• ベストアンサー
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数166
  • ありがとう数2

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

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

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 で最初のレコードに戻ります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • テーブルのレコードが0件時にmsg表示(アクセス)

    とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" 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が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • 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

その他の回答 (1)

  • 回答No.2
  • imogasi
  • ベストアンサー率27% (4561/16327)

何がしたいのかコードからはよくわかりません。しかし適当でない方法でやっているような気がする。 一度コードのことは置いておいて、テーブル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

  • 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から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を介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • Access VBA(データを横並べで追加)について

    いつもお世話なっております。なかなか解決できなくて、ヘルプ求めにきました。  OS- XP SP2 ACCESS2003 T1(テープル) ID    店名 連番 ----------------------- 1 A 1 2 A 2 3 A 3 4 B 4 5 B 5 6 B 6 7 C 7 8 C 8 9 C 9 ---------------------------- T2(空) ID(オート)店名1  店名2 ----------------------------- T1の店名をT2へ横並べて追加したいので、↓のようににソースを書きました。 希望結果↓ ID(オート)店名1 店名2 ----------------------- 1 A A 2 A B 3 B B 4 C C 5 C Private Sub コマンド0_Click() Dim db As DAO.Database Dim RS1 As Recordset Dim RS2 As Recordset Dim fld As Field Dim A As Integer Set db = CurrentDb() Set RS1 = db.OpenRecordset("T1", dbOpenTable) Set RS2 = db.OpenRecordset("T2", dbOpenTable) RS1.MoveFirst For A = 1 To RS1.RecordCount If RS1![連番] Mod 2 <> 0 Then RS2.AddNew RS2![店名1] = RS1![店名] ElseIf RS1![連番] Mod 2 = 0 Then RS2![店名2] = RS1![店名] RS2.Update End If RS1.MoveNext Next MsgBox "終わり", vbExclamation RS1.Close RS2.Close End Sub 質問1-自分のこの書き方でデータ店名のCが一つ消えてしまいます。原因を教えてください。 質問2-後、店名が変わる時、店1からスタートさせたいですが、どうすれば、いいんでしょうか。 希望結果↓ T2 ID    店名1   店名2 ----------------------------- 1 A A 2 A 3 B B 4 B 5 C C 6 C

  • 1つのフォームから複数のテーブルにレコード追加をやってみました。

    1つのフォームから複数のテーブルにレコード追加をやってみました。 そこで疑問があるのですが、Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのですか? 一応下記のコードで2つのテーブルにレコードを追加出来たのですが、素人の推測でやってみたので間違っている所がないか見て頂きたいです。 返答よろしくお願いします。 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(Format(txt車両コード, "000000") & " " & 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登録番号 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 Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub

  • 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が返るのでしょうか?

  • 日付の最大値を求めるには

    DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 表示する項目が多い為、DAOを使って検索を考えています。 検索するコードが複数存在し、最大の日付のレコードを表示 したいと思っています。 コードの名称は・・・ Quotation_B_Noです。 日付が入っている名称は Input_dayです。 フォーム内のMe.W_Revise_Noにコードを入力して、検索を行います。 検索するテーブルは、T_Quotation_B_request_received_tableです。 この中にある。 コードを最初にあるか、どうかをチェックして、 あれば、そのコードに対する、最大の日付のレコードを 検索したいと思っています。 現在、このように組みましたが、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim han As Date Set db = CurrentDb() Set rs = db.OpenRecordset("T_Quotation_B_request_received_table", dbOpenDynaset) rs.FindFirst "Quotation_B_No ='" & Me.W_Revise_No & "'" If rs.NoMatch = True Then MsgBox "Not found Supplier code" Cancel = True Me.W_Revise_No.Undo Exit Sub Else han = DMax("Input_day", "T_Quotation_B_request_received_table ", "Quotation_B_No ='" & Me.W_Revise_No & "'") rs.FindFirst "#" & "han" & "#" And "Quotation_B_No ='" & Me.W_Revise_No & "'"→ここで、エラーが発生します。 Me.W_Control_No = rs!Control_No       ・・・・・ End If rs.Close Set rs = Nothing db.Close Set db = Nothing どのように組めば良いのか、さっぱり分かりません。 ご指導、宜しくお願いします。

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

    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

  • 初歩的な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」から値を引っ張り出せるのでしょうか? 宜しくお願いします。

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

    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 ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • 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