dポイントプレゼントキャンペーン実施中!

いつも助けられています。
また宜しくお願いします。
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

A 回答 (2件)

Filter の使い方は ADO とDAO で異なります。



http://msdn.microsoft.com/ja-jp/library/cc948692 …
こちらの中程、「Filter プロパティの使用」 を確認してください。

なお、連続してレコードの存在確認をする場合には
上記の最初に書かれている「Find メソッド」(DAO では FindFirst)を 使用するのが一般的かと思います。

tamating さんのコードでは Filter の反映されていない rs1 の RecordCount を見ていますから
正しい値は取得できません。

さらに、 Recordset を開いて最初のレコードにある状態では、まだ他のレコードは読まれていませんので
レコード数は1です。
正しいレコード数を取得するには、1度 MoveLast メソッドで最終レコードまで移動します。
その後必要なら MoveFirst で最初のレコードに戻ります。
    • good
    • 0
この回答へのお礼

返答遅くなり、すみませんでした。

ADOとDAOの違いを全く考慮していませんでした。
これを機に勉強します。

アドバイス通りで希望の動きをしてくれたので大変助かりました。

最初に助言を頂きましたのでベストアンサーはm3 makiさんにさせていただきます。

参考HPも勉強させていただきます。どうもありがとうございました。

お礼日時:2011/05/23 11:58

何がしたいのかコードからはよくわかりません。

しかし適当でない方法でやっているような気がする。
一度コードのことは置いておいて、テーブル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
    • good
    • 0
この回答へのお礼

返答遅くなり、すみませんでした。

テーブルについては個人情報が載っていることやAAAは他にもフィールドがあり、分けた方がわかりやすいと考えました。
AAAにあたる元管理用マスタがあれば一番いいのですが、運用上利用できないのでこのような面倒な形になりました。

ADOとDAOの違いを全く考えておらず、filter後にもう一度setをすれば問題なく出来ました。

ありがとうございました。

お礼日時:2011/05/23 11:55

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