トップ > スキル : アプリケーション > VBA for Access > 応用編(データベースオブジェクト DAOとADO)

VBA_Access

DAO

テーブルの作成

DAOでテーブルとフィールドを作成するには、コレクションとオブジェクトの定義付けを覚えておく必要があります。

図の階層構造を見ると、テーブルはTableDefsコレクション、フィールドはFieldsコレクションで管理され、テーブルを作成するにはこれらのコレクションにオブジェクトを追加することになります。

テーブルを1つ作成するには、TableDefオブジェクトを作成してTableDefsコレクションに追加します。同様に、フィールドを1つ作成するには、Fieldオブジェクトを作成してFieldsコレクションに追加します。

テーブルはフィールドで構成されるので、少なくても1つ以上のフィールドを作成することになります。そして、各オブジェクトのコレクションへの追加は、低い方から順番に行っていきます。

◆ テーブル作成手順
  1. テーブルの本体となるTableDefオブジェクトを作成する
  2. Fieldオブジェクトを作成する
  3. FieldオブジェクトをFieldsコレクションに追加する
  4. TableDefオブジェクトをTableDefsコレクションに追加する
  5. これ以降はNewAddメソッドなどを使用して、新規レコードを作成する
《 記述例 》

テーブル「商品マスタ」を作成します。フィールドは「No」、「商品名」、「単価」の3つを作成して、データ型、フィールドサイズも指定します。次のように記述します。

	Sub テーブル作成()
		On Error GoTo Error_go

		Dim db As DAO.Database
		Dim tbdef As DAO.TableDef
		Dim flNo As DAO.Field
		Dim flName As DAO.Field
		Dim flPrice As DAO.Field

		Set db = CurrentDb()
		Set tbdef = db.CreateTableDef("商品マスタ")

		Set flNo = tbdef.CreateField("No", dbText, 3)
		Set flName = tbdef.CreateField("商品名", dbText, 50)
		Set flPrice = tbdef.CreateField("単価", dbInteger)

		tbdef.Fields.Append flNo
		tbdef.Fields.Append flName
		tbdef.Fields.Append flPrice

		db.TableDefs.Append tbdef

		MsgBox "商品マスタテーブルが作成されました"

		db.Close: Set db = Nothing
		Exit Sub

	Error_go:
		If Err.Number = 3010 Then
			db.TableDefs.Delete "商品マスタ"
			Resume
		Else
			MsgBox Err.Number & ":" & Err.Description
		End If

		Exit Sub

	End Sub
    

このプロシージャを実行すると作成した旨のメッセージが表示されます。

データベースを更新(F5キーを押す)すると、テーブルが新規に作成されていることが確認できます。

「商品マスタ」テーブルをデザインビューで開くと、それぞれのデータ型やフィールドサイズも指定された設定内容であることが確認できます。

※ CreateFieldメソッド
フィールド作成時に使用して、設定値までも指定できます。
※ Appendメソッド
作成したオブジェクト(テーブルやフィールド)をそれぞれのコレクションに追加する時に使用します。Appendメソッドを実行することで作成が完了します。
※ エラーコード3010
テーブルを作成する際に、同名のテーブルが既に存在する場合はこのエラー番号が発生します。

インデックスの作成

DAOでインデックスは、Indexesコレクションで管理されています。検索時にはインデックスを作成することですばやく実行できます。また、Seekメソッドを使用する際は、必ず検索対象となるフィールドにはインデックスを作成しておく必要があります。

インデックスを作成することは、1つ以上のFieldオブジェクトを持つIndexオブジェクトを作成してIndexesコレクションに追加することになります。

Indexオブジェクトを作成するには、TableDefオブジェクトのCreateIndexメソッドを使用し、インデックスを構成するフィールドの作成は、IndexオブジェクトのCreateFieldメソッドを使用します。

オブジェクトのコレクションへの追加は、階層の低い方から順番に行います。また、IndexオブジェクトのCreateFieldメソッドは、TableDefオブジェクトのCreateFieldメソッドとは異なります。(引数が違う)そして、各コレクションにAppendメソッドを使用して追加して完了します。

◆ インデックスの作成手順

新規テーブル作成時にインデックスも作成する手順は以下の通りになります。

  1. テーブルの本体となるTableDefオブジェクトを作成する
  2. Fieldオブジェクトを作成する
  3. FieldオブジェクトをFieldsコレクションに追加する
  4. Indexオブジェクトを作成する
  5. インデックスを構成するFieldオブジェクトを作成する
  6. Fieldオブジェクトを、IndexオブジェクトのFieldコレクションに追加する
  7. IndexオブジェクトをTableDefオブジェクトのIndexesコレクションに追加する
  8. TableDefオブジェクトをTableDefsコレクションに追加する
  9. これ以降はNewAddメソッドなどを使用して、新規レコードを作成する

基本的には、Indexオブジェクトを作成した後に、Indexesコレクションに追加することになります。

《 記述例 》

先ほどのテーブル作成のプロシージャにインデックスを追加する記述は以下のようになります。

	Sub テーブルとインデックス作成()
		On Error GoTo Error_go

		Dim db As DAO.Database
		Dim tbdef As DAO.TableDef
		Dim flNo As DAO.Field
		Dim flName As DAO.Field
		Dim flPrice As DAO.Field
		Dim Idx As DAO.Index

		Set db = CurrentDb()
		Set tbdef = db.CreateTableDef("商品マスタ")
  
		Set flNo = tbdef.CreateField("No", dbText, 3)
		Set flName = tbdef.CreateField("商品名", dbText, 50)
		Set flPrice = tbdef.CreateField("単価", dbInteger)

		tbdef.Fields.Append flNo
		tbdef.Fields.Append flName
		tbdef.Fields.Append flPrice

		Set Idx = tbdef.CreateIndex("idx_No")
		Set flNo = Idx.CreateField("No")

		Idx.Fields.Append flNo
		tbdef.Indexes.Append Idx

		db.TableDefs.Append tbdef

		MsgBox "商品マスタテーブルが作成されました"

		db.Close: Set db = Nothing
		Exit Sub

	Error_go:
		If Err.Number = 3010 Then
			db.TableDefs.Delete "商品マスタ"
			Resume
		Else
			MsgBox Err.Number & ":" & Err.Description
		End If

		Exit Sub

	End Sub
    

動作を実行すると、「商品マスタ」テーブルが作成されます。そのテーブルをデザインビューで開き、インデックスを確認すると[No]フィールドにインデックスが設定されていることが確認できます。

クエリの作成

DAOでクエリを管理しているのは、QueryDefsコレクションになります。クエリを作成するには、このコレクションにQueryDefオブジェクトを追加することになります。

クエリの基になるテーブルがデータベースに存在しないとクエリは作成できません。そして、このテーブルを基にしてSQLを作成し、CreateQueryDefメソッドを使用してクエリを作成します。
テーブルと同様に、作成したオブジェクトをコレクションに追加する時は、階層の低い方から順番に行います。

◆ クエリの作成手順
  1. QueryDefオブジェクトを作成する
  2. QueryDefsコレクションに追加する

テーブル作成では、Appendメソッドを使用してオブジェクトをコレクションに追加しましたが、クエリではCreateQueryDefメソッドにクエリ名とSQLを引数すると、これを実行した段階で即座にQueryDefsコレクションに新規クエリが追加されます。

《 記述例 》

テーブル「T_商品リスト」を基にして、ID、商品名、そして単価(税抜)と表示させるクエリを作成するには次のように記述します。

  Sub クエリ作成()
  	On Error GoTo Error_go

  	Dim db As DAO.Database
  	Dim rs As DAO.Recordset
  	Dim qryDef As DAO.QueryDef
  	Dim mySQL As String
  	Dim strData As String

  	Set db = CurrentDb()

  	mySQL = "SELECT ID,商品名,[単価] & '(税抜)'AS 税抜単価 FROM T_商品リスト;"
  
  	Set qryDef = db.CreateQueryDef("", mySQL)
  	Set rs = qryDef.OpenRecordset()

  	Do Until rs.EOF
  		strData = strData & vbNewLine & rs!ID & ":" & rs!商品名 & ":\" & rs!税抜単価
  		rs.MoveNext
  	Loop

  	MsgBox strData

  	rs.Close: Set rs = Nothing
  	db.Close: Set db = Nothing
  	Exit Sub

  Error_go:
  	MsgBox Err.Number & ":" & Err.Description
  	Exit Sub

  End Sub
    

動作を確認すると、テーブルから3つのフィールドを取り出して、単価に税抜という文字を付加した結果を表示するメッセージとなります。

ここでは、CreateQueryDefメソッドでSQLを用いた一時的なクエリを作成しています。


これでDAOに関する紹介を終わります。コレクション、オブジェクト、メソッドは、いろいろとありますが、まずは基本的な操作の手順と階層構造を覚えていくことが大事です。また、Access2000、2002ではADOが初期設定となっています。DAOとADOの間には互換性がないので、DAOを利用する場合は必ず「参照設定」でDAOが使えるようにチェックを入れておいてください。