ACCESSのFindコマンドでの更新が遅い時の対策方法

このQ&Aのポイント
  • ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。ADOでFINDコマンドを使用しているのですが、遅くて困っています。早くロック付きの更新ができる方法を教えてください。
  • ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。ADOのFINDコマンドが遅くて困っています。ロック付きの更新をするための方法に関して教えてください。
  • ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。FINDコマンドが遅いため、ロック付きの更新方法について教えてください。
回答を見る
  • ベストアンサー

ACCESSのFindコマンドが遅い

ACCESS2000でORACLEにリンクテーブルをはり、更新するプログラムを作成しています。 そこでADOでFINDコマンドを使用しているのですが、かなり遅く困っています。 どのようにすれば、早くロック付きの更新ができますでしょうか? Set cn = Application.CurrentProject.Connection Set rs = New ADODB.Recordset cn.BeginTrans rs.Open "テーブル名", cn, addopenkeyset, adLockOptimistic rs.MoveFirst strKey = "ankKey = 'aaa'" rs.Find strKey rs.ankA = "あ" rs.Update cn2.CommitTrans キィを変えてLOOPさせ更新させていると 複数ステップのOLE DBの操作でエラーが発生しました。各OLE DBの状態の値を確認してください。作業は終了しませんでした。 のエラーになります。 1行1行みてみると異常にFINDが遅いものがあり、これが原因でないかと思うのですが、 どのようにロック付きの更新を変更すればいいのかがわかりません。 どのように変更すればいいのでしょうか?

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

http://www.ne.jp/asahi/hishidama/home/tech/access/recset.html を参考にしてください。 更新処理を高速に処理したいのであれば、 SQLのUPDATEを使う方がよいです。 SQLでアップデートした場合はレコードセットを再度取得してくださいね。 レコードセットは参照には便利ですが、 更新系はちょっと遅いんです。

ai0101k
質問者

お礼

無事に解決しました。 ありがとうございました。

関連するQ&A

  • access ふたつのテーブル間でのデータ移動VB

    win10 office365 accessのテーブルの table1のフィールド IDの数値を table2のフィールド ID (いずれも長整数型 数値型 重複あり 空白の許容なし) にコピーする操作ですが 幾度か お尋ねしてきていますが 今回 このやり方で やってみました http://www.mahoutsukaino.com/ac/ac2002/vba/vba16/v16.htm 以下のコードにおいて rs2.Update ここの部分が黄色くなって とまってしまいます しかし なぜか 数値の移行は 出来ていました ただ止まってしまうと 次に続けられなく困っています Public Function table2table1() Dim cn As adodb.Connection Dim rs1 As adodb.Recordset Dim rs2 As adodb.Recordset Set cn = Application.CurrentProject.Connection Set rs1 = New adodb.Recordset Set rs2 = New adodb.Recordset rs1.Open "table1", cn, adOpenStatic, adLockReadOnly rs2.Open "table2", cn, adOpenKeyset, adLockOptimistic rs1.MoveFirst Do Until rs1.EOF rs2.Find "ID='" & rs1!ID & "'" If rs2.EOF Then rs2.AddNew rs2![ID] = rs1![ID] rs2.Update End If rs1.movenext Loop rs1.Close rs2.Close cn.Close End Function 以上 すみません 宜しくお願い致します

  • ACCESS2003でのFindの使い方について

    1つのクロス集計クエリーと1つのテーブルがあります。 1.クロス集計クエリー(Q_実施報告書_年齢)の中は 年齢 <> 女 男(ここがフィールド名) 24 7 2 40代 11 1 50代 1 9 2.テーブル(実施報告書_相談者年齢構成)の中は 年齢 合計 男 女 不明(ここがフィールド名) 10代 20代 30代 40代 50代 60代 70代 80歳以上 10歳以下 です。 クロス集計クエリー(Q_実施報告書_年齢)の年齢フィールドを キーにして、もしテーブル(実施報告書_相談者年齢構成)の年齢 フィールドと一致すれば、クロス集計クエリー(Q_実施報告書_年齢)の 例えば「男」フィールドの値をテーブル(実施報告書_相談者年齢構成)の 男フィールドに移そうと思っています。 3.ADOの以下の構文で、上記データだと年齢が40代、50代はあるはずなのですが 1つも該当するデータがない事になってしまいます。 rs1.Open "実施報告書_相談者年齢構成", cnn1, adOpenDynamic, adLockOptimistic rs2.Open "Q_実施報告書_年齢", cnn1, adOpenDynamic, adLockOptimistic rs1.MoveFirst Do Until rs1.EOF smoji = rs1("年齢") rs2.Find "年齢 = '" & smoji & "'" If rs2.EOF = True Then MsgBox smoji & "ありませんでした" Else rs1(2) = rs2("男") rs1(3) = rs2("女") MsgBox smoji & "更新できました" rs1.Update End If rs1.MoveNext Loop 大変恐縮ですが、どなたかおわかりの方おられましたらよろしくご教授ください。

  • rs.MoveFirst

    アクセスvbaです。 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst '←これいらない? For i = 1 To rs.RecordCount rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub このようなコードの場合 rs.MoveFirst はあってもなくても変わらないですか?

  • アクセスVBAの検索メソッドについてデバック

    前回もこちらで質問させていただいたことがある内容なのですが、引き続き、トラブルに悩まされています。仕組みがおかしくなっていたので、自分で触ってしまったことがまた悪影響だったのですが、、。 元々他の人が作ったものであり、いま、うまくいかない原因を探っているところです。まず、添付のシートにあるように、上の行のテーブルデータは"商品2_T"という名前のテーブル、下のデータは"商品2_T25discount"という名前のテーブルです。それぞれデータを引っ張ってきて、こちらのサイトに投稿するために貼り付けしました。 問題のコードをこちらに記載します。 Dim cn As ADODB.Connection Dim cn2 As ADODB.Connection Dim rs As ADODB.Recordset Dim rs2 As ADODB.Recordset Dim strmsg As String Dim lngRet As Long Dim strcriteria As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset Set cn2 = CurrentProject.Connection Set rs2 = New ADODB.Recordset rs.Open "商品2_T", cn, adOpenKeyset, adLockOptimistic rs2.Open "商品2_T25discount", cn2, adOpenKeyset, adLockOptimistic MsgBox "更新を開始します  ", 64, 更新 Do Until rs.EOF '該当レコード摘出 If rs!MCD = Me!tx検索 Then '--------------------------------------------- strcriteria = "CAT = '" & rs!CAT & "'" ' --- A rs2.Find strcriteria, 0, adSearchForward If rs2.EOF Then ' Else rs!仕入単価 = rs2!discount End If '--------------------------------------------- rs!更新日 = Now() rs.Update End If rs.MoveNext Loop MsgBox "更新が完了しました  ", 64, 更新 (以上) やりたいことの説明ですが、まず、 If rs!MCD = Me!tx検索 Then とあるように、これはフォーム内にテキストボックスを用意していますので、ここに記入したMCDに一致するものに、検索をかける、ということです。そしてつぎに、strcriteria = "CAT = '" & rs!CAT & "'" 、(省略)rs!仕入単価 = rs2!discount とありますように、"CAT"を検索対象にし、前者のテーブルの"仕入単価"を、後者のテーブルの"discount"のデータで塗り替えます。 という私の解釈なのですが、(何せ他の人が作りましたので)正しいですよね? それで今試しているところなのですが、なぜかうまくいきません。何が間違っているのでしょうか? どういうエラーになるのかというと、これを実行すると、"更新日"というフィールドのみ、更新されて、仕入単価はそのままになります。ちなみに更新日が更新されているのは、このテキストボックスに入れたMCDが一致する全てのデータに対してですので、MCDが一致、には反応しているが、CATを検索して更新をかける、という動作に失敗しているように見えます。 しかし素人なのでこれ以上どうすればよいかがわかりません。どなたか少しでも解決策があれば教えていただけないでしょうか。

  • アクセス VBAのエラー

    以下のコードをwindowsXPで問題なく使っていましたが、windows7で使ったところ 「保存できません」というエラーメッセージが出ます。ただ全く同じコードを(だと思うのですが)リストボックスのダブルクリックで実行すると作動します。参考に二つのコードを書いておきます。 何か原因に心当たりのある方よろしくお願いします。 (コマンドボタン) Private Sub コマンド選択_Click() Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub (ダブルクリック) Private Sub リスト会員_DblClick(Cancel As Integer) Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

  • アクセスVBAで検索条件にFormatは使えませんか?

    前に同じような質問をしたのですが解決できないので再度お願いします。 アクセス2000で、あるテーブルの日付型フィールドデータを検索条件に抽出する方法なのですが、 rs.find "Format([売上日付],'yyyymm')='200309'" とするとエラー(引数の型が  になります。 Formatを使ったこのような書き方はできないのでしょうか? rs.Open "売上TB", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst rs.Filter = "Format([売上日付],'yyyymm')='200309'" とFilterを使っても駄目なんです

  • アクセス クエリ-について

    テーブルには、 フィールド1 ------------------ エクセルaaa aaaエクセルaaa aaaエクセル ------------------ というレコードが入っていて、 ------------------------------------------------------ UPDATE テーブル1 SET テーブル1.フィールド1 = "Excel" WHERE (((テーブル1.フィールド1) Like "*エクセル*")); ------------------------------------------------------ という更新クエリ作り、実行すると、テーブルのデータが フィールド1 ------------------ Excel Excel Excel ------------------ になってしまいます。 やりたい事は、 フィールド1 ------------------ Excelaaa aaaExcelaaa aaaExcel ------------------ にしたいのですが、更新クエリじゃ無理なのでしょうか? 手動でテーブルで検索ダイアログを開いてフィールドの一部分のみ置換するしかないのですか? 最終的には、 ------------------------------------------------------ Sub 更新クエリ() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim 置換前 As String Dim 置換後 As String Dim SQL As String cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & CurrentProject.FullName rs.Open "T置換", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount 置換前 = rs("置換前") 'エクセル 置換後 = rs("置換後") 'Excel SQL = "UPDATE テーブル1 SET テーブル1.フィールド1 = ""Excel"" WHERE (((テーブル1.フィールド1) Like ""*エクセル*""));" DoCmd.RunSQL SQL rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ------------------------------------------------------ のようにして、置換用テーブルのレコードを一つ一つ取得して、 テーブル1の値を置換していきたいのです。 何か対策があればご回答よろしくお願いします。

  • VB2005でAddNew()

    VB2005Express、SQLServer2005にて開発を行っています。 テーブルに対してSELECTを行った結果、該当レコードがなかったらAddNewでレコードを追加しようと実行すると 「現在のRecordsetは更新をサポートしていません。プロバイダか選択されたロックタイプの限界の可能性があります。」 というエラーが発生します。 レコードセットのパラメータを色々変えてみたのですが状況が変わりません。どなたか原因がお分かりの方いらっしゃいましたら教えて下さい。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset strCn = "Provider=WWW;Password=XXX;User ID=YYY;Data Source=ZZZ;Persist Security Info=True" cn.Open(strCn) cn.BeginTrans() Try strSQL = "SELECT * FROM テーブル1"   rs.Open(strSQL, cnGSTAFF, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic) If rs.EOF Then '登録 rs.AddNew() rs.Fields("コード").Value = 10000 rs.Fields("内容").Value = "OK" Else '更新処理 End If rs.Update() rs.Close() cn.CommitTrans() cn.Close() Catch ex As Exception rs.Close() cn.RollbackTrans() End Try

  • access Ado フィルタ 含むができない

    バージョン2007です テーブル名:テーブル1 フィールド名:ファイル名 レコードには色々なファイル名が入っていて、テキストファイルだけを抽出したいのですが Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & CurrentProject.FullName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "ファイル名 like '%.txt'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これをすると 実行時エラー 3001  引数が間違った型、許容範囲外、又は競合しています。なります。 しかもなぜかヘルプファイルが開けません。(画像をご参照ください) rs.Filter = "ファイル名 like '*.txt'" これに変えてもおなじです。 「含む」と言う条件で抽出したい場合はどうすればいいでしょうか? ご教授よろしくお願いします。

  • accessのADOの記述について。

    表題についてなのですが、初心者のため宜しくお願いいたします。 T_顧客というテーブルをつくり、そこに名字のフィールド、氏名のフィールドがあり、その中からある人物だけ名字の後ろに"さん"という文字をつけようとしています。 そこで下記のように記述しました。 Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim ipt As String rs.Open "T_顧客", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst ipt = InputBox("どの人を変更する?") rs.Find "[名字]='" & ipt & "'" If rs.EOF Then MsgBox "そんな人いないよ!" Else rs![名字] = rs![名字] & "さん" End If rs.Close cn.Close End Sub ・・・・と記述したのですが、実行すると、rs.Close の ところで「実行時エラー'3219' このコンテキストで操作は許可されていません。」とでます。これはいったい どういうことなのでしょうか。宜しくアドバイスお願い致します。

専門家に質問してみよう