xBrowse
Posted: Tue Jun 12, 2007 2:22 pm
Hola Amigos.
Estoy peleándome desde hace algún tiempo con el xBrowse
Tengo un ejemplo bastante sencillo de una entrada de datos común para hacer mantenimiento a un archivo de Presupuestos mensuales con total acumulado.
Para el ejemplo, tipeo en la cuenta cualquier dígito y en la rutina de “Co130ChCta” lleno el array “tPre” con el último dígito de la cuenta para el 1er mes y lo incremento para los sucesivos, pero ya el Refresh() de la línea 100 no la hace. Y todo aparece en cero.
Luego digito un”2” en row 1 col 2 y entra a la rutina “Co130ChMen” de validación mensual con el “2” digitado y tampoco hace el Refresh() de la línea 121 y luego entra otra vez (solito) a la misma rutina “Co130ChMen” pero con el dato “1” original. Como que no actualiza el array tPre con lo digitado????
Y después de esto entra otra vez (solito) a la función “Co130ChCta” donde carga los datos iniciales...
No sé qué me falta o lo que hago mal
Pongo la rutina por si acaso alguien me ayuda
///////////////////////////////////////////////////////////////
extern DbfCdx
#include "FiveWin.ch"
#include "XBrowse.ch"
Function Main() //CO130() // Mantenimiento al Maestro de Presupuestos
PROG1="CO130"
priv oDlg,oFnt
priv oCta,oSCta
priv wCta:=0
priv oBrw,oBtnEsc,oBtnF1,oBtnF2
priv tPre:={}
for x=1 to 12
aadd(tpre,{str(x,2),0,0})
next
DEFINE FONT oFnt NAME "Ms Sans Serif" SIZE 0, -12
DEFINE DIALOG oDlg TITLE "CO130 Archivo de Presupuestos" ;
FONT oFnt FROM 3,25 to 30,75
@01,02 SAY oSCta VAR "Cuenta" OF oDlg
@01.3,05 GET oCta VAR wCta OF oDlg PICTURE "@R 999-99" SIZE 22,8 ;
VALID CO130ChCta (wCta)
oCta:bGotFocus={||oCta:SelectAll()}
WITH OBJECT (oBrw := TXBrowse():New( oDlg ) )
:SetArray(tPre)
WITH OBJECT :aCols[1]
:cHeader:= "Periodo"
:nWidth:= 50
END
WITH OBJECT :aCols[2]
:cHeader:="Presupuesto"
:nHeadStrAlign:=AL_RIGHT
:cEditPicture:="99999,999,999.99"
:bClrEdit:=oBrw:bClrStd
:bOnPostEdit:={|o,x| tPre[oBrw:nArrayAt,2]:=x }
:nEditType:=EDIT_GET
:bEditValid:={|| Co130ChMen()}
:nWidth:= 65
:nDataStrAlign:=AL_RIGHT
END
WITH OBJECT :aCols[3]
:cHeader:="Total"
:nHeadStrAlign:=AL_RIGHT
:cEditPicture:="99999,999,999.99"
:nEditType:=EDIT_NONE
:nWidth:= 65
:nDataStrAlign:=AL_RIGHT
END
:nMarqueeStyle := MARQSTYLE_HIGHLCELL
:nColDividerStyle := LINESTYLE_BLACK
:nRowDividerStyle := LINESTYLE_BLACK
:nTop:=55
:nLeft:=50
:nBottom:=175 //nWidth=150
:nRight:=160 //nHeight=200
:nFreeze:=1
:lHScroll:=.f.
:lVScroll:=.f.
:lFastEdit:=.t.
:CreateFromCode()
END
oDlg:oClient:=oBrw
@10,21 BUTTON oBtnF2 PROMPT "F2 - GRABAR" SIZE 40,12 OF oDlg ;
Action (CO130Bor(),oCta:setfocus())
@10,03 BUTTON oBtnEsc PROMPT "Esc - Salir" SIZE 40,12 OF oDlg ;
Action (oDlg:End())
ACTIVATE DIALOG oDlg ;
ON INIT ( Co130Bor())
oFnt:end()
return nil
//
///////////////////////////////
//
FUNCTION Co130ChCta(wCta) // validar Cuenta
?"ChCta 88"
priv res:=val(substr(str(wCTA,5),5,1)) // toma el ultimo digito de wCta
priv TotPres:=0
tPre:={}
for x=1 to 12
TOTPRES:=TOTPRES+(Res*x) // ultimo digito * mes
Aadd(tPre,{str(x,2),Res*x, TotPres})
next // mes mensual acumulado
?"ChCta 96",tPre[12,1],tPre[12,2],tPre[12,3] // tPre con datos correctos
oBrw:show()
sysRefresh()
oBrw:refresh() // linea 100: no hace Refresh(), cols 2 y 3 aparecen en Cero
oBrw:goTop()
oBrw:nRowSel:=1
oBrw:nColSel:=2
oBrw:setfocus()
oCta:oJump():=oBrw
RETURN .t.
//
/////////////////
//
Function CO130ChMen() && Val Mensual - actualizar 3ra col - Acumulados
priv lin:=oBrw:nArrayAt
?"113 ChMen","Lin",oBrw:nArrayAt,"Col",tPre[oBrw:nArrayAt,2],"Dato",tPre[lin,2]
priv TotPres:= x:= 0
for x=1 to 12
TOTPRES:=TOTPRES+tPre[x,2]
tPre[x,3]:=TOTPRES
?"118",x,tpre[x,2],tPre[x,3]
next
oBrw:refresh() // Linea 121. tampoco hace este Refresh()
oBrw:goTop()
oBrw:nRowSel:=oBrw:nArrayAt+1 // ir a sgte linea
*oBrw:goDown()
oBrw:nColSel:=2
?"126 ChMen","Lin",oBrw:nArrayAt,"Col",tPre[oBrw:nArrayAt,2]
*oBrw:oJump:=oBrw
oBrw:setfocus()
return .t.
//
//////////////////////////////////////
//
function CO130Bor() // Borrar
wCta:=0
oCta:refresh()
*tPre:={}
oBrw:refresh()
oBrw:hide()
return .t.
*
////////////////////////////////////
o tal vez alguien tenga alguna rutina básica similar a lo que deseo hacer
Muchas gracias de antemano
Jorge Vargas
Estoy peleándome desde hace algún tiempo con el xBrowse
Tengo un ejemplo bastante sencillo de una entrada de datos común para hacer mantenimiento a un archivo de Presupuestos mensuales con total acumulado.
Para el ejemplo, tipeo en la cuenta cualquier dígito y en la rutina de “Co130ChCta” lleno el array “tPre” con el último dígito de la cuenta para el 1er mes y lo incremento para los sucesivos, pero ya el Refresh() de la línea 100 no la hace. Y todo aparece en cero.
Luego digito un”2” en row 1 col 2 y entra a la rutina “Co130ChMen” de validación mensual con el “2” digitado y tampoco hace el Refresh() de la línea 121 y luego entra otra vez (solito) a la misma rutina “Co130ChMen” pero con el dato “1” original. Como que no actualiza el array tPre con lo digitado????
Y después de esto entra otra vez (solito) a la función “Co130ChCta” donde carga los datos iniciales...
No sé qué me falta o lo que hago mal
Pongo la rutina por si acaso alguien me ayuda
///////////////////////////////////////////////////////////////
extern DbfCdx
#include "FiveWin.ch"
#include "XBrowse.ch"
Function Main() //CO130() // Mantenimiento al Maestro de Presupuestos
PROG1="CO130"
priv oDlg,oFnt
priv oCta,oSCta
priv wCta:=0
priv oBrw,oBtnEsc,oBtnF1,oBtnF2
priv tPre:={}
for x=1 to 12
aadd(tpre,{str(x,2),0,0})
next
DEFINE FONT oFnt NAME "Ms Sans Serif" SIZE 0, -12
DEFINE DIALOG oDlg TITLE "CO130 Archivo de Presupuestos" ;
FONT oFnt FROM 3,25 to 30,75
@01,02 SAY oSCta VAR "Cuenta" OF oDlg
@01.3,05 GET oCta VAR wCta OF oDlg PICTURE "@R 999-99" SIZE 22,8 ;
VALID CO130ChCta (wCta)
oCta:bGotFocus={||oCta:SelectAll()}
WITH OBJECT (oBrw := TXBrowse():New( oDlg ) )
:SetArray(tPre)
WITH OBJECT :aCols[1]
:cHeader:= "Periodo"
:nWidth:= 50
END
WITH OBJECT :aCols[2]
:cHeader:="Presupuesto"
:nHeadStrAlign:=AL_RIGHT
:cEditPicture:="99999,999,999.99"
:bClrEdit:=oBrw:bClrStd
:bOnPostEdit:={|o,x| tPre[oBrw:nArrayAt,2]:=x }
:nEditType:=EDIT_GET
:bEditValid:={|| Co130ChMen()}
:nWidth:= 65
:nDataStrAlign:=AL_RIGHT
END
WITH OBJECT :aCols[3]
:cHeader:="Total"
:nHeadStrAlign:=AL_RIGHT
:cEditPicture:="99999,999,999.99"
:nEditType:=EDIT_NONE
:nWidth:= 65
:nDataStrAlign:=AL_RIGHT
END
:nMarqueeStyle := MARQSTYLE_HIGHLCELL
:nColDividerStyle := LINESTYLE_BLACK
:nRowDividerStyle := LINESTYLE_BLACK
:nTop:=55
:nLeft:=50
:nBottom:=175 //nWidth=150
:nRight:=160 //nHeight=200
:nFreeze:=1
:lHScroll:=.f.
:lVScroll:=.f.
:lFastEdit:=.t.
:CreateFromCode()
END
oDlg:oClient:=oBrw
@10,21 BUTTON oBtnF2 PROMPT "F2 - GRABAR" SIZE 40,12 OF oDlg ;
Action (CO130Bor(),oCta:setfocus())
@10,03 BUTTON oBtnEsc PROMPT "Esc - Salir" SIZE 40,12 OF oDlg ;
Action (oDlg:End())
ACTIVATE DIALOG oDlg ;
ON INIT ( Co130Bor())
oFnt:end()
return nil
//
///////////////////////////////
//
FUNCTION Co130ChCta(wCta) // validar Cuenta
?"ChCta 88"
priv res:=val(substr(str(wCTA,5),5,1)) // toma el ultimo digito de wCta
priv TotPres:=0
tPre:={}
for x=1 to 12
TOTPRES:=TOTPRES+(Res*x) // ultimo digito * mes
Aadd(tPre,{str(x,2),Res*x, TotPres})
next // mes mensual acumulado
?"ChCta 96",tPre[12,1],tPre[12,2],tPre[12,3] // tPre con datos correctos
oBrw:show()
sysRefresh()
oBrw:refresh() // linea 100: no hace Refresh(), cols 2 y 3 aparecen en Cero
oBrw:goTop()
oBrw:nRowSel:=1
oBrw:nColSel:=2
oBrw:setfocus()
oCta:oJump():=oBrw
RETURN .t.
//
/////////////////
//
Function CO130ChMen() && Val Mensual - actualizar 3ra col - Acumulados
priv lin:=oBrw:nArrayAt
?"113 ChMen","Lin",oBrw:nArrayAt,"Col",tPre[oBrw:nArrayAt,2],"Dato",tPre[lin,2]
priv TotPres:= x:= 0
for x=1 to 12
TOTPRES:=TOTPRES+tPre[x,2]
tPre[x,3]:=TOTPRES
?"118",x,tpre[x,2],tPre[x,3]
next
oBrw:refresh() // Linea 121. tampoco hace este Refresh()
oBrw:goTop()
oBrw:nRowSel:=oBrw:nArrayAt+1 // ir a sgte linea
*oBrw:goDown()
oBrw:nColSel:=2
?"126 ChMen","Lin",oBrw:nArrayAt,"Col",tPre[oBrw:nArrayAt,2]
*oBrw:oJump:=oBrw
oBrw:setfocus()
return .t.
//
//////////////////////////////////////
//
function CO130Bor() // Borrar
wCta:=0
oCta:refresh()
*tPre:={}
oBrw:refresh()
oBrw:hide()
return .t.
*
////////////////////////////////////
o tal vez alguien tenga alguna rutina básica similar a lo que deseo hacer
Muchas gracias de antemano
Jorge Vargas