Ayuda con xBrowse y salto de columna

Post Reply
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Ayuda con xBrowse y salto de columna

Post by Pedro »

Hola a todos
Estoy compilando el ejemplo de Francisco Alegria, un xBrowse con validacion de celdas y salto sobre celdas no editables. La pega es que no salta una sola celda sino dos celdas, me podeis decir que hago mal ?
Os pongo el código del ejemplo con sus funciones.

Code: Select all


#include "FiveWin.ch" 
#include "InKey.ch" 
#include "xbrowse.ch" 

//---------------------------- 
Function CDiario() 
local oWnd, oBrw, oCol, cAlias 
local n:=0 
local nTotal1:=0, nTotal2:=0 


DbUseArea(.T.,,"Datos","Datos",.F.) 
cAlias:=Alias() 

dbSelectArea(cAlias) 

DEFINE WINDOW oWnd TITLE "EDITAR COMPROBANTE DE DIARIO" ; 
FROM 0,0 TO 600,900 PIXEL ; 
COLOR nRGB(247, 243, 232), nRGB(228, 213, 184) 

oBrw := TXBrowse():New( oWnd ) 
oBrw:cAlias := cAlias 

oBrw:nColDividerStyle := LINESTYLE_INSET 
oBrw:nRowDividerStyle := LINESTYLE_INSET 
oBrw:lColDividerComplete := .t. //completa pintado sobre el footer cuando lineas no llenan todo el browse 

oBrw:nHeaderHeight := 30 //Altura cabeceras de col 
oBrw:lFooter := .t. //Que tendrá footer 
oBrw:nFooterLines := 1 //Lineas del footer 
oBrw:nFooterHeight := 24 //Altura del Footer 
oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq 


oBrw:bClrHeader := {|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO 
oBrw:bClrFooter := oBrw:bClrHeader 
oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales 
oBrw:bClrSel := {|| { nRGB(255,255,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco 
oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco 

oBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL //solo ilumina la celda actual 

oBrw:nRowHeight := 20 //altura entre lineas 

oBrw:lFastEdit := .t. 

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

//Aqui uso DbPack() porque es una dbf pequeña y temporal. En grandes usar function de mantenimiento. 
oCol = oBrw:AddCol() 
oCol:bStrData = { || (cAlias)->cuenta } 
oCol:cHeader = "CUENTA" 
oCol:nEditType = EDIT_GET 
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),) ,; 
If( nKey == VK_RETURN, If (lCtaOk(oBrw),(cAlias)->Cuenta := xVal,oBrw:GoLeftMost() ), ),; 
If( nKey == VK_ESCAPE .and. Empty((cAlias)->Cuenta), ( (cAlias)->(dbDelete()),(cAlias)->(__dbPack()),(cAlias)->(dbGoBottom()),oBrw:Refresh() ), ) } 

oCol = oBrw:AddCol() 
oCol:bStrData = { || (cAlias)->NOMBRE } 
oCol:cHeader = "DESCRIPCION DE LA CUENTA" 
oCol:cFooter = "BALANCE ---> " 
oCol:nFootStrAlign := 1 
oCol:nEditType = 0 //no editable 

oCol = oBrw:AddCol() 
oCol:bStrData = { || Transform((cAlias)->DEBE,"9,999,999,999.99") } 
oCol:nDataStrAlign := 1 //alineado a la derecha 
oCol:cHeader = "DEBITOS" 
oCol:nEditType = EDIT_GET 
oCol:lTotal := .t. //para totalizar cols a report y/o excel 
oCol:bFooter = {|| TRANSFORM(nTotal1,"9,999,999,999.99") } 
oCol:nFootStrAlign := 1 
*oCol:bEditWhen := {|| (cAlias)->Haber =0 } 
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),),; 
If( nKey == VK_RETURN,; 
if(lDebeOK(oBrw,xVal),( nTotal1+=(Val(xVal)-(cAlias)->DEBE), oCol:RefreshFooter(), (cAlias)->DEBE := Val(xVal) ), oBrw:GoLeftMost()) ,) } 

oCol = oBrw:AddCol() 
oCol:bStrData = { || Transform((cAlias)->HABER,"9,999,999,999.99") } 
oCol:nDataStrAlign := 1 
oCol:cHeader = "CREDITOS" 
oCol:nEditType = EDIT_GET 
oCol:lTotal := .t. //para totalizar cols a report y/o excel 
oCol:bFooter = {|| TRANSFORM(nTotal2,"9,999,999,999.99") } 
oCol:nFootStrAlign := 1 
*oCol:bEditWhen := {|| (cAlias)->Debe =0 } 
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, ( DbAppend(), oBrw:Refresh() ),),; 
If( nKey == VK_RETURN,; 
if(lHaberOK(oBrw,xVal), ( nTotal2+=(Val(xVal)-(cAlias)->HABER), oCol:RefreshFooter(), (cAlias)->HABER := Val(xVal) ), oBrw:GoLeftMost()) ,) } 


oCol = oBrw:AddCol() 
oCol:bStrData = { || (cAlias)->CONCEPTO } 
oCol:cHeader = "CONCEPTO" 
oCol:nEditType = EDIT_GET 
oCol:bOnPostEdit = { | oCol, xVal, nKey | If( RecCount() == 0, DbAppend(),),; 
If( nKey == VK_RETURN, (cAlias)->CONCEPTO := xVal ,) ,; 
if ( (cAlias)->(Recno())==(cAlias)->(Reccount()) , (DbAppend(), oBrw:GoLeftMost(), oBrw:Refresh()),)  } 


oBrw:SetRDD() 
oBrw:CreateFromCode() 

oBrw:bKeyDown :={ | nKey | Teclas(nKey, oBrw, cAlias) } 

oWnd:oClient := oBrw 

ACTIVATE WINDOW oWnd ; 
ON INIT oBrw:SetFocus() 

RETURN NIL 

//-------------------- 
Function Teclas(nKey, oBrw, cAlias) 
Do Case 
Case nKey == VK_DELETE 
if MsgNoYes("¿Está seguro(a) de borrar este registro?","Borrar registro de "+cAlias) 
(cAlias)->(dbDelete()) 
(cAlias)->(dbPack()) 
oBrw:GoBottom() 
oBrw:Refresh() 
endif 
EndCase 
Return nil 

//----------------// 
Function lCtaOK(oBrw) 
Local nNextCol 

*msgInfo("validamos la cuenta")
(oBrw:cAlias)->nombre := "Nombre de la Cuenta, si existe..."

nNextCol := oBrw:nColSel + 1 // FranciscoA Sept/23/2008 

if oBrw:aCols[nNextCol]:nEditType == 0 //Si prox col no es editable... 
   if nNextCol < Len(oBrw:aCols) //Si no es la ult columna, salta a sig editable 
      oBrw:nColSel := nNextCol + 1 
      oBrw:aCols[ oBrw:nColSel ]:Edit()
      oBrw:Refresh() 
   endif 
endif 
//tu codigo de validacion 

*oBrw:nColSel -- 
oBrw:Refresh() 
SysRefresh()
Return .t. 

//----------------------------//No permitir registro sin valores 
Function lDebHabOK(nValor) 
if nValor = 0 
MsgStop("Omision de Valores","Alto") 
return .f. 
endif 

Return .t. 
//----------------// 
Function lDebeOK(oBrw,xVal)
Local nDebe := Val(xVal)
Local nHaber := (oBrw:cAlias)->haber

   If nDebe <> 0
      (oBrw:cAlias)->Haber := 0 
      oBrw:nColSel ++
      oBrw:aCols[ oBrw:nColSel ]:Edit()
   EndIf   

oBrw:Refresh() 
Return .T.
//----------------// 
Function lHaberOK(oBrw,xVal) 
Local nDebe := (oBrw:cAlias)->debe
Local nHaber := Val(xVal)

If nDebe == 0 .and. nHaber == 0
   MsgStop("El debe y el haber no pueden ser igual a cero","Alto")
   
   Return .f.
Else
   If nHaber <> 0
      (oBrw:cAlias)->Debe := 0 
      oBrw:nColSel ++
      oBrw:aCols[ oBrw:nColSel ]:Edit()
   EndIf   
EndIf      
oBrw:Refresh() 
Return .t.
Le he hecho algunas modificaciones (poca cosa) sólo para verlo funcionar a mi manera.
Gracias a todos y a ver si me decis por qué salta dos celdas en vez de una.

Pedro
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Post by joseluisysturiz »

Pedro, desde que celda te salta 2? ya que ese ejemplo lo tengo y me salta solo las no editable, estamos construyendo entre algunos un ejemplo de facturacion y hace el salto de celda de una en una o salta las no editable, si deseas te lo envio a tu correo, a ver si te ayuda es algo que hacemos poco a poco pero da buen pie para el dominio de xBrowse con la ayuda de nuestro colega MCFOX, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Post by Pedro »

Hola Jose Luis

Desde luego me gustaria que me mandaras el ejemplo, o lo que teneis, y si puedo ayudar no dudes que lo haré.
Si te fijas en el ejemplo, yo llamo a lCtaOk en la primera columna, la segunda no es editable, el resto si, pues al saltar desde la primera a la segunda y de aqui a la tercera, no se queda en la tercera, si no que va a la cuarta, y eso que retoqué (o más bien quité) el bWhen de la columna 3º y 4º ya que si no no podia cambiar sus valores. Lo curioso es que con unos msginfo, me informa de que está en la 1ª, salta por la 2ª y llega a la 3ª pero no sé por qué no se queda ahí si no que salta a la 4ª.
En esta columna, la 4ª cuando pulso enter para salir de la edición, debería ir a la 5ª y la mayoría de las veces se la salta y me abre un registro nuevo.

Espero haberme hecho entender.
Un saludo

Pedro
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Post by joseluisysturiz »

Pedro wrote:Hola Jose Luis

Desde luego me gustaria que me mandaras el ejemplo, o lo que teneis, y si puedo ayudar no dudes que lo haré.
Si te fijas en el ejemplo, yo llamo a lCtaOk en la primera columna, la segunda no es editable, el resto si, pues al saltar desde la primera a la segunda y de aqui a la tercera, no se queda en la tercera, si no que va a la cuarta, y eso que retoqué (o más bien quité) el bWhen de la columna 3º y 4º ya que si no no podia cambiar sus valores. Lo curioso es que con unos msginfo, me informa de que está en la 1ª, salta por la 2ª y llega a la 3ª pero no sé por qué no se queda ahí si no que salta a la 4ª.
En esta columna, la 4ª cuando pulso enter para salir de la edición, debería ir a la 5ª y la mayoría de las veces se la salta y me abre un registro nuevo.

Espero haberme hecho entender.
Un saludo

Pedro
Coloca correo donde enviarte lo que tenemos ya que no tienes uno en tu perfil, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
Pedro
Posts: 457
Joined: Tue Mar 21, 2006 7:30 pm
Location: Córdoba (España)

Post by Pedro »

Jose Luis
mi correo está debajo pero por si acaso algafiq@terra.es o bien este otro
pedrogahete@terra.es

Un saludo y gracias Jose Luis

Pedro
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Post by Daniel Garcia-Gil »

te he enviado un correo intenta contactarme
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Post Reply