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
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
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.
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
- Compartir respuesta