リレーション組めれば楽なのにってパターンですね。あるあるです。が、データベース的にはあまり考えたくない特殊な条件なので質問時点で記載があるとよかったかなぁと思います
この条件だと、最後に提示したメイン-サブフォーム形式は使えないので「T_モニタリング(ケアプランID)」と「T_ケアプラン(プランID)」で(想定とは逆向きの)一対多でクエリを組んで計画日を拾うためだけの形で運用します
ケアプランIDは計算で求めることになる(求められる)のでフィールドに持つ必要はないともいえるのですが、結構複雑な処理になるので必要なタイミングで取得したらデータとして保存する(「ケアプランID」フィールドを設ける)というのがやはり扱いやすいと思います
質問では評価記入の基準のために「評価日」を設ければいいのではないか?としていますが、ケアプランIDがあればその計算は簡単なのと、ケアプラン側から評価の一覧を見たいとなった場合、ケアプランIDでモニタリングのデータが抽出できる等のメリットもあります
こうすると問題点が2つ上がってきます
1.どのタイミングでケアプランIDを取得するか、その求め方
求め方については、モニタリングの計画日がケアプランの計画期間内になるようなケアプランIDを拾えばいいので次のような式で求められます
DLookup("プランID", "T_ケアプラン", [計画月] & " Beteen [計画日] AND [計画期間終] AND お客様ID=" & [お客様ID])
「計画期間終」の入力が実際のプラン終了時(それまでは未入力)なんて場合はNz([計画期間終], DataAdd("m", 6, [計画日])-1)
等、手入れが必要になると思います
タイミングは、まず、モニタリングのデータ入力時に「計画月」を入力したタイミングで更新後処理イベントを使って
Private Sub 計画月_AfterUpdate()
me!ケアプランID = DLookup("プランID", "T_ケアプラン", me!計画月 & " Beteen [計画日] AND [計画期間終] AND お客様ID=" & me!お客様ID)
End Sub
これで、ケアプランが存在しない場合はNullチェックで警告が出せますね
もう一つは、モニタリング入力時にケアプランが存在しなかったデータについて「後から入力する」ことですが、これはケアプラン入力時に更新クエリを発行すればいいでしょう
2.ケアプランIDがない場合、「評価」の入力可否をどのように決めるか
ケアプランIDがある場合は、DateDiff("m", [計画日], [計画月])
で何か月目なのかが判断できます
ない(nullの)場合は、「ケアプランが不明です」として入力不可にしてしまうか、推定3か月目等、それでも入力すべきタイミングを計算するかを考える必要があります。後者の場合は、ケアプランの最後のデータを拾ってきて仮の計画日として計算させる形になります