レコード追加に関する質問

このQ&Aのポイント
  • テーブルに既に主キーがあれば追加しないようにrecordcountで分岐したいが、フィルタで0件のはずがrecordcountは1になってしまう。また、1件以上あるはずでも1になる。
  • フォームには主nom1~主nom10、加nom1~加nom10、名前、数量、事由、日の非連結テキストボックスがある。
  • 新規登録ボタンをクリックすると、AAAテーブルにデータを追加する。既に同じ主nomと加nomが存在していない場合のみ追加する。BBBテーブルにもデータを追加する。
回答を見る
  • ベストアンサー

レコードカウントでレコード追加する

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

質問者が選んだベストアンサー

  • ベストアンサー
  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.1

Filter の使い方は ADO とDAO で異なります。 http://msdn.microsoft.com/ja-jp/library/cc948692.aspx こちらの中程、「Filter プロパティの使用」 を確認してください。 なお、連続してレコードの存在確認をする場合には 上記の最初に書かれている「Find メソッド」(DAO では FindFirst)を 使用するのが一般的かと思います。 tamating さんのコードでは Filter の反映されていない rs1 の RecordCount を見ていますから 正しい値は取得できません。 さらに、 Recordset を開いて最初のレコードにある状態では、まだ他のレコードは読まれていませんので レコード数は1です。 正しいレコード数を取得するには、1度 MoveLast メソッドで最終レコードまで移動します。 その後必要なら MoveFirst で最初のレコードに戻ります。

tamating
質問者

お礼

返答遅くなり、すみませんでした。 ADOとDAOの違いを全く考慮していませんでした。 これを機に勉強します。 アドバイス通りで希望の動きをしてくれたので大変助かりました。 最初に助言を頂きましたのでベストアンサーはm3 makiさんにさせていただきます。 参考HPも勉強させていただきます。どうもありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

tamating
質問者

お礼

返答遅くなり、すみませんでした。 テーブルについては個人情報が載っていることやAAAは他にもフィールドがあり、分けた方がわかりやすいと考えました。 AAAにあたる元管理用マスタがあれば一番いいのですが、運用上利用できないのでこのような面倒な形になりました。 ADOとDAOの違いを全く考えておらず、filter後にもう一度setをすれば問題なく出来ました。 ありがとうございました。

関連するQ&A

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • 初歩的なSQLですが・・・

    私の環境はOS:Xp      ACCESS2000です。 宜しくお願いします 今AccessVBAで作業をしているのですが、 Dim ws As DAO.Workspace Dim DB As DAO.Database Dim rs As DAO.Recordset Dim sql As String Set ws = DBEngine.Workspaces(0) Set DB = ws.Databases(0) sql = "select MAX(銀行コード) from 銀行テーブル ;" Set rs = DB.OpenRecordset(sql) Me.合計 = rs このSQL文で銀行テーブルに入っている銀行コードの最大値を取得したいのですが、取得した後どのように記述したら「rs」から値を引っ張り出せるのでしょうか? 宜しくお願いします。

  • adoのループについて カレントレコードについて

    adoのFor i = 1 To rs.RecordCountについて質問があります。 Sub test() Dim i As Long Dim MyFileName As String Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これを実行した時に、テーブルには、1,2,3・・・という値が入っていて、 イミディエイドウインドウにも1,2,3・・・と順番に取得されるのですが、 For i = 1 To rs.RecordCountを実行した時は、強制的にrs.MoveFirstされるのでしょうか? For i = 1 To rs.RecordCount rs.MoveFirst Debug.Print rs.Fields(0).Value rs.MoveNext Next これと同じ意味なのでしょうか? RecordCount プロパティ (ADO) のヘルプを見ましたが、この件に関する記述は探せませんでした。 ご回答よろしくお願いします。

  • AccessSQL COUNT文で該当レコード抽出したい

    初心者です。 Access2000であるテーブルの条件に一致した レコード件数を抽出するSQLを作成しました。 条件に該当しない場合も1件で件数が戻ってきてしまいます。 AccessクエリでSQLを貼り付けて 検証した場合はちゃんと0件になるのですが VBAのコードではうまく件数が抽出されません。 簡単なことだったらごめんなさい。 いろいろなサイトで探した末、 どうしても解決できないので ご教授よろしくお願いします。 Dim strSQL As String Dim db As DAO.Database Dim rs As DAO.Recordset  Dim IntCount As integer 'SQL文を生成 strSQL = "SELECT COUNT(*) AS 件数 FROM テーブル名 " strSQL = strSQL & "WHERE テーブル名.コード = '" strSQL = strSQL & Forms![フォーム名]![txtコード] strSQL = strSQL & "' AND Left([テーブル名]![区分],1) = '" strSQL = strSQL & Forms![フォーム名]![cnb種類].Column(0) strSQL = strSQL & "' AND テーブル名.名称 = '" strSQL = strSQL & Forms![フォーム名]![txt名称] strSQL = strSQL & "';" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) IntCount =  rs.RecordCount rs.Close Set db = Nothing Set rs = Nothing

  • Access レコードを分割してフォームで表示

    Access 2007です。 下記のような日記テーブルがあり、 その「行動」フィールドの中身を「●」の記号で レコードに分割して、 フォームに表示したいと思っています。 日記テーブル ID 年月日   天気  行動 1 2014/1/10  晴  ●読書。●新聞を読む。●散歩。 2 2014/1/11  曇  ●電車に乗る。●新年会。●庭の手入れ。●カラオケ。 3 2014/1/12  曇  ●昼寝。 4 2014/1/13  雨  ●買い物。●読書。 ・・・・ 結果フォーム(データシートビュー)で表示 年月日    行動 2014/1/10  読書。 2014/1/10  新聞を読む。 2014/1/10  散歩。 2014/1/11  電車に乗る。 2014/1/11  新年会。 2014/1/11  庭の手入れ。 2014/1/11  カラオケ。 2014/1/12  昼寝。 2014/1/13  買い物。 2014/1/13  読書。 もとの日記テーブルのデータは変更しません。 下記のように、VBAのコードの中で、 レコードセットを使えば、上記のようなレコードの分割ができると思うのですが、 うまくいきません。 rs2というレコードセットをどうやって作成すればいいのかわかりません。 (Set rs2 = DB.OpenRecordset ・・・ のような行が必要ではないか、と思うのですが、 そのやり方がわかりません。) やり方を教えていただけたら幸いです。 Dim DB As DAO.Database Set DB = CurrentDb() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = DB.OpenRecordset("日記テーブル", dbOpenForwardOnly) Dim A As Variant Do Until rs1.EOF A = Split(rs1!行動, "●") For i = 1 to UBound(A) rs2.AddNew rs2!年月日 = rs1!年月日 rs2!行動 = rs1!A(i) rs2.Update Next i rs1.MoveNext Loop DoCmd.OpenForm "結果フォーム" Set Forms!結果フォーム.Recordset = rs2

専門家に質問してみよう