vba - run - QueryDefs devuelve ~ sq_rrptStatTabRout
ms access vba run query (2)
Situación: necesito buscar el primer campo de cada consulta. Después de crear el código que figura a continuación y ejecutarlo, recibí la siguiente Debug.Print
:
~sq_rrptStatTabRout
qryBridgeSub
qryCentTabRout
Esperaba que los dos últimos se imprimieran, pero no estoy particularmente seguro de por qué lo hizo el primero, ya que rptStatTabRout
existe en la base de datos como un informe.
Pregunta: ¿Hay una manera simple de explicar esto o deshacerse de él?
Código:
Private Sub Command47_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim queries As DAO.QueryDefs
Dim query As DAO.QueryDef
Dim queryname As String
Dim fld As DAO.Field
Set db = CurrentDb
Set queries = db.QueryDefs
'' loop through each query
For Each query In queries
On Error Resume Next
queryname = query.name
Debug.Print queryname
Set rs = CurrentDb.OpenRecordset("SELECT * FROM " & queryname & "", dbOpenDynaset)
fld = rs.Fields(0).name
MsgBox fld
Next
End Sub
En primer lugar, lamento mucho ejecutar tu código antes de darte cuenta de que ejecutas cada consulta. Hecho para momentos interesantes ya que tengo más de 50 consultas.
Modifiqué tu código para ayudar a explicar lo que está sucediendo, el código está limitado a 10 iteraciones porque parece que las consultas guardadas se muestran primero y se expulsaron de mi ventana inmediata.
Public Function Test()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim queries As DAO.QueryDefs
Dim query As DAO.QueryDef
Dim queryname As String
Dim fld As DAO.Field
Set db = CurrentDb
Set queries = db.QueryDefs
Dim i As Integer
i = 0
'' loop through each query
For Each query In queries
On Error Resume Next
If i < 10 Then
Debug.Print query.Name
Debug.Print query.SQL
i = i + 1
End If
Next
End Function
Si ejecuta eso, puede ver el SQL real que encontró en su informe rptStatTabRout
. Esto se debe a que hay más consultas en QueryDefs
que solo las que ve en su panel de navegación.
En su ejemplo, eche un vistazo a RecordSource
para su informe y sospecho que encontrará una consulta escrita. Incluso encontrará sql en el RowSource
para comboboxes también.
Parece que quiere ignorar las consultas guardadas cuyos nombres comienzan con ~
. Use una condición If
para ignorarlos.
If Not query.Name Like "~*" Then
'' find the first field
End If
Tenga en cuenta que si desea limitar la evaluación solo a las consultas SELECT
, verifique la propiedad .Type
cada consulta. Una consulta SELECT
es tipo dbQSelect (0). Compruebe el tema QueryDef.Type Property en el sistema de ayuda de Access en caso de que desee procesar otros tipos de consultas.
Si se pregunta de dónde salió esa consulta ~ sq_rrptStatTabRout , marque la propiedad Record Source de su informe rptStatTabRout . Cuando la fuente es una instrucción SELECT
, Access guarda la declaración como una consulta oculta. El prefijo ~
evita que se muestre en el panel de navegación.
Lo mismo sucede cuando usa una instrucción SELECT
como origen de fila para un combo o cuadro de lista.