1ヶ月分の献立買い物リストの作成。料理名を入力すると必要な材料、分量などを抽出する仕組みを作りたい。例えば、カレーライスと入力するとじゃがいも、人参、玉ねぎ、牛肉、カレールー
など、作るのに必要な材料一覧を抽出したいのです。また、複数入力し、合算して必要な材料、個数の一覧(買い物リスト)を抽出したいです。カレー、肉じゃが、ハンバーグ、唐揚げ、など入力し必要な材料一覧を作りたいのです。説明下手ですみません。作り方を教えて下さい。かなりの初心者ですので、詳しく教えて下さい。
37c13d32c3
なお
通報 ...
現状はどこまでできていますか。
テーブルは作成しましたか。
それとも、まったく手付かずですか。
全くです。料理名、材料リストを作ったりしましたがそこからどうしていいかわからずです
全くです。料理名、材料リストを作ったりしましたがそこからどうしていいかわからずです
テーブル設計からということですね。
まずは、「正規化」という概念については理解していますか。
データベース設計の基本になります。よく、分からないという場合は、「テーブル 正規化」をキーワードでWEB検索して、解説ページをいくつか読んで、概要を理解しておいてください。(データベース初心者だと完全に理解するのは難しいと思いますので、なんとなくイメージとして掴んでおけばとりあえずOKです。)
例えば、下記のサイトの「正規化」の項目など。
もう一度学ぶMS-Access
そのうえで、最低限、下記のようなテーブルが必要です。
T_料理
料理ID 主キー
料理名
種別(主菜、副菜、汁物など)
T_材料
材料ID 主キー
材料名
単位
T_料理_材料
料理ID 主キー
材料ID 主キー
数量
T_献立
献立ID 主キー オートナンバー型
日付
種別 (朝食、昼食、夕食など)
T_献立_料理
献立ID 主キー
料理ID 主キー
上記のテーブルを作成したら、リレーションシップを設定します。
リレーションシップがよく分からないという場合は、上記で紹介したサイトの「リレーションシップ」の項目を参照してください。
とりあえずここまでやってみてください。それができたら、入力フォームの設計について説明します。
わかりました。やってみます。非常にわかりやすいです
テーブルを作っていてわからなくなりました。献立テーブルと献立料理テーブルの必要性が。シンプルに30日分(30品目の料理)から必要な材料を合算して表示させたい。単位も統一して個単位でいいです。説明が下手で申し訳ございません。ご教示お願いいたします。
30日分(全て一人前)を一回で買い物に行くとして、必要な材料の一覧を合算して抽出させたいのです。料理数もかなりの数があるので、料理名を入力するのではなく、簡単なコードを入力して抽出させる仕組みを作りたいのです。もちろん、それ以上に効率的に抽出できる仕組みでもいいです。料理の種類、料理名、材料名、個数、これらは必要だと思うんですが、これをどう作り繋げていけばのいいのかわかりません。
実はこの料理材料管理という題材は、かなり難易度が高いものになります。
テーブル設計も複雑になりますし、そこから管理用の入力フォームも作成するのも難しいものになります。
Accessで今まで何か作成したことがありますか。
名簿管理とか、家計簿(出納帳)とか、蔵書管理とか、、、この辺が最初に取り組む題材としては適切です。
入門書にのっているようなレベルのものを作成したことがあるのなら、次に取り組む題材として適切だとは思います。
それぞれのテーブルの意味を簡単に説明しておきます。
T_料理、T_材料 はマスターテーブルと言われるもので、一度入力しためったに変更することのない固定的なデータになります。
T_献立 はトランザクションテーブルと呼ばれるもので、日々入力していってデータとして蓄積していくものになります。
T_献立 と T_献立_料理 の2つのテーブルは、「一対多の関係」といいます。
献立の1レコードに対して、複数の料理があるからです。
例えば、「12月17日の夕食の献立」に対して「カレーライス、サラダ」と2つの料理がある、という関係です。
T_献立が一側、T_献立_料理が多側になります。
T_料理 と T_材料 は「多対多の関係」になります。
例えば、カレーライスは、じゃがいも、人参、玉ねぎ、牛肉、カレールー の複数の材量が必要です。
逆に、じゃがいもは、カレーライスや肉じゃが、ポテトサラダ・・・などに使われます。
このような関係が「多対多」になります。
リレーショナルデータベースでは多対多の関係を実現することはできないので、2つのテーブルの間に入る中間テーブルというのを作成して、2つの「一対多の関係」に分解します。
T_T_料理_材料 というのが中間テーブルになります。
T_料理(一)---(多)T_T_料理_材料
T_材料(一)---(多)T_T_料理_材料
これらのテーブルにリレーションシップを設定すると、下図のようになります。
このテーブルから入力フォームを作成していくことになります。
まずは、料理に必要な材料を入力するフォームから作成していきましょう。
が、その前に、テーブルのフィールドにルックアップの設定をしておきましょう。
まず、T_料理 の「種別」フィールドのルックアップを下図のように設定します。
値集合ソースは
主菜;副菜;汁物
というようにセミコロンで区切ってリストを入力してください。これで、コンボボックスから選択できるようになります。
次に、T_料理_材料の「材料ID」フィールドのルックアップの設定を下図のようにします。
値集合タイプを「テーブル/クエリ」にして値集合ソースは「T_材料」とします。
列数: 2、列幅: 0 と設定することでコンボボックスのリストには「T_材料」の2番目のフィールドの材料名が表示されることになります。
テキストボックス部分にも材料名が表示されます。ただし、フィールドに実際に格納されている値は、材料IDになります。
この辺の設定の意味は理解するのが難しいと思いますが、おいおい理解できるようになるでしょう。
この設定でテーブルでの材料の入力が下記のようにコンボボックスから選択することできるようになります。
分かりやすい説明ありがとうございます。全て真似事ですが作成できました。やはり献立が今一理解できません。12月17日の夕食の献立にカレー、サラダがある。仮にカレーしかなければ、毎日一食限定なら必要はないのでしょうか?献立はオートナンバーになっているので、12月17日はカレーとサラダだったと言うことがデータから分かると言うことなのでしょうか?簡単に2種類の料理名と材料名を入力しました。次はどうすればいいでしょうか?
1回の食事の献立で、料理は必ず一種類だけ、ということてすか。
もし、そうなら、T_献立_料理 テーブルは不必要になります。
T_献立 に 料理ID フィールドを持たせるだけです。
そうでないなら(ふつうは複数の料理がでると思いますが)、
T_献立_料理 は必要です。
献立の入力フォームの作成について、これから解説しますが、今はちょっと忙しいので、今日の夜ぐらいになりますので、しばらくお待ちください。
1回の食事で1種類、30日分です。
「1回の食事で1種類」でいいのなら、T_献立_料理 は不要になります。
T_献立 に 料理ID を追加すればいいでしょう。
T_献立
献立ID 主キー オートナンバー型
日付
料理ID
種別 (朝食、昼食、夕食など)
T_献立 をレコードソースとする入力フォームを作成すればいいでしょう。
料理IDはコンボボックスにして、料理名で選択できるようにしてもいいでしょう。
コンボボックスを2つ並べてIDでも料理名でも入力できるようにすることも可能です。
コードでも名称でも入力できるコンボボックス - hatena chips
合算して抽出する方法ご教示お願いいたします
元の質問は解決済みで、別の質問になると思いますので、新規に質問しなおしてください。
そのときに、何をどのように合算するのか具体的に説明するようにしてください。
フォームも完成しました。