Me Gustaría saber como aprender a utilizar el EOF en access en una consulta

Tengo una Aplicación en la Cual teniendo en Cuenta un Campo Genera Una Consulta, Muchas veces esa Consulta Puede no tener resultado, se que se utiliza el EOF pero no se como utilizarlo. Tengo Una Aplicación en Access

2 respuestas

Respuesta
1

Si sólo te interesa saber si la consulta devuelve registros o no puedes utilizar un dlookup. Así no tienes que declarar ni crear recordsets sobre la consulta.

Supongamos que tu consulta tiene un campo que se llama [Id]. Entonces, en el evento "Al hacer clic" que te abriera una consulta llamada "C1", por ejemplo, escribirías:

...

Private Sub Comando0_Click()
    Dim hayDatos As Variant
    hayDatos = DLookup("Id", "C1")
    If IsNull(hayDatos) Then
        MsgBox "No devuelvo registros"
    Else
        docmd.openquery "C1"
    End If
End Sub

...

La otra opción es crear un recordset, pero en este caso no necesitarías el EOF. Simplemente le tienes que decir que te cuente los registros que encuentre.

La mecánica sería la siguiente. Te lo comento en un código:

...

Private sub...

Dim rst as dao.recordset 'Declaramos el recordset

Set rst=currentdb.openrecordset("C1") 'Abrimos el recordset sobre la consulta

If rst.recordcount=0 'Si el número de registros devueltos es cero...

msgbox "No devuelvo registros"

Else 'En caso contrario abro la consulta

docmd.openquery "C1"

End if

'Limpio y libero memoria

rst.close

Set rst=nothing

End sub

...

Si utilizas versiones antiguas de Access antes debes hacer un recorrido de registros. Yo te recomendaría que lo utilizaras sólo si no te funciona el código anterior. El nuevo código sería:

...

Dim rst as dao.recordset 'Declaramos el recordset

Set rst=currentdb.openrecordset("C1") 'Abrimos el recordset sobre la consulta

'Recorremos los registros del recordset para ir contándolos

rst.movefirst

rst.movelast

If rst.recordcount=0 'Si el número de registros devueltos es cero...

msgbox "No devuelvo registros"

Else 'En caso contrario abro la consulta

docmd.openquery "C1"

End if

'Limpio y libero memoria

rst.close

Set rst=nothing

End sub

...

Finalmente, el uso del EOF se produce, por ejemplo, cuando vas recorriendo uno a uno los registros, empezando desde el primero.

Suponiendo que tu consulta sí devuelve registros y que tiene el campo [Id] podrías obtener una lista de id's en la ventana inmediato así:

...

Private sub...

Dim rst as dao.recordset 'Declaramos el recordset

Set rst=currentdb.openrecordset("C1") 'Abrimos el recordset sobre la consulta

If rst.recordcount=0 'Si el número de registros devueltos es cero...

msgbox "No devuelvo registros"

Else 'En caso contrario ...

rst.movefirst 'Me voy al primer registro

do until rst.EOF 'Hago este proceso registro a registro hasta llegar al último

debug.print rst.Fields("Id").value 'Escribo en la ventana inmediato el valor del id

rst.movenext 'Me voy al siguiente registro

Loop 'Repito el proceso de escritura del id

End if

'Limpio y libero memoria

rst.close

Set rst=nothing

End sub

...

Espero que ahora lo tengas un poco más claro.

Por cierto, si te interesa profundizar un poco sobre el tema de los recordsets en mi página, en la sección de manuales, hay un manual dedicado a VBA para Access. Si coges el índice y buscas el capítulo dedicado a recordsets (DAO) ahí tienes una explicación un poco más "profunda" sobre el uso de DAO.

Saludos,

Neckkito espero este muy bine gracias por intención de ayudarme... le quiero explicar con un poco de profundidad para así sea la ayuda más directa

1- Selecciono la Empresa y Descripción

2-Seleccciono El trabajador

3- Agrego Códigos Nominales... (Te explico en la imagen)

El Sub-Formulario encerrado en Azul es donde esta la consulta

En la cual miro si ese trabajador tiene ese código

Cuando ese trabajador no tiene información de ese código (Consulta Vacía)

Ese es el problema que no he podido Solucionar

Gracias

Hay demasiadas variables para darte una ayuda directa. Necesitaría verlo sobre una BD para ver qué procesos se están ejecutando y en cuál de ellos salta el error, y qué tipo de error es. No sé si puedes hacer una mini-BD con sólo los elementos implicados y pasármela para que yo lo vea. Mi correo es neckkito(ARROBA)gmail(PUNTO)com

Si no difícilmente puedo ayudarte.

Por si a alguien le puede interesar, el subformulario está basado en una consulta parametrizada. La solución que Juan Carlos había adoptado era operar sobre el origen del registro del subformulario, y para ello era necesario el clonado del recordset.

Para clonar el recordset, y enlazando con la respuesta que había dado un poco más arriba, pasa por definir el recordset de la siguiente manera:

Set rst=me.recordsetclone

Y parece que listos.

Respuesta

Puedes usar la función de Dominio DCount para averiguar si la consulta te devuelve registros, ejemplo:

If DCount("*","TuConsulta")=0 Then

   MsgBox "La consulta no devuelve ningún registro"

End If

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas