Page 1 of 1
Avanzar y retroceder en una dbf
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Smile :-)](./images/smilies/icon_smile.gif)
Re: Avanzar y retroceder en una dbf
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Sat Sep 14, 2013 1:26 pm
by TOTOVIOTTI
Gracias MASTER!
Lo probaré y te cuento!
Roberto
Re: Avanzar y retroceder en una dbf
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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...
![Shocked :shock:](./images/smilies/icon_eek.gif)
Re: Avanzar y retroceder en una dbf
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
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
![Razz :P](./images/smilies/icon_razz.gif)
Re: Avanzar y retroceder en una dbf
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Sep 17, 2013 1:06 pm
by TOTOVIOTTI
Graaaaccciiiiiiassss!
Perfecto!
Roberto