FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Avanzar y retroceder en una dbf
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Avanzar y retroceder en una dbf
Posted: Fri Sep 13, 2013 09:48 PM

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

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 555
Joined: Wed Jul 31, 2013 01:14 PM
Re: Avanzar y retroceder en una dbf
Posted: Fri Sep 13, 2013 11:32 PM

Quizás refrescando los botones.

oBtn[elquesea]:Refresh()

Saludos

Dario Fernandez

Dario Fernandez

FWH 2501, Harbour, MVS2022 Community, MySql & MariaDB, Dbf/Cdx VSCode.

Maldonado - Uruguay
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Re: Avanzar y retroceder en una dbf
Posted: Sat Sep 14, 2013 12:29 PM

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

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Avanzar y retroceder en una dbf
Posted: Sat Sep 14, 2013 01:03 PM
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 (fw): Select all Collapse
//-------------------------------------------------------
// 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 (fw): Select all Collapse
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 :-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Re: Avanzar y retroceder en una dbf
Posted: Sat Sep 14, 2013 01:26 PM

Gracias MASTER!
Lo probaré y te cuento!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: Avanzar y retroceder en una dbf
Posted: Sat Sep 14, 2013 03:09 PM

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:

Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Re: Avanzar y retroceder en una dbf
Posted: Mon Sep 16, 2013 11:10 AM

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

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Avanzar y retroceder en una dbf
Posted: Mon Sep 16, 2013 11:35 AM
Se me ocurre lo siguiente:

Code (fw): Select all Collapse
//-------------------------------------------------------
// 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() )
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Re: Avanzar y retroceder en una dbf
Posted: Mon Sep 16, 2013 12:01 PM
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
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Avanzar y retroceder en una dbf
Posted: Mon Sep 16, 2013 12:38 PM
Roberto, quizas quedase el codigo mas compacto asi:

Code (fw): Select all Collapse
//-------------------------------------------------------
// 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
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Avanzar y retroceder en una dbf
Posted: Mon Sep 16, 2013 02:55 PM
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 (fw): Select all Collapse
    //-------------------------------------------------------
    // 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 :-)
______________________________________________________________________________

Sevilla - Andalucía
Posts: 470
Joined: Fri Feb 05, 2010 11:30 AM
Re: Avanzar y retroceder en una dbf
Posted: Tue Sep 17, 2013 01:06 PM

Graaaaccciiiiiiassss!
Perfecto!
Roberto

Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.ar

Continue the discussion