Page 1 of 1

Uso de tecla VK_UP / VK_DOWN en xBROWSE

PostPosted: Tue Nov 04, 2008 10:26 pm
by joseluisysturiz
Srs. tengo un xbrowse tipo facturacion, cada vez que llego ultima columna me hace un DBAPPEND, eso esta bien, pero me gustaria que si estando en la primera columna uso VK_UP se borre el registo el blanco y que cuando este moviendome y este en la ultmima fila con datos si doy VK_DOWN, me haga un nuevo DBAPPEND, si el get de la primera fila no tiene valor, es decir esta en edicion y vacio no paso a las otras columnas y alli es que pudiera hacer VK_UP y VK_DPOWN. use este codigo pero no resulto, cualquier ayuda y sugerencia de los guru de xBrowse, sera bienvenida :shock:

oBrw:bKeyDown :={ | nKey | teclas(nKey, oBrw, "movinv") } // VALIDO TECLAS PRESIONADA SOBRE REGISTROS


FUNCTION teclas(nKey, oBrw, cAlias) // VALIDA TECLAS SOBRE xBRW
local n=1
DO CASE
CASE nKey == VK_DELETE // BORRAR REGISTRO
IF MsgNoYes("Desea borrar este registro.?"," ATENCION")
(cAlias)->( DBDELETE() )
(cAlias)->( DBPACK() )
oBrw:GOBOTTOM()
oBrw:REFRESH()
ENDIF

CASE nKey == VK_UP // FLECHA ARRIBA
IF n <> 0 //EMPTY( (cAlias)->mvi_codpro )
(cAlias)->( DBDELETE() )
(cAlias)->( DBPACK() )
oBrw:GOBOTTOM()
oBrw:REFRESH()
ENDIF

ENDCASE
RETURN NIL // FIN VALIDA TECLAS SOBRE EL xBROWSE

PostPosted: Tue Nov 04, 2008 11:24 pm
by Daniel Garcia-Gil
una cosa es la tecla que presionas durante la navegacion del xbrowse y otra mientras estas en estado de edicion de una celda...
no soy guro del xbrowse pero me parece una clase muy interesante
cambia y agrega esto a ver si te sirve...
claro es importante que estes en estado de edicion para que funcione, no lo he probado pero teoricamente deberia funcionar
Code: Select all  Expand view

oBrw:bKeyDown                 :={ | nKey | teclas(nKey, oBrw, "movinv") }

oBrw:aCols[ 1 ]:bEditValid   :=   {|o| Valida( o, oBrw ) }


procedure teclas(nKey, oBrw, cAlias)
   if nKey == VK_DELETE
      IF MsgNoYes("Desea borrar este registro.?"," ATENCION")
         (cAlias)->( DBDELETE() )
         (cAlias)->( DBPACK() )
         oBrw:GOBOTTOM()
         oBrw:REFRESH()
      endif
   endif
return

FUNCTION Valida( o, oBrw )
local lRet := .t.

DO CASE
   CASE o:nLastKey == VK_UP // FLECHA ARRIBA
      IF o:Value() == space( 20 )  //CAMBIA ESTE VALOR SEGUN VALIDACION
         ( oBrw:cAlias )->( DBDELETE() )
         ( oBrw:cAlias )->( DBPACK() )
         oBrw:GOBOTTOM()
         oBrw:REFRESH()
      ENDIF

   CASE o:nLastKey == VK_DOWN // FLECHA ARRIBA
      IF o:Value() == space( 20 ) //CAMBIA ESTE VALOR SEGUN VALIDACION
         lRet := .f.
      ENDIF


ENDCASE

RETURN lRet

PostPosted: Wed Nov 05, 2008 12:14 am
by joseluisysturiz
mcfox wrote:una cosa es la tecla que presionas durante la navegacion del xbrowse y otra mientras estas en estado de edicion de una celda...
no soy guro del xbrowse pero me parece una clase muy interesante
cambia y agrega esto a ver si te sirve...
claro es importante que estes en estado de edicion para que funcione, no lo he probado pero teoricamente deberia funcionar
Code: Select all  Expand view

oBrw:bKeyDown                 :={ | nKey | teclas(nKey, oBrw, "movinv") }

oBrw:aCols[ 1 ]:bEditValid   :=   {|o| Valida( o, oBrw ) }


procedure teclas(nKey, oBrw, cAlias)
   if nKey == VK_DELETE
      IF MsgNoYes("Desea borrar este registro.?"," ATENCION")
         (cAlias)->( DBDELETE() )
         (cAlias)->( DBPACK() )
         oBrw:GOBOTTOM()
         oBrw:REFRESH()
      endif
   endif
return

FUNCTION Valida( o, oBrw )
local lRet := .t.

DO CASE
   CASE o:nLastKey == VK_UP // FLECHA ARRIBA
      IF o:Value() == space( 20 )  //CAMBIA ESTE VALOR SEGUN VALIDACION
         ( oBrw:cAlias )->( DBDELETE() )
         ( oBrw:cAlias )->( DBPACK() )
         oBrw:GOBOTTOM()
         oBrw:REFRESH()
      ENDIF

   CASE o:nLastKey == VK_DOWN // FLECHA ARRIBA
      IF o:Value() == space( 20 ) //CAMBIA ESTE VALOR SEGUN VALIDACION
         lRet := .f.
      ENDIF


ENDCASE

RETURN lRet

Amigo, sabia que ud responderia, lo del guru es solo un decir.... voy probar lo que me enviastes y te aviso como me fue, una ves mas gracias, saludos...como esta esa bella isla...y sus preciosas mujeres...? :shock:

Re: Uso de tecla VK_UP / VK_DOWN en xBROWSE

PostPosted: Wed Nov 05, 2008 5:29 pm
by FranciscoA
joseluisysturiz wrote:Srs. tengo un xbrowse tipo facturacion, cada vez que llego ultima columna me hace un DBAPPEND, eso esta bien, pero me gustaria que si estando en la primera columna uso VK_UP se borre el registo el blanco y que cuando este moviendome y este en la ultmima fila con datos si doy VK_DOWN, me haga un nuevo DBAPPEND, si el get de la primera fila no tiene valor, es decir esta en edicion y vacio no paso a las otras columnas y alli es que pudiera hacer VK_UP y VK_DPOWN.


José Luis:

La manera en que yo lo hago, y trabaja precisamente como tú explicas, con la diferencia que uso ESCAPE, es la siguiente:


oBrw:bPastEof = {|| if( lCtaOK(oBrw) .and. lDebHabOK((cAlias)->debe+(cAlias)->haber) ,;
(Dbappend(), oBrw:GoLeftMost(), oBrw:Refresh(), oBrw:aCols[ 1 ]:Edit() ),) } //agrega registro y queda en edicion.


//COLUMNA 1
oCol = oBrw:AddCol()
oCol:bStrData = { || (cAlias)->cta }
oCol:cHeader = "CTA"
oCol:nEditType = EDIT_GET
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),) ,;
If( nKey == VK_RETURN, (cAlias)->Cta := xVal, ) ,;
If( nKey == VK_ESCAPE .and. Empty((cAlias)->Cta), ( (cAlias)->(dbDelete()),(cAlias)->(__dbPack()),(cAlias)->(dbGoBottom()),oBrw:Refresh() ), ) }


//ULTIMA COLUMNA
oCol = oBrw:AddCol()
oCol:bStrData = { || (cAlias)->CONCEPTO }
oCol:cHeader = "CONCEPTO"
oCol:nEditType = EDIT_GET
//Es la ultima columna, agrega nuevo registro en blanco y se va a primer columna,
//solo si la cta y/o valores están OK
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),;
If( nKey == VK_RETURN, (cAlias)->CONCEPTO := xVal ,) ,;
if( !lCtaOK(oBrw),(oBrw:GoLeftMost(), oBrw:Refresh()),;
if ( (cAlias)->(Recno())==(cAlias)->(Reccount()) .and. lDebHabOK((cAlias)->debe+(cAlias)->haber), (DbAppend(), oBrw:GoLeftMost(), oBrw:Refresh()),) ) }


Prueba a ajustarlo a tu código.

Saludos.

Francisco.