Microsoft Access 掲示板

3か月おきにコメント挿入

5 コメント
views
4 フォロー

Hatenaさまいつもお世話になっています。
2016頃によく質問をさせていただき、社内で5名程度が記録を行う
老人介護システムを作成管理しています。
今回は、このシステムに新たなフォームを追加して管理したいと思って製作に取り組んでいます。
クエリを2つ作成し管理しようと思っていましたが、構築の段階でつまってしまいました。
下記の内容をフォームで表示する方法を教えていただけたらと思います。

流れ:ケアプラン:お客様をどう介護していくのか計画するケアプランの書式を半年の期日で作成します。期日が来ると新たにプランを作成します。急な変更で期日前に新たに作成することもあります。
   モニタリング:お客様の様子を毎月、ひと月全体を通じてどのような様子だったか記録します。ケアプラン書式の作成日にもとづいて3か月に1度評価を記録します。

今回、モニタリングのフォームでケアプランで作成された作成日を元に3か月目を抽出し、フォームで3か月目に記録を記入できる表示/非表示をテキストボックスに反映させたいと思っています。
   ケアプランの作成日を元に追加クエリでモニタリングに評価日を挿入すればできるのではと考えているのですがうまくいきません。久しぶりの取り組みで抜け落ちも多そうです。
ぜひ、ご教授いただけたらと思います。
T_フェイスシート
 お客様ID  主キー
 その他情報…
T_ケアプラン  
プランID
計画No   主キー
お客様ID  主キー
計画内容
計画日    日付型
計画期間終  日付型
その他情報…
T_モニタリング
 モニタリングID 
 お客様ID  主キー
 計画月    主キー 日付
 評価日        日付型
 その他の情報フィールド

ファイルを送信します。

管理者追加

送信いただいたファイルです。
システム試行中R2.8.22.zip

takurou
作成: 2020/08/22 (土) 19:10:29
最終更新: 2020/08/24 (月) 14:39:44
通報 ...
1
hiroton 2020/08/24 (月) 09:10:13 9fe34@f966d

モニタリングとケアプランの関係性がよくわかりませんね

少し乱暴ですがテーブルを分けずに「T_ケアプラン」に「モニタリング評価1」、「モニタリング評価2」、「その他情報フィールド」をつけてしまえば解決するのでは?

テーブルを分ける必要があるのなら「T_モニタリング」に「ケアプランID」を設けて関係性を持たせれば楽ができると思います

ケアプランの作成日を元に追加クエリでモニタリングに評価日を挿入すればできるのでは

未記入のフィールドにデータを書き込むなら更新クエリです。それともケアプランを作成したときに自動的に「T_モニタリング」にデータを追加したい(6か月分)という内容でしょうか?

2
takurou 2020/08/24 (月) 13:47:25 9d79c@a8489

ありがとうございます。説明足らずですみません。
やはりテーブル一つで組むのがよいのでしょうか…

 モニタリングというのは毎月報告していく書式ですのでお客様の様子を日付と内容を挿入し毎月更新します。
ケアプランは初回から6か月おきに作る書式です。関連性は、ケアプランで作成した計画が3か月目で毎月行うモニタリングを元に評価する。という点だけです。ただ、毎月行うモニタリングの書式のフォームに評価をする項目も盛り込みたいと考えています。(記録者にわかりやすくしたい為です)
テーブルを一つにまとめて挑戦もしていますが、構成がいまいち頭に描けず混乱しています。

3
hiroton 2020/08/24 (月) 17:45:51 0ae10@f966d

テーブル一つで組めば楽だと思いますが

ex)
タブコントロールを設置してタブを6個(1か月目~6か月目)用意し、モニタリングのデータを切り替えるように作成。3か月目と6か月目には追加で評価用のテキストボックスを設置する

『「評価」は2か月に1度にしよう』とか業務内容変更の可能性なんかを考えるとテーブル1つにしちゃったら発狂間違いなしですねぇ

もう一つ例を挙げているように「T_モニタリング」に「ケアプランID」を設けてあげればクエリで簡単にモニタリングの計画月に対応するケアプランの計画日が拾えるので日付の比較で3か月目かどうかが簡単に計算できます。「評価日」も簡単に計算できるのでフィールドに持つ必要もなさそうです

質問のように対応する「ケアプランID」が不明の状態だと、自前で対応するケアプランの計画日を探すという計算式を組むことになります。結構めんどくさいです

「関係性がよくわからない」とはこの部分のことで、それぞれのテーブルに日付のデータが入っているので頑張れば関係性を見つけることはできそうですが、そんな頑張りせずにIDで紐づけできないか?という話です

「T_モニタリング」に「ケアプランID」を設けて、メインフォーム(T_ケアプラン)、サブフォーム(T_モニタリング)としてプランIDとケアプランIDをリンクさせ、よくあるメイン-サブフォーム形式で組めば難しいものでもないのではないでしょうか

4
takurou 2020/08/24 (月) 23:03:44 5e07f@bf2c5

ご連絡ありがとうございます。
「T_モニタリング」に「ケアプランID」を設ける形で再度挑戦してみようと思います。
毎月、記録するT_モニタリングと、計画をするT_ケアプランは記録をする担当者が違う為、ケアプランが期日を過ぎてもモニタリングは毎月可動するように考えています。(過ぎている場合警告を出す予定で)
毎月のモニタリングはお客様数が50名を超えるのでできれば表形式を使いたいと思っています。
クエリの組立が勉強不足なのだと痛感しました。hirotonさんありがとうございます。

5
hiroton 2020/08/25 (火) 10:01:38 ba56c@f966d

リレーション組めれば楽なのにってパターンですね。あるあるです。が、データベース的にはあまり考えたくない特殊な条件なので質問時点で記載があるとよかったかなぁと思います

この条件だと、最後に提示したメイン-サブフォーム形式は使えないので「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か月目等、それでも入力すべきタイミングを計算するかを考える必要があります。後者の場合は、ケアプランの最後のデータを拾ってきて仮の計画日として計算させる形になります