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