Recorrer datos de un Select

Tengo un problema con una aplicación que estoy desarrollando,
tengo el siguiente código que me llama unos datos de la Base de Datos.
Set Rec = New ADODB.Recordset
    With Rec
        Set .ActiveConnection = Con
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Source = "select * from ANTICIPOS where ANTICIPODIRIGIDOA = '" & lblNombre & "'"
        .Open
    End With

Seguido de esto coloco los datos en sus respectivas casillas
lblLegalizacionNo.Caption = Rec!NO
        lblValorAnticipo2.Caption = FormatCurrency(Rec!VALORANTICIPO)
        lblObra2.Caption = Rec!OBRA

Pero a la hora de recorrer los datos solo me muestra el primero y no puedo navegar sobre los datos que traje de la base de datos con el . Source

3 respuestas

Respuesta
1
Te comento algunas opciones abajo:
Rec.movenext => Mueve una posicion hacia adelante
Rec.movelast=> Va al ultimo
Rec.moveprevious=> Uno hacia atras.
Mira en el explorador de objetos ( F2) las propiedades del recordset son bastante obvias por el nombre.
Ademas hay dos propiedades que debes comprobar
Rec.BOF => Si es true estas en el primer registro
Rec.EOF=> Has pasado el último
El clasico bucle para imprimir tooodos los registros se hace:
while not Rec.eof ' Mientras haya registros eof=final
haz lo que quieras con el registro de turno
Rec.movenext 'avanzamos uno
Wend ' final bucle
Yo tengo el código así en el botón Next:
With Rec
    .MoveNext
    If .EOF Then .MoveLast
End With
Display

Te aclaro que Display es la función que me trae los datos de Access.
Debería funcionar.
¿Rec está definido con la visibilidad suficiente? A ver si se están solapando las variables.
Entiendo que tienes el 'Option Explicit' activado.
Intenta pasar REC como parámetro al procedimiento Display pero cambiale el nombre dentro del procedimiento (pRec por ejemplo) a ver si se están mezclando o no.
Mira en la ventana de Debug que hay más de un registro, a veces pasa :-) ..
Cambie el código como me dijiste antes pero solo me muestra el primer registro, y cuando doy click en next llega al final del registro EOF como si no existieran más registros.
While Not Rec.EOF
    Rec.MoveNext
Wend
Si puedes te puedo enviar el código completo vía correo electrónico y lo revisas porque no se que más hacerle a esto código.
No parece que sea del código, más bien tiene pinta de que solo trae un registro, habría que comprobar cuantos registros recupera.
-Por debug captura la sentencia SQL exacta que se está lanzando a la BD
- Comprueba el SQL directamente sobre la BD a ver cuantos registros te devuelve.
- Tambien podrias comentar la condicion 'where' para que recupere varios registros seguro.
A ver si hay suerte.
Como podría traer más registros de la bese de datos, ya que solo tengo este código:
Set Rec = New ADODB.Recordset
    With Rec
        Set .ActiveConnection = Con
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Source = "select * from ANTICIPOS where ANTICIPODIRIGIDOA = '" & lblNombre & "'"
        .Open
    End With
.Source = "select * from ANTICIPOS " '#comentado  where ANTICIPODIRIGIDOA = '" & lblNombre & "'"
Eso trae toda la tabla de anticipos, pero es incorrecto por que quita el filtro, acuérdate dejarlo bien luego de las pruebas
Me funciona bien sin el filtro, pero al colocar de nuevo el filtro sigue igual.
Pues entonces el código está bien. Solo había un dato que cumplía el filtro y por eso no muestra más.
Puedes añadir código de validación que si después de hacer el 'movenext' no hay más regisgtros deshabilite el botón de 'siguiente' quedará más profesional.
Eso ya lo tengo, pero por ejemplo hay dos datos "A" que serian lblNombre que se usaría para el filtro, pero solo me muestra el primer registro donde lblNombre sea igual a "A" y hay dos registros "A"
No son iguales, casi seguro que hay algún carácter raro ( quizás un espacio en blanco) en la condición de búsqueda y por eso está fallando. ¿También puede ser alguna otra opción Anticipos es tabla o consulta?, etc..
También pueden ser las mayusculas/minusculas
Comprueba bien la información de la BD como comenté antes. Captura la sentencia SQL tal como la genera el programa (usa debug. Print) y compruébala directamente con la BD es la forma más rápida de localizar este tipo de temas.
Respuesta
1
El código para recorrer el recordset esta bien, pero después del movenext debes asignar los nuevos valores leídos a los controles necesarios.
Me podrías dar una aclaración de como lo debo hacer, ya que me perdí.
Es esto:
lblLegalizacionNo.Caption = Rec!NO
        lblValorAnticipo2.Caption = FormatCurrency(Rec!VALORANTICIPO)
        lblObra2.Caption = Rec!OBRA
Lo que yo no se es en cuales controles o campos vas a mostrar lo que ue tienes en tu recordset
Los quiero mostrar en sus respectivos labels.
Este es el código del display:
Private Sub Display()
Set Rec = New ADODB.Recordset
    With Rec
        Set .ActiveConnection = Con
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Source = "select * from ANTICIPOS where ANTICIPODIRIGIDOA = '" & lblNombre & "'"
        .Open
    End With
    If Rec.EOF Then
        MsgBox "NO HA SOLICITADO NINGUN ANTICIPO"
    Else
        lblLegalizacionNo.Caption = Rec!NO
        lblValorAnticipo2.Caption = FormatCurrency(Rec!VALORANTICIPO)
        lblObra2.Caption = Rec!OBRA

end sub
y este es el boton Siguiente:
Private Sub cmdNext_Click()
With Rec
    .MoveNext
    If .EOF Then .MoveLast
End With
        lblLegalizacionNo.Caption = Rec!NO
        lblValorAnticipo2.Caption = FormatCurrency(Rec!VALORANTICIPO)
        lblObra2.Caption = Rec!OBRA
Display
End Sub

La verdad no se si quedo bien así, me puedes corregir.
El tema es que si son varios registros no los puedes mostrar en los mismos controles, debes inventarte algo como colocarlso en una grilla, se me ocurre. Pero todo depende del diseño de tu aplicación.
Respuesta
1
Tienes que recorrer el recordser o el source ¿?
do while rec.soirce.eof
datos
loop
¿En el DO que datos van?
Es un while, va la condición que quieres para que termine
Y conviene toda la vida poner que finalize cuando termine de recorrer el recordset

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas