转载日本某网站。。。。。
Recordsetの作成(DAO編)
【書式】Dim オブジェクト名 As クラス名
オブジェクト変数を宣言するには,Dim,Static,Public,Privateステートメントを使用します。これらのステートメントについては変数の適用範囲を参照してください。クラス名は,オブジェクトを提供するコンポーネントの名前と,オブジェクトのクラス名をドット(.)でつないで指定します。DAOオブジェクトを提供するコンポーネントの名前は「DAO」です。
【サンプルコード】
Dim DB As DAO.Database (Databaseオブジェクトを扱う変数(DB)を宣言)
Dim RS As DAO.Recordset (Recordsetオブジェクトを扱う変数(RS)を宣言)
データベースに接続するには,Databaseオブジェクトを使用します。
CurrentDb関数の戻り値をDatabase型オブジェクト変数に代入します。
【サンプルコード】
Dim DB As DAO.Database
Set DB = CurrentDb()
WorkasaceコレクションのOpenDatabaseメソッドを使用します。
【サンプルコード】
Dim DB As DAO.Database
Set DB = DBEngine.Workspaces(0).OpenDatabase("D:\Data\Sample.mdb")
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オブジェクトは,テーブルに登録されているレコードの集まりを表します。レコードの追加・削除や、データの更新したりすることができます。
②1つのローカルテーブルからのみ作成可能で、リンクテーブルや結合による選択クエリで作成することは出来ません。
③もとになっているテーブル用に作成された「インデックス」が使用でき、他のタイプのレコードセットに比べ、データのソートや検索が高速です。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenTable)
①ダイナセットタイプのRecordsetオブジェクトは,ローカルテーブル、リンクテーブル、選択クエリから作成できます。
②レコードを追加したり,データを更新したりすることができます。
③Recordsetのレコードが変更されると、もとになっているテーブルのレコードも更新され、もとになっているテーブル
のレコードが更新されると、Recordsetも変更されます。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenDynaset)
①スナップショットタイプのRecordsetオブジェクトは,スナップショット作成時のデータに固定されます。。
②レコードセットの内容は更新できません。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbopenSnapshot)
①処理は速いが、他のタイプより機能がすくなくなります。
②レコードを前方方向のみ移動できます(MoveメソッドとMoveNextメソッドのみ使用可能)。
③レコードセットの内容は更新できません。
【サンプルコード】
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Set DB = CurrentDb()
Set RS = Db.OpenRecordset("生徒名簿",dbOpenForwardOnly)
【書式】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
こちらにもサンプルがあります。参考にしてください。
データを使う目的によってRecordsetのタイプを使い分ける必要があります。
① データの並べ替えやインデックスを利用してレコード操作を行う場合は、テーブルタイプを使用すると高速に処理
できます。
② クエリで抽出したレコードを更新する場合は、ダイナセットを使用します。
③ テーブルタイプを使えない状況で、レコードを単に参照する場合は、前方スクロールスナップショットを使うと、速く
処理できます。
フィールドオブジェクトには,作成した順番に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