Microsoft Access 掲示板

メインとサブのテーブルにデータ追加可能?

19 コメント
views
4 フォロー

メインテーブルにはオートナンバーのIDと日付やその他があり、サブテーブルにはメインとの連結用ID、オートナンバーの明細ID、品目、その他があります。サブにだけデータを追加するには追加クエリーで出来るのですが、一度にメイン、サブに追加がしたい時があります。例えば他のフォームの非連結データを新規レコードにコピーするイメージです。どうすれば可能か分からないのです。

マスオ
作成: 2023/11/16 (木) 08:42:49
通報 ...
1
hatena 2023/11/16 (木) 11:12:43 修正

メインに追加してから、サブに追加という2段階ではだめなんですか。

メインのIDがオートナンバー型でインクリメントなら、最大値が新規IDということになります。

2
マスオ 2023/11/16 (木) 12:19:00 ddfe5@f146b

hatenaさん ありがとうございます。2段階でも全然OKなのですが、それはコマンドボタン1つで可能でしょうか?

3

可能です。
下記はVBAで追加クエリのSQLを実行する場合のコード例です。

Private Sub 追加_Click()
    Dim stSQL As String, mainID As Long
    
    'メインテーブルへの追加クエリのSQL
    stSQL = "INSERT INTO メインテーブル (フィールド1, フィールド2) " & _
            "VALUES ('" & Me.テキスト1 & "','" & Me.テキスト2 & "');"
    CurrentDb.Execute stSQL, dbFailOnError '追加クエリの実行
    
    mainID = DMax("メインID", "メインテーブル") '追加したレコードのメインID取得
    
    'サブテーブルへの追加クエリのSQL(1レコード目)
    stSQL = "INSERT INTO メインテーブル (メインID, フィールド1, フィールド2) " & _
            "VALUES (" & mainID & "'" & Me.テキスト3 & "','" & Me.テキスト4 & "');"
    CurrentDb.Execute stSQL, dbFailOnError '追加クエリの実行
    
    'サブテーブルへの追加クエリのSQL(2レコード目)
    stSQL = "INSERT INTO メインテーブル (メインID, フィールド1, フィールド2) " & _
            "VALUES (" & mainID & "'" & Me.テキスト5 & "','" & Me.テキスト6 & "');"
    CurrentDb.Execute stSQL, dbFailOnError '追加クエリの実行

End Sub

詳細が不明なので、テーブル名、フィールド名、コントロール名は適当ですので雰囲気だけつかんで、あとは状況に合わせて改修してください。

4

下記はDAOを使って新規追加する場合のコード例です。
こちらの方が分かりやすいかもしれません。

Private Sub 追加_Click()
    Dim rs As DAO.Recordset, mainID As Long
    Set rs = CurrentDb.OpenRecordset("メインテーブル", dbOpenTable, dbAppendOnly)
    rs.AddNew
    rs!フィールド1 = Me.テキスト1
    rs!フィールド2 = Me.テキスト2
    mainID = rs!メインID
    rs.Update
    rs.Close

    Set rs = CurrentDb.OpenRecordset("サブテーブル", dbOpenTable, dbAppendOnly)    
    rs.AddNew
    rs!メインID = mainID
    rs!フィールド1 = Me.テキスト3
    rs!フィールド2 = Me.テキスト4
    mainID = rs!メインID
    rs.Update

    rs.AddNew
    rs!メインID = mainID
    rs!フィールド1 = Me.テキスト5
    rs!フィールド2 = Me.テキスト6
    mainID = rs!メインID
    rs.Update
    rs.Close

End Sub
5
マスオ 2023/11/17 (金) 08:55:09 ddfe5@f146b

hatenaさん丁寧な解説ありがとうございます。SQL、DAOで直接した事はなくチャレンジしてみたいと思いますが、因みに手始めに追加クエリをメイン用、サブ用を用意してクエリ実行でも可能でしょうか?(すみません)

6

可能です。
サブ用の方は、メインの新規IDが必要になりますので、そこはDMax関数で取得することになります。

7
マスオ 2023/11/21 (火) 13:12:08 ddfe5@e6213

hatenaさんへ 追加クエリではなく教えて頂いたDAOでしました。追加は出来たのですが、サブには1レコードづつなのですね? 40レコード程あるのですが、(メイン1つに対して)一括では出来ないのでしょうか? (知識不足ですみません)
あとついでにお聞きするのですが rs.Close の後は Set rs = Nothing と記述した方がいいのでしょうか?

8

40レコード程あるとのことですが、非連結フォームなんですよね。
40レコード分の非連結コントロールがあるということですか。

それとも一時テーブルをレコードソースとするサブフォームが埋め込まれているとか。

9

あとついでにお聞きするのですが rs.Close の後は Set rs = Nothing と記述した方がいいのでしょうか?

プロシージャを抜ければ、自動で廃棄してくれますので、なくても問題ないです。(あっても問題はないですが。)

プロシージャが長くて、途中で使用済みになったというようなときに、使用済みということを明確にするために、
Set rs = Nothing とするということはありえます。

10
マスオ 2023/11/21 (火) 17:44:09 2952d@962d7

hatenaさん すみません40件程のレコードは非連結というか、あるテーブルに保存されたものです。そのテーブルを加工したクエリがありそれを基に作成したリスト形式のフォームがあります。そのフォームにはサブフォームはありません。金額等の数字だけを入力してまして(項目は固定)それを別テーブルに追加する形です。追加先は日々の処理用でメインが日付や他の項目、サブに必要な項目や金額等が入ります。そのリスト型フォーム上のデータをコマンドボタンで追加したいのです。

11

hatenaさん すみません40件程のレコードは非連結というか、あるテーブルに保存されたものです。そのテーブルを加工したクエリがありそれを基に作成したリスト形式のフォームがあります。

非連結という言葉の意味を誤解しているようですね。
フォームがテーブルと連結してたら非連結とはいいません。
VBAでするならForループでレコード件数分繰り返せはいいでしょう。
ただ、テーブルがあるのなら追加クエリの方が楽です。

どのような意味で「非連結」という言葉を使ったのでしょうか。

12

金額等の数字だけを入力してまして(項目は固定)それを別テーブルに追加する形です。追加先は日々の処理用でメインが日付や他の項目、サブに必要な項目や金額等が入ります。そのリスト型フォーム上のデータをコマンドボタンで追加したいのです。

それぞれのテーブル名、フィールド構成、を提示して、
それぞれのデータ例を提示して、
どのような結果が欲しいのか説明してもらえますか。

13
マスオ 2023/11/22 (水) 09:32:14 ddfe5@e6213

hatenaさん情報不足で色々すみません。非連結の認識は勘違いしてました。対象のフォームに直接関係ないイメージでとらえてました。今回の関連するテーブル構成としては下記になってます。
①処理メイン:メインID、日付、伝票番号、その他項目  ②処理サブ:サブID、品目A、品目B、金額A、金額B、メインID、その他の項目 *品目と金額入力欄が各2ヶ所あり  ③品目一覧:品目ID、品目名、繰越金額、グループID  ④グループ一覧:グループID、グループ名
社内用財務関係のファイルです(作成途中)。
特定の品目に繰越金額を入力して(半年毎)、それを処理メイン、サブに追加したいのです(日付設定は任意)。但し品目のグループにより品目A・金額Aに入るか品目B・金額Bに入るかの切り分けがあります(繰越時)。
③の品目一覧テーブルを基に特定の項目に対する繰越金額を入力できるフクエリを作成しました。入力したら品目A・金額A、Bに切り分ける為にIIFで処理してます。入力し易い様にこのクエリを基にリスト型フォームを作成し、処理メイン、サブに追加できるコマンドボタンを用意したいのです。
●繰越入力イメージ
品目  繰越   IIFにて切り分け    ★フォームには任意の日付欄と伝票番号(共に非連結)
 あ  1000 ⇒ 品目A・金額A
 い  500  ⇒ 品目B・金額B 
●処理イメージ(メイン)
日付  伝票番号
3/31   0000
●処理イメージ(サブ)
品目A 金額A   品目B・金額B
あ   1000
          い   500

1レコードづつ追加は教えて頂いたDAOコードで出来ましたのでそれに繰り返し処理が出来たらいいかなと思ってます。
でもそれはどうやってしたらいいか分からなくて。
お手数かけます。

14
りんご 2023/11/22 (水) 09:54:56 935bc@0e907 >> 13

>●処理イメージ(サブ)
品目A 金額A   品目B・金額B
あ   1000
          い   500

但し品目のグループにより品目A・金額Aに入るか品目B・金額Bに入るかの切り分けがあります

下記のようにしない理由は?
●処理イメージ(サブ)

品目金額グループ
1,000A
500B
15
マスオ 2023/11/22 (水) 10:35:58 ddfe5@e6213

りんごさん 財務の振替の様なもので伝票に記入するイメージで直感的にそれに沿った処理フォームにしています。実際は
品目A 金額A   品目B・金額B
あ   1000    繰越  1000
繰越  500     い   500
で金額AとBの合計値は合致させる必要があります。(繰越入力フォーム基のクエリでこうなる様にしてます)
繰越時はA・Bどちらかになるかは決まってますが日々の処理ではどちらかになるかはランダムなのです。
これも説明不足でした(すみません)。

16
りんご 2023/11/22 (水) 11:17:36 935bc@0e907 >> 15

品目A 金額A   品目B・金額B
>あ   1000    繰越  1000
>繰越  500     い   500

要するにこういう事?

品目日付金額区分
1,000入庫
500振替出庫
500振替入庫
17
マスオ 2023/11/22 (水) 11:40:35 ddfe5@e6213

りんごさん イメージとしてはそんな感じですが、日付や取引先(Nullの場合あり)・伝票番号・その他テキストはメインテーブルにしてます。サブにはA、Bの品目・金額は両方とも入力必要で(相対品目として)、繰越入力の時は説明した通りの決まった切り分けとなります。

18
りんご 2023/11/22 (水) 12:00:44 935bc@0e907

サブにはA、Bの品目・金額は両方とも入力必要で(相対品目として)、繰越入力の時は説明した通りの決まった切り分けとなります。

 品目の相対関係を管理するテーブルを別に作らないの?
 まずは、きちんと正規化しておかないと、質問して完成しても、設計が杜撰だから破綻している、捨てて下さいとなるだけですよ。残念ながら。

19
マスオ 2023/11/22 (水) 12:18:40 ddfe5@e6213

りんごさん相対関係は最初作ろうと思ってたのですが内容的にお互い全てが対象となりますので不可なのです。品目はコンボで選択する形になっており、よくあるパターンとして絞り込みは出来る様にしているのです。