Ayuda con xBrowse y salto de columna
Posted: Mon Dec 15, 2008 3:55 pm
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.
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
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.
Gracias a todos y a ver si me decis por qué salta dos celdas en vez de una.
Pedro