![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつも助けられています。
また宜しくお願いします。
xp sp2
access2003 使用です。
今回二つのテーブルにレコード追加をしたく、クリックすると追加できるように見よう見まねで書いたのですが、テーブルに既に主キーがあれば追加しないようにrecordcountで分岐したいのですが、
フィルタで0件のはずがrecordcountは1になってしまいます。また、1件以上あるはずでも1になります。
テーブルAAA: 主nom、加nom、名前、数量 (主と加が主キーです。)
テーブルBBB: ID、主nom、加nom、事由、日 (IDがオートナンバで主キーです。)
フォームには 主nom1~主nom10、加nom1~加nom10、名前、数量、事由、日
の非連結テキストボックスがあります。
ご助言お願いします。
Private Sub 新規登録_Click()
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim db As DAO.Database
Dim i As Integer
i = 1
Set db = CurrentDb
Set rs1 = db.OpenRecordset("AAA", dbOpenDynaset)
Set rs2 = db.OpenRecordset("BBB", dbOpenDynaset)
Do While Me.Controls("加nom" & i) <> ""
rs1.Filter = "[主nom]=" & Me.主nom & "and [加nom]=" & Me.Controls("加nom" & i)
If rs1.RecordCount = 0 Then ←ココがうまくいかない
rs1.AddNew
rs1!主nom = Me.主nom
rs1!加nom = Me.Controls("加nom" & i)
rs1!名前 = Me.名前
rs1!数量 = Me.Controls("数量" & i)
rs1.Update
End If
rs2.AddNew
rs2!主nom = Me.主nom
rs2!加nom = Me.Controls("加nom" & i)
rs2!事由 = Me.事由
rs2!日 = Me.日
rs2.Update
End If
i = i + 1
Loop
rs1.Close
rs2.Close
End Sub
No.1ベストアンサー
- 回答日時:
Filter の使い方は ADO とDAO で異なります。
http://msdn.microsoft.com/ja-jp/library/cc948692 …
こちらの中程、「Filter プロパティの使用」 を確認してください。
なお、連続してレコードの存在確認をする場合には
上記の最初に書かれている「Find メソッド」(DAO では FindFirst)を 使用するのが一般的かと思います。
tamating さんのコードでは Filter の反映されていない rs1 の RecordCount を見ていますから
正しい値は取得できません。
さらに、 Recordset を開いて最初のレコードにある状態では、まだ他のレコードは読まれていませんので
レコード数は1です。
正しいレコード数を取得するには、1度 MoveLast メソッドで最終レコードまで移動します。
その後必要なら MoveFirst で最初のレコードに戻ります。
返答遅くなり、すみませんでした。
ADOとDAOの違いを全く考慮していませんでした。
これを機に勉強します。
アドバイス通りで希望の動きをしてくれたので大変助かりました。
最初に助言を頂きましたのでベストアンサーはm3 makiさんにさせていただきます。
参考HPも勉強させていただきます。どうもありがとうございました。
No.2
- 回答日時:
何がしたいのかコードからはよくわかりません。
しかし適当でない方法でやっているような気がする。一度コードのことは置いておいて、テーブル2つががどういう場合か簡単な実例を挙げて、どうなったとき、どちらにどう追加したいのか書いて質問しなおしたら、何かもっとスマートな回答が出るような気がする。
フォームにデータを入力して、両方のテーブルにそのキーが存在し無ければ各々に追加するということか?
片一方だけにその主キーが存在することは無いのか。
===
DAOとADOのフィルタで件数のとらえ方の差についてやってみました。
ーー
山田という生徒が「生徒」テーブルに3名います。
フィルタをかけることでRSは3レコードとなります。
それをDo Until RS.EOF以下で1名(レコード)づつ取り出して表示してます。
ーー
ADOの例
Sub 抽出()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim criteria As String
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "生徒", CN, adOpenKeyset, adLockOptimistic
'フィルタ
criteria = "氏名 Like '山田%'"
RS.Filter = criteria
MsgBox "該当件数=" & RS.RecordCount
If RS.RecordCount = 0 Then
MsgBox "該当するレコードは見つかりません"
Else
Do Until RS.EOF
MsgBox RS!生徒番号 & " " & RS!氏名
RS.MoveNext
Loop
End If
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
End Sub
ーー
DAOの例
RS.MoveLast
や If RS.RecordCount = 0 Thenの位置が変わっています。
該当が無い生徒名の例をRS.Filter =のあとに入れてやってみてください。
Sub Exsample()
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim i As Integer
Set DB = CurrentDb
Set RS = DB.OpenRecordset("生徒", dbOpenDynaset)
RS.Filter = "氏名 Like '佐藤*'"
Set RS = RS.OpenRecordset
If RS.RecordCount = 0 Then
MsgBox "該当するレコードは見つかりません"
Else
RS.MoveLast
MsgBox "該当件数=" & RS.RecordCount
RS.MoveFirst
Do Until RS.EOF
MsgBox RS!生徒番号 & " " & RS!氏名
RS.MoveNext
Loop
RS.Close: Set RS = Nothing
DB.Close: Set DB = Nothing
End If
End Sub
ーーー
参考
http://www.accessclub.jp/bbs6/0024/das7594.html
返答遅くなり、すみませんでした。
テーブルについては個人情報が載っていることやAAAは他にもフィールドがあり、分けた方がわかりやすいと考えました。
AAAにあたる元管理用マスタがあれば一番いいのですが、運用上利用できないのでこのような面倒な形になりました。
ADOとDAOの違いを全く考えておらず、filter後にもう一度setをすれば問題なく出来ました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessでオートナンバーを使わ...
-
AccessのRefresh・Requery・Rep...
-
ACCESS 複数のフォームから同一...
-
アクセスで複数レコードを1レ...
-
MS.Access でサブフォーム付の...
-
docmd.gotorecordを起動するには
-
DoCmd.SearchForRecord が動か...
-
Accessフォームで詳細内の任意...
-
ACCESSフォーム入力後の確定
-
Accessでレコードの複製
-
Accessのレコード数をテキスト...
-
バーコードリーダーを使用してA...
-
Access2000のレポートの作成で
-
ファイルメーカーで重複してイ...
-
VBAコンパイルエラー
-
Accessのメッセージについて
-
MSAccess ロック状態かどうかを...
-
access2000では、自動で連続デ...
-
エクセルで、抽出したデータだ...
-
Access サブフォームでの選択行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS 複数のフォームから同一...
-
ACCESSフォーム入力後の確定
-
AccessのRefresh・Requery・Rep...
-
Accessフォームで詳細内の任意...
-
access の 最終レコードの判定...
-
Accessでレコードの複製
-
accessでオートナンバーを使わ...
-
Accessのレコード数をテキスト...
-
Accessで経過日付に応じて色を...
-
MS.Access でサブフォーム付の...
-
DoCmd.SearchForRecord が動か...
-
Accessの「Form_AfterUpd...
-
access2010 特定文字を含むレコ...
-
アクセエスのレコードの更新をV...
-
新しいレコードへの移動時にト...
-
アクセスのコンボボックスの内...
-
アクセスのフォームで自動連番...
-
ファイルメーカーProでレコード...
-
アクションクエリ DoCmd.RunSQ...
-
アクセスで複数レコードを1レ...
おすすめ情報