次の方法で共有


Database.CreateQueryDef メソッド (DAO)

適用先: Access 2013、Office 2013

新しい QueryDef オブジェクトを作成します。

構文

。CreateQueryDef(Name, SQLText)

Database オブジェクトを表す変数です。

パラメーター

名前

必須かどうか

データ型

説明

名前

省略可能

Variant

新しい QueryDef の一意の名前を表す、サブタイプが文字列型 (String) であるバリアント型 (Variant) の値。

SQLText

省略可能

Variant

QueryDef を定義する SQL ステートメントである Variant (String サブタイプ)。 この引数を省略した場合、コレクションへの追加前または追加後に、 SQL プロパティを設定して、 QueryDef を定義できます。

戻り値

QueryDef

注釈

Microsoft Access ワークスペースでは、QueryDef の作成時に名前として長さ 0 の文字列以外を指定すると、作成された QueryDef オブジェクトが QueryDefs コレクションに自動的に追加されます。

名前で指定されたオブジェクトが既に QueryDefs コレクションのメンバーである場合は、実行時エラーが発生します。 CreateQueryDef メソッドを実行すると、名前の引数に長さ 0 の文字列を使用して一時的な QueryDef を作成できます。 新しく作成した QueryDefName プロパティを長さ 0 の文字列 ("") に設定することにより、これを行うこともできます。

一時的な QueryDef オブジェクトは、QueryDefs コレクション内に新しい永続的オブジェクトを作成せずに動的 SQL ステートメントを繰り返し使用する場合に便利です。 長さ 0 の文字列は永続的な QueryDef オブジェクトの有効な名前ではないので、一時的な QueryDef をコレクションに追加することはできません。 新しく作成した QueryDef オブジェクトの Name プロパティと SQL プロパティはいつでも設定が可能であり、設定後に QueryDefQueryDefs コレクションに追加できます。

QueryDef オブジェクトで SQL ステートメントを実行するには、Execute メソッドまたは OpenRecordset メソッドを使用します。

ODBC データベースを使用して SQL パススルー クエリを実行する場合は、QueryDef オブジェクトの使用をお勧めします。

Microsoft Access データベース エンジンのデータベースで QueryDefs コレクションから QueryDef オブジェクトを削除するには、コレクションの Delete メソッドを使用します。

この例では、CreateQueryDef メソッドを使用して、一時的と永続的な QueryDef の両方を作成して実行します。 このプロシージャを実行するには、GetrstTemp 関数が必要です。

    Sub CreateQueryDefX() 
     
       Dim dbsNorthwind As Database 
       Dim qdfTemp As QueryDef 
       Dim qdfNew As QueryDef 
     
       Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     
       With dbsNorthwind 
          ' Create temporary QueryDef. 
          Set qdfTemp = .CreateQueryDef("", _ 
             "SELECT * FROM Employees") 
          ' Open Recordset and print report. 
          GetrstTemp qdfTemp 
          ' Create permanent QueryDef. 
          Set qdfNew = .CreateQueryDef("NewQueryDef", _ 
             "SELECT * FROM Categories") 
          ' Open Recordset and print report. 
          GetrstTemp qdfNew 
          ' Delete new QueryDef because this is a demonstration. 
          .QueryDefs.Delete qdfNew.Name 
          .Close 
       End With 
     
    End Sub 
     
    Function GetrstTemp(qdfTemp As QueryDef) 
     
       Dim rstTemp As Recordset 
     
       With qdfTemp 
          Debug.Print .Name 
          Debug.Print "  " & .SQL 
          ' Open Recordset from QueryDef. 
          Set rstTemp = .OpenRecordset(dbOpenSnapshot) 
     
          With rstTemp 
             ' Populate Recordset and print number of records. 
             .MoveLast 
             Debug.Print "  Number of records = " & _ 
                .RecordCount 
             Debug.Print 
             .Close 
          End With 
     
       End With 
     
    End Function 

次の例では、 CreateQueryDef メソッドと OpenRecordset メソッド、および SQL プロパティを使用して、Microsoft SQL Server サンプル データベース Pubs の題名のテーブルをクエリし、最もよく売れている本の題名と題名識別子を返します。 次に、著者のテーブルをクエリし、印税の割合に基づいてそれぞれの著者にボーナス小切手を送信するようユーザーに指示します (ボーナスの合計は 1,000 ドルで、それぞれの著者はこの金額から印税の割合に応じた額を受け取ります)。

Sub ClientServerX2() 
 
   Dim dbsCurrent As Database 
   Dim qdfBestSellers As QueryDef 
   Dim qdfBonusEarners As QueryDef 
   Dim rstTopSeller As Recordset 
   Dim rstBonusRecipients As Recordset 
   Dim strAuthorList As String 
 
   ' Open a database from which QueryDef objects can be  
   ' created. 
   Set dbsCurrent = OpenDatabase("DB1.mdb") 
 
   ' Create a temporary QueryDef object to retrieve 
   ' data from a Microsoft SQL Server database. 
   Set qdfBestSellers = dbsCurrent.CreateQueryDef("") 
   With qdfBestSellers 
      ' Note: The DSN referenced below must be configured to  
      '       use Microsoft Windows NT Authentication Mode to  
      '       authorize user access to the Microsoft SQL Server. 
      .Connect = "ODBC;DATABASE=pubs;DSN=Publishers" 
      .SQL = "SELECT title, title_id FROM titles " & _ 
         "ORDER BY ytd_sales DESC" 
      Set rstTopSeller = .OpenRecordset() 
      rstTopSeller.MoveFirst 
   End With 
 
   ' Create a temporary QueryDef to retrieve data from 
   ' a Microsoft SQL Server database based on the results from 
   ' the first query. 
   Set qdfBonusEarners = dbsCurrent.CreateQueryDef("") 
   With qdfBonusEarners 
      ' Note: The DSN referenced below must be configured to  
      '       use Microsoft Windows NT Authentication Mode to  
      '       authorize user access to the Microsoft SQL Server. 
      .Connect = "ODBC;DATABASE=pubs;DSN=Publishers" 
      .SQL = "SELECT * FROM titleauthor " & _ 
         "WHERE title_id = '" & _ 
         rstTopSeller!title_id & "'" 
      Set rstBonusRecipients = .OpenRecordset() 
   End With 
 
   ' Build the output string. 
   With rstBonusRecipients 
      Do While Not .EOF 
         strAuthorList = strAuthorList & "  " & _ 
            !au_id & ":  $" & (10 * !royaltyper) & vbCr 
         .MoveNext 
      Loop 
   End With 
 
   ' Display results. 
   MsgBox "Please send a check to the following " & _ 
      "authors in the amounts shown:" & vbCr & _ 
      strAuthorList & "for outstanding sales of " & _ 
      rstTopSeller!Title & "." 
 
   rstTopSeller.Close 
   dbsCurrent.Close 
 
End Sub 

次の例は、パラメーター クエリを作成する方法を示しています。 Param1 および Param2 という名前の 2 つのパラメーターを使用して myQuery という名前のクエリを作成します。 これを行うために、クエリの SQL プロパティは、パラメータを定義する Structured Query Language (SQL) ステートメントに設定されます。

サンプル コードの提供元:Microsoft Access 2010 Programmer's Reference

    Sub CreateQueryWithParameters()
    
        Dim dbs As DAO.Database
        Dim qdf As DAO.QueryDef
        Dim strSQL As String
    
        Set dbs = CurrentDb
        Set qdf = dbs.CreateQueryDef("myQuery")
        Application.RefreshDatabaseWindow
    
        strSQL = "PARAMETERS Param1 TEXT, Param2 INT; "
        strSQL = strSQL & "SELECT * FROM [Table1] "
        strSQL = strSQL & "WHERE [Field1] = [Param1] AND [Field2] = [Param2];"
        qdf.SQL = strSQL
    
        qdf.Close
        Set qdf = Nothing
        Set dbs = Nothing
    
    End Sub