Page 1 of 1

Avanzar y retroceder en una dbf

PostPosted: Fri Sep 13, 2013 9:48 pm
by TOTOVIOTTI
Amigos
necesito colocar en un diálogo, cuatro botones,
<| << >> |>

para ir al ppio del archivo, retroceder un registro, avanzar un registro o ir al final de la misma.

Para los botones de ir al ppio o final del archivo, no hay problemas, el tema es cuando estoy en el primer
registro o el último, quiero deshabilitar los botones correspondientes y no lo puedo hacer funcionar correctamente.

Hago:

DO CASE
CASE ppio
(archivo)->(DBGOTOP())
oBtn[1]:Hide()
oBtn[2]:Hide()
oBtn[3]:Show()
oBtn[4]:Show()
CASE retrocedo
IF !(archivo)->(BOF())
(archivo)->(DBSKIP(-1))
oBtn[1]:Show()
oBtn[2]:Show()
oBtn[3]:Show()
oBtn[4]:Show()
ELSE
oBtn[1]:Hide()
oBtn[2]:Hide()
oBtn[3]:Show()
oBtn[4]:Show()
ENDIF
CASE avanzo
IF !(archivo)->(EOF())
(archivo)->(DBSKIP())
oBtn[1]:Show()
oBtn[2]:Show()
oBtn[3]:Show()
oBtn[4]:Show()
ELSE
oBtn[1]:Show()
oBtn[2]:Show()
oBtn[3]:Hide()
oBtn[4]:Hide()
ENDIF
CASE final
(archivo)->(DBGOBOTTOM())
oBtn[1]:Show()
oBtn[2]:Show()
oBtn[3]:Hide()
oBtn[4]:Hide()
ENDCASE

Donde oBtn[1] es el boton del ppio del archivo, oBtn[2] retroceder uno, oBtn[3] avanzar uno y oBtn[4] fin del archivo.

Que podré estar haciendo mal?
Muchas gracias!
Roberto

Re: Avanzar y retroceder en una dbf

PostPosted: Fri Sep 13, 2013 11:32 pm
by D.Fernandez
Quizás refrescando los botones.

oBtn[elquesea]:Refresh()

Saludos

Dario Fernandez

Re: Avanzar y retroceder en una dbf

PostPosted: Sat Sep 14, 2013 12:29 pm
by TOTOVIOTTI
Probé y no es la solución,
el tema es que cuando estoy parado en el primer registro, no es bof(), y cuando estoy
en el último, tampoco es eof(), entonces no sé como solucionarlo...
Si alguien lo tiene implementado, le agradeceré el comentario...
Muchas gracias!
Roberto

Re: Avanzar y retroceder en una dbf

PostPosted: Sat Sep 14, 2013 1:03 pm
by xmanuel
Efectivamente el primer registro no activa el BOF() hasta que no lo fuerzas a ir más arriba y lo mismo ocurre con EOF().

Sin probarlo te digo que deberías crear tu propia función muy parecida a esto:

Code: Select all  Expand view

//-------------------------------------------------------
// Devuelve true si se ha movido
 
function dbPrevious()
    local nRec := RecNo()
   
    DbSkip( -1 )

return( nRec != RecNo() )

//-------------------------------------------------------
// Devuelve true si se ha movido

function dbNext()
    local nRec := RecNo()
   
    DbSkip( 1 )

return( nRec != RecNo() )
 

en tu programa usalo así:
Code: Select all  Expand view

IF (archivo)->( dbPrevious() ) // Si se mueve es que hay registros
oBtn[1]:Show()
oBtn[2]:Show()
oBtn[3]:Show()
oBtn[4]:Show()
ELSE
oBtn[1]:Hide()
oBtn[2]:Hide()
oBtn[3]:Show()
oBtn[4]:Show()
ENDIF
 

Bueno espero que te valga la idea :-)

Re: Avanzar y retroceder en una dbf

PostPosted: Sat Sep 14, 2013 1:26 pm
by TOTOVIOTTI
Gracias MASTER!
Lo probaré y te cuento!
Roberto

Re: Avanzar y retroceder en una dbf

PostPosted: Sat Sep 14, 2013 3:09 pm
by joseluisysturiz
Una idea seria que validez el numero del registro...si recno() es igual a 1 has tal cosa y si recno() es igual a la cantidad total de registro entonces ese es el ultimo, no se si me copias la idea.espero y se que si..saludos... :shock:

Re: Avanzar y retroceder en una dbf

PostPosted: Mon Sep 16, 2013 11:10 am
by TOTOVIOTTI
Manuel,
me funciona de la misma manera que como lo tenía antes, cuando estoy en el primer registro,
no se me deshabilita el botón, recién lo hace cuando vuelvo a presionar el botón para retroceder...

José Luis,
intenté con lo que tú me dices, solo que como es una dbf que puede tener varios índices e incluso
filtros, no puedo validar el recno...

Algo más que se les ocurra a alguien? Se los voy a agradecer.
Roberto

Re: Avanzar y retroceder en una dbf

PostPosted: Mon Sep 16, 2013 11:35 am
by cnavarro
Se me ocurre lo siguiente:

Code: Select all  Expand view

//-------------------------------------------------------
// Devuelve true si se ha movido
 
function dbPrevious()
//    local nRec := RecNo()
local lSw    := .F.
   
    DbSkip( -1 )
    DbSkip( -1 )
    if !Bof()
       DbSkip(1)
       lSW := .T.
   endif
       

return   lSw    //( nRec != RecNo() )

//-------------------------------------------------------
// Devuelve true si se ha movido

function dbNext()
//    local nRec := RecNo()
Local lSw := .F.
   
    DbSkip( 1 )
    DBSkip( 1 )
    if !Eof()
       DbSkip( - 1 )
       lSW  := .T.
    endif
return   lSW   //( nRec != RecNo() )
 
 

Re: Avanzar y retroceder en una dbf

PostPosted: Mon Sep 16, 2013 12:01 pm
by TOTOVIOTTI
Por si a alguien le sirve,
ésta opción última si me sirve, aunque le agregué:

//-------------------------------------------------------
// Devuelve true si se ha movido

function dbPrevious()
// local nRec := RecNo()
local lSw := .F.

DbSkip( -1 )
DbSkip( -1 )
if !Bof()
DbSkip(1)
lSW := .T.
else
DbGotop() // porque necesito visualizar el primer registro, sino, como es bof() da error
endif


return lSw //( nRec != RecNo() )

//-------------------------------------------------------
// Devuelve true si se ha movido

function dbNext()
// local nRec := RecNo()
Local lSw := .F.

DbSkip( 1 )
DBSkip( 1 )
if !Eof()
DbSkip( - 1 )
lSW := .T.
else
else
DbBottom() // porque necesito visualizar el último registro, sino, como es eof() da error
endif
return lSW //( nRec != RecNo() )

Gracias a todos!
ROberto

Re: Avanzar y retroceder en una dbf

PostPosted: Mon Sep 16, 2013 12:38 pm
by cnavarro
Roberto, quizas quedase el codigo mas compacto asi:

Code: Select all  Expand view

//-------------------------------------------------------
// Devuelve true si se ha movido
function dbPrevious()
local lSw    := .F.
   
    DbSkip( -1 )
    DbSkip( -1 )
    if !Bof()
       lSW := .T.
   endif
   DbSkip(1)        

return   lSw

//-------------------------------------------------------
// Devuelve true si se ha movido

function dbNext()
Local lSw := .F.
   
    DbSkip( 1 )
    DBSkip( 1 )
    if !Eof()
       lSW  := .T.
    endif
    DbSkip( - 1 )

return   lSW
 
 

Re: Avanzar y retroceder en una dbf

PostPosted: Mon Sep 16, 2013 2:55 pm
by xmanuel
Me alegro mucho Roberto.

La verdad es que ese es el comportamiento incluso de las bases de datos SQL.
El puntero puede estar antes del primer registro (BOF()) o después del último (EOF()).
En DBF eso se llama el registro fantasma.
Lo importante es que lo has conseguido...

Ah para que vaya muy rápido tienes que intentar acceder lo menos posible al DBF aunque para un botón la diferencia no la vas a tomar...
Pero como a mí me gusta rizar el rizo:

Code: Select all  Expand view

    //-------------------------------------------------------
    // Devuelve true si se ha movido
    function dbPrevious()
        local lRet := .F.      
        DbSkip( -2 )
        lRet := !BOf()
        DbSkip(1)        
    return lRet

    //-------------------------------------------------------
    // Devuelve true si se ha movido
    function dbNext()
        local lRet := .F.      
        DbSkip( 2 )
        lRet := !EOf()
        DbSkip( -1 )        
    return lRet
 


Así te ahorra un acceso :P

Re: Avanzar y retroceder en una dbf

PostPosted: Tue Sep 17, 2013 1:06 pm
by TOTOVIOTTI
Graaaaccciiiiiiassss!
Perfecto!
Roberto