Método Database.CreateQueryDef (DAO)

Se aplica a: Access 2013, Office 2013

Crea un nuevo objeto QueryDef.

Sintaxis

expresión . CreateQueryDef(Name, SQLText)

expression Variable que representa un objeto Database.

Parameters

Nombre

Obligatorio/opcional

Tipo de datos

Descripción

Name

Opcional

Variant

Variant (subtipo String) que designa inequívocamente el nuevo objeto QueryDef.

SQLText

Opcional

Variant

Variant (subtipo String) que es una instrucción SQL que define el objeto QueryDef. Si omite este argumento, puede definir el objeto QueryDef estableciendo su propiedad SQL antes o después de agregarlo a una colección.

Valor devuelto

QueryDef

Comentarios

En un área de trabajo de Microsoft Access, si proporciona cualquier otro elemento que no sea una cadena de longitud cero para el nombre al crear un objeto QueryDef, el objeto QueryDef resultante se agrega automáticamente a la colección QueryDefs.

Si el objeto especificado por el nombre ya es un miembro de la colección QueryDefs, se produce un error en tiempo de ejecución. Puede crear un archivo QueryDef temporal utilizando una cadena de longitud cero para el argumento de nombre cuando ejecuta el método CreateQueryDef. También puede realizar esto estableciendo la propiedad nombre de un QueryDef recién creado en una cadena de longitud cero ("").

Los objetos QueryDef temporales son útiles si quiere utilizar instrucciones SQL repetidamente sin tener que crear nuevos objetos permanentes en la colección QueryDefs. No puede anexar un QueryDef temporal a cualquier colección ya que una cadena de longitud cero no es un nombre válido para un objeto QueryDef permanente. Siempre puede establecer las propiedades Name y SQL del objeto QueryDef recién creado y posteriormente anexar QueryDef a la colección QueryDefs.

Para ejecutar una instrucción SQL en un objeto QueryDef, use el método Execute u OpenRecordset.

El uso de un objeto QueryDef es el método recomendado para realizar consultas de paso a través SQL con bases de datos ODBC.

Para quitar un objeto QueryDef de una colección QueryDefs de una base de datos del motor de base de datos de Microsoft Access, use el método Delete en la colección.

Ejemplo

En este ejemplo se usa el método CreateQueryDef para crear y ejecutar un QueryDef temporal y otro permanente. La función GetrstTemp es necesaria para que se ejecute este procedimiento.

    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 

En este ejemplo se usan los métodos CreateQueryDef y OpenRecordset y la propiedad SQL para realizar una consulta en la tabla de títulos de la base de datos de ejemplo Pubs de Microsoft SQL Server y devolver el título y el identificador de título del libro más vendido. A continuación, se realiza una consulta en la tabla de autores y se indica al usuario que envíe una prima a cada autor en función de su porcentaje de derechos de autor (la prima total es de 1.000 dólares y cada autor debe recibir un porcentaje de ese importe).

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 

El siguiente ejemplo muestra cómo crear una consulta de parámetros. Una consulta denominada myQuery se crea con dos parámetros, denominados Param1 y Param2. Para ello, la propiedad SQL de la consulta está configurada en una instrucción de Lenguaje de consulta estructurado (SQL) que define los parámetros.

Código de ejemplo proporcionado por la Referencia del programador de Microsoft Access 2010.

    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