プロが教える店舗&オフィスのセキュリティ対策術

Access2003にて、メインフォーム上に設置した「コピー」ボタンをクリックすると、メインフォームとサブフォーム9個のレコードを一括で新規レコードにコピーするVBAを作成しています。
ですが、ボタンをクリックすると、
「3164
 フィールドを更新できません」
とメッセージが表示されて、メインとサブ1だけがコピーされ、サブ2~9はコピーされません。

テーブルの構成は以下のようになっています。
メイン(テーブル名:00メイン)
 ・計画書番号(オートナンバー型)※主キー
 ・コピーフラグ(数値型)
 ・コピー実行日(日付型)
 ・作成フラグ(数値型)
 ・作成日(日付型)
 ※この他40程フィールドがあります。

サブ1~9(テーブル名:01~09サブ)
 ・計画書番号(長整数型)※インデックスは「はい(重複なし)」
 ・レコード作成用番号(長整数型)
 ※この他各サブテーブルごとに、20~40程のフィールドがあります。

サブ1~9の計画書番号はメインの計画書番号とリレーションシップしています。

サブフォームに計画書番号を表示するようにしてみると、コピーボタンをクリックしたときサブ2だけがメインで取得した新しい計画書番号が表示されていて、サブ2~9はコピー元の計画書番号が表示されています。
以下にコピーボタンをクリックした時のコードとBeforeUpdate時のコードを記載します。

また、「Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No」の箇所はメインの新規作成時にサブ1~9にレコードを作成するようにしています。
(メイン作成と同時にサブにもレコードを作成したかったので・・・)

サブ2~9までのコピーができるようにするにはどうしたらよいのでしょうか?
よろしくお願いいたします。

Private Sub cmdコピー_click()

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdPasteAppend

Me!コピーフラグ = 1
Me!コピー実行日 = Date

Me!サブ1.SetFocus
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdPasteAppend

Me!サブ2のサブフォーム.SetFocus
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord , , acNewRec
DoCmd.RunCommand acCmdPasteAppend

※以下サブ3~9までサブ2と同じコードを記述しています。

MsgBox "レコードのコピーが完了しました。"
End Sub


Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim dlgret As Integer

dlgret = MsgBox("編集内容を保存しましすか?", vbQuestion + vbOKCancel, "保存確認")

If dlgret = vbCancel Then
Cancel = True

Else

'新規作成の場合、作成日フラグは既定値0のため1に変更
If Me!作成フラグ = 0 Then
Me!作成フラグ = 1
Me!作成日 = Date

If Me!コピーフラグ = 1 Then
Forms!メイン!サブ1.Form.Requery
Forms!メイン!サブ2.Form.Requery
※サブ3~9も同様にRequeryを行ないます。
Else
MsgBox "コピーフラグは" & Forms!メイン!コピーフラグ & "です。" & Chr(13) & _
"新規作成を実行します。"""
Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No
Forms!メイン!サブ2.Form.レコード作成用番号 = Me.txt計画書No
※サブ3~9も同様に処理します。
End If

Else

End If
End Sub

A 回答 (4件)

>Me!サブ2のサブフォーム.SetFocus


>DoCmd.RunCommand acCmdSelectRecord
>DoCmd.RunCommand acCmdCopy
>DoCmd.GoToRecord , , acNewRec
>DoCmd.RunCommand acCmdPasteAppend

ここに記載されている箇所でエラーが出ていますか?。

追加更新としているテーブルは、更新(追加)できる状態ですか?。
追加しようとしているレコードをコピーできていますか?。
空値にはなってないですか?。

こういうところから探ってみてはどうでしょうか?。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

おっしゃられた内容を確認してみます。
マルチポストをしてしまったので、こちらでの質問は閉じさせていただきます。

せっかくのご回答いただき、誠に申し訳ございませんでした。

お礼日時:2010/08/26 10:46

リレーションシップ定義はどうなってますか。


記述はよくても制約で更新できないケースでは?。

ほかにコピー時用テーブル用意して後で本体に追加クエリではダメでしょうか?。
    • good
    • 0

では、閉じられる前に



あの質問を見てから、もわ~んと考えていました。


情報が足らない様な気がします。

メインとサブは、リンク親子フィールドを設定しているとか、していないとか、
サブ側のレコードソースでは、条件としてメイン側を参照しているとか。

例えば、リンク親子フィールドに「計画書番号」が設定されていたとすると、
メインを新規にした時には、サブ側にはそれに相当するものが無いので空欄になり、
コピー自体ができなくなるのでは??

万が一、タイミング的にコピーができたとして確認が必要なのは、
サブ側コピーレコードの追加貼り付け時、どのタイミングでAccessさんが
メインの「計画書番号」を設定しにくるのか・・・・・

貼り付けた後で、上書きしてくれるのか???
貼り付ける直前で設定していて、貼り付けが上書きしてしまうのか???

サブ側のレコードソースで条件としてメイン側を参照しているので、
Requeryしない限りはレコードが存在する・・・・のであれば、
コピーレコードの追加貼り付け後、メイン側の「計画書番号」を参照し、
サブのテーブル用に設定する必要があると思います。
(貼り付けのままなら重複のエラーになりそうな?)

> Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No
の記述だけで新規作成されていることから、
リンク親子フィールドを「計画書番号」で設定しているようにも思えますが。
(サブ側の挿入前処理/更新前処理で設定していたりして・・・・)


あちらの方で、補足されたら良いと思います。
(日時が古いし、記述量も多いし・・・・等々)


※ タイミングの洗い出し、VBA記述の見直し等、頑張ってください。

> '内容を編集している場合、先に保存をさせる   部分の記述とか・・・
Me.Dirty = False で SaveRecord ??

> '新規作成の場合、作成日フラグは既定値0のため1に変更
> If Me!作成フラグ = 0 Then

メインをコピー貼り付けた時、既定値は関係なくなっていて????
なにも処理しないけど、それでOK???
メインのレコード確定は、Me!サブ1.SetFocus で起きる???
サブ1のレコード確定は、いつ起きる???
また、サブ9のレコード確定は、いつ起きる???

 など、など。


Private Sub cmdコピー_click() の先頭行や、
Private Sub Form_BeforeUpdate(Cancel As Integer) の先頭行、
また、サブ側の更新前処理の先頭行に、ブレイクポイントを設定して、
ステップ実行で、その時その時の内容を確認された方が解決が早いかもしれません。

特に、どのタイミングで、レコードを確定しに行くのか・・・・とか。


以上 完
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

詳しくご説明いただきました点をこれからじっくりみてみます。

お礼日時:2010/08/26 10:53

http://www.accessclub.jp/bbs/wforum.cgi?mode=all …
こちらが参考になるでしょう。

とイヤミを言ってみる。(笑)

あちらで Null さんの回答にあったことを
実行しているようには見えませんが。

いろいろやったとは言っても肝心なことをやらなくては
動くはずがないでしょう。

なお、Access に関してはあちらで継続された方が良いと思いますよ。
もちろん、こちらは閉じて。

マルチポストは嫌われますから、
きちんと処理しないと、
本来もらえるはずのレスがもらえなくなるかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

AccessClubでのNull様のアドバイスは実行してみましたが、うまくできず、いろんな方法を試してみたところあのような内容になったのです。
ですが、もう一度トライしてみます。

マルチポストを行ってしまった点については、善意でお答えいただいた方々、運営元の方々などご迷惑お掛けしまして申し訳ございませんでした。

お礼日時:2010/08/26 10:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています