1つのフォームから5つのテーブルに情報を登録する方法

このQ&Aのポイント
  • 1つのフォームから5つのテーブルに情報を登録する方法を教えてください。
  • 現在、5つのテーブルがあり、それぞれ品番、設備名に対する異なる情報が記録されています。
  • 新しい品番が追加された場合、設備名、単価、生産能力、材料使用名、担当者名のテーブル全てに新しい項目を追加する方法を教えてください。
回答を見る
  • ベストアンサー

アクセスで

アクセスで、テーブルが5つあり、1番テーブルは、品番、設備名一覧で、品番は重複しているものがありますが、品番と設備の組み合わせは1つしかなく、主キーが設定してあります。 2番テーブルは、品番、設備名に対する、単価、3番テーブルは、品番、設備名に対する生産能力、4番のテーブルは、品番、設備名に対する、使用材料名、5番のテーブルは、品番、設備名に対する担当者名になっています。この5つのテーブルをリレーションシップでつなぎ、クエリで、品番、設備名、生産能力、使用材料名、担当者名を表示しています。 それぞれ既に存在する品番、設備名に対するデータが変更になった時は、それぞれのテーブルの内容を変更するだけでいいのですが、新しい品番が追加になった時に、設備名、単価、生産能力、材料使用名、担当者名のテーブル全てに新しい項目を追加するのは大変手間がかかってしまいます。 そこで、1つのフォームから5つのテーブル全てに情報が登録される様にできますか? フォームで、新品番、設備名・・・を入力すれば、5つのテーブル全てに新品番が登録され、それぞれのデータが入力される様にするにはどの様にしたらいいでしょうか? 誰か教えて下さい。よろしくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#1、2です 補足がないですが、まとめてみました。 以下、やりたいことになっていなかったらスルーしてください。 ※ 試される時には、バックアップは忘れずに 1)クエリの作成 2)クエリをもとに表形式のフォームを作成 の順で記述します。 1)クエリの作成 テーブル名を1番~5番と略記します。 ・クエリをデザインから、1番~5番を表示します。 ・1番から各2番~5番へ矢印が向く結合線を「品番」「設備名」で設定します。 ・表示するフィールドを指定していきます(以下順でダブルクリック) 1番の「品番」「設備名」 2番の「品番」「設備名」「単価」 3番の「品番」「設備名」「生産能力」 4番の「品番」「設備名」「使用材料名」 5番の「品番」「設備名」「担当者名」 ・下に表示されているフィールド欄の重複している「品番」「設備名」を変更します。 テーブル欄が2番のは「T2_1: 品番」「T2_2: 設備名」 テーブル欄が3番のは「T3_1: 品番」「T3_2: 設備名」 テーブル欄が4番のは「T4_1: 品番」「T4_2: 設備名」 テーブル欄が5番のは「T5_1: 品番」「T5_2: 設備名」 ・クエリを「Q1」名で保存します。 2)クエリをもとに表形式のフォームを作成 クエリ「Q1」をもとに、フォームウィザードでフォームを作成していきます。 ・クエリ「Q1」を選択し、漢字部分を「>」ボタンで追加していきます。 (品番、設備名、単価、生産能力、使用材料名、担当者名) ・表形式で作成します。 ・フォーム名を決定し、編集で完了させます。 2-1)フォームの修正 ・プロパティを表示させ、 フォームの「レコードセット」を「ダイナセット(矛盾を許す)」に変更します。 ・フォームの「更新前処理」を[イベントプロシージャ]にし、右横の「・・・」をクリックします。 Private Sub Form_BeforeUpdate(Cancel As Integer) End Sub が表示されるので以下の様に記述します (2番~5番の主キーがオートナンバであると仮定) Private Sub Form_BeforeUpdate(Cancel As Integer)   If (IsNull(Me.品番) Or IsNull(Me.設備名)) Then     Cancel = True     Exit Sub   End If   If (Not IsNull(Me.単価)) Then     Me.T2_1 = Me.品番     Me.T2_2 = Me.設備名   End If   If (Not IsNull(Me.生産能力)) Then     Me.T3_1 = Me.品番     Me.T3_2 = Me.設備名   End If   If (Not IsNull(Me.使用材料名)) Then     Me.T4_1 = Me.品番     Me.T4_2 = Me.設備名   End If   If (Not IsNull(Me.担当者名)) Then     Me.T5_1 = Me.品番     Me.T5_2 = Me.設備名   End If End Sub 各テーブルに登録/更新する際に必要となる、「品番」「設備名」を設定します。 各テーブルに必要なものが入力されていたらという条件で設定しています。 「品番」「設備名」「単価」が入力されたとすると、1番、2番に設定されます。 3番~5番には、レコードは存在しません。 クエリを作成する時に2番~5番に別途主キーが設定されていたとして、 「T5_3: 主キー項目」の様に追加しておいたとすると、 登録時に主キーを生成する処理を盛り込むと、   If (Not IsNull(Me.担当者名)) Then     If (IsNull(Me.T5_3)) Then       Me.T5_3 = "XXXX" ' 主キーの設定     End If     Me.T5_1 = Me.品番     Me.T5_2 = Me.設備名   End If 「品番」「設備名」が入力されたら、無条件に2番~5番へレコード追加するのであれば (2番~5番の主キーがオートナンバであると仮定) Private Sub Form_BeforeUpdate(Cancel As Integer)   If (IsNull(Me.品番) Or IsNull(Me.設備名)) Then     Cancel = True     Exit Sub   End If   Me.T2_1 = Me.品番   Me.T2_2 = Me.設備名   Me.T3_1 = Me.品番   Me.T3_2 = Me.設備名   Me.T4_1 = Me.品番   Me.T4_2 = Me.設備名   Me.T5_1 = Me.品番   Me.T5_2 = Me.設備名 End Sub レコードセレクタを使って削除すると、全テーブルから削除されます。 2番~5番の「品番」「設備名」が主キーになっているのなら、#1で書いたように 1番から各2番~5番の「品番」「設備名」に矢印が向く結合になっていれば、 > 品番、設備名、単価、生産能力、使用材料名、担当者名をクエリ表示する時には、 > 品番、設備名は、1番テーブル、他は各テーブルからのものにします。 のクエリだけで各2番~5番の「品番」「設備名」は設定されます。 (2番~5番の主キーがオートナンバであると仮定した場合) ただし、例えば「担当者名」をNULLにすると、5番の「品番」「設備名」は残ります。 残った時の処理は同じように(以下)しないとだめだと思います。 更新の時に、表示されたものをNULLにすると、そのテーブルには、 「品番」「設備名」のみのものが残ることになります。 (指定した部分はNULLに更新されます) 例えば、5番「担当者名」に記述していたものを、NULLにすると、 担当者名がNULLの、「品番」「設備名」が残ることになります。 一対多ということなので、単純に削除してよいものかわかりませんが、削除するとしたら フォームの「更新後処理」イベントに記述します。 Private Sub Form_AfterUpdate()   Dim sSql As String   Dim iPos As Long   Dim bDel As Boolean   bDel = False   If (IsNull(Me.単価) And (Not IsNull(Me.T2_1))) Then     sSql = "DELETE * FROM 2番 WHERE 品番='" & Me.T2_1 _          & "' AND 設備名='" & Me.T2_2 & "';"     CurrentProject.Connection.Execute sSql     bDel = True   End If   If (IsNull(Me.生産能力) And (Not IsNull(Me.T3_1))) Then     sSql = "DELETE * FROM 3番 WHERE 品番='" & Me.T3_1 _          & "' AND 設備名='" & Me.T3_2 & "';"     CurrentProject.Connection.Execute sSql     bDel = True   End If   If (IsNull(Me.使用材料名) And (Not IsNull(Me.T4_1))) Then     sSql = "DELETE * FROM 4番 WHERE 品番='" & Me.T4_1 _          & "' AND 設備名='" & Me.T4_2 & "';"     CurrentProject.Connection.Execute sSql     bDel = True   End If   If (IsNull(Me.担当者名) And (Not IsNull(Me.T5_1))) Then     sSql = "DELETE * FROM 5番 WHERE 品番='" & Me.T5_1 _          & "' AND 設備名='" & Me.T5_2 & "';"     CurrentProject.Connection.Execute sSql     bDel = True   End If   If (bDel = True) Then     iPos = Me.Recordset.AbsolutePosition     Me.Requery     Me.Recordset.AbsolutePosition = iPos   End If End Sub 「品番」「設備名」をテキスト型とした時の例です。 各入力項目がNULLで、品番にあたる部分がNULLでなかったら、削除します。 部分的に削除が行われると、フォーム上の表示は #Deleted になるので、Requery します。 単純に Requery すると、表形式のために表示は先頭に戻ります。 Requery しても操作をした行から外れないように、後半の If (bDel ・・・ 部分で処理します。 クエリを作成する時に2番~5番に別途主キーが設定されていたとして、 「T5_3: 主キー項目」の様に追加しておいたとすると、   If (IsNull(Me.担当者名) And (Not IsNull(Me.T5_3))) Then     sSql = "DELETE * FROM 5番 WHERE 主キー項目='" & Me.T5_3 & "';"     CurrentProject.Connection.Execute sSql の様にも変形できます。(主キー項目がテキスト型だった場合) ※※ 一対多といっても、各2番~5番内で「品番」「設備名」が重複しない場合のものです。 各2番~5番内で重複する場合は、1番が親フォーム、2番~5番が各サブフォームで、 リンク親/子フィールドに「品番」「設備名」を設定します。 前述同様に2番~5番の更新前処理で、それぞれの主キーを設定する記述が必要になります。 この親子フォームの作成手順が必要であれば、補足してください。 (親子フォームも1つのフォームと思いますので)

doradora64
質問者

お礼

丁寧な回答本当にありがとうございます。 只今、出張先でして、一通り読ませて頂きましたが、帰ってから実行してみたいと思います。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> リレーションシップは1対多になっています 1番、2番テーブルのサンプルを載せてもらえませんか。 2~3件でも 2番テーブルの主キーはどのようなものに設定されていますか。 できれば他の3番~5番テーブルも

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

1番テーブルから、2番~5番テーブルへのリレーションシップ設定はどのようになっていますか。 (一対一の関係でしょうか) リレーションシップは、1番テーブルから2番~5番テーブルへ矢印が向く設定にします。 品番、設備名、単価、生産能力、使用材料名、担当者名をクエリ表示する時には、 品番、設備名は、1番テーブル、他は各テーブルからのものにします。 品番、設備名、単価を設定し登録すると、1番、2番テーブルのみに登録されます。 後で、担当者名を入力すると、5番テーブルにのみ追加されます。 1番テーブルにあっても、2番~5番の各テーブルに無いものは空欄になります。 (空欄=そのテーブルにレコードがないことになります) > フォームで、新品番、設備名・・・を入力すれば、5つのテーブル全てに新品番が登録され、それぞれのデータが入力される様にするにはどの様にしたらいいでしょうか? 上記クエリをレコードソースとするフォームとします。 動きとしては前述の様になりますが、必ず全テーブルに登録したいのであれば、 空欄を作らないように「既定値」を設定しておきます。 (単価、生産能力、使用材料名、担当者名の各既定値に)

doradora64
質問者

補足

1番のテーブルが品番、設備名の2つを主キーにしているので、リレーションシップは1対多になっています。 このままでは無理でしょうか?

関連するQ&A

  • アクセスのフォームで

    アクセスのフォームで、この様に、"品番"、"設備名"、"単価"、"担当者"のテーブル(1000レコードほどあります)のフォームがあります。 このフォームを開いた時には、1レコード目が表示されますが、下に一覧が全て表示(100以上は次のページ)され、検索フォームに品番、又は、設備名を入力すると、絞りこまれて表示される様にできますか? 又、下の一覧の担当者の右に"編集ボタン"を置きボタンを押すと、左のデータを編集できる様に(編集は上のフォームで行う)できますか? 説明がへたくそで申し訳ありませんが、誰か教えて頂けませんか? よろしくお願いします。

  • Access2003にて・・・

     こんにちは。Accessにて、詰まってしまいまして、お知恵をお借りできればと思っています。よろしくお願いします。 Access2003 にて テーブルAには、 品番、品名、単価の3つのフィールドがあります。 このテーブルをもとにして、フォームAを単票形式で作成しました。 このフォームを、品番を登録したりするためではなく、品名や単価の確認用として使用したいと考えています。そこで、「品番」コントロールに品番を入力すると、あとの2つのコントロールに自動でデータが表示されるようにできればいいな、と思いました。  「品番」コントロールはコンボボックスに変更し、テーブルAの品番から値を取得するよう設定し、ここを入力したあと更新後処理であとの2つのコントロールに値を表示するような設定をするのかな、というところまで至って、はてここにどのような処理を書き込めばいいのかで詰まってしまいました。  このやり方がそもそも間違っているのかもしれません。テーブルをもとにするのではなく先にクエリを作っておくのがいいのかもしれませんが、自分なりにいろいろ試してみたのですが、なかなかうまくいかなくて…  何か方法はありますでしょうか?他にここへ組み込むサブフォームやら、別のフォームを表示させるボタン等考えているのですが、上記の方法ができるかできないかでフォームAのつくりを変えようと思っているので、とりあえずは必要と思われることだけ書きました。言っていただければどんどん補足させていただきますので、何か方法がございましたらご教授お願いいたします。 (ちなみに、私のAccessレベルは初心者でございます…)

  • Accessのクエリで2

    お伺い致します。 テーブル名:テーブルA  フィールド:月日,販売先,品番 テーブル名:テーブル期間  フィールド:分類、始月日、終月日 テーブル名:材料テーブル  フィールド:品番,材料1,材料2, 分類 の3テーブルが有り ”テーブルA”の月日の違いで”テーブル期間”の分類を表示させた後 現在品番と分類で材料1、材料2の使用量をクエリで以下のように表示 クエリ名:Q_テーブルA 月日,販売先,品番, 材料1, 材料2 0501,東京販売,18-18, 270, 180...材料の使用量は月日と品番で決まる、 1105,仙台販売,18-21, 290, 190 0801,大阪販売,21-21, 300, 190 0907,東京販売,27-18, 350, 175  ここでお伺いしたい事は 材料テーブルの事ですが実際は品番が30種類、材料が10種類の300データに及び それに期間による材料テーブル1と2の2種類あります 各々の表はエクセルで計算させインポートさせた後ユニオンクエリで一緒にし テーブル作成クエリで”材料テーブル”を作成するという事をしていますが。 そのまま、テーブル1とテーブル2を月日の違いによる分類1,2でスイッチさせて クエリ”Q_テーブルA”を作成する方法が有りませんでしょうか 簡単に出来ると思いつつも良い方法が浮かばず回り道しています。 よろしくお願い致します。

  • アクセスで

    アクセスで添付したデータの様にするにはどの様にしたら良いですか? 1つ目(右上)は品番ごとの"数量"と"生産数"の合計の出し方。 2つ目(右下)は品番と設備名の組合わせで"数量"と"生産数"の合計の出し方を教えほしいです。 よろしくお願いします。

  • Accessの計算について

    いつもお世話になっております。 Access2002で、以下のような計算って出来るのでしょうか? <材料テーブル> ID|材料名|単価 1|木  |200 2|紙  |100 というテーブルがあり、コンボボックスで選んだ場合に材料テーブルのIDの値をmasterテーブルに以下のように格納させたいと思ってます。 <master> ID|数量| 1| 1| 2| 1| すなわち、masterテーブルには材料テーブルで選択したIDの値が挿入されるのですが、masterテーブルに挿入されたIDを元に、材料テーブルの単価を参照させて計算させると言うことです。 すなわち計算式は、ファームで合計欄という非連結のテキストボックスを作って、その中に、計算式を入れて計算させるということです。 合計=単価*数量 って具合です。実際は、masterテーブルに入っている値はIDなので、それをどうにかして、masterに入っているIDを元に単価を参照させて、フォーム上で計算させたいという風にしたいのですが・・・ よろしくお願いいたします。

  • アクセスのフォームで抽出したデータに追加をしたい。

    アクセスのフォームで抽出したデータに追加をしたい。 はじめまして。アクセスの初心者ですが、どうぞお願いいたします。 添付のシートのようなアクセスのフォーム画面があります。これの前に、別のフォームで ORDER NO. 品番、数量、、、など、入力し終わっているので、その入力したデータがテーブルに入っています。 ここのフォームでは、ORDER NOを入力し、さきほど入力してテーブルに入っている品番数量などのデータを呼び出すようになっています。(私が作ったシステムではないのですが、抽出するためのクエリと結びついているようです) ここの画面において、たとえば、もう一つデータを加えたいとき、(この添付の画面で言えば、4番目のデータを付け加えたいとき)どうすればいいのでしょうか。 たとえば、品番、数量などだけ入力したところで、テーブルにデータは反映されません。 1,2,3番までのデータには、さきほど申しましたように、ORDER NO.も含めて前の画面で入力済み(テーブルに入っています)から、大丈夫ですが、それ以降のデータを付け加えるとなると、ここの画面でもひとつひとつORDER NOも入力しないと、テーブルに追加されなくなります。 添付したシートの右のほうに(ORDER NO)とあると思うのですが、1,2,3までのデータには、この欄にORDER NOが表示されます。だから、更新可能です。4番以降、追加したかったら、ここにひとつひとつORDER NOを入力しなければテーブルに反映されません。つまりお尋ねは、4番、5番のデータを入力したときに、この(ORDER NO)のところに自動的にORDER NOが入力され、そしてテーブルにデータが入るようになるにはどうしたらよいのでしょうか。 というのも、以前はそうなっていたのですが、私が一度ここのフォームをいじってしまったためこのような不具合が起こってしまったのです。しかし、私がさわった(一度消してしまった)のは、この(ORDER NO)のところだけですので、ここさえ直せば、今のトラブルは解消できるものと思います。 どなたか、説明が下手で申し訳ありませんが、助けてください。

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • accessのクエリについて

    テーブル1のフィールド ・品番 ・期間 ・生産数 テーブル2のフィールド ・品番 ・期間 ・使用数 上記のようなテーブルをもとに、品番と期間が一致した場合に生産数 - 使用数 を表示出来るようなクエリは作成できますでしょうか? 出来るなら,どのようにすればよいでしょうか? おわかりになられる方がいらっしゃいましたらご教授お願い致します。

  • アクセスで…、クエリの作り方のなのでしょうか?

    こんにちは、お世話になります。 料理のレシピみたいな物を、製品名と原材料名にコード番号をつけて管理し、ある材料を使用している製品を検索できるようにしたいと考えています。 そこで製品テーブルと原材料テーブルを作って、メインのフォームで製品名とコード番号、サブフォームにはその製品の原材料とコード番号が表示され、コード番号を入れると 原材料名が自動入力されるようにはなりました。 ところが、ほとんどの製品が違う製品を材料としているため、原材料テーブルだけでは対応できません。 新たに、使用している製品のみを別に表示するサブフォームを作ってはみましたが、製品テーブルを参照すると、メインフォームに表示されている物が自動的に入力されてしまいます。 こちらのサブフォームの中でもコード番号を入れるとそれに対応した製品名が入るようにしたいのですが、どうしたら良いのでしょうか? よろしくお願いします。

  • アクセスのサブフォームが編集可能な状態で表示されない

    ■バージョン:Access2003 ■使用経験:Accessはつい最近使い始めたばかりで、初心者レベルです。    (ヘルプ及びいくつかのサイトを参考にしながら使っています) ■質問内容:   データをテーブルに登録するためのフォームを作ろうとしています。   登録するテーブルは、商品テーブルと商品明細テーブル(1対多)のヘッダ明細型です。   まず始めに商品テーブルへデータを登録するフォームを   クエリを使用してウィザードで単票形式で作成しました。   次に、商品明細テーブルへデータを登録するフォームを   クエリを使用してウィザードでデータシート形式で作成しました。   次に、始めに作った単票形式のフォームに、2番目に作ったデータシート形式のフォームをサブフォームとして組み込みました。        その後、デザインビューからフォームビューに切り替えたところ、   単票形式にした1つめのフォームは入力できる状態になっているのですが、   サブフォームとして組み込んだデータシートビューのほうが   列のヘッダ(「商品名」等の列タイトル)しか表示されておらず、   入力できるような白いセルが表示されません。   (列タイトルの下は一面グレーとなっています。    デザインビュー上では登録したい項目が全て表示されています。)   関係あるのか不確かですが、サブフォームのプロパティで   「フォームビューの許可、更新の許可、追加の許可、データ入力用」などは「はい」にしてあります。   サブフォームのデータシートにデータを入力できるようにするには   どうしたらよいのでしょうか。   入力できなくなってしまう原因がテーブル構造等にあるのでしたら、   テーブルの構造をもう少し詳しく書かせて頂こうと思います。   何卒よろしくお願い申し上げます。

専門家に質問してみよう