Microsoft Access 掲示板

フォーム内容を複写する

11 コメント
views
4 フォロー

現在作成中の見積フォームについて
同じような内容の場合、複写したいと思っています。
(メインフォームに宛名、サブフォームに明細)

検索したところ、帳票内の複写はあったのですが、単票のものがあまり見当たりませんでした。

ベストな方法かどうかわからず、制作前におたずねしたいのですが、
追加クエリでカレントレコードのメイン、サブ共にオートナンバーのID部分以外を追加する。
といった感じで可能でしょうか。
ざっくりした質問で申し訳ありません・・・

ポンタ
作成: 2020/11/06 (金) 11:38:07
通報 ...
1
ポンタ 2020/11/06 (金) 16:35:16 0029a@1c915

追加クエリで対応しようとトライしていましたが、不可能な気がしてきました。
メインとサブがある部分で引っかかってしまいます。
どのような方法があるかご教示いただけると助かります。

2
hatena 2020/11/07 (土) 10:45:35 修正

追加クエリでカレントレコードのメイン、サブ共にオートナンバーのID部分以外を追加する。
といった感じで可能でしょうか。

それで可能ですよ。

まずは、メインの方を追加してから、サブを追加という順番になります。
メインを追加した後で、オートナンバーのIDの最大値(=追加したレコードのID)を取得して、
サブの外部キーの値にします。

下記のような感じのコードになります。

    Dim sSQL As String
    
    sSQL = "INSERT INTO メイン (フィールド1, フィールド2, ・・ ) " & _
           "SELECT フィールド1, フィールド2, ・・  FROM メイン " & _
           "WHERE 主キーフィールド=" & Me.主キーフィールド
    CurrentDb.Execute sSQL, dbFailOnError
    
    
    Dim maxID As Long
    maxID = DMax("主キーフィールド", "メイン")
    
    sSQL = "INSERT INTO サブ (" & maxID & ", フィールド1, フィールド2, ・・ ) " & _
           "SELECT リンクフィールド, フィールド1, フィールド2, ・・  FROM サブ " & _
           "WHERE リンクフィールド=" & Me.主キーフィールド
    CurrentDb.Execute sSQL, dbFailOnError
3
ポンタ 2020/11/09 (月) 08:01:13 f1ed8@377eb

ありがとうございます!クエリの中身までVBAで記載する勉強にもなりました。

4
ポンタ 2020/11/09 (月) 12:52:25 0029a@1c915

VBAを教えていただいたのですが、accessのクエリで作成してみようと思ったところつまづいてしまいました。
メインはうまく追加できるのですが、サブの追加クエリがエラーで止まってしまいます。
(エラーを飛ばしてメインだけ作成されたりもする)

INSERT INTO  サブ( フィールド1,フィールド2,… [DMax主キーフィールド", "メイン")], フィールド11 )
SELECT .サブ[フィールド1], サブ.[フィールド2],…, サブ.リンクフィールド, フィールド11
FROM サブ
WHERE (((サブ.リンクフィールド)=[forms]![メイン]![主キーフィールド]));

エラー内容
⇒INSERT INTO ステートメントに、認識できないフィールド'DMamx(・・・・)'があります。名前が正しいことを確認して、再度実行してください。

力不足で申し訳ありません。ご助言宜しくお願いいたします。

5
ポンタ 2020/11/09 (月) 12:57:50 0029a@1c915

コードに一部ミスがありましたので記載しなおします。
また、エラーもDMamxと記載してしまいましたが、DMaxの書き間違いです。スミマセン

INSERT INTO  サブ( フィールド1,フィールド2,… [DMax("主キーフィールド", "メイン")], フィールド11 )
SELECT .サブ[フィールド1], サブ.[フィールド2],…, サブ.リンクフィールド, フィールド11
FROM サブ
WHERE (((サブ.リンクフィールド)=[forms]![メイン]![主キーフィールド]));
6

[DMax("主キーフィールド", "メイン")]
の部分は、[]で囲まずに、
DMax("主キーフィールド", "メイン")
に修正してください。

[]で囲むとフィールド名して認識されます。

7
ポンタ 2020/11/09 (月) 16:06:34 0029a@1c915 >> 6

ありがとうございます。今回クエリで作ったもののSQLで、自動でカッコがついてしまっていたのですが、SQL画面で外そうとすると
「INSERT INTOステートメントの構文エラーです」と表示され、保存できませんでした。

8
ポンタ 2020/11/09 (月) 16:38:04 0029a@1c915

教えていただいたVBAで全て書き直したところ下記のエラーが出ます。

INSERT INTO ステートメントに、認識できないフィールド「11」があります。名前が正しいことを確認して、再度実行してください。

ちなみに11というのは maxIDと同じ値になっています。

9
ポンタ 2020/11/09 (月) 16:38:38 0029a@1c915 >> 8

ちなみにエラーが出るのは「CurrentDb.Execute sSQL, dbFailOnError」の最終行でした。

10

あー!すみません。コード間違ってました。
DMax は SELECT文の方にいれないとだめでした。

INSERT INTO  サブ( フィールド1,フィールド2,… リンクフィールド, , フィールド11)
SELECT サブ.[フィールド1], サブ.[フィールド2],…, DMax("主キーフィールド", "メイン"), フィールド11
FROM サブ
WHERE (((サブ.リンクフィールド)=[forms]![メイン]![主キーフィールド]));
11
ポンタ 2020/11/10 (火) 12:46:40 0029a@1c915 >> 10

VBA、クエリともバッチリうまくいきました。うれしいです!ありがとうございました。