转载日本某网站。。。。。
Recordsetの作成(DAO編)
01.オブジェクト変数の宣言
【書式】Dim オブジェクト名 As クラス名
オブジェクト変数を宣言するには,Dim,Static,Public,Privateステートメントを使用します。これらのステートメントについては変数の適用範囲を参照してください。クラス名は,オブジェクトを提供するコンポーネントの名前と,オブジェクトのクラス名をドット(.)でつないで指定します。DAOオブジェクトを提供するコンポーネントの名前は「DAO」です。
【サンプルコード】
Dim DB As DAO.Database (Databaseオブジェクトを扱う変数(DB)を宣言)
Dim RS As DAO.Recordset (Recordsetオブジェクトを扱う変数(RS)を宣言)
02.データベースに接続する
データベースに接続するには,Databaseオブジェクトを使用します。
- カレントデータベースに接続する
CurrentDb関数の戻り値をDatabase型オブジェクト変数に代入します。
【サンプルコード】
Dim DB As DAO.Database
Set DB = CurrentDb()
- 他のAccessデータベースに接続する
WorkasaceコレクションのOpenDatabaseメソッドを使用します。
【サンプルコード】
Dim DB As DAO.Database
Set DB = DBEngine.Workspaces(0).OpenDatabase("D:\Data\Sample.mdb")
03.Recordsetオブジェクトの作成
DatabaseオブジェクトのOpenRecordsetメソッドを利用してレコードセットを作成します。
【書式】
Set recordset = database.OpenRecordset (type, options)
recordset: Recordsetオブジェクトを表すオブジェクト変数を指定
database:開いているDatabaseオブジェクト変数を指定
source:テーブル名,クエリー名,SQL ステートメントを指定
type:(省略可能) Recordsetの種類を示す定数を指定
options:(省略可能) Recordsetの特性を指定する定数の組み合わせを指定
■引数typeには次の定数から 1つを使用します。
定数 | 内容 |
dbOpenTable | テーブルタイプの Recordsetオブジェクトを作成。 |
dbOpenDynaset | ダイナセットタイプの Recordsetオブジェクトを作成。 |
dbOpenSnapshot | スナップショットタイプの Recordsetオブジェクトを作成。 |
dbOpenForwardOnly | 前方スクロールタイプの Recordsetオブジェクトを作成。 |
※種類を指定しないと、テーブルタイプの Recordsetオブジェクトが作成可能な場合は、テーブルタイプの Recordsetオブジェクが作成され、sourceに、リンクテーブルやクエリーを指定している場合はダイナセットタイプの Recordset オブジェクトが作成されます。
■引数optionsには,次の定数の組み合わせを使用できます。
定数 | 内容 | T | D | S | F |
dbAppendOnly | レコードの追加はできますが、編集および削除はできません。 | ● | |||
dbSeeChanges | 編集中のデータを他のユーザーが変更しようとした場合、エラーが発生します。 | ● | |||
dbDenyWrite | 他のユーザーはレコードの修正や追加できません。 | ● | ● | ● | ● |
dbDenyRead | 他のユーザーはテーブルのデータの読み取りはできません。 | ● | |||
dbForwardOnly | 前方スクロールタイプの Recordsetオブジェクトを作成します。 | ● | |||
dbReadOnly | 他のユーザーは Recordsetの変更はできません。 | ● | ● | ● | ● |
dbInconsistent | 矛盾を許す更新を可能にします。 | ● | ● | ||
dbConsistent | 一貫性のある更新のみを可能にします。 | ● | ● |
※表中の「●」は使用可能なレコードセットのタイプを表しています。
T・・・テーブルタイプの Recordsetオブジェクト
D・・・ダイナセットタイプの Recordset オブジェクト
S・・・スナップショットタイプの Recordsetオブジェクト
F・・・前方スクロールタイプの Recordsetオブジェクト
- テーブルタイプのRecordsetオブジェクト
① テーブルタイプのRecordsetオブジェクトは,テーブルに登録されているレコードの集まりを表します。レコードの追加・削除や、データの更新したりすることができます。
②1つのローカルテーブルからのみ作成可能で、リンクテーブルや結合による選択クエリで作成することは出来ません。
③もとになっているテーブル用に作成された「インデックス」が使用でき、他のタイプのレコードセットに比べ、データのソートや検索が高速です。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenTable)
- ダイナセットタイプのRecordsetオブジェクト
①ダイナセットタイプのRecordsetオブジェクトは,ローカルテーブル、リンクテーブル、選択クエリから作成できます。
②レコードを追加したり,データを更新したりすることができます。
③Recordsetのレコードが変更されると、もとになっているテーブルのレコードも更新され、もとになっているテーブル
のレコードが更新されると、Recordsetも変更されます。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenDynaset)
- スナップショットタイプのRecordsetオブジェクト
①スナップショットタイプのRecordsetオブジェクトは,スナップショット作成時のデータに固定されます。。
②レコードセットの内容は更新できません。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenSnapshot)
- 前方スクロールスナップショットタイプのRecordsetオブジェクト
①処理は速いが、他のタイプより機能がすくなくなります。
②レコードを前方方向のみ移動できます(MoveメソッドとMoveNextメソッドのみ使用可能)。
③レコードセットの内容は更新できません。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbOpenForwardOnly)
- フォームをもとにRecordsetオブジェクトを作成する
【書式】Set recordset = form.Recordset.Clone
recordset:開くRecordsetオブジェクトを表すオブジェクト変数を指定
form:開いているフォーム
フォームのRecordsetプロパティは,フォームのRecordsetのCloneメソッドを利用すると,AccessのフォームをもとにしてダイナセットタイプのRecordsetオブジェクトを作成することができます。
【サンプルコード】
Public Sub exsample()
Dim RS As dao.Recordset
Set RS = Form!F_銀行コード.Recordset.Clone
Do Until RS.EOF
Debug.Print RS!銀行コード, RS!銀行名
RS.MoveNext
Loop
RS.Close
Set RS = Nothing
End Sub
こちらにもサンプルがあります。参考にしてください。
04.レコードタイプの使い分けのポイント
データを使う目的によってRecordsetのタイプを使い分ける必要があります。
① データの並べ替えやインデックスを利用してレコード操作を行う場合は、テーブルタイプを使用すると高速に処理
できます。
② クエリで抽出したレコードを更新する場合は、ダイナセットを使用します。
③ テーブルタイプを使えない状況で、レコードを単に参照する場合は、前方スクロールスナップショットを使うと、速く
処理できます。
05.フィールドの参照方法
フィールドオブジェクトには,作成した順番に0から始まるインデックス番号が付けられます。各フィールドを参照するには,このインデックス番号を使う方法と,フィールドに付けられた名前を使う方法があります。
Fields | ||||
学籍番号 | 氏名 | フリガナ | クラス | ・・・ |
0 | 1 | 2 | 3 | ・・・ |
図1 |
- インデックス番号を利用する
Recordset オブジェクトとFieldsコレクションをドット演算子(.)でつないで記述します。
【書式1】recordset.Fields(インデックス番号)
recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
- オブジェクトの名前を利用する
【書式2】recordset.Fields(オブジェクト名)
recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
(オブジェクト名はダブルクォーテーションで囲みます)
【書式3】recordset.Fields!オブジェクト名
recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【書式4】recordset!オブジェクト名
recordset: 開いているRecordsetオブジェクトを表すオブジェクト変数を指定します。
【例】次はいずれも上の図1のFieldsコレクションの「フリガナ」フィールドを参照する例です。
RS.Fields(2)
RS.Fields("フリガナ")
RS.Fields!フリガナ
RS!フリガナ
【サンプルコード】次の例は「コード1」から「コード10」までのフィールドを「 For ~Next 」ループで操作する方法です。似たような名称のフィールド操作に利用すると便利です。
Sub Exsample()
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim i As Integer
Set DB = CurrentDb
Set RS = DB.OpenRecordset("T_追跡")
RS.MoveFirst
Do Until RS.EOF
RS.Edit
For i = 1 To 10
RS("コード" & i) = Me("コード" & i)
If RS("コード" & i) = "" Or Len(RS("コード" & i)) <> 8 Then
RS("コード" & i) = Null
End If
Next i
RS.Update
RS.MoveNext
Loop
RS.Close: Set RS = Nothing
DB.Close: Set DB = Nothing
End Sub