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
xBrowse
- Maurilio Viana
- Posts: 252
- Joined: Tue Oct 25, 2005 2:48 pm
- Location: Garça/Garza/Heron City - Brazil
- Contact:
Re: xBrowse
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:
O:
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
- 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 }
Code: Select all
:bOnPostEdit:={|o,x| tPre[oBrw:nArrayAt,2]:=x, oBrw:aArrayData := aClone(tPre) }
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
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
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
FW-705, xHarbour 0.99.71 (SimpLex) , bcc55