ray88’s diary

お仕事で困ったとき用の自分用の覚書

AccessVBA DAO

■DAOは「Data Access Object」の略でAccessのデータベースエンジンである jetデータベースエンジン に直接接続して、データを操作することのできるオブジェクトライブラリです。
■ADO と DAO の違い
 DAOは、jetデータベースエンジンに直接接続するため、単体のAccessシステムを操作するケースに適しています。ADOはAccessに限らず、Microsoft SQL Serverなどのデータベースに接続できる汎用性のはるオブジェクトを提供し、データベースの種類が異なっても同じ手法でレコードを操作できる利点があります。

■DAOの特徴
 DAOにはテーブルやクエリを作成する機能があるが、ADOにはテーブルやクエリを作成する機能はなく、ADOXというADOの拡張機能を使用する必要がある。
 また、DAOはレコードセットの操作やトランザクションの管理等、ADOで行うことのできる処理の多くを実行することが可能。

■DAOを使用するには
 参照設定は不要。

■DAOの宣言について
 DAOとADOには同じ名前のオブジェクトが数多く存在する為、明示的に以下の様に宣言すると、参照設定で優先してライブラリが参照されます。

Dim RS AS ADODB.Recordset
Dim RS AS DAO.Recordset

■データベースへの接続
 【カレントデータベースに接続する場合】

Dim DB AS DAO.DB
Set DB = CurrentDB

 【カレント以外のデータベースに接続する場合】

Dim DB AS DAO.DB
Set DB = OpenDatabase("データベースのファイルパス")

SQLの実行
以下の構文で実行できる。「クエリ」の部分にはクエリ名またはSQL文を記述する。

DB.Execute クエリ

■レコードセットに格納する

Private Sub btn_実行_Click()

    'SQL格納用変数
    Dim strSQL As String
    'SQL文生成
    strSQL = "SELECT " & _
    "T_販売データ.fld_販売ID" & _
    ",T_販売データ.fld_販売日" & _
    ",T_販売データ.fld_商品ID" & _
    ",T_商品マスター.fld_商品名" & _
    ",T_販売データ.fld_数量" & _
    ",T_販売データ.fld_売価" & _
    ",T_社員マスター.fld_社員名 " & _
    "FROM T_商品マスター INNER JOIN " & _
    "(T_社員マスター INNER JOIN T_販売データ " & _
    "ON T_社員マスター.fld_社員ID = T_販売データ.fld_社員ID) " & _
    "ON T_商品マスター.fld_商品ID = T_販売データ.fld_商品ID " & _
    "WHERE T_販売データ.fld_商品ID = 'BL05-01' " & _
    "AND T_販売データ.fld_販売日 = #2019/01/10# " & _
    "ORDER BY T_販売データ.fld_販売ID;"
    
    'データベースオブジェクトの宣言
    Dim daoDb As DAO.Database
    '現在のデータベースをセット
    Set daoDb = CurrentDb
    'レコードセットオブジェクトを宣言
    Dim daoRs As DAO.Recordset
    'SQLでレコード読込
    Set daoRs = daoDb.OpenRecordset(strSQL)
    'レコード数を格納する変数を宣言
    Dim rsCnt As Long
    '繰り返し処理用カウンタ変数の宣言
    Dim i As Long
    'レコードが存在しない場合の処理
    If daoRs.BOF = True And daoRs.EOF Then
        MsgBox "対象レコードがありません", vbExclamation, "確認"
        '接続解除の工程へジャンプ
        GoTo Finally
    Else
        '最後のレコードへ移動
        daoRs.MoveLast
        '現在地のレコード数を代入
        rsCnt = daoRs.RecordCount
        'レコードの先頭へ移動
        daoRs.MoveFirst
    End If
    'レコードの先頭から末尾まで繰り返し処理
    For i = 1 To rsCnt
        
        Debug.Print _
            daoRs!fld_販売ID, daoRs!fld_販売日, daoRs!fld_商品ID, _
            daoRs!fld_商品名, daoRs!fld_数量, daoRs!fld_売価, daoRs!fld_社員名
        '次のレコードへ移動
        daoRs.MoveNext
        
    Next i
    
'行ラベルを付けておく
Finally:
    daoRs.Close
    Set daoRs = Nothing
    daoDb.Close
    Set daoDb = Nothing
  
End Sub

ray88.hatenablog.com