- ベストアンサー
Accessでの質問!
- Accessで作成中のシステムで問題が発生しています。
- 関連テーブルのリレーションシップ設定について質問です。
- フォームの製作所コンボボックスの動作について問題があります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
要は、<受注>という主表があって<受注_明細>という従表があるということかと。 それならば、主フォーム、サブフォームの関係も理解できます。 <受注> ID__日付____________品物 ------------------- 1___2007/01/10_品物_A 2___2007/01/12_品物_B <受注_明細> ID__受注_ID__担当社員_ID_担当製作所_ID -------------------------------- 1___1__________1_________________1___________________ 2___1__________2_________________2___________________ 3___2__________1_________________2___________________ 受注1は、担当が1と2でそれぞれに製作所が1と2である。 受注2は、担当が2にみで製作所は2である。 <フォームの初期形態> ID:______[_____1] 日付:__[2007/01/10] 品物:__[品物_A_______________] =[明細]================== [担当社員_ID][担当製作所_ID] [_______________1][___________________1] [_______________2][___________________2] ======================== ・[ID][受注_ID]も、サブフォームに配置しているとします。 これが、最も基本的な初期形態。 <社員データを自動表示させるには> =[明細]============================================================ [社員コード][社員名_____][所属_____________][担当製作所][担当製作所_A][担当製作所_B] [_________101][中村_太郎_][営業第一課___][製作所_A___][_________________10][_________________3] 初期形態をこのように変化させるには、フォームのレコードソースを変更します。 レコードソースは、クエリで[受注_明細][社員]から列を選ぶだけです。 [社員.社員名][社員.所属]を加えること可能になります。(これらの参照列は、編集不可に!) [社員コード]は、単に、[担当社員_ID]をコンボボックスを利用して[社員コード]を表示しているだけ。 [社員コード]が選択されれば、その他は自動的に更新表示されます。 さて、ここまでは基本中の基本。もし、この説明で判らなければ入門書を再読して下さい。 <製作所の件数も表示したい> SELECT 受注_明細.ID, 受注_明細.受注_ID, 受注_明細.社員_ID, 受注_明細.製作所_ID, 社員.社員コード, 社員.名前, 社員.所属, DCount("*","受注_明細","製作所_ID=1") AS A, DCount("*","受注_明細","製作所_ID=2") AS B, * FROM 社員 INNER JOIN 受注_明細 ON 社員.ID=受注_明細.社員_ID; フォームのレコードソースに件数集計列を追加します。 さて、[担当製作所]を入力しても、この件数集計列は即座には更新されません。 VBAにて強制的に明細の入力レコードを保存するという工夫が必要です。 ※まず、<社員データを自動表示させるには>までを成功させる。 ※次に、<製作所の件数も表示したい>のクエリでの列のビルド、またがズームでの生成。 ※このように、手順を追っていくことです。 ※質問は、この一つひとつの段階で判らない点を行うのがいいです。 ※ちょっと、丸投げ臭いですよ!
その他の回答 (5)
- p-applepie
- ベストアンサー率53% (156/290)
とりあえず、サブフォームについて・・ 以前回答したものです。 手前味噌ですみません。 http://oshiete1.goo.ne.jp/qa2690050.html
<訂正> 製作所B担当回数ControlSource =DBCount("*", "受注", "担当社員_ID=" & Me.担当社員_ID & " AND 担当製作所_ID=2")
<社員> ID_社員コード_所属___________氏名 ----------------------------- 1__101__________営業第一課_中村 太郎 2__102__________営業第一課_鈴木 健一 <製作所> ID_名前 1__製作所A 2__製作所B <受注> ID_日付____________品物____担当社員_ID_担当製作所_ID 1__2007/01/10_品物_A_中村 太郎____製作所A 2__2007/01/12_品物_B_ 鈴木 健一___製作所B ※[担当社員_ID]、[担当製作所_ID] はコンボボックスで[社員.氏名]、[製作所.名前]を表示。 このようなテーブル設計であれば、 (1)関連テーブルが不要。 (2)メインフォーム、サブフォームなどというややこしい作り込みも不要。 (3)担当回数も、ただ、製作所A担当回数.Query、製作所B担当回数.Queryを実行すれば良い。 製作所A担当回数.ControlSource =DBCount("*", "受注", "担当社員_ID=" & Me.担当社員_ID & " AND 担当製作所_ID=1") 製作所B担当回数ControlSource =DBCount("*", "受注", "担当社員_ID=" & Me.担当社員_ID & " AND 担当製作所_ID=1") と思いましたが・・・。
補足
ご回答ありがとうございます。 補足となるのですが、 ・一つの品物について1~3人で担当することがあるためサブフォームを作成しています。 ・社員テーブルでは、所属が変更となる場合があり、前の所属で担当した品物についての記録を残したいので、関連テーブルを使用してあります。 ・できれば社員コードを入力した時点で、社員氏名等の社員テーブルの内容を自動的に表示させたい (社員件数が多いためコンボボックスから社員氏名を探すのは面倒なので) 説明不足でした。。
こんばんわ。 やりたいことが書かれていないので・・・。 補足お願いします。
- p-applepie
- ベストアンサー率53% (156/290)
やりたい事はどの様な事でしょうか?
補足
やりたい事を書くのを忘れてました…。 すいません。 ◎やりたいこと 1.サブフォームに社員コードを入力した時点で、社員コードに該当する社員氏名などを 社員情報テーブルから自動的に入力させたい。(該当データが無い場合はそのまま入力) ※所属が変更となる場合があるので最新のデータを自動入力させたい。 2.メインフォーム「製作所コンボボックス」のデータ(「製作所A」または「製作所B」)を 参照して、サブフォーム内の「製作所A」または「製作所B」に担当回数を自動計算して 入力したい。(初めて担当のときは自動的に「1」を、2回目以降の時は前のデータを 社員情報テーブルから検索し、+1にして入力したい。) 3.「2.」のところで、製作所コンボボックスの選択が変更された場合に、担当回数を再計 算させたい。 (「製作所A」から「製作所B」に変更した時に、担当回数「製作所A」を-1、「製作所B」 を+1としたい) 4.レコードが削除された場合、自動的に担当回数を-1と再計算したい。 (例:4件のデータ中、2件目のデータが削除された時など) 以上の4つをやりたいのですが方法がわかりません。 ご回答よろしくお願いいたします。
お礼
ありがとうございました。 大変参考になりました!もっと自分で勉強しなければなりませんね…。 また何かありましたらよろしくお願いします。