Avanzar y retroceder en una dbf

Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » Fri Sep 13, 2013 9: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.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Avanzar y retroceder en una dbf

Postby D.Fernandez » Fri Sep 13, 2013 11:32 pm

Quizás refrescando los botones.

oBtn[elquesea]:Refresh()

Saludos

Dario Fernandez
Dario Fernandez
FWH 22.12, Harbour, MVS2022 Community, BCC, MySql & MariaDB, Dbf/Cdx VSCode.
Maldonado - Uruguay
D.Fernandez
 
Posts: 455
Joined: Wed Jul 31, 2013 1:14 pm
Location: Maldonado - Uruguay

Re: Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » 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.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Avanzar y retroceder en una dbf

Postby xmanuel » Sat Sep 14, 2013 1: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: 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 :-)
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » Sat Sep 14, 2013 1:26 pm

Gracias MASTER!
Lo probaré y te cuento!
Roberto
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Avanzar y retroceder en una dbf

Postby joseluisysturiz » Sat Sep 14, 2013 3: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!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » 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.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Avanzar y retroceder en una dbf

Postby cnavarro » Mon Sep 16, 2013 11:35 am

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() )
 
 
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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » 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.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Avanzar y retroceder en una dbf

Postby cnavarro » Mon Sep 16, 2013 12:38 pm

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
 
 
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
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Avanzar y retroceder en una dbf

Postby xmanuel » Mon Sep 16, 2013 2: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: 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
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Avanzar y retroceder en una dbf

Postby TOTOVIOTTI » Tue Sep 17, 2013 1:06 pm

Graaaaccciiiiiiassss!
Perfecto!
Roberto
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
TOTOVIOTTI
 
Posts: 387
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 75 guests