- ベストアンサー
1つのフォームから複数のテーブルにレコード追加の疑問や間違いについて
- 1つのフォームから複数のテーブルにレコード追加をやってみました。Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのでしょうか?
- 下記のコードで2つのテーブルにレコードを追加できたのですが、素人の推測でやってみたため、間違っている所がないか確認していただきたいです。
- rs1とrs2を使用してT車検証テーブルとT所有者テーブルにレコードを追加しました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コンパイルはこのまま通ります。一点だけ、 cn、rs1、rs2はIf~End Ifの外でオブジェクトを セットしていますが、これらのオブジェクトの 破棄は中で行なわれています。したがって何らかの 理由でクリックイベントがIf~End Ifの中に 入らなかった場合はインスタンスは残ったままに なります。ですから破棄をEnd Ifの後に行なうのが いいでしょう。あるいはオブジェクトのセットを Ifの中で行なうかです。 たとえば、Excelや他のAccessのExeを呼び出すような 場合はこのような形でインスタンスが残ると OSのタスクにいくつもExeのタスクが残ること になり、メモリを圧迫したり、Excelなどでは 読み取りでしか立ち上がらなくなるという ことになりかねません。タスクマネージャを 立ち上げればいくつかのExcel.EXEのタスクが 同時実行されているのを見かけることがあります。 また、このようなことに伴う質問も時々 見かけます。 このあたりはエラー表示はでませんが、いろいろな 症状で何かがおかしいと気がつかないと読み取れ ないかもしれません。 このようなところです。
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
!と.の違いは慣れるまでは判りづらいところが ありますが、一般的にはドットはプロパティなどを参照するとき、 Me.Requery Text1.Value など。たとえば、フォームのモジュールなどで、 Me.とすればフォームのプロパティとして使える メンバが表示されます。オブジェクトブラウザ でもメンバは確認できます。もちろん、メンバが 表示されなくても使用できるプロパティはいろいろ あります。 !はForms!メインフォーム名!コントロール名 のような使い方。 込み入った使い方としては、サブフォーム上のコントロールを参照 するときに、 Forms!メインフォーム名!サブフォーム埋め込みコントロール名.Form.コントロール名 のような使い方。いわばオブジェクトを階層的に たどるときには!。もちろんドットでも見方に よれば同じですが。 なかなか表現するのは難しいのですが、エラー表示を 見ながら何となくおぼえていくのが一番早いと思います。 私もエラー表示で覚えていきました。エラーが一番の 先生ですね。ですから、エラー処理はプログラムの 最後まで最小限のものは除いてONにしません。 そして、エラーを最大限捕獲できる状況を作って おきます。
お礼
なるほど大変勉強になります。 下記コードに修正しました、全体的に見て他に気になる点がありましたら指摘頂きたいのですが、 よろしくお願いいたします。 Option Compare Database Option Explicit Private Sub cmb登録_Click() Dim cn As ADODB.Connection Dim rs1 As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset Set rs2 = New ADODB.Recordset Beep If MsgBox(Me!txt支局 & " " & Me!txt区分番号 & " " & Me!txtかな & " " & Me!txt連番 & Chr(13) & "を登録しますか?", 33, "確認! 登録") = vbOK Then rs1.Open "T車検証", cn, adOpenKeyset, adLockPessimistic rs2.Open "T所有者", cn, adOpenKeyset, adLockPessimistic rs1.AddNew rs1!車両コード = Me!txt車両コード rs1!登録番号 = Me!txt支局 & Me!txt区分番号 & Me!txtかな & Me!txt連番 rs1!交付年月日 = Me!txt交付年月日 rs1!初度年月 = Me!txt初度年月 rs1.Update rs2.AddNew rs2!車両コード = Me!txt車両コード rs2!所有者 = Me!txt所有者 rs2.Update rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn.Close: Set cn = Nothing MsgBox Me!txt支局 & " " & Me!txt区分番号 & " " & Me!txtかな & " " & Me!txt連番 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub
- piroin654
- ベストアンサー率75% (692/917)
エラーは表示されないようですが。 コード表の一番上には、 Option Compare Database Option Explicit としるされていますか。 Option Explicit が記されていないのならば 追加して保存し、コンパイルしてください。 コード表のツール→オプション→編集 の変数の宣言を強制するにチェックが 入っていますか。入っていなければ 入れてください。 これで今一度コンパイルしてみてください。 T所有者には別途所有者コードが主キーとして あるという前提で、 車両を複数の所有者がいる場合がないのならば、 T所有者で車両コードが主キーである必要が あるのかは状況によりますが、とくには 主キーである必要はないのではと思いますが。 >の様に一対一にしていみたのですが、 >”T所有者”に枝番を持たせた方が良いのでしょうか? 上記の前提ならばとくに必要はないと思いますが。 とくに枝番がないと困るという場合があれば 別ですが。例えば、フォームあるいはレポートなどで 初期のレコードの並びを存続させたいという場合 です。この場合は枝番といっても整数だけではなく 少数点以下の数値を併用します。 すみません。Isloadedは勘違いです。以前回答の途中 だったのがKOUSUKE0409さんと思ったものですから。
お礼
丁寧なレスありがとうございます。 コード表の上にOption Compare DatabaseだけだったのでOption Explicitを記述し、変数の宣言を強制するにチェック入れ確認したところOptionエラーが出ました! Me.txt車両コードをMe!txt車両コードに修正して無事に動きました。 いろんな本を読み勉強しているのですが「 . と ! は同じだと認識していました・・・ 今回の場合はどういった事でエラーなのですか?
- piroin654
- ベストアンサー率75% (692/917)
>Recordsetは追加するテーブルの数だけOpenが必要なのですか? はい。 コンパイルエラーは出ませんか。 txt車両コード などMe!txt車両コード としていない箇所。 また、 rs1!車両コード = Me.txt車両コード などにおいてメンバが見つからないという エラーは出ないですか。 rs1!車両コード = Me!txt車両コード では? IsLoadedが途中でしたか?
お礼
早急な返信ありがとうございます。 再度確認してみましたが、エラーは確認できませんだした! 一枚の車検証のデータを複数のテーブルに分けたいので主キーを ”T車検証” 車両コード→主キー 登録番号 ・・・・ ”T所有者” 車両コード→主キー 所有者名 ・・・・ の様に一対一にしていみたのですが、”T所有者”に枝番を持たせた方が良いのでしょうか? また >IsLoadedが途中でしたか? ・・・ってどう言うことですか?ド素人ですいません m(_ _)m ご教授よろしくお願いいたします。
お礼
遅くなりました、申し訳ありません。 ”大変解りやすいレスありがとうございます。” オブジェクトの破棄をEnd Ifの外で行う事に致します。 自分もさらにスキルを上げる様に努力して行きたいと思います、この先も解らない所が出て来ると思いますが機会がありましたら、また宜しくお願いいたします。 本当にありがとうございました。m(_ _)m