Consulta sql
Hola. Mira he escrito este modulo en access '97:
Function PARCIALBA1()
Dim Dbs As Database, QDF As QueryDef
Dim strSQL As String
Dim Variable As String
' Devuelve la referencia a la base de datos activa.
Set Dbs = CurrentDb()
' Actualiza la colección QueryDefs.
Dbs.QueryDefs.Refresh
' Si existe la consulta Consulta TEMPORAL, la elimina.
For Each QDF In Dbs.QueryDefs
If QDF.Name = "PARCIAL BA1" Then
Dbs.QueryDefs.Delete QDF.Name
End If
Next QDF
' Crea una cadena SQL con la consulta deseada pidiendo parametros
' hasta que el dato devuelto sea blanco o se pulse en cancelar
Do
Variable = InputBox("Introdueixi les caselles de l'estat 1:", "CASELLES")
If Variable = "" Or IsNull(Variable) Then
Exit Do
Else
strSQL = strSQL & Variable & ", "
End If
Loop
'Formamos la sentencia SQL completa, teniendo en cuenta los parametros anteriores
strSQL = "PARAMETERS [ESTAT1?] Text, [DATA DE L'ESTAT1?] Long; SELECT DISTINCTROW EMPRESA, DATA, ESTAT, COMPTE_PRODUCTE, Int(Sum(Val([IMPORT]))/1000) AS IMPORTE INTO [PARCIAL BA1] FROM GESTIO_COMPTABLE_HISTORIC_ESTATS_BA WHERE clau3 IN(" & Mid$(strSQL, 1, Len(strSQL) - 1) & ") GROUP BY EMPRESA, DATA, ESTAT, COMPTE_PRODUCTE HAVING ((EMPRESA=118) AND (ESTAT= [ESTAT1?]) AND (DATA= [DATA DE L'ESTAT1?]) ) ORDER BY COMPTE_PRODUCTE "
' Crea un objeto tipo consulta llamado ConsultaTemporal con la sentencia anterior
Set QDF = Dbs.CreateQueryDef("PARCIAL BA1", strSQL)
' Abre la consulta en la vista Hoja de datos.
DoCmd.OpenQuery QDF.Name
'Elimina la consulta creada anteriormente
Dbs.QueryDefs.Delete QDF.Name
'Libera la variable objeto
Set Dbs = Nothing
End Function
Funciona todo perfectamente solo que cuando se abre la consulta con el "docmd.openquery qdf.name" me dice que tiene un error 3078 y que el motor de la base de datos no pudo encontrar la tabla "parcial ba1". Pero si esa es la tabla de salida!. Si ejecutas la consulta manualmente pasa lo mismo pero si la ejecutas unas tres o cuatro veces seguidas va dando el fallo hasta que de repente funciona. ¿Sabes qué podría ser?
Ha ver si me podrías echar un cable.
Merci.
Function PARCIALBA1()
Dim Dbs As Database, QDF As QueryDef
Dim strSQL As String
Dim Variable As String
' Devuelve la referencia a la base de datos activa.
Set Dbs = CurrentDb()
' Actualiza la colección QueryDefs.
Dbs.QueryDefs.Refresh
' Si existe la consulta Consulta TEMPORAL, la elimina.
For Each QDF In Dbs.QueryDefs
If QDF.Name = "PARCIAL BA1" Then
Dbs.QueryDefs.Delete QDF.Name
End If
Next QDF
' Crea una cadena SQL con la consulta deseada pidiendo parametros
' hasta que el dato devuelto sea blanco o se pulse en cancelar
Do
Variable = InputBox("Introdueixi les caselles de l'estat 1:", "CASELLES")
If Variable = "" Or IsNull(Variable) Then
Exit Do
Else
strSQL = strSQL & Variable & ", "
End If
Loop
'Formamos la sentencia SQL completa, teniendo en cuenta los parametros anteriores
strSQL = "PARAMETERS [ESTAT1?] Text, [DATA DE L'ESTAT1?] Long; SELECT DISTINCTROW EMPRESA, DATA, ESTAT, COMPTE_PRODUCTE, Int(Sum(Val([IMPORT]))/1000) AS IMPORTE INTO [PARCIAL BA1] FROM GESTIO_COMPTABLE_HISTORIC_ESTATS_BA WHERE clau3 IN(" & Mid$(strSQL, 1, Len(strSQL) - 1) & ") GROUP BY EMPRESA, DATA, ESTAT, COMPTE_PRODUCTE HAVING ((EMPRESA=118) AND (ESTAT= [ESTAT1?]) AND (DATA= [DATA DE L'ESTAT1?]) ) ORDER BY COMPTE_PRODUCTE "
' Crea un objeto tipo consulta llamado ConsultaTemporal con la sentencia anterior
Set QDF = Dbs.CreateQueryDef("PARCIAL BA1", strSQL)
' Abre la consulta en la vista Hoja de datos.
DoCmd.OpenQuery QDF.Name
'Elimina la consulta creada anteriormente
Dbs.QueryDefs.Delete QDF.Name
'Libera la variable objeto
Set Dbs = Nothing
End Function
Funciona todo perfectamente solo que cuando se abre la consulta con el "docmd.openquery qdf.name" me dice que tiene un error 3078 y que el motor de la base de datos no pudo encontrar la tabla "parcial ba1". Pero si esa es la tabla de salida!. Si ejecutas la consulta manualmente pasa lo mismo pero si la ejecutas unas tres o cuatro veces seguidas va dando el fallo hasta que de repente funciona. ¿Sabes qué podría ser?
Ha ver si me podrías echar un cable.
Merci.
1 respuesta
Respuesta de juanito01
1