SELECT ステートメント、FROM 句の使用例

以下のいくつかの例では、Employees テーブルに Salary フィールドがあると仮定しています。このフィールドは実際の Northwind データベースの Employees テーブルにはありませんので注意してください。

次の例では、Employees テーブルからすべてのレコードの LastName フィールドと FirstName フィールドを選択する SQL ステートメントに基づいて、ダイナセット タイプの Recordset オブジェクトを作成します。ここでは、Debug ウィンドウに Recordset オブジェクトの内容を出力する EnumFields というプロシージャを呼び出しています。

Sub SelectX1()

    

    Dim dbs As Database, rst As Recordset

    

    ' この下の行を、使用しているコンピュータ上の

    ' Northwind のパスに変更してください。

    Set dbs = OpenDatabase("Northwind.mdb")

    

    ' Employees テーブルにあるすべてのレコードの

    ' last name first name の値を選択します。

    Set rst = dbs.OpenRecordset("SELECT LastName, " _

        & "FirstName FROM Employees;")

    

    ' レコード セットを作成します。

    rst.MoveLast

    

    ' EnumFields を呼び出し、Recordset の内容を

    ' 出力します。

    EnumFields rst,12

    

    dbs.Close

    

End Sub

    

次の例では、PostalCode フィールドに値が入力されているレコードの数を数え、返されるフィールドに "Tally" という名前を付けます。

Sub SelectX2()

    

    Dim dbs As Database, rst As Recordset

    

    ' この下の行を、使用しているコンピュータ上の

    ' Northwind のパスに変更してください。

    Set dbs = OpenDatabase("Northwind.mdb")

    

    ' PostalCode フィールドに値が入力されている

    ' レコード数を数え、その結果を

    ' Tally フィールドに返します。

    Set rst = dbs.OpenRecordset("SELECT Count " _

        & "(PostalCode) AS Tally FROM Customers;")

    

    ' Recordset を作成します。

    rst.MoveLast

    

    ' EnumFields を呼び出し、Recordset の内容を

    ' 出力します。フィールド幅を 12 に設定します。

    EnumFields rst, 12

    

    dbs.Close

    

End Sub

    

次の例では、社員数、平均給与額、および最高給与額を表示します。

Sub SelectX3()

    

    Dim dbs As Database, rst As Recordset

    

    ' この下の行を、使用しているコンピュータ上の

    ' Northwind のパスに変更してください。

    Set dbs = OpenDatabase("Northwind.mdb")

    

    ' 社員の数を数え、平均給与額を計算して、

    ' 最高給与額を返します。

    Set rst = dbs.OpenRecordset("SELECT Count (*) " _

        & "AS TotalEmployees, Avg(Salary) " _

        & "AS AverageSalary, Max(Salary) " _

        & "AS MaximumSalary FROM Employees;")

    

    ' Recordset を作成します。

    rst.MoveLast

    

    ' EnumFields を呼び出し、Recordset の内容を

    ' 出力します。Recordset オブジェクトと必要な

    ' フィールド幅を渡します。

    EnumFields rst, 17

    

    dbs.Close

    

End Sub

    

EnumFields Sub プロシージャには、呼び出し元のプロシージャから Recordset オブジェクトが渡されます。EnumFields は Recordset オブジェクトのフィールドを書式化し、それを Debug ウィンドウに出力します。変数 intFldLen は、出力に必要なフィールド幅です。フィールドによってはその一部が切り捨てられる場合があります。

Sub EnumFields(rst As Recordset, intFldLen As Integer)

    

    Dim lngRecords As Long, lngFields As Long

    Dim lngRecCount As Long, lngFldCount As Long

    Dim strTitle As String, strTemp As String

    

    ' 変数 lngRecords Recordset

    ' レコードの数を設定します。

    lngRecords = rst.RecordCount

    ' 変数 lngFields Recordset

    ' フィールドの数を設定します。

    lngFields = rst.Fields.Count

    

    Debug.Print "There are " & lngRecords _

        & " records containing " & lngFields _

        & " fields in the recordset."

    Debug.Print

    

    ' 列見出しに出力する文字列を作成します。

    strTitle = "Record "

    For lngFldCount = 0 To lngFields - 1

        strTitle = strTitle _

        & Left(rst.Fields(lngFldCount).Name _

        & Space(intFldLen), intFldLen)

    Next lngFldCount

    

    ' 列見出しを出力します。

    Debug.Print strTitle

    Debug.Print

    

    ' Recordset のレコード数とフィールドの値を

    ' 出力するループを実行します。

    rst.MoveFirst

    For lngRecCount = 0 To lngRecords - 1

        Debug.Print Right(Space(6) & _

            Str(lngRecCount), 6) & " ";

        For lngFldCount = 0 To lngFields - 1

            ' Null 値があるかどうかを調べます。

            If IsNull(rst.Fields(lngFldCount)) Then

                strTemp = "<null>"

            Else

                ' strTemp をフィールドに設定します。

                Select Case _

                    rst.Fields(lngFldCount).Type

                    Case 11

                        strTemp = ""

                    Case dbText, dbMemo

                        strTemp = _

                            rst.Fields(lngFldCount)

                    Case Else

                        strTemp = _

                            str(rst.Fields(lngFldCount))

                End Select

            End If

            Debug.Print Left(strTemp _

                & Space(intFldLen), intFldLen);

        Next lngFldCount

        Debug.Print

        rst.MoveNext

    Next lngRecCount

    

End Sub