Page 1 of 1

xBrowse

Posted: Tue Jun 12, 2007 2:22 pm
by jvargas
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

Re: xBrowse

Posted: Wed Jun 13, 2007 2:27 pm
by Maurilio Viana
Jorge, cuando cambia el array tPre no cambia el contenido del xBrowse. El buffer de array de xBrowse es oBrw:aArrayData, tienes que hacer 1 de estas 2 cosas:
- Asigne el buffer del campo editado a oBrw:aArrayData
- Atualice el contenido de oBrw:aArrayData despues de edicion de las celdas

Puedes hacer:

Code: Select all

 :bOnPostEdit:={|o,x| oBrw:aArrayData[oBrw:nArrayAt,2]:=x } 
O:

Code: Select all

 :bOnPostEdit:={|o,x| tPre[oBrw:nArrayAt,2]:=x, oBrw:aArrayData := aClone(tPre) } 
En estos ejemplos yo he passado directamente en el codeblock de bOnPostEdit, pero puedes añadir la atualizacion de oBrw:aArrayData en mejores locales de las functions Co130ChCta, Co130ChMen etc
Tal vez tenga que refrescar la celda con oBrw:Refresh() despues de la edicion...

Espero que te sirva (e compreendas mi "portuñol")

Saludos de Brasil
Maurilio

Posted: Thu Jun 14, 2007 2:50 pm
by jvargas
Hola Maurilio
Muchas gracias por tu ayuda. Tu Portuñol es igualito a mi Español.
Actualicé el oBrw:aArrayData antes de hacer los Refresh() y funciona perfecto cuando hago el seguimiento.
Pero todavía tengo el problema que después de entrar a la rutina Co130ChMen por el bEditValid, entra otra vez a esta misma rutina aunque le he quitado las líneas que mueven el cursor un Row mas abajo del oBrw y después de esto (lo que es peor) hace automáticamente la rutina Co130ChCta donde carga los datos iniciales.
Gracias otra vez por tu ayuda
Jorge Vargas

Posted: Mon Jun 18, 2007 4:50 pm
by jvargas
Hola Amigos.
nadie tiene un ejemplo sencillo de entrada de datos en xBrowse cambiando de casilla por programa?
Gracias
J. vargas