- ベストアンサー
別のACCESSデータベースのテーブルのレコードを追加したいのです
別のACCESSデータベースのテーブルのレコードを追加したいのです 同じ内容のデータベースが二つあります データベース1とデータベース2を其々別の人がデータを入力しています データベース1にデータベース2のテーブルで T_データT_データ明細の二つのレコードを追加したいのですがどの様にすればよいでしょうか ご指導をお願いいたします。
- みんなの回答 (35)
- 専門家の回答
質問者が選んだベストアンサー
レコードカウントで採番する場合は、 rsInMain.AddNew rsInMain!番号 = rsInNUM!番号 + 1 rsInMain!項目1 = rsOutMain!項目1 rsInMain!項目2 = rsOutMain!項目2 j = rsInMain!番号 rsInMain.Update のところで、 rsInMain!番号 = rsInNUM!番号 + 1 を rsInMain!番号 = rsInMain.RecordCount + 1 に置き換えればいいです。 それと、 'T_番号の更新 rsInNUM.Edit rsInNUM!番号 = rsInNUM!番号 + 1 rsInNUM.Update の部分はコメントアウトするか削除します。 こちらの環境では、レコードソースを クエリ、テーブル、SQLどれも問題はないのですが。 一応、簡単にT_テーブルでオートフォームでフォームを つくり、あとボタンをくっつけた簡単な フォームでやっています。
その他の回答 (34)
- piroin654
- ベストアンサー率75% (692/917)
すこし状況がわかりました。 まず、最適化をしてください。 多分、何度もプログラムを入れ替えたり、 データをセットしたりするとファイルの 最適化が必要になることがあります。
補足
すいません 用事で外出していました 今戻りまして 遅くなりまてすいません まずプログラム起動時に自動で最適化をしています それと鉛筆マークは出ていません チェックボックスにチェックを入れ直しても同じで 2回実行しないとダメのようです ?? それと データベース2のT_データのナンバーを番号テーブルから取っていますが T_データの最後のレコードを取得した方が良いようです 間違って番号テーブルのデータを消したらヌルでエラーになりますし 生成された番号が違う場合も有りうりますのでT_データの最終レコードを取得した方が確実なので ご指導頂けますでしょうか
- piroin654
- ベストアンサー率75% (692/917)
両方のデータベースを最適化と操作をくりかえしてみてください。
補足
すいません追加情報です 転送をして そのたびにフォームを閉じると 上手く動きます
- piroin654
- ベストアンサー率75% (692/917)
(2) チェックを入れたときにチェックを入れたレコードの 左端に鉛筆マークが表示されたままボタンクリックを するとレコードロックのエラーが表示されます。 したがって、鉛筆マークが消えるようにどれか他の レコードのフィールドをクリックして鉛筆マークが 黒い三角マークになるようにしてください。 これでチェックを入れたレコードの事前処理が 確定したことになります。 この意味はチェックボックスもテキストボックスと 同様に一つのレコードの中のフィールドですから レコードを確定させるためにチェックをいれたら フォーカスを他のレコードに移動させて暗黙的に レコードの更新を確定させるというものです。 したがって、2回ボタンを押したらできるということは 一つのレコードの更新が確定していないが二回押すことに よりフォーカスが移動してレコードの更新が確定した ということです。 単独のチェックボックスと違ってレコード帳票フォームなどの レコードはチェックボックスのチェックを入れただけでは レコードの確定がしない、ということです。
補足
ありがとうございます チェックボックスの件 なんとか自己解決致しました ありがとうございます 番号の件 よろしくお願いいたします。
- piroin654
- ベストアンサー率75% (692/917)
T_データを表示しているのはサブフォームでは ないですね。 (1) End Sub の前に Me.Requery をいれてください。この場合はサブフォーム でない場合です。 (2) チェックを入れたときにチェックを入れたレコードの 左端に鉛筆マークが表示されたままボタンクリックを するとレコードロックのエラーが表示されます。 したがって、鉛筆マークが消えるようにどれか他の レコードのフィールドをクリックして鉛筆マークが 黒い三角マークになるようにしてください。 これでチェックを入れたレコードの事前処理が 確定したことになります。 これ以外に何かでていますか。 エラーが表示されていましたか。 テーブルを指定するとどうですか。
- piroin654
- ベストアンサー率75% (692/917)
>そのまま続けて違うレコードにチェックを入れ >Private Sub コマンド0_Click()を実行させると >処理ができません 処理ができないというのはどのような状況ですか。 (1) フォームからデータが消えない (2) 転送、削除そのものができない。
補足
ありがとうございます (2)転送、削除そのものができない です 2回同じ事をすると 実行できます?? Me.Requery は入れています
- piroin654
- ベストアンサー率75% (692/917)
なお、データの削除の部分は単純に前のコードに 削除の部分を追加してだけです。その部分を はずせば前のコードと同じです。
補足
ありがとうございます データベース2のT_データのクエリーを造りそれをフォームに引き込みしチェックボタンを設定 チェックを要れPrivate Sub コマンド0_Click()を実行させると処理されますが そのまま続けて違うレコードにチェックを入れPrivate Sub コマンド0_Click()を実行させると 処理ができません おそらくクエリーで取っているためだと思いますが 続けて処理するにはどの様にすればよいでしょうか ご指導お願いいたします。
- piroin654
- ベストアンサー率75% (692/917)
字数がぎりぎりだったのでのですが、 たぶん全部一つにして掲示できたと思います。 追加した部分はたいした文字数ではないのですが、 一つにしようとして、既存のコメントの中の 長い部分を二つくらい除けました。 午前のつもりがお昼ですね。 Loopの終了後、データの削除が始まる前に、 MsgBox("データの転送終了。データの削除開始。") End Subの前に MsgBox("処理完了") などを入れて終了確認をしてもいいかもしれません。 データが少なければあまり意味がないかもしれませんが、 一つの案です。 以上です。データの転送、削除を確認をしてみてください。
- piroin654
- ベストアンサー率75% (692/917)
Private Sub コマンド0_Click() Dim dbOut As Database 'データベース2 Dim dbIn As Database 'データベース1 Dim rsOutMain As Recordset 'データベース2のT_データ Dim rsOutSub As Recordset 'データベース2のT_データ明細 Dim rsInMain As Recordset 'データベース1のT_データ Dim rsInSub As Recordset 'データベース1のT_データ明細 Dim rsInNUM As Recordset 'データベース1のT_番号 Dim i As Long Dim j As Long 'データベースの設定 Set dbOut = CurrentDb 'データベース2 Set dbIn = DBEngine.Workspaces(0).OpenDatabase("C:\データベース1.mdb") '各データベースのテーブルの設定 Set rsOutMain = dbOut.OpenRecordset("T_データ", dbOpenDynaset) Set rsOutSub = dbOut.OpenRecordset("T_データ明細", dbOpenDynaset) Set rsInMain = dbIn.OpenRecordset("T_データ", dbOpenDynaset) Set rsInSub = dbIn.OpenRecordset("T_データ明細", dbOpenDynaset) Set rsInNUM = dbIn.OpenRecordset("T_番号", dbOpenDynaset) 'T_データのエクスポート(データベース2からデータベース1へ) rsOutMain.MoveFirst Do Until rsOutMain.EOF If rsOutMain!チェック = True Then 'T_データに紐付けられたT_データ明細レコード検出用 i = rsOutMain!番号 'データベース1のT_データへのレコードの追加 rsInMain.AddNew rsInMain!番号 = rsInNUM!番号 + 1 rsInMain!項目1 = rsOutMain!項目1 rsInMain!項目2 = rsOutMain!項目2 j = rsInMain!番号 rsInMain.Update 'T_データ明細のエクスポート(データベース2からデータベース1へ) 'T_データに紐付けられたT_データ明細のエクスポート rsOutSub.MoveFirst Do Until rsOutSub.EOF If rsOutSub!番号 = i Then 'データベース1のT_データ明細へのレコードの追加 rsInSub.AddNew rsInSub!番号 = j rsInSub!名前 = rsOutSub!名前 rsInSub!住所 = rsOutSub!住所 rsInSub!電話 = rsOutSub!電話 rsInSub.Update End If rsOutSub.MoveNext Loop 'T_番号の更新 rsInNUM.Edit rsInNUM!番号 = rsInNUM!番号 + 1 rsInNUM.Update End If rsOutMain.MoveNext Loop 'T_データの削除 rsOutMain.MoveFirst Do Until rsOutMain.EOF If rsOutMain!チェック = True Then i = rsOutMain!番号 rsOutMain.Delete 'T_データ明細の削除 rsOutSub.MoveFirst Do Until rsOutSub.EOF If rsOutSub!番号 = i Then rsOutSub.Delete End If rsOutSub.MoveNext Loop End If rsOutMain.MoveNext Loop rsOutMain.Close Set rsOutMain = Nothing rsOutSub.Close Set rsOutSub = Nothing rsInMain.Close Set rsInMain = Nothing rsInSub.Close Set rsInSub = Nothing rsInNUM.Close Set rsInNUM = Nothing dbOut.Close Set dbOut = Nothing dbIn.Close Set dbIn = Nothing End Sub
- piroin654
- ベストアンサー率75% (692/917)
では、転送終了後に、引き続いてチェックの入った T_データとそれに紐付けられたT_データ明細を 削除するという方法でいきます。 えー、少し一息いれて仕上げておきます。 もう今日になりましたが、午前には 掲示しておきます。いかがでしょうか。
補足
誠にありがとうございます piroin654様のご都合でお任せいたします。 この度は すごく勉強になりました。 ご親切、本当に感謝しております。
- piroin654
- ベストアンサー率75% (692/917)
すみません。返答があとからきたので 前後しましたが、データの量によりますが 最近のPCは性能がいいので動きを気にするほど 時間がかかるものではないと思いますが。 たしかにテーブルのリンクが出来ないので 若干の時間はかかる傾向はありますが。 1万とか2万とかのレコード数でもクエリ ほどではないにしろ少しの時間で済む と思いますが。 必要なら送ったレコードを削除するように しましょうか。
補足
すいません入れ違いになりました 削除の方向でお願いいたします。
お礼
大変 お世話になりました ようやく完成いたしました。 どの様にお礼を言って良いのかわかりませんが 今後とも よろしくお願いいたします。 ご指導ありがとうございました。