質問: 請求書データを入力するフォームがあります。 メインフォームとサブフォームで構成されており、 メインに入力された内容はテーブルAに、 サブに入力された内容はテーブルBに保存されます。 入力されたレコードはそれぞれのテーブルにある フィールド「請求NO」をキーとして紐づけています。 この請求書データの中で、毎月同じ内容で発生する請求データがあるのですが、 現状、毎月同じ内容のデータ都度入力しているので、この入力を簡略化したいと考えました。 (※請求日、請求NOは変わります) すでに入力されているレコードをコピーし、 発行日と請求NOだけ変更しようとしたのですが、 コピーしたデータは、請求NOを変更しようとすると サブフォームの請求内容が消えてしまい、結果、再度入力が必要になってしまいました。 また、新たにテーブルと追加クエリを作成、実行してみたのですが、 テーブルBに対して実行した際、エラー(キー違反)で出来ませんでした。 追加クエリでは追加先のテーブルのフィールド全てを設定しました。 追加用のテーブルのレコードは1件で、1件のキー違反、他は0でした。 クエリに設定するフィールドを1つずつ全て試してみたのですが、 全てキー違反となってしまい、どれが違反しているのか特定できませんでした。 ここまでが現状です。 方法としては、 1入力済のレコードを利用する 2追加クエリを利用する 3Excel等のファイルをインポートする 等、 やりようはあると思うのですが、 どれが良いか、またどうやればいいのかが分からず困っております。 拙い言葉足らずな説明かもしれませんが、お分かりになる方がいましたら お力添えいただけますでしょうか。 どうぞよろしくお願いいたします。 ・入力フォーム ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/254608b65e4ab5c64b6bf2670c1758e2.png) ・テーブル構成 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/5d2da0175fed076d16aeb602f51b4e3f.png) ※テーブルBの「印刷日」は印刷実行時に値が入る為、フォームに項目はありません。 画像1 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/02fef45c88152e50abbe3f0ded82a089.png) 画像2 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/530f539c46801992b3f0ce25eddd116b.png) 画像3 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/f834ca2dd7fccfd7c6bb82adcb33cdc2.png) 画像4 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/8dd08276d4fd6688fcda3780596fb309.png) 画像5 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/76bcbd3ef6278bfb9c177574c3920ae2.png) 画像A ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/208d47a28507d503a6635f37977b1828.png) 画像B ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/7f8f74ec6d8f61236d4911e5a0d8255b.png) 画像C ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/0c423c1896e09261894ded87f09a668f.png) 画像D ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/3d59d36b5e2596b61a09d783328e922f.png) 画像E ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/e7f9e85a9abeaba07b3cc54ec73ce2f4.png) 画像F ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/ce768364deaeb5f60909bf60c356f4e2.png) 画像G ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/97cfa349534999ab139754c16c4a8bac.png) 画像H ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/efac307fe1cb334baf15c18b4a33a7f6.png) 画像I ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/ca07358d897eb071b943a52d7a397c50.png) 画像J ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/e86495dae654ef51aac67df35ee14a2a.png) 画像K ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/4bb7c048cc788dd5a6dfd34a935a1961.png) 画像L ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/a8cc1d6f9da0d3536019dc7b0f9d43e0.png)
回答: > > すでに入力されているレコードをコピーし、発行日と請求NOだけ変更しようとしたのですが、 > > > どのような方法でコピーしましたか? > > コピーしたデータは、請求NOを変更しようとすると > > サブフォームの請求内容が消えてしまい、結果、再度入力が必要になってしまいました。 > > > サブフォームが表示されている状態から請求Noの入力によりサブフォームが消えるという状況から判断するとコピーはされていなくて、表示しているデータの請求Noの修正を行っていることになり、該当する明細が無いので、表示が消える状況だと思われます。 この状況は、テーブルAとテーブルBの請求Noのリンクが切れている状態だと思いますので、データは確認されて下さい。 参照作成を行いたい場合、テーブルAとテーブルB両方のコピーを行います。 具体的にはコピー元の請求Noを条件にして、ID以外のコピーしたい項目を追加します。 ※その際、請求Noは新しいものである必要があります。 追記 概要 コピーボタンで、表示している請求データと請求明細データをコピーを行う。 1.コピー元は画面上の請求NOを用いる。 2.追加はクエリーで行う。 2.1.コピー元条件は画面の請求NOを使用する。 2.2.コピー先の請求NOはテーブルAの最大値+1 3.コピー完了後に、画面上の請求NOにテーブルAの請求NOの最大値を設定し、コピー先を表示する。 ※以下画面や項目の名称を以下と仮定しているので、実際の名称に適宜合わせて下さい。 請求データ入力画面=F請求データ入力 請求データ入力画面の請求NO=コンボ_請求NO クエリー コピーする項目は想定して設定しているので、請求NO以外は過不足があれば変更して下さい。 ※IDは追加しないこと。 クエリー名:Q_請求データ追加 ``` INSERT INTO テーブルA ( 請求NO, 取引先コード, 部門, 業務件名 ) SELECT (SELECT Max(請求NO) FROM テーブルA)+1 , 取引先コード, 部門, 業務件名 FROM テーブルA WHERE 請求NO=[Forms]![F_請求データ入力]![コンボ_請求NO]; ``` クエリー名:Q_請求明細追加 ``` INSERT INTO テーブルB ( 請求NO, 内容, 数量, 単価, 備考 ) SELECT (SELECT Max(請求NO) FROM テーブルA)+1 , 内容, 数量, 単価, 備考 FROM テーブルB WHERE 請求NO=[Forms]![F_請求データ入力]![コンボ_請求NO]; ``` ・作成タブ⇒クエリデザイン(テーブルの表示は何も選択せず閉じる)⇒右クリックでSQLビューを選択 この状態で上記のSQLを元に変更(実際のテーブル名や請求NOの画面上での名前など)したものを貼り付けて、 クエリーに名前を付けて保存してください。 ※修正後にエラーが無ければ、デザインに戻すことができます。 コード コピーボタンのクリック時イベントに割り当てられているコードを以下に差し替えし、テーブル名や請求NOの名前を実際のものに変更して下さい。 ※マクロの呼出はではなくイベントプロシージャに変更して下さい。マクロ自体の変更は不要です。 ``` On Error GoTo Err_コピー_Click DoCmd.SetWarnings False 'メッセージの表示 無効 DoCmd.OpenQuery "Q_請求明細コピー" DoCmd.OpenQuery "Q_請求データコピー" DoCmd.SetWarnings True 'メッセージの表示 有効 Me.Requery '再表示 Me.Recordset.FindFirst "請求NO=" & DMax("請求NO", "テーブルA") 'コピー先の請求NOへ移動 Exit_コピー_Click: Exit Sub Err_コピー_Click: MsgBox Err.Description Resume Exit_コピー_Click ```