ちょっと先の未来クイズ第4問

(昨日同じ質問をあげましたがカテゴリが間違っていたのでこちらにあげなおしました)

メインフォーム「MAIN」にサブフォーム「REN」を埋め込んでいます。

【メインフォームMAIN】
テーブル名:JIK
ID:事件ID

【サブフォームREN】
テーブル名:REN
ID:連絡先ID(・事件ID)

ボタンをクリックすると、メインフォームで表示させているレコードを複製させたいです。

以下を参考に、そのとおり(のつもり)に作ってみたのですが
(メインフォーム「MAIN」に「txtCopy事件ID」という名前のテキストボックスも作成しました)
「コマンドまたはアクション”追加貼り付け”は無効です。」
とエラーメッセージが出てしまいます。
どのように修正すればよいでしょうか?
http://www.accessclub.jp/bbs3/0103/superbeg36719

ちなみに追加クエリだけを実行すると
表示させているメインフォーム「MAIN」のレコードに、
サブフォーム「REN」のレコードが追加され、
サブフォーム「REN」のレコードが2倍になりました。

以下追加クエリとコードです。

【追加クエリ】
INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ )
SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・
FROM REN
WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

【VBA】
Private Sub 明細コピー_Click()
On Error GoTo Err_明細コピー_Click

Me!txtCopy事件ID = Me!事件ID

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append


Dim stDocName As String

DoCmd.SetWarnings False ' システムメッセージ非表示
stDocName = "追加クエリ"
DoCmd.OpenQuery stDocName, acNormal, acEdit
DoCmd.SetWarnings True ' システムメッセージ表示

' サブフォーム再クエリ
Me!REN.Requery

Exit_明細コピー_Click:
Exit Sub

Err_明細コピー_Click:
MsgBox Err.Description
Resume Exit_明細コピー_Click

End Sub

よろしくお願いいたします!

A 回答 (4件)

メインフォーム側の方は解決しました様で良かったです。



サブフォーム側のキー違反に関してですが、リンク先のURLの内容によると

メインフォーム→見積明細フォーム
 見積明細ID→オートナンバー型(主キー)
 見積品名→テキスト型
 ・・・

サブフォーム→工程明細フォーム
 工程明細ID→オートナンバー型(主キー)
 見積明細ID→数値型
 工程コード→テキスト型
 ・・・

とあります。これをそっくりそのまま質問者様の仕様に置き換えると

メインフォーム→MAIN
 事件ID→オートナンバー型(主キー)
 ・・・

サブフォーム→REN
 連絡先ID→オートナンバー型(主キー)
 事件ID→数値型
 ・・・

となるかと思います(一つ前の回答にも同じような事を書きましたが)
考えられるキー違反の原因としては、サブフォーム側で「事件ID」が主キー設定されていませんか?

リンク先のURLのイメージですと、例えば

【メインフォーム】
1 A みかん
2 C りんご
3 D ぶどう
項目名は左からID1(オートナンバー)、コード、品名とします。主キーは「ID1」

【サブフォーム】
1 1 A みかん 愛媛
2 2 C りんご 青森
3 3 D ぶどう 山梨
項目名は左からID2(オートナンバー)、ID1(数値)、コード、品名、産地とします。主キーは「ID2」

というレコードが各フォームにあるとして、メインフォームで2のりんごの項目を表示させてボタンを押すと

【メインフォーム】
1 A みかん
2 C りんご
3 D ぶどう
4 C りんご

【サブフォーム】
1 1 A みかん 愛媛
2 2 C りんご 青森
3 3 D ぶどう 山梨
4 2 C りんご 青森

という感じの動作になるかと思うのですが(間違っていたらお恥ずかしい限りですが。。。^^;)
この時サブフォームの「ID1」(=事件ID)は同じ値が複製されるので、主キーが設定されているとキー違反になってしまうかと思われます。

もしサブフォーム側の「事件ID」に主キーが設定されていたら、そちらは主キーを外して「連絡先ID」の方に主キー設定して下さい。
(勿論、メインフォーム側の「事件ID」は主キーでOKです)

他の原因だったらすみませんm(_ _)m
    • good
    • 0
この回答へのお礼

またまたありがとうございます!

サブフォームの主キーは連絡先IDです。

主キーに関するお話を色々いただいたので、ふと気づいて確認したところ
サブフォームに連絡先IDフィールドを表示させていなかったことに気付き
追加してしばらく色々触っていたら
(クエリを加工してみたり元に戻してみたり・・・)
なぜか正常に動きました!

何週間も悩んでやっと出来上がって、本当にうれしいです!
主キーに注目する点を教えていただけなかったら
絶対に完成できませんでした。
大変感謝しています!

長々とお付き合いいただきまことにありがとうございました!

お礼日時:2013/08/28 11:43

補足有り難うございます。



また勘違いしていたようですみません。
貼っていただいた参照先のリンクが私のPCでは最初開けず読むことができなかったので
てっきりIDもそのまま複製したいものであると思っていました^^;
今回は無事開くことができました。

リンク先読ませていただきましたが、
リンク先の「見積明細ID」→質問者様の仰る「事件ID」(メイン・サブフォーム)
リンク先の「工程明細ID」→質問者様の仰る「連絡先ID」(サブフォーム)

・・・という認識でよろしいでしょうか?(また違っていたらすみません)

それでよろしいのであれば
テーブル「JIK」 「事件ID」→オートナンバー型(主キー)
テーブル「REN」 「連絡先ID」→オートナンバー型(主キー)/「事件ID」→数値型

また当方環境下あるいは細かい設定の違いの問題かもしれませんが、
そのままではサブフォームの「事件ID」が上手く複製されなかったので

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append

の3行を、「サブフォーム再クエリ」の記述の前に移動したら上手く複製できました。

それでも動かないようであれば補足願いますm(_ _)m
    • good
    • 0
この回答へのお礼

何度もありがとうございます!

>リンク先の「見積明細ID」→質問者様の仰る「事件ID」(メイン・サブフォーム)
>リンク先の「工程明細ID」→質問者様の仰る「連絡先ID」(サブフォーム)

まさに上記のとおりです!

いただいた方法試してみました。
メインフォームのレコードの複製の構文を
サブフォームコントロールの再クエリの前にもってきてみました。

Private Sub 明細コピー_Click()
On Error GoTo Err_明細コピー_Click

Me!txtCopy事件ID = Me!事件ID

Dim stDocName As String

DoCmd.SetWarnings False ' システムメッセージ非表示
stDocName = "追加クエリ"
DoCmd.OpenQuery stDocName, acNormal, acEdit
DoCmd.SetWarnings True ' システムメッセージ表示

' メインフォームレコードの複製
DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択
DoCmd.RunCommand acCmdCopy '選択レコードのコピー
DoCmd.GoToRecord , , acNewRec '新規レコードに移動
DoEvents ' (必要に応じて)
DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け

' サブフォーム再クエリ
Me!SREN.Requery

Exit_明細コピー_Click:
Exit Sub

Err_明細コピー_Click:
MsgBox Err.Description
Resume Exit_明細コピー_Click

End Sub

教えていただいたやり方はこんなふうでよかったでしょうか?

なお、メインフォームレコードの複製のコードが

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append

から

DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択
DoCmd.RunCommand acCmdCopy '選択レコードのコピー
DoCmd.GoToRecord , , acNewRec '新規レコードに移動
DoEvents ' (必要に応じて)
DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け

に変更になっているのは、
この時点でのエラーを修正するためです。
こうしたおかげで「コマンドまたはアクション”追加貼り付け”は無効です。」
とはでなくなったのですが、
サブフォームのレコードはやはりコピーできませんでした。

追加クエリだけ実行してみようとすると
「○件のレコードでキー違反」
と出てしまいました・・・。

また何かお気づきの点ありましたら教えてください!
よろしくお願いいたします!

お礼日時:2013/08/27 09:53

質問の意味を一部理解しきれていなかったようで申し訳ありません。



つまりは例えばメインフォームに「1 みかん」と表示されていたら
ボタンをクリックの際にメインフォームで「1 みかん」のレコードをメインフォーム内で複製、
同時にサブフォームでIDが1のレコードをサブフォーム内で複製・・・のような感じでよろしいですか?

「コマンドまたはアクション”追加貼り付け”は無効です。」のエラーメッセージの件は
とりあえず主キー設定無しでこちらでも試してみたところ、再現できず普通に動作したのですが
この件に関してはもう大丈夫でしょうか?

主キーに関してですが
同一テーブル内では重複はできないので、レコード全体をそっくり複製するのは難しいと思います。
代替案としては、別に主キー(事件ID)と詳細フィールド(氏名、フリガナ・・・)を設定したテーブルを用意して
MAIN、RENテーブルはそれぞれフィールドをIDのみにし(こちらは主キーは外して下さい)
クエリで結合させてそれぞれメイン、サブフォームに表示させる、とかでは如何でしょうか。。。

見当違いな回答でしたらすみませんm(_ _)m
    • good
    • 0
この回答へのお礼

こちらこそ説明が下手で申し訳ありません。
またご回答いただきありがとうございます!

>メインフォームに「1 みかん」と表示されていたら
>ボタンをクリックの際にメインフォームで「1 みかん」のレコードをメインフォーム内で複製、
>同時にサブフォームでIDが1のレコードをサブフォーム内で複製

目指すものは上記のとおりです!

主キー(事件ID)だけは複製せず新しい番号を自動でふって、
それ以外は複製、ということはできないでしょうか・・・?

私が参考にしたサイトでは、
http://www.accessclub.jp/bbs3/0103/superbeg36719 …
IDが重複しないように構造上工夫されているようなのですが
そっくりそのまま作ったつもりなのに先述したエラーが出てしまいうまくいきません。

下記参考サイトの抜粋です。
>ちなみに、今回のようにメインフォームのID番号フィールドがオートナンバー型の場合、
>新規レコードのID番号フィールドが何番になるか予測することは難しい(というか無理?)
>です。なぜかというと、途中でレコードの削除をしたとき、あるいは何らかの理由で
>レコードが正常に保存されなかったときなど、簡単に欠番になってしまいますので。
>そのため、ちょっとした工夫が要ります。

>今回考えた方法としてはコピー対象レコードの[見積明細ID]の値を一時的に格納する
>ためのテキストボックスを作り、追加クエリの中で条件としてそれを参照させることに
>しました。

あまりテーブルを増やしたりすることは上司がいやがるもので・・・
申し訳ありませんが、お時間ありましたらまた教えてください!

お願いいたします!

お礼日時:2013/08/26 09:51

単に表示されているレコードを別テーブルに追加するだけでしたら以下のコードのみで可能です。



Private Sub 明細コピー_Click()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cn = CurrentProject.Connection
rs.Open "REN", cn, adOpenKeyset, adLockOptimistic

rs.AddNew
rs!連絡先ID = Me.事件ID
rs!氏名 = Me.氏名
rs!フリガナ = Me.フリガナ
'(・・・以下必要に応じて項目を増やして下さい)
rs.Update

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

Me!REN.Requery

End Sub

もし「ユーザー定義型は~」のようなエラーが出た場合は、「ADO 参照設定」等のキーワードで検索してVBEの設定を変更して下さい。

この回答への補足

たびたびすみません。
文字化けについては、フィールドのパラメータを指定することで解決できました。
(「事件ID」のパラメータを「整数型」にしました)
しかし次は、
追加クエリですべてのレコードを追加できません
×件のレコードでキー違反
となってしまいました。

「事件ID」を主キーに設定してしまっているせいなのかなと思いますが
「事件ID」を主キーにしないわけにはいきません。
どのように対処したらいいでしょうか?

引き続きよろしくお願いいたします!

補足日時:2013/08/23 16:35
    • good
    • 0
この回答へのお礼

別テーブルではなく、
メインフォーム、サブフォームそれぞれ同じテーブルに複製したいです!

質問に挙げた方法でやってみたところ、
今日はサブフォームのレコードが追加されません。
追加クエリを見てみると、
「Forms]![MAIN]![事件ID] AS 式1」
が文字化けしてしまっていました。

引き続きよろしくお願いいたします!

お礼日時:2013/08/23 15:23

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

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


おすすめ情報