none
Error EOF y BOF al hacer consulta sql sobre una BBDD de Access RRS feed

  • 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.

    lunes, 14 de julio de 2014 11:30

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
    lunes, 14 de julio de 2014 12:58

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

    lunes, 14 de julio de 2014 11:55
  • 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!!!

    lunes, 14 de julio de 2014 12:42
  • 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
    lunes, 14 de julio de 2014 12:58
  • Vale muchísimas gracias!!! Me ha funcionado :D

    Realmente es que no termino de entender como funciona el JOIN. XD

    Un saludo.

    lunes, 14 de julio de 2014 13:22