Accessで昔の処方箋をデータベース化する方法

このQ&Aのポイント
  • Accessを使用して昔の処方箋をデータベースにする方法について説明します。薬の材料を整理し、薬材料テーブルを作成します。
  • 薬の材料は薬草や動物の一部で、イチジクの実やアカシアの葉などが含まれます。材料は主か部分のどちらかに分類されます。
  • 処方箋テーブルと薬材料テーブルをフォームとサブフォームで結合しようと試みましたが成功しませんでした。成分IDと中間IDの自動ナンバリングができないためです。
回答を見る
  • ベストアンサー

サブフォームの中にサブフォーム

Accessで昔の処方箋をデータベースにしたいです。薬の材料を整理して、薬材料テーブルを作りました。 材料は薬草や動物の一部で、イチジクの実、アカシアの葉、牛の骨の隋、鳥の血などです。植物名や動物名と、使われてる部分の2種類の違いを区分として主か部分、のどちらかに入れます。分けるのは、牛の血、豚の血、牛の骨など、重複した部分を効率よく組み合わせて入力するためです。   薬材料テーブルとメインの処方箋テーブルをフォームとサブフォームで繋げてやってみたのですが何故かうまくいかないです。 >処方箋テーブル:処方箋ID(Key:Autonumber)&処方箋の名前(Text) >薬材料テーブル:薬材料ID(Key:Autonumber)&薬材料の名前(Text)&区分(Text) >成分テーブル: 成分ID(Key:Autonumber)&処方箋ID (Number) >中間テーブル:中間ID (Key:Autonumber)&成分ID(Number)&薬材料ID(Lookup to:薬材料の名前) テーブルのイメージとしては 「処方箋ID  「成分ID   「中間ID   「薬材料ID  処方箋名   処方箋ID   成分ID    薬材料名       」      」    薬材料ID」  区分 」 [処方箋ID>処方箋ID] > [成分ID>成分ID] > [薬材料ID >Look up > 薬材料名] 理想は、メインの処方箋フォームの中に、成分のサブフォーム。成分のサブフォームの中に中間フォーム。 中間フォームでは、プルダウンメニューから薬材料名を選べるというものです。 つまり、処方箋1の1つ目の成分の“イチジク”と“実”をそれぞれ、2つ目は“牛”と“血”とそれぞれ選ぶ、みたいな感じです。 が、この方法だと、フォームで入力時に成分IDと中間IDが自動ナンバーされないで、実質入力ができないです。  メインフォームの複数のサブフォームを、中間のID(成分IDや中間ID)を使って管理はできないのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.4

No.3は下記の内容です。 処方箋ID 1    ↓(リレーション)   中間ID 成分ID 薬材料ID 区分    1   001    10  (主)    1   002    11  (部分) で リストなどは成分IDの順で並べ分析は中間IDと区分でグループ化し薬材料の統計・分析をするという事ですが主と部分の結びつきはありません。するとすれば成分IDは区分的に使い長整数型などで入力し成分IDでもグループ化すれば出来ます。 処方箋ID 1    ↓(リレーション)   中間ID 成分ID 薬材料ID 区分    1   001    10  (主)    1   001    11  (部分)    1   002    20  (主)    1   002    21  (部分) こんな感じで成分IDで主と部分を結び付けられます。クエリを元にフォームを作れば中間テーブル成分テーブルに書き込めると思います。 shingoogooさんの作った構成では下記のようになるということですね。(中間と成分が逆かもしれませんが) 処方箋ID 1    ↓(リレーション)   中間ID 成分ID    1   001    1   002    ↓(リレーション)       成分ID 薬材料ID        001    10(主)        001    11(部分)        002    20(主)        002    21(部分) フォームにすると単票方の中に単票型でその中に帳票型ではひとつの成分の主と部分を入力し中間単票型フォームのレコードを次に進めて次の成分を入力するような格好になるのでは。 処方箋fm内に帳票型のフォームを入れ帳票型のフォームに薬材料のフォームを表示するボタンでも作りリンクするようにした方がキー同士の連携を取るには良いのかもしれません。 取り合えずオートナンバーが振られない状況なら主キーとレコードキーになる副キーとリレーションをとりフォーム同士のリンクも同じリレーションにすれば振られるはずです。

shingoogoo
質問者

補足

分かりやすい構成説明を有難う御座いました。 実際に教えてもらった構成でやってみて、処方箋IDや主と部の振り分けが出来ているのが確認できました。処方箋IDと薬材料IDとの結びつきの間に中間テーブルを置いただけのシンプルな構成なので、管理がしやすいと思いました。フォームもサブフォームの中にサブフォームを作らずに、サブフォームだけで、成分IDの番号は手入力、薬材料はLookUp toで選択入力できました。気になったのですが、クエリを元にフォームを作るというのは、このフォーム構成ではなくて、別の方法を言われているのですか? もしそうなら、そのことについてもう少し教えて欲しいです。お願いします。

その他の回答 (3)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

成分テーブルの意味は解りました。 しかし成分テーブルで成分IDと処方箋IDを管理するだけなら 処方箋テーブル.処方箋IDと中間テーブル.中間IDを1対多でリレーション。 中間テーブル:中間ID(超整数型)&成分ID(オートナンバー型)&薬材料ID(Lookup to:薬材料の名前)として 中間テーブル.成分ID(オートナンバー型)と薬材料テーブル.薬材料IDをリレーション これで処方箋ID→中間IDと成分ID→薬材料IDのリレーションを作り中間テーブルの成分IDで薬材料テーブルから薬材料IDを抽出し区分で分類し統計を取れるのではないでしょうか。 >主と部分が混在する薬材料テーブルから主と部分の関係を効率よく分けて表示したり分析したり出来ますか? 主と部分が混在する薬材料テーブルから効率よく分類等するには薬材料テーブルのレコードの構成ではないでしょうか。 薬材料テーブルの区分で主と部分を判定するフィールドを作る。分類するときは主か部分でグループ化し薬材料名?でグループ化すれば良いのではと思いますが。

shingoogoo
質問者

補足

何度も答えて頂いて有難う御座います。 提案されたテーブルの構成ですが、すこし分かりづらいので聞きたいです。テーブルは全部で3つで。 (1)処方箋テーブルに(処方箋ID、処方箋名)、(2)中間テーブルに(中間ID(超整数型)、処方箋ID、成分ID(オートナンバー)、薬材料ID(Lookupで薬材料テーブル))、(3)薬材料テーブルに(薬材料ID、材料名、区分)となるのでしょうか? リレーションは、(1)処方箋テーブルの処方箋IDと中間テーブルの処方箋IDの1:M薬材料ID、(2)中間テーブルの薬材料IDと薬材料テーブルの薬材料IDの薬材料IDでしょうか?  この場合、実質成分IDが処方箋IDと薬材料IDのリレーションを作りますが、中間IDで、薬剤のリストされる順番や、個々の薬材成分の主と部の結びつきをはっきりさせるにはどうすればいいのですか? ひとつの処方箋にある材料を単に複数の主と複数の部がある、というのではなく、それぞれの組み合わせを出したいです。 教えてください。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>中間IDを整数型にするのは 中間IDを整数型にするのはオートナンバーで処方箋IDが振られた際に中間IDに処方箋IDと同じキーを持ってきてリレーションするためです。 テーブルの構成を見ると成分テーブルは不必要なのではと思いますが。(他の使用目的があるのでしたら別ですが) 処方箋テーブル・中間テーブル(処方箋の内容)・薬材料テーブルで足りるのではないかと思いますけど。 処方箋テーブルに中間テーブルがぶら下がり中間テーブルに薬材料テーブルがぶら下がる構成で足りると思います。 処方箋IDと中間ID間で1対多のリレーションをすれば問題はないはずで処方箋IDを主キーに多側の中間IDは入力したレコード数分の薬材料IDがあるレコードが出来ますので処方箋IDのみで管理できる。 中間テーブルから処方箋IDで抽出すれば1処方箋分のレコードが抽出できる。処方箋テーブルに日付があれば処方箋テーブルの日付を使い何月何日から何月何日までの使用薬材料が集計できる等 管理が楽ではないでしょうか。 >最後の部分に書かれているのはこの構成自体を変更する必要があるのですか >薬材料も中間IDと共通するフィールドを追加して処方箋IDと中間IDを1レコード内に持つようにするべきではないでしょうか のことでしょうか・・ テーブルにフィールドを1つ追加するだけなので構成自体を変える必要はないと思います。 データベースを構築する際に各テーブルのレコードは共通するキーを持たせた方が構築も楽でリレーションも複雑にならずシステム自体の管理もやり易い。この考えからです。

shingoogoo
質問者

お礼

ご教示ありがとうございました。 もう1つ聞かせてください。  成分テーブルの意味は、1つの処方箋の中に複数使われる薬材料のうち1つを管理し、中間では、その薬材料の主(牛など)と部分(血のど)の組み合わせを作っています。それで、行いたい分析の一つに主と部分の関係の統計があるのですが、例えば、血が使われている処方箋は主に、牛が80%で鳥が12%とか、牛の使われる部分の多くは脂肪で、その次が血であるとか。その場合、この構成で、主と部分が混在する薬材料テーブルから、主と部分の関係を効率よく分けて表示したり分析したり出来ますか?

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

構成がちょっと解りにくいのですが・・。 中間ID・薬材料IDをオートナンバーから長整数型にして処方箋IDのオートナンバーを持ってくるように変更すれば出来ると思います。 メインフォームと各サブフォームに共通するキーがない状態だと思うのですが・・。そのため入力できない? 今のテーブルままの構成だと処方箋IDではなく中間IDを主キーに持った方が良いような構成だと思います。 処方箋IDに各レコードをぶら下げるならオートナンバーで主キーを持ち各テーブルのレコードは処方箋IDで管理するようにしないとだめなのでは。 入力時は処方箋IDでサブフォームまで入力し入力時に中間IDを別にふり成分と薬材料も中間IDと共通するフィールドを追加して処方箋IDと中間IDを1レコード内に持つようにするべきではないでしょうか。 そうすれば処方箋IDでも中間IDでもどちら側からでも管理できるのでは。

shingoogoo
質問者

お礼

迅速なお答え有難う御座いました。  中間IDを整数型にするのは、入力時に自動で番号がつかないので、あらかじめレコードの分だけ準備しておく必要があるのでしょうか? そうすると、やはり処方箋IDでサブフォームまで入力して、その後薬材料の入力という順番になるのでしょうか?  あと、最後の部分に書かれているのは、この構成自体を変更する必要があるのですか?  なにぶん初心者ですので、最後の意味が把握仕切れないです。お願いします。

関連するQ&A

  • Access2000でメインサブフォーム

    テーブル1 商品ID 数値型(主キー) 商品名 テキスト型 ------------------ テーブル2 売上ID  数値型(主キー) 商品ID  数値型 月日   日付型 売上個数 数値型 --------------------- 以上のようなテーブルがあり、テーブル1を「メイン」テーブル2を「サブ」のメインサブフォームを作成しました。 しかし、「サブ」のデータが多いため、さらに、サブフォームの日付フィールドを使い、抽出をしたいのですが、方法がわかりません。(例えば、9/1以上9/10以下のような抽出) いろいろやってみは見たのですが、思うようにできません。メインサブフォームでさらにサブフォームのデータを抽出するということは無理なのでしょうか?

  • 2つのサブフォーム間でデータの連携

    今、ある単票フォームに、2つのサブフォームを配置し、そのサブフォーム間で金額の連携をしたいと考えています。 【親フォームA】 ・ID1、長整数型(主きー) ・受付日時 ・発注金額総合計 <== ※Bが更新されたら、ここを更新したい 【サブフォームB】 ・ID2、長整数型(主キー) ・ID1(外部キー) ・発注日 ・発注合計金額 <=== ※Cが更新されたら、ここを更新したい ==> Aの更新へ↑ 【サブフォームC】 ・ID3、長整数型(主キー) ・ID2(外部キー) ・発注項目名 ・単価 ・数量 ==>ここを更新する→Bへ↑ ・単位 ==>ここを行進する→Bへ↑ ・摘要 サブフォームB、Cは、いずれも帳票型です。 それぞれ、テーブルA, B, Cがレコードソースで テーブル構成は、上の項目の構成と同じです。 A-ID1: B-ID1 = 1:多 B-ID2: C-ID2 = 1:多 この時、Cで単価と数量を入力したら、Bの発注合計金額の値を更新したいです。 それと同時に、親Form Aの「発注金額総合計」の値を、Bの全てのレコードの「発注合計金額」のSumで更新したいです。 よろしくお願いします。

  • Access97:サブフォームを切り替え表示したい

    アクセスで仕事で用いられる専門用語の和英辞書データベースを作っております。 その辞書は用語の持つ意味や使われ方などから分類をしています。 分類一覧テーブルは分類ID,分類からなり、用語一覧テーブルは用語IDと用語からなります。 これらをつなぐのが和英辞書テーブルで、辞書ID,分類ID,用語IDからなり、 分類ID,用語IDはそれぞれ分類一覧テーブル,用語一覧テーブルのそれとリレーションシップを 組んでいます。 メインフォーム(既定のビュー=単票フォーム)には分類フィールドを作り、コンボボックスにします。 分類を選択したときまたはその横に「表示」ボタンを設置しておいてそのボタンをクリックしたときに 選択された分類に属する用語一覧がサブフォーム(既定のビュー=帳票フォーム)にリロードされてるように切り替えて表示させたいと考えています。 メインフォーム元:分類一覧テーブル,サブフォーム元:用語一覧テーブルにしたフォームは作成できました。 メインフォームのレコードを切りかえるとサブフォームも切り替わりますが、 コンボボックスの選択でサブフォームを切りかえ(たように見せ)る上記のようなフォームに このフォームから編集することはできるでしょうか? 無理なら新規にフォームを作りなおすとしてできるでしょうか? 自分の発想で2通りやってみましたが、いずれも失敗でした。 (詳しく書いたら文字数が800を超えたので省略します) テーブルの構成やリレーションを多少変えてもいいしフォームのレコードソースにクエリービルダを使ったりVBを組んでもいいので、メインフォームのコンボボックスの選択値によってサブフォームの表示を切り替える方法について教えて下さい。

  • 「埋め込み」と「サブフォーム」は同じ意味ですか?

    こんばんは。 当方アクセス2003を使用しています。 デザインビューでフォームの中に違うフォームをドラッグして サブフォーム作成したときに プロパティの名前が「埋め込み」になります。 しかしフォームにテーブルをドラッグした場合は 「テーブル名のサブフォーム」という名前になります。 フォームをドラッグしたしたときに出来上がる「埋め込み」もサブフォームと同じ意味と捕らえて言いのでしょうか?

  • サブフォームをブランクで開きたい(値の代入)

    現在、サブフォームを開く時に値の代入の後、DMax関数で+1をして最後のレコードに+1したIDをマクロで行っていますが、VBAでできないでしょうか? 1.サブフォームを開く Cmd Open フォーム名 2.値の代入で(””)をいれフォームをクリア 3.値の代入でID=DMax"テーブル”+1 良い知恵があれば教えて頂けないでしょうか マクロにあまり頼りたくないので宜しくお願い致します。

  • Accessでメイン、サブフォームへの入力について

    accessほぼ初心者です。 取引先の会社情報を管理するために、access2007で顧客管理を作成しています。現在、取引先本社情報とその支店情報を登録するフォーム「会社登録フォーム」を作成していますが、次のようなことで困っています。 <問題としていること>: 「サブフォーム」をクリックした瞬間に、テーブルにレコードが追加されてしまう。 <改善したいこと>: 本社テーブルの会社名が未入力ならば、上記の操作でレコードを追加しない。(会社名に主キーは設定していません。) <会社登録フォームの環境>: 会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして支社ごとに分けて入力できる登録フォームを作成しました。本社テーブルの会社IDを主キーに、支店テーブルの支店IDを主キーにしてリレーションシップを設定しています。 <会社情報の入力に関して行っていること>: ・メインフォームに「新規」「更新」「削除」ボタンを設置。 ・新規ボタンでメインフォームの「会社ID」に自動採番。 ・会社(本社)名がないと困るので、未入力の状態で「新規」「更新」及び「サブフォーム」をクリックされた際に「会社名が未入力です。」のメッセージを表示され「OK」で元の状態にもどります。 ・会社(本社)名が入力済みならば、「更新」ボタンで、メッセージ「OK」「キャンセル」が表示され、「OK」ならば本社テーブルにレコードが追加され「キャンセル」ならばそのままの状態になります。 上記の<問題としていること>の補足ですが、新規ボタンで新規登録フォームに会社IDが自動採番(末番)されるのですが、「会社名」を入力せず、先にサブフォームの支店情報から(タブ名「支店(1)」)入力しようとした場合、「会社名が未入力です。」のメッセージを表示されますが、この時点で本社テーブルに、この採番でレコードが追加されてしまいます。入力者がそのまま会社名(本社)から入力するも、途中でキャンセルした場合、再度新規登録をする際、登録フォームの自動採番がキャンセルされた採番の次の番号になります。 キャンセルされた会社情報空白のレコードができるということになります。これを回避したいのです。 出来るだけ詳細をとおもい説明が長くなりましたが、よろしくお願いいたします。

  • Access2003 リレーションされたサブフォームの抽出

    Access顧客情報のデータベースを正規化(VBA)している初心者です。リレーションされているテーブルを元にクエリ(3つのテーブルをつなげただけ)を作成しメインフォームにサブフォームを作りました。3つのテーブルは、1対多でリレーションされています。テーブルAのGR_IDやグループ名で検索しそれに紐づいているCOmpanyは抽出できるのですが、サブフォームのテーブルBのCOmpany nameから抽出することができません。メインフォームからオプションボタンを使用してメインとサブの両方のテーブルを検索したいので、子・親リンクの設定をはずせませんよね?以前の類似質問で「サブフォームのフィルターに入力し、フィルター実行でうまくいきました」とありましたが、具体的にどのように設定(マクロやVBA、再クエリ?)すればいいのかわからず悩んでいます。どうぞ初心者向きのアドバイスをよろしくお願いいたします。 テーブルA GR_ID グループ名 ※テーブルA(1):テーブルB(多) テーブルB GR_ID Company_ID Company name ※テーブルB(1):テーブルC(多) テーブルC Company_ID salesman

  • Access2003 サブフォームについて

    サブフォームを持つ画面で 親子テーブルを共に更新しようとしていて挫折しかかっています。 そこで皆様の知恵を借りれれば幸いです。 <<画面表示>> メインフォーム…受注  ┗サブフォーム…受注明細 <<更新条件>> ・メインフォームは変更可能 ・サブフォームは追加、変更、削除可能 ・サブフォームのデータ変更時  →受注明細テーブルを更新しない ・メインフォームのデータ更新時  →受注テーブルを更新しない ・メインフォームの更新ボタン押下時  →受注テーブル、受注明細テーブルを更新 <<質問>> 1.サブフォームの値をテーブルへ  自動更新(項目変更時に付随更新)せずに  任意更新(ボタン押下時など)出来ますか?  [サブフォームに主キー項目を設置せず行追加すると Not Null制約で怒られます。] 2.VBで言うところのFlexGridの様にサブフォームを  制御出来ますか?  RecordSourceを使うのではなく、  VBA内で持っている値を各セルに設定する 3.そもそも同一画面内で親子テーブル共に更新することは  有り得ないことなんでしょうか?

  • AC2000でフォームから入力したデータをサブフォームに表示

    ID 商品名 単位 単価で商品マスタフォームを作っています。このフォーム内にサブフォームを作っておいて データが入力するたびにサブフォームへ表示させたいのですが、このときの条件としてID(オートナンバー)を降順(最新のデータが一番上になる)・データシート形式にしたいと思います。 T_商品(テーブル名) Q_商品(IDを降順としたクエリ) MF_商品(各入力テキストボックスがあるフォーム) SF_商品(MF_商品に貼り付けるサブフォーム) 降順にすると一番若いIDのデータだけがサブフォームに 表示されるのです。 requeryは必要なのでしょうか? よろしくお願い致します。

  • サブフォームにフィルタをかけたい

    サブフォームにフィルタをかけたいのですが エラーになってしまいます。 下記がエラー内容です。 ---------------------------------------------------------- 実行時エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ---------------------------------------------------------- 細かい概要は テーブル1にフィールドがあり、 レコードには「あああ」と入力されています。 テーブル1がレコードソースとされている「フォーム(2)」をサブフォームとして 親フォーム(フォーム名:フォーム(1))に乗せました。 フォーム(1)を開いた時にフォーム(2)にフィルタをかけたいのですが うまくいきません。 オブジェクト名にカッコを付けているため、 Form_フォーム・・・・ というコードは書けないので ---------------------------------------------------------- Private Sub Form_Open(Cancel As Integer) Forms("フォーム(1)").Controls("フォーム(2)").Form.Filter = "フィールド = '" & "*あ*" & "'" Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True End Sub ---------------------------------------------------------- としています。 Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True でエラーになりますが、 この行をなくしたら、フィルタがかかりません。 どうすればサブフォームにフィルタをかける事が出来るのでしょうか? ご教示よろしくお願い致します。

専門家に質問してみよう