Access2003 で開発をしている場合の dbOpenTable と dbOpenDynaset の違いとは?

このQ&Aのポイント
  • Access2003 で開発をしている場合、サブフォームで選択行のある項目の値を取得するためには、適切なロジックを選択する必要があります。
  • ロジック(1)では、dbOpenTable を使用してサブフォーム用のテーブルを開くことで、正しく動作するアプリもありますが、動作しないアプリもあります。
  • 一方、ロジック(2)では、dbOpenDynaset を使用してテーブルを開くことで、正しく動作するアプリが多くあります。
回答を見る
  • ベストアンサー

dbOpenTableとdbOpenDynaset

Access2003 で開発をしています。 サブフォームで選択行のある項目の値を取得したいのですが、 下記ロジック(1)で正しく動作するアプリAと、動作しないアプリBが出てきました。 動作しないアプリは、他の行の値を取ってきてしまいます。 【ロジック(1)】 Set db = CurrentDb Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenTable) Cnt = 1 If rs.BOF = True And rs.EOF = True Then Else Do Until Cnt = Forms![メイン]![サブフォーム].Form.CurrentRecord rs.MoveNext Cnt = Cnt + 1 Loop    MsgBox ("項目1の値:" & rs![項目1]) End If 色々調べたところ、正しく動かないアプリでは、ロジックを下記(2)のように変更したら、 正しく動きました。 【ロジック(2)】 Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenDynaset)   MsgBox ("項目1の値:" & rs.Fields("項目1").Value) こちらのロジックの方が簡単なのもありますが、 テーブルをopenする際、dbOpenTable と dbOpenDynaset がありますが、 サブフォームのレコードを扱う際には、dbOpenDynaset にするべきなのでしょうか。 ロジック(1)で正しく動作していると思われるアプリAは、現在稼動中のため、 ロジックに間違いがなければそのままにしたいのですが、 ロジック(1)の dbOpenDynaset だと間違いで不具合が起きる可能性があるのでしょうか? ご教授いただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> サブフォームで選択行のある項目の値を取得したいのですが、 であれば、 MsgBox "項目1の値:" & Forms![メイン]![サブフォーム].Form.Recordset("項目1") で求まると思います。 「項目1」自体をサブフォーム内で求めていなかったら、 サブフォーム内の一意に特定できる内容を上記ルートで求め、 WHERE 条件に付加して Recordset を得れば良いかと。 提示された処理の前後で何をやっているのかわかりませんが、 今までは、偶々動いていたというレベルと思います。 テーブルを開いただけでは、レコードの並び順は保証されていなかったかと・・・ Dynaset も同様だったかと・・・ 偶々だったものが偶々でなくなり、さらに偶々動いたものと比較はできないかと・・・

mountain11
質問者

お礼

さらなる回答、ありがとうございました。 教えていただいたロジックで、できました。 本当にありがとうございました。

その他の回答 (1)

回答No.1

目的は、Forms![メイン]![サブフォーム]の最終レコードの取得でしょうか? ロジック1・2とも問題です。 テーブルを開いたときのレコードの並び順と サブフォームの並び順は必ずしも一致しません。 (並び替えやフィルターをかければなおさらの事) なのでDAOですが、メインフォーム上から実行する場合 Dim rs As DAO.Recordset Set rs = Me!サブフォーム.Form.Recordset.Clone ’コピーを参照する rs.MoveLast MsgBox rs!項目1.Value rs.close:set rs = Nothing などでしょうか。

mountain11
質問者

お礼

回答ありがとうございます。 ロジック(1)、(2)共に正しく動作することがあり、 (2)については正しいものかと思っていました。 最終レコードの取得ではなく、 サブフォーム上で選択している行の取得なのですが、 その場合は、どのようなロジックになるのでしょうか? 度々すみませんが、ご教授いただければ幸いです。

関連するQ&A

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • SQLServerのテーブルはdbOpenTableで取得できない?

    SQLServerのテーブルはdbOpenTableで取得できない? いつもお世話になっております。 VB6.0、Access2003で開発されたシステムのデータベースを SQLServer(2008Express)に置き換えています。 接続方法は、現行通りのDAOを使用したいと考えております。 レコードセットをオープンするときに、 Set RS = DB.OpenRecordset("テーブル名", dbOpenTable) としたら、「引数が無効です」というエラーが発生しました。 dbOpenTableの所をdbOpenDynasetに変更したらエラーは発生しなくなりました。 SQLServerへの接続の場合、dbOpenTableは使用できないのでしょうか? dbOpenTableが使用できないとなると、IndexやSeekも使用できないということでしょうか? 以上です。よろしくお願い致します。

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

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

  • Access VBAでクエリーのレコード件数を取得したいのですが

    Access2003のVBAで次のような構文を用いてクエリーの該当レコード数を取得したいのですがうまく出来ません。 構文又は手法が間違っているのでしょうか。 Dim db As Database Dim rs As Recordset Dim cnt As Long Set db = CurrentDb Set rs = db.OpenRecordset("該当顧客リストクエリ", dbOpenTable) cnt = rs.RecordCount ※OpenRecordsetの行で「実行時エラー'3219'無効な処理です」と出てしまいます。 又、”該当顧客リストクエリ”では特定の抽出条件を設定して、”顧客リストテーブル”の一部を抽出するようにしています。

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

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

  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

  • ACCESS2000でテーブルをVBAからテーブルを読み込む方法

    ACCESS2000を使っています。 以下の指定をした場合、「ユーザ定義型は定義されていません」のメッセージが出て、コンパイルが通りません。 なにかインストールや設定が必要なのでしょうか? Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル名", dbopendynaset) ヘルプ等を自分なりに参照してみたのですが、わかりません。教えてください。

  • AccessVBAでIBM特殊文字を調査

    Access2000でテーブルにある氏名から特殊文字が使用されているか調査したいのです。 テーブルやVBAは下記の通りです。 顧客テーブルがあり、内容はキー番号(半角10バイト)、漢字氏名(全角50バイト)、カナ氏名(半角50バイト)です。 漢字氏名フィールドを調査して特殊文字コードが存在した場合エラーメッセージを表示したいのです。ロジックを以下の通り作成したのですが、すべての漢字氏名がエラーとなってしまいます。 なぜでしょうか?教えていただけますでしょうか。お願いいたします。 Public Sub 調査()   Dim DB As DAO.Database   Dim RS As DAO.Recordset   Dim Moji As String   Set DB = CurrentDb()   Set RS = DB.OpenRecordset("顧客テーブル", dbOpenDynaset) Do Until RS.EOF   If RS!漢字氏名 Like "*[" & Chr("&hFA40") & "-" & Chr("&hFC4B") & "]*"   Then    Msgbox RS!漢字氏名   End If   RS.MoveNext Loop   RS.Close: Set RS = Nothing   DB.Close: Set DB = Nothing End Sub

専門家に質問してみよう