PROCEDURE grdPagos.chkPagoSi.InteractiveChange |
|
* Suponiendo que el ControlGrid se llame "Grilla"* Suponiendo que las columnas afectadas son la 6 y la 7
* Creamos un Método en el formulario llamado "SoluProb"* Metodo SoluprobLOCAL LoObjenEv=AEVENTS(gaEvent,0)IF nEv=0 RETURNENDIFLoObje=gaEvent[1]lValor=loObje.ValueoColumn=LoObje.ParentoControl=ocolumn.ControlSourcenos=ALINES(gaControl,oControl,1,".")cTabla=gaControl[1]cCampo=gaControl[2]SELECT (cTabla)do case case Upper(cCampo)==THISFORM.CAMPOSI replace (Thisform.CampoNo) with !lValor CASE uPPER(cCampo)==thisform.campoNo replace (Thisform.CampoSi) with !lValorendcase
********************************** Despues de crear la cuadrícula*********************************WITH thisform.Grilla .Columns[6].REadonly=.f. .Columns[7].Readonly=.f.ENDWITH* Agregamos dos propiedades con el nombre de los campos* que supongo "PAGOSI" Y "PAGONO", ambos "L"
WITH thisform .Addproperty("CampoSi","PAGOSI") .ADDPROPERTY("CampoNo","NOPAGO")ENDWITHobjGrid=Thisform.GrillaFOR i=6 TO 7 BINDEVENT(objGrid.Columns[i].Check1,"click",This,"SoluProb")NEXT
****************************** Destroy del Form*****************************UNBINDEVENTS(Thisform.Grilla)
********************************** Despues de crear la cuadrícula*********************************WITH thisform.Grilla .Columns[6].REadonly=.f. .Columns[7].Readonly=.f.ENDWITH* Agregamos dos propiedades con el nombre de los campos* que supongo "PAGOSI" Y "PAGONO", ambos "L"
WITH thisform .Addproperty("CampoSi","PAGOSI") .ADDPROPERTY("CampoNo","PAGONO")ENDWITHobjGrid=Thisform.GrillaFOR i=6 TO 7 BINDEVENT(objGrid.Columns[i].Check1,"click",This,"SoluProb")NEXTOoorales!! pues bueno con lo que me acaban de aportar Pablo Daniel, FidelJ tengo para analizarlo un rato, entonces voy a ver como funciona y adaptarlo de ser asi pues les comento en lo subsecuente de lo contrario estare dandoles lada... Una excelente comunidad...
Gracias...
Si definiitvamente si Ricardo, lo poco que se de Visua Fox Pro me ha gustado mucho en todo su aspecto. gracias a todos por su ayuda, estoy viendo todo lo que me han hecho favor de mandar!
SELECT id_pago, fechapago, abono, saldo, pagosi, pagono;
FROM dbf_pagos where cliente = tmpCobranza.cliente INTO CURSOR tmpPagos NOFILTER READWRITEthisform.pageframe1.page1.grdDbf_pagos.RecordSource = "tmpPagos"
thisform.pageframe1.page1.grdDbf_pagos.Refresh()WITH thisform.pageframe1.page1.grdDbf_pagos
.ColumnCount = 6
.AllowAutoColumnFit = 2
.AllowHeaderSizing = .F.
.BackColor = RGB(255,255,255)
.DeleteMark = .F.
.ForeColor = RGB(0,0,0)
.FontName = "Calibri"
.FontSize = 10
.GridLineColor = RGB(192,192,192)
.GridLineWidth = 1
.GridLines = 3
.HeaderHeight = 20
.Height = 289
.HighlightRow = .F.
.Left = 597
.Panel = 1
.RecordMark = .F.
.RecordSource = 'tmpPagos'
.linkmaster = 'tmpCobranza'
.Relationalexpr = 'Cliente'
.RecordSourceType = 1
.ScrollBars = 2
.Top = 13
.Width = 357
.visible = .T..column1.header1.caption = "No."
.column2.header1.caption = "Fecha de Pago"
.column3.header1.caption = "Abono"
.column4.header1.caption = "Saldo"
IF PEMSTATUS(.column5, "Text1", 5)
.column5.removeobject("Text1")
.column5.addobject("chkPagosi","Checkbox")
.column5.chkPagosi.visible=.T.
.column5.chkPagosi.enabled=.T.
.column5.chkPagosi.caption = ""
.column5.chkPagosi.backstyle = 0
.column5.chkPagosi.readonly = .F.
.column5.chkPagosi.centered = .T.
.column5.sparse = .F.
.column5.header1.caption = "Si"
IF PEMSTATUS(.column6, "Text1", 5)
.column6.removeobject("Text1")
.column6.addobject("chkPagoNo","Checkbox")
.column6.chkPagoNo.visible=.T.
.column6.chkPagoNo.enabled=.T.
.column6.chkPagoNo.caption = ""
.column6.chkPagoNo.backstyle = 0
.column6.chkPagoNo.Readonly = .F.
.column6.chkPagoNo.centered = .T.
.column6.sparse = .F.
.column6.header1.caption = "No"
ENDIF
ENDIF
FOR grdNegrit=1 TO 6ncol="column"+ALLTRIM(STR(grdNegrit))+"."
.&ncol.header1.Alignment=2ENDFOR.Column3.InputMask = "$999,999.99"
.Column4.InputMask = "$999,999.99".column1.Width = 24
.column2.width = 141
.column3.Width = 59
.column4.Width = 69
.column5.Width = 19
.column6.Width = 19
ENDWITHTHISFORM.REFRESH
éste es el codigo que utilizo para hacer la consulta insertarla en el grid y controlar su aspecto en todo el sentido de la palabra, en modo diseño tengo los grids con el recorsource="" y su tamaño definido al mismo de ejecucion, estuve viendo y si efectivamente es lo que necesito pero como adapto en este metodo para que se le pueda dar click al checkbox y si es con ek bindevent() lo trate de hacer pero marca error que no existe la propiedad aunque si existe una igual con el nombre pero es metodo,
bindevent(thisform.pageframe1.page1.grdDbf_pagos.column5.chkPagoNo, "InteractiveChange",thisform, "chkPagoNo")
thisform.pageframe1.page1.grdDbf_Pagos.column5.chkPagoSi = 1
thisform.pageframe1.page1.grdDbf_Pagos.column6.chkPagoSi = 0
meChkPagoNo
thisform.pageframe1.page1.grdDbf_Pagos.column5.chkPagoSi = 0
thisform.pageframe1.page1.grdDbf_Pagos.column6.chkPagoSi = 1
y en el metodo llenaGrdPagos
BINDEVENT(thisform.pageframe1.page1.grdDbf_pagos.column5.chkPagoSi, 'Click', thisform,"meChkPagoSi")
BINDEVENT(thisform.pageframe1.page1.grdDbf_pagos.column6.chkPagoNo, 'Click', thisform,"meChkPagoNo")
* Este código iba en el INit del formulario, o en el método que * genera la cuadrícula de Pagos "grdDbf_pagos"* La idea es * 1) saber cómo se llaman los campos de la tabla* que se verán afectados* 2) Crear una secuencia de BindEvent() para las columnas afectadas* con un solo método delegado "SoluProb"** Este segmento podría estar incluso, en el Load del formularioWITH thisform .Addproperty("CampoSi","PAGOSI") .ADDPROPERTY("CampoNo","PAGONO")ENDWITH
* En la creación del Control Grid, prefiero mantener los nombres de* los objetos por Default. En este caso, los CheckBox agregados a cada columna* se llaman siempre "Check1". Eso facilita la secuenciación de los * BindEvent. Si no, tienes que escribirlos a todos.* De todos modos, lo importante es saber en qué columna se produce el* evento Click y su ControlSource asociado.** Este segmento tiene que seguir a la creación del objeto Grid.objGrid=Thisform.pageframe1.page1.grdDbf_pagosFOR i=5 TO 6 BINDEVENT(objGrid.Columns[i].Check1,"click",This,"SoluProb")next
*----------------------------------------------* Método de Usuario * "SoluProb" ** Basado en una respuesta de Pablo Daniel Lisa* para una consulta anterior *----------------------------------------------LOCAL LoObjenEv=AEVENTS(gaEvent,0)IF nEv=0 RETURNENDIFLoObje=gaEvent[1]lValor=loObje.ValueoColumn=LoObje.ParentoGrid=loObje.Parent.Parent.Name && Nombre de la cuadrícula (literal)* && en este caso no se utilizaoControl=ocolumn.ControlSourcenos=ALINES(gaControl,oControl,1,".")cTabla=gaControl[1]cCampo=gaControl[2]
* LoObje, es una referencia al objeto que responde a BindEvent,* determinado a través de AEVENTS()* en este caso podría ser:* thisform.pageframe1.page1.grdDbf_pagos.Columns[5].Check1* o* thisform.pageframe1.page1.grdDbf_pagos.Columns[6].Check1* oColumn, es una referencia al objeto contenedor de lcObje* en este caso podría ser:* thisform.pageframe1.page1.grdDbf_pagos.Columns[5]* o* thisform.pageframe1.page1.grdDbf_pagos.Columns[6]** oControl=oColumn.ControlSource* es un literal = 'NombreTabla.Campo'** nos=ALINES(gaControl,oControl,1,".") genera una matriz de dos elementos* Elemento 1= Nombre de la tabla* Elemento 2= Nombre del Campo** Por Eso:* cTabla=gaControl[1]* Luego, puedes hacer Select (cTabla). * Con esto te independizas de cómo se llama la tabla* y lo puedes aplicar a cualquier otra cuadrícula.* cCampo=gaControl[2] * Nombre del campo de la tabla asociado a la columna* afectada por el BindEvent.** Lo que corresponde cambiar, es el valor en la tabla (o cursor) y que luego * se vean reflejados en el control grid.** Este mecanismo permite que exista un solo método "cDelegate" que resuelva * el problema, en lugar de generar un "cDelegate" para cada columna.
<Código Puesto> SELECT tmpPagos DO case case Upper(cCampo)== thisform.pageframe1.page1.grdDbf_pagos.chkPagoSi replace thisform.pageframe1.page1.grdDbf_pagos.chkPagoNo with !lValor CASE uPPER(cCampo)==thisform.pageframe1.page1.grdDbf_pagos.chkPagoNo replace thisform.pageframe1.page1.grdDbf_pagos.chkPagoSi with !lValor ENDCASE</Código Puesto>
<Código Sugerido>* Se propone "Upper(cCampo)", porque se definió el valor de la * propiedad respectiva con mayúsculas. Podría ser a la inversa.SELECT (cTabla)do case case Upper(cCampo)==THISFORM.CAMPOSI replace (Thisform.CampoNo) with !lValor CASE uPPER(cCampo)==thisform.campoNo replace (Thisform.CampoSi) with !lValorendcase* Esto resulta seguramente más rápído que citar toda la cadena de parent.</Código Sugerido>
************************************************************************* Sugerencias
*************** 1) Evita, en lo posible, el uso de Thisform.REfresh.
* 2) Utiliza el objecto Columns() en lugar de macrosustitución* 3) No necesitas quitar el objeto Text1 de la columna* Puedes agregar el objeto que necesites y utilizar* la propiedad CurrentControl="NuevoObjeto"* Para el caso de agregar CheckBox, conviene definir primero* el ControlSource de la columna. Ello porque CheckBox soporta* valores numéricos (0,1 y 2) y lógicos. * * SamplelcAlias = "Nombre del Cursor"Select (lcAlias)nFields=Afields(gastruct)cName=lcAlias+"."+lcNombreCampo
with thisform.Grid1
.Columncount=nfields
.RecordSource=lcAlias .RecordMark=.t. .DeleteMark=.f. for wi=1 to alen(gastruct,1) with .Columns[wi].Header1 .Caption=Proper(gastruct[wi,1]) .Fontsize=8 endwith do case case gastruct[wi,2]="C" * .Columns(wi). (lo que sea) case gastruct[wi,2]="N" * .Columns(wi). (lo que sea) case gastruct[wi,2]="M" * .Columns(wi). (lo que sea) case gastruct[wi,2]="D" * .Columns(wi). (lo que sea) case gastruct[wi,2]="T" * .Columns(wi). (lo que sea) case gastruct[wi,2]="I" * .Columns(wi). (lo que sea)
case gastruct[wi,2]="L" .Columns(wi).ControlSource='&cName' .Columns(wi).Sparse=.f. if Vartype(.Columns(wi).Check1)#"O" .Columns(wi).AddObject("Check1",'CheckBox') endif .Columns(wi).CurrentControl="Check1" .Columns(wi).Check1.Caption="" .Columns(wi).Check1.Visible=.t. * etc endcase nextendwith
1) Referenciar al objeto en lugar de Macrosustitución
FOR grdNegrit=1 TO 6 ncol="column"+ALLTRIM(STR(grdNegrit))+"."
.&ncol.header1.Alignment=2 &¯osustitución ENDFOR
En lugar de eso,es mejor;
For i=1 to Thisform.pageframe1.page1.grdDbf_pagos .Columns[i].header1.Alignment=2 && referencia directa al objeto.next
DIRECTORY(cDirectoryName [, nFlags]) && cDirectoryName es un literal