Principales respuestas
Error EOF y BOF al hacer consulta sql sobre una BBDD de Access

Pregunta
-
Buenas, estoy intentando hacer una consulta sobre varias tablas en una base de datos de Access 2003 (Sí, 2003) para traer los registros a una Hoja de Excel.
La consulta que he creado es la siguiente
'-- Asignamos la ruta de la base de datos
sDbPath = "C:\Users\admin\Documents\Mis archivos de origen de datos\base de calibracion externa.mdb"
'-- Asignamos la conexión con la base de datos
cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & sDbPath & ";"
'-- Creamos la sentencia Sql
strSQL = "SELECT INSTRUMENTOS.INSTRUMENTO, INSTRUMENTOS.MARCA, INSTRUMENTOS.MODELO, OTS.[Nº SERIE], OTS.PETICIONARIO, " _
& "CERTIFICADOS.[FECHA CALIBRACIÓN], OTS.[IN SITU / PERMANENTE], CERTIFICADOS.[Nº CERTIFICADO] " _
& "FROM (OTS INNER JOIN INSTRUMENTOS ON INSTRUMENTOS.[Nº SERIE] = OTS.[Nº SERIE]) " _
& "INNER JOIN CERTIFICADOS ON CERTIFICADOS.[ORDEN TRABAJO] = OTS.[ORDEN TRABAJO] " _
& "WHERE OTS.[ORDEN TRABAJO] = '282005P7157'"
'-- Iniciamos la conexión con la BBDD
cnn.Open cnnStr
'-- Iniciamos el Recorset y ejecutamos la sentencia Sql
rsData.Open strSQL, cnn, adOpenForwardOnly, adLockReadOnly
If Not rsData.EOF Then
cell_Objeto.Value = rsData(0).Value
cell_Marca.Value = rsData(1).Value
cell_Modelo.Value = rsData(2).Value
cell_NumSerie.Value = rsData(3).Value
cell_Solicitante.Value = rsData(4).Value
cell_FechaCalib.Value = rsData(5).Value
cell_InSitu.Value = rsData(6).Value
cell_NumCertificado.Value = rsData(7).Value
'DoEvents
'-- mostramos mensaje de éxito
MsgBox "Importación Completada con éxito!", vbInformation
Else
'-- No hay datos
MsgBox "No hay datos para importar", vbInformation
End If
El problema es que me sale un cuadro de error indicando que las propiedades BOF o EOF son True, y por lo que he podido comprobar ambas son True lo cual indica que no encuentra ningún registro cuando eso no es así porque compruebo ese número de orden concreto y existen tanto el número como el resto de campos que quiero buscar.
Qué está pasando???
Gracias de antemano.
Respuestas
-
Si usas
FROM (OTS LEFT JOIN INSTRUMENTOS ON INSTRUMENTOS.[Nº SERIE] = OTS.[Nº SERIE]) " _
& "LEFT JOIN CERTIFICADOS ON CERTIFICADOS.[ORDEN TRABAJO] = OTS.[ORDEN TRABAJO]Te va a devolver todos los registros de OTS y los correspondientes de INSTRUMENTOS y de CERTIFICADOS si estos existen. De esta manera la limitación es menor.
Saludos, Javier J
- Marcado como respuesta CSharlie lunes, 14 de julio de 2014 13:36
Todas las respuestas
-
Ten en cuenta que estás utilizando una consulta con INNER JOIN que solo te va a devolver los registros que tengan el mismo valor en el campo de unión. En tu consulta solo se devuelven los registros de OTS que tengan algún registro con el mismo valor en [Nº SERIE] en la tabla de certificados.
Si no quieres obligar a que existe el registro en certificados solo teines que cambiar INNER JOIN por LEFT JOIN.
Saludos, Javier J
-
Muchas Gracias por tu respuesta pero no lo he entendido muy bien.
De todos modos según he podido comprobar me daba error puesto que las tablas que tienen echas no están muy completas que digamos y hay registros que alomejor tienen datos de los instrumentos pero no de Certificados y viceversa.
Así que lo que he hecho ha sido crear 2 sentencias sql y ejecutarlas por separado y así cargar los datos que sí existan.
En cualquier caso según lo que me has comentado, debería cambiar ambos INNER JOIN por LEFT JOIN o solamente uno de los dos? aún así no creo que me dejase traer datos igualmente si hay información que no se encuentra por la razón que te he comentado. Creo que daría error de EOF y BOF igualmente no? O si me guardaría en el recordset la información que sí estuviese disponible?Un saludo!!!
-
Si usas
FROM (OTS LEFT JOIN INSTRUMENTOS ON INSTRUMENTOS.[Nº SERIE] = OTS.[Nº SERIE]) " _
& "LEFT JOIN CERTIFICADOS ON CERTIFICADOS.[ORDEN TRABAJO] = OTS.[ORDEN TRABAJO]Te va a devolver todos los registros de OTS y los correspondientes de INSTRUMENTOS y de CERTIFICADOS si estos existen. De esta manera la limitación es menor.
Saludos, Javier J
- Marcado como respuesta CSharlie lunes, 14 de julio de 2014 13:36
-