Intenté usar la consulta Pass-Through para llamar al procedimiento de la tienda mysql desde Ms Access VBA. Este es el código:

Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset
    Set qdf = CurrentDb.CreateQueryDef("")
    qdf.Connect = "DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=localhost;PORT=3306;DATABASE=accounting_supp_db;User=xxx;Password=xxx;Option=3"
    qdf.SQL = "CALL MyStoreProc('10156','2021-03-03','2021-03-10')"
    qdf.ReturnsRecords = True
    Set rst = qdf.OpenRecordset
    
    rst.Close
    Set rst = Nothing
    Set qdf = Nothing

Pero devuelve el error 3305: Cadena de conexión no válida en la consulta de paso a través. ¿Hay algún problema con la cadena de conexión?

Gracias

0
Hanni 14 mar. 2021 a las 03:55

1 respuesta

La mejor respuesta

Bueno, ¿una forma de resolver esto?

Simplemente use los datos externos de la cinta y vincule una tabla desde el acceso a MySQL. Haz que funcione, ¿una vez que lo hagas?

Luego haz esto en tu código:

dim rst  as DAO.RecordSet
With CurrentDB.queryDefs("MyPTQuery")
   .Connection = currentdb.tableDefs("The working linked table").Connection
   .SQL = "CALL MyStoreProc('10156','2021-03-03','2021-03-10')"
    set rst = .OpenRecordSet
End if

Supongo que podría agregar a lo anterior .ReturnsRecords = True, pero ¿de nuevo?

Bueno, cree esa consulta de PT: configure la conexión correctamente. Entonces puedes hacer esto en código:

Dim rst1     as DAO.RecordSet
Dim rst2     as DAO.ReocrdSet

With Currentdb.tableDefs("MyPTQuery")
   .SQL = "CALL MyStoreProc('10156','2021-03-03','2021-03-10')"
    set rst1 = .OpenRecordSet
END with

With Currentdb.tableDefs("MyPTQuery")
   .SQL = "CALL MyStoreProc('10777','2021-04-03','2021-05-10')"
    set rst2 = .OpenRecordSet
End With

Tenga en cuenta que no nos metemos en la creación de una definición de consulta. Y observe cómo podemos usar la consulta ONE pt una y otra vez.

Y se pone mejor. ¿Dice que quiere ese proceso de tienda para un informe? Basamos el informe en "MyPTQuery"

Entonces haz esto:

With Currentdb.tableDefs("MyPTQuery")
   .SQL = "CALL MyStoreProc('10777','2021-04-03','2021-05-10')"
End With

docmd.OpenReport "rptCustomerProjects",acViewPreview

De hecho, puede escribir lo anterior así:

Currentdb.tableDefs("MyPTQuery").SQL = "CALL MyStoreProc('10777','2021-04-03','2021-05-10')"
docmd.OpenReport "rptCustomerProjects",acViewPreview

Por lo tanto, le recomiendo que GUARDE la cadena de conexión en la consulta PT. De esa manera, su código no tiene cadenas de conexión desordenadas, y tales conexiones ahora están "fuera" de su código, puede cambiar fácilmente la conexión para toda la base de datos, no cambiar ningún código.

Entonces, ¿cuando ejecutas el código de reenlace de tu tabla? Haga que ese código de reenlace TAMBIÉN actualice cualquier consulta de PT. De esa manera, ahora puede volver a vincular y apuntar su aplicación a una base de datos de prueba, o de producción, o lo que sea. Entonces, ninguna cadena de conexión en el código es el resultado de lo anterior.

Independientemente de lo anterior? Haga que una tabla vinculada funcione, y luego use eso para "robar" la conexión conocida de la tabla vinculada y empújela en la conexión para la consulta PT como en el primer ejemplo anterior.

1
Albert D. Kallal 14 mar. 2021 a las 05:18