Comportamiento extraño de combobox

212 views
Skip to first unread message

José Luis

unread,
Jan 27, 2013, 3:31:09 PM1/27/13
to publice...@googlegroups.com
Hola grupo,

Vuelvo a necesitar vuestra ayuda.

Tengo un combobox insertado en un grid y funciona correctamente, pero lo extraño es que no actualiza el valor en el cursor hasta que salgo del combobox y selecciono otra fila del grid.

¿Qué es lo que hago mal?

El código que utilizo es el siguiente:

WITH this
    .Recordsource = ""
    .Columncount = 3
    .Recordsource = "curConsumibles"
    .AllowAutoColumnFit = 0
    .AllowRowSizing = .F.
    .AllowHeaderSizing = .F.
    .FontSize = 10
    .RowHeight = 28
    .Column1.ControlSource = "consumible"
    .Column1.Header1.Caption = "Artículo"
    .Column1.Header1.Fontbold = .T.
    .Column1.Width = 250
    .Column1.Alignment = 0
    .Column2.ControlSource = "partnumber"
    .Column2.Header1.Caption = "Referencia"
    .Column2.Header1.Fontbold = .T.
    .Column2.Width = 200   
    .Column2.Alignment = 0
    .Column3.ControlSource = "cantidad"
    .Column3.Header1.Caption = "Unidades"
    .Column3.Header1.Fontbold = .T.
    .column3.Width = 70
    .Column3.Sparse = .F.
    .Column3.AddObject("MyCombobox", "Combobox")
    .Column3.MyCombobox.Fontsize = 10
    .Column3.MyCombobox.Style = 2
    .Column3.MyCombobox.Visible = .T.
    .Column3.MyCombobox.Rowsource = "0,1,2,3"
    .Column3.MyCombobox.RowsourceType = 1
    .Column3.CurrentControl="MyCombobox"

    *** Alternar columnas entre blanco y gris ***

    .SetAll("DynamicBackColor","IIF(MOD(RECNO(),2)=1, RGB(255,255,255), RGB(210,210,210))",;
  "Column")
ENDWITH

Daniel Sánchez

unread,
Jan 27, 2013, 8:57:32 PM1/27/13
to Comunidad de Visual Foxpro en Español
Lo que ocurre es que los datos están en el buffer cuando estas editando un registro este no es actualizado en la tabla hasta que sales o cambias de registro, en todo caso en el valid o lostfocus de tu combobox podrías indicar un tableupdate para que solo al salir ya del combobox se hagan perennes los cambios deseados.

Saludos



--
 
 



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

FidelJ

unread,
Jan 28, 2013, 8:21:53 AM1/28/13
to publice...@googlegroups.com
Como sabes que no actualiza el cursor?. Tal vez porque no realiza una operación determinada y quizá porque esa operación esta en el AfterRowColChange del grid.

Para solucionar este tema, propongo
1) Muda ese código para el Init del formulario (With thisform.Grid1  etc)
2) Crea un método (por ejemplo, "Calcular" en tu formulario donde escribes el código del cálculo
Ej. 
* Metodo Calcular
Select curConsumibles
REPLACE importe WITH Cantidad * precio

Luego de la definición del control grid (Init del Formulario)
BINDEVENT(thisform.Grid1.Columns[3].mycomboBox,"InteractiveChange",thisform,"calcula")

En el Destroy del formulario tiene que ir
UNBINDEVENTS(thisform.Grid1.Columns[3].mycomboBox)

FidelJ

unread,
Jan 28, 2013, 8:38:03 AM1/28/13
to publice...@googlegroups.com
José Luis
En el método "Calcular" propuesto habrá que cambiar algo para que no vaya "atrasado"
SELECT curconsumibles
replace importe WITH precio * VAL(tHISFORM.GRID1.cOLUMN3.MyCombobox.vALUE)
De lo contrario la respuesta es inmediata, pero el valor del cursor no se actualiza, efectivamente, hasta que no se produce el LostFocus del MycomboBox.
Disculpa la "pifia".
Fidel.

FidelJ

unread,
Jan 28, 2013, 9:05:44 AM1/28/13
to publice...@googlegroups.com
De paso, fíjate que puedes escribir tu código un poco más limpio.
WITH thisform.grid1
    .Recordsource = ""
    .Columncount = 5
    .Recordsource = "CurConsumibles"
    .AllowAutoColumnFit = 0
    .AllowRowSizing = .F.
    .AllowHeaderSizing = .F.
    .FontSize = 10
    .RowHeight = 28
    WITH .Columns[1]
    .ControlSource = "CurConsumibles.consumible"
   .Header1.Caption = "Artículo"
    .Header1.Fontbold = .T.
   .Width = 150
    .Alignment = 0
    ENDWITH
    WITH .Columns[2]
    .ControlSource = "CurConsumibles.partnumber"
   .Header1.Caption = "Referencia"
    .Header1.Fontbold = .T.
   .Width = 100    
    .Alignment = 0
    ENDWITH
    WITH .Columns[3]
.ControlSource = "CurConsumibles.cantidad"
.Header1.Caption = "Unidades"
.Header1.Fontbold = .T.
.Width = 70
.Sparse = .F.
.AddObject("MyCombobox", "Combobox")
WITH .MycomboBox
.Fontsize = 10
.Style = 2 
.Visible = .T. 
.RowsourceType = 1    
.Rowsource = "0,1,2,3" 
.BorderStyle=0
.SpecialEffect=1
endwith
.CurrentControl="MyCombobox" 
    ENDWITH
    WITH .Columns[4]
.ControlSource = "CurConsumibles.precio"
.INputMask="999,999.99"
.Header1.Caption = "Precio"
.Header1.Fontbold = .T.
.Width = 80 
     ENDWITH
     WITH .columns[5]
.ControlSource = "CurConsumibles.Importe"
.Header1.Caption = "Importe"
.Header1.Fontbold = .T.
.INputMask="999,999.99"
.Width = 80 
     ENDWITH
ENDWITH

BINDEVENT(thisform.Grid1.Columns[3].mycomboBox,"InteractiveChange",thisform,"calcula")

Al objeto MyComboBox, conviene presentarlo con .SpecialEffect=1 y BorderStyle=0. Tendrá menos delay el movimiento de la cuadrícula. También es una cuestión de gusto.
También resulta conveniente manejar la propiedad Columns(). Te dará mucha flexibilidad si diseñas una clase capaz de formatear cualquier control grid a tu gusto y necesidad, sin tener que recurrir a la macrosustitución.

Fidel

José Luis

unread,
Jan 29, 2013, 12:35:37 PM1/29/13
to publice...@googlegroups.com

Gracias por tu ayuda Fidel

No consigo solucionar este problema, y debe ser lo más tonto del mundo, pero no lo consigo
El caso es que el cursor donde está este combobox no se actualiza por mucho que haga un tableupdate
Este formulario muestra una selección de consumibles según la impresora que se escoja y nos permite introducir la cantidad que deseamos
Luego he creado un botón Aceptar que realiza un Select de aquellos artículos que tienen la cantidad > 0, pero claro los datos que muestra no son correctos porque el cursor no se ha actualizado
He probado de poner un tableupdate() en el boton aceptar antes de crear el nuevo cursor, pero nada
Adjunto 2 imágenes, para que se me entienda mejor

Víctor Hugo Espínola Domínguez

unread,
Jan 29, 2013, 2:51:34 PM1/29/13
to publicesvfoxpro
Hola José Luís

Prueba agregando esto:
    
        .Columns3.RemoveObject( "Text1" )

Saludos,
Víctor.




--
 
 

FidelJ

unread,
Jan 29, 2013, 5:27:36 PM1/29/13
to publice...@googlegroups.com
José Luis:
Estás trabajando con VFP 9?
Después de ver tu formulario, propongo lo siguiente (probado antes de enviar)
(Este código utiliza BINDEVENT() igual que el anterior, pero aquí he corregido produciendo en el método "Calcular" el reemplazo del valor en el cursor de modo explícito. 

Agrega dos métodos de usuario a tu form.
1) GETCURSOR
2) CALCULA

Cuando tienes que mostrar la cuadrícula 
Thisform.GetCursor()

* METODO GETCURSOR
********************
* Crear Cursor CurConsumibles
* Luego
WITH thisform.grid1
    .Recordsource = ""
    .Columncount = 3
    .Recordsource = "CurConsumibles"
    .AllowAutoColumnFit = 0
    .AllowRowSizing = .F.
    .AllowHeaderSizing = .F.
    .FontSize = 10
    .RowHeight = 28
    WITH .Columns[1]
    .ControlSource = "CurConsumibles.consumible"
   .Header1.Caption = "Artículo"
    .Header1.Fontbold = .T.
   .Width = 150
    .Alignment = 0
    ENDWITH
    WITH .Columns[2]
    .ControlSource = "CurConsumibles.partnumber"
   .Header1.Caption = "Referencia"
    .Header1.Fontbold = .T.
   .Width = 100    
    .Alignment = 0
    ENDWITH
    WITH .Columns[3]
.ControlSource = "CurConsumibles.cantidad"
.Header1.Caption = "Unidades"
.Header1.Fontbold = .T.
.Width = 70
.Sparse = .F.
IF !VARTYPE(.MyComboBox)="O"  && evitar si ya se agregó
.AddObject("MyCombobox", "Combobox")
ENDIF
WITH .MycomboBox
.Fontsize = 10
.Style = 2 
.Visible = .T. 
.RowsourceType = 1    
.Rowsource = "0,1,2,3" 
.BorderStyle=0
.SpecialEffect=1
endwith
.CurrentControl="MyCombobox" 
    ENDWITH

ENDWITH
BINDEVENT(thisform.Grid1.Columns[3].mycomboBox,"InteractiveChange",thisform,"calcula",0)

********************
*METODO CALCULA
********************
SELECT curconsumibles
replace cantidad WITH tHISFORM.GRID1.cOLUMN3.MyCombobox.vALUE

* METODO DESTROY
UNBINDEVENTS(thisform.Grid1.Columns[3].mycomboBox)



Lo de TableUpdate() no juega para nada aquí, porque según entiendo, es el cursor el que no toma los valores del ComboBox, o al menos, no toma todos los valores.



El domingo, 27 de enero de 2013 17:31:09 UTC-3, José Luis escribió:

Miguel Canchas

unread,
Jan 29, 2013, 5:38:42 PM1/29/13
to publice...@googlegroups.com

Quizás solo debas hacer un setfocus a cualquier objeto y antes hacerle un refresh…..

 

MK

GeoSys Diseño de Software

unread,
Jan 29, 2013, 6:52:04 PM1/29/13
to publice...@googlegroups.com
José Luis, para refrescar un combo o lista se usa Requery, creo que con esto solucionas tu problema, yo lo he usado.

Vuelve a consultar el origen de la fila al que está asociado el control ListBox o ComboBox.

Control.Requery
Observaciones
Utilice el método Requery para asegurarse de que un control contiene los datos actualizados. El método Requery requiere la propiedad RowSource y actualiza la lista con los nuevos valores.

Vea también
RowSource (Propiedad)

Se aplica a: ComboBox | ListBox


Saludos

Anthony Contreras Peralta

Costa Rica.

José Luis

unread,
Jan 30, 2013, 6:52:37 AM1/30/13
to publice...@googlegroups.com





Gracias a todos por vuestra ayuda.

Se actualiza el valor en el cursor, lo que no entiendo es que cuando realizo un select del cursor curConsumibles a otro cursor, el valor del campo cantidad se queda en 0

Me estoy volviendo loco



El domingo, 27 de enero de 2013 21:31:09 UTC+1, José Luis escribió:

FidelJ

unread,
Jan 30, 2013, 7:28:07 AM1/30/13
to publice...@googlegroups.com
Prueba con 
SET FILTER TO CANTIDAD #0
GO TOP
THISFORM.GRID1.REFRESH

José Luis

unread,
Jan 30, 2013, 11:22:42 AM1/30/13
to publice...@googlegroups.com
Por fín lo he solucionado
En el boton Aceptar de mi formulario he puesto el siguiente código:

SELECT curconsumibles
=TABLEUPDATE(.T.)
SELECT partnumber, consumible, cantidad ;
    FROM curConsumibles WHERE VAL (curConsumibles.cantidad) > 0 ;
    INTO CURSOR curPedidos
DO FORM pedido2


El domingo, 27 de enero de 2013 21:31:09 UTC+1, José Luis escribió:
Reply all
Reply to author
Forward
0 new messages