Como acceder a una tabla que esta en otra BD

Necesito acceder a una tabla (RESULTADOS) que esta en otra BD (VENTASDIRECTAS).

Estoy intentando darle estos parámetros pero me dice que no encuentra la tabla:

dentro de [Rut1] esta esta dirección:

                    C: \Users \LUIS\Desktop \GESTION\GESGENERAL \GESASOCIA.accdb

y al ejecutar estas funciones me dice que no encuentra la tabla: [RESULTADOS]

Set miAccess = GetObject(Rut1) 
Dim rst As DAO.Recordset

Set rst = CurrentDb.OpenRecordset("SELECT * FROM [RESULTADOS] order by FECHA desc,NASIENTO DESC")

Los espacios son porque no me deja mandar de otra forma

1 Respuesta

Respuesta
2

Si usas "CurrentDb" te estás refiriendo a la BD en la que ejecutas el código, entonces es normal que no te encuentre la tabla "Resultados"

Prueba así:

Dim miDB As DAO.Database
Dim rst As DAO.Recordset
Set miDB = OpenDatabase("C:\Users\LUIS\Desktop\GESTION\GESGENERAL\GESASOCIA.accdb")
Set rst = miDB.OpenRecordset("RESULTADOS")
'Por aquí lo que quieras hacer con ella...
rst.Close
Set rst = Nothing
miDB.Close
Set miDB = Nothing

Un saludo.


También creo que te valdría así, para aprovechar el código que tienes:

Set miAccess = GetObject(Rut1) 
Dim rst As DAO.Recordset
Set rst = miAccess.OpenRecordset("SELECT * FROM [RESULTADOS] order by FECHA desc,NASIENTO DESC"

En mi respuesta anterior, el recordset, para ponerlo como lo quieres, tiene que ser así:

Set rst = miAccess.OpenRecordset("SELECT * FROM [RESULTADOS] order by FECHA desc,NASIENTO DESC")

He emplazado la Base en otra dirección y estoy utilizando estos parámetros pero no me lee nada. Antes me daba error que no lo encontraba ahora no lee.

Se va al final del for .. next

Dim rst As DAO.Recordset

Dim miAccess As Object

Set miAccess = OpenDatabase("C:\Program files\GESARVE\GESCONTA_be.accdb")
Set rst = miAccess.OpenRecordset("SELECT * FROM [MOVIMIENTOS] order by FECHA DESC,NUMEASIENTO DESC")

vs = rst.RecordCount

If rst.RecordCount = 0 Then GoTo ENDD
rst.MoveLast
vcua = rst.RecordCount
rst.MoveFirst
For b = 1 To vcua
vfec = rst("[FECHA]")
If Day(vfec) < 13 Then vfec = Format(vfec, "mm/dd/yyyy")

...

Si necesitas todo el proceso te lo puedo enviar

Declara las variables como en mi primer código, yo lo probé y funciona correctamente

Me dice que no encuentra la tabla MOVIMIENTOS.

¿Te importa si te mando el código completo y miras donde pueda estar el motivo para que no la encuentre?.

Estoy probando y no se ya donde pueda estar el error.

Sí, claro, pon el código completo y también indícame la ruta completa al archivo y su extensión.

Te mando todo el proceso si necesitas más información dímelo y te la envío:

*******************************************************************

*    Numeracion de Asientos dentro la tabla: MOVIMIENTOS

*    Rut1 = Direccion del  FRONT END

*    RUT1=C:\Users\PePe\Desktop\GESARVE\GESCONTA Contabilidad\GESCONTA.accdb

*    Rut2 = Direccion donde esta el BACK END

*    RUT2=C:\Program files\GESARVE\GESCONTA_be.accdb

*    Campos Tabla: MOVIMIENTOS

*    IdFecha -  Fecha – NumeAsiento - Cuenta,Documento – Concepto – Debe - Haber

*------------------------------------------------------------------------------------------------------------

* Proceso: Dentro de la Tabla MOVIMIENTOS remunera los asientos que están a 0

*  dándoles un orden correlativo a cada uno de ellos en función de la Fecha Apunte

*  Todos los que tienen la misma Fecha recogen el mismo Nº de Asiento asignado

*  He probado direccionando donde se encuentra FRONTEND y el BACKEND

*******************************************************************

DoCmd.SetWarnings False

Dim miDB As DAO.Database

Dim rst As DAO.Recordset

Set miDB = OpenDatabase("C:\Users\PePe\Desktop\GESARVE\GESCONTA Contabilidad\GESCONTA.accdb")

Set rst = miDB.OpenRecordset("SELECT * FROM [MOVIMIENTOS] order by FECHA desc,NUMEASIENTO DESC")

vs = rst.RecordCount

If rst.RecordCount = 0 Then GoTo ENDD

rst.MoveLast

vcua = rst.RecordCount

rst.MoveFirst

For B = 1 To vcua

    vfec = rst("[FECHA]")

    If Day(vfec) < 13 Then vfec = Format(vfec, "mm/dd/yyyy")

    vasi = rst("[NUMEASIENTO]")

    If vasi = 0 Then

        vr2 = DCount("*", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and [NUMEASIENTO]<>0")

        If vr2 > 0 Then

             vasiante = DLookup("[NUMEASIENTO]", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and NUMEASIENTO<>0")

            SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vasiante & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0"

            DoCmd.RunSQL SSQL

        Else

            vdmax = DMax("[NUMEASIENTO]", "[MOVIMIENTOS]")

            vdmax = vdmax + 1

            SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vdmax & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0"

            DoCmd.RunSQL SSQL

        End If

    Else

    End If

    rst.MoveNext

Next

MsgBox "TRASPASOS REALIZADOS CORRECTAMENTE"

ENDD:

End If

DoCmd.SetWarnings True

rst.Close

set rst= Nothing

MIdb.Close

Set miDB = Nothing

DoCmd.Close acForm, "TRASPASOAPUNTESCONTABLES"

End Sub

Un saludo

Veamos:

1º/ Si divides la BD en dos partes (Back-End y Front-End), lo normal es que vincules las tablas del Back-End en el Front-End y trabajes con ellas como si fuesen tablas locales, con lo que te evitas todo el proceso de "abrir una tabla de otra BD"

2º/ Al código que tienes le veo los siguientes errores, además de poder simplificarse:

a) Cuando asignas la base de datos a la variable miDB, no le asignas el back-end, que es el que contiene las tablas (por eso no te la encuentra...). La linea tendría que ser:

Set miDB = OpenDatabase("C:\Program files\GESARVE\GESCONTA_be.accdb")

b) No declaras prácticamente ninguna variable, luego a muchas les asignas un valor que no usas para nada. Además, si la tabla "MOVIMIENTOS" no la tienes ni en local ni vinculada, las funciones en la que la llamas (DLookUp, DMax) siempre te darán error. Si quieres saber esos datos de una BD externa, tendrás que hacer en la BD externa una consulta que te devuelva ese dato, y cargarlo en un nuevo recordset para trabajar con él..

3º/ En tu pregunta original, intentabas cargar una tabla llama "RESULTADOS" y ahora una llamada "MOVIMIENTOS". Eso me tiene despistado un poco..

Por tanto, en mi opinión, te recomendaría que vinculases las tablas del back-end y trabajes en ellas normalmente, que además, es la forma correcta de hacerlo, y tu código quedaría así:

DoCmd.SetWarnings False

Dim rst As DAO.Recordset

Set rst = CurrentDB.OpenRecordset("SELECT * FROM [MOVIMIENTOS] order by FECHA desc,NUMEASIENTO DESC")

vs = rst.RecordCount

If rst.RecordCount = 0 Then GoTo ENDD

rst.MoveLast

vcua = rst.RecordCount

rst.MoveFirst

For B = 1 To vcua

    vfec = rst("[FECHA]")

    If Day(vfec) < 13 Then vfec = Format(vfec, "mm/dd/yyyy")

    vasi = rst("[NUMEASIENTO]")

    If vasi = 0 Then

        vr2 = DCount("*", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and [NUMEASIENTO]<>0")

        If vr2 > 0 Then

             vasiante = DLookup("[NUMEASIENTO]", "[MOVIMIENTOS]", "[FECHA]= # " & vfec & " # and NUMEASIENTO<>0")

            SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vasiante & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0"

            DoCmd.RunSQL SSQL

        Else

            vdmax = DMax("[NUMEASIENTO]", "[MOVIMIENTOS]")

            vdmax = vdmax + 1

            SSQL = "Update [MOVIMIENTOS] Set [NUMEASIENTO] = " & vdmax & " where [FECHA]= # " & vfec & " # and NUMEASIENTO=0"

            DoCmd.RunSQL SSQL

        End If

    Else

    End If

    rst.MoveNext

Next

MsgBox "TRASPASOS REALIZADOS CORRECTAMENTE"

ENDD:

End If

DoCmd.SetWarnings True

rst.Close

set rst= Nothing

DoCmd.Close acForm, "TRASPASOAPUNTESCONTABLES"

End Sub

Probare esos detalles que me has comentado y te diré como es el resultado

Me funciona ya perfectamente siguiendo los consejos que me has dado. Muchas gracias

No hay de que, me alegra que lo resolvieras. Hasta otra!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas