Combobox multiples columnas

1,224 views
Skip to first unread message

Ruben Antunes

unread,
Oct 16, 2013, 9:07:15 PM10/16/13
to mundovis...@googlegroups.com

Buenas noches: pido una vez mas me ayuden a descifrar el problema. Tengo un combobox con 2 columnas dentro de un formulario.

Este formulario se llena con datos de una Tabla donde tiene un campo que sería la unión (id_union), al desplayar el combo me debería mostrar las uniones que hay en la tabla  “id_union+nombre_union”

De hecho eso lo hace. Pero cuando igualo los datos del formulario con los del registro de la tabla, NO MUESTRA el valor que esta grabado.

 

El COMBOBOX tiene las siguientes características:

INIT

This.Value=''

This.InputMask=REPLICATE('#',10)

This.Format='KL'

This.MaxLength=10

This.BoundColumn=2

This.ColumnCount = 2

This.ColumnWidths = "75,190"

This.RowSourceType= 6

This.RowSource = "DBFUniones.id_union,nombre"

This.Style= 2

This.FirstElement= 1

 

VALID:

Thisform.txtunion.Value=ALLTRIM(DBFUniones.nombre)

IF EMPTY(This.DisplayValue)

      Thisform.txtunion.Value=''

ENDIF

 

INTERACTIVECHANGE:

Thisform.txtunion.Value=ALLTRIM(DBFUniones.nombre)

IF EMPTY(This.DisplayValue)

      Thisform.txtunion.Value=''

ENDIF

 

 

CUANDO DEPOSITO LOS VALORES DEL REGISTRO DE LA TABLA EN EL FORMULARIO:

      Thisform.txtCompite.Value=curPK.Compite

      Thisform.txtInvitado.Value=curPK.Invitado

      Thisform.CuitInicial=curPK.cuit

      Thisform.txtid_club.Value=curPK.id_club

      Thisform.txtid_union.Value=curPK.id_union

      Thisform.txtid_union.DisplayValue=curPK.id_union

      __union=curPK.id_union

      Thisform.txtnombre.Value=curPK.nombre

      Thisform.txtAbreviatura.Value=curPK.abreviatura

      Thisform.txtcuit.Value=curPK.cuit

      Thisform.txtFecha.Value=Mittod(curPK.fecha)

      Thisform.txtTelefono.Value=curPK.telefono

      Thisform.txtFax.Value=curPK.fax

      Thisform.txtEmail.Value=curPK.email

      Thisform.txtEOficial.Value=curPK.eoficial

      Thisform.txtWeb.Value=curPK.web

      Thisform.txtcoorden_x.Value=curPK.coorden_x

      Thisform.txtcoorden_y.Value=curPK.coorden_y

 

      Thisform.txtCPostal.Value=curPK.cpostal

      Thisform.txtDomicilio.Value=curPK.domicilio

      Thisform.txtLocalidad.Value=curPK.localidad

      Thisform.txtProvincia.Value=curPK.provincia

      Thisform.txtFundacion.Value=curPK.fundacion

      Thisform.txtEmail.Valid

      Thisform.txtEoficial.Valid

      Thisform.txtFecha.Valid

      Thisform.txtBuscar.Value=''

 

*Puse esta banderita para ver si trae realmente el dato guardado

*y si lo hace

SET ALTERNATE TO PEDRO

SET ALTERNATE ON

? 'PEDRO:'

 

      _RecnoUnion=0

      IF USED('DBFUniones')

            *Fuerzo los datos para ver si me los muestra

            SELECT DBFUniones

            GO TOP

            LOCATE FOR TRANSFORM(DBFUniones.id_union,'@Z ##########')==TRANSFORM(__union,'@Z ##########')

            IF !FOUND()

                  ? 'A:',DBFUniones.id_union,__union

                  GO TOP

            ELSE

                  _RecnoUnion=RECNO('DBFUniones')

                  SELECT DBFUniones

                  GO _RecnoUnion

 

                  ? 'B:',DBFUniones.id_union,__union

                  Thisform.txtid_union.DisplayValue=DBFUniones.id_union

                  Thisform.txtid_union.Value=DBFUniones.id_union

                  Thisform.txtUnion.Value=DBFUniones.nombre

                  Thisform.Refresh

            ENDIF

      ENDIF

SET ALTERNATE TO

      Thisform.Refresh

 

 

Pero esto no anda…

Alguien tendrá algún ejemplo con combobox con multiples columnas para leerlo. Busco en google y no encuentro nada que me sirva.

Gracias

 

Adjunto ejemplos de pantalla:

Muestra la razón social de la union, no asi el código de la unión

 

Y cuando toma el foco el campo combobox muestra el registro anterior al que debería ser:

Es decir:

Código   Union

19            Unión de Rugby de San Juan

18            Unión de Rugby de San Luis

 

 

image001.png

Analyzer

unread,
Oct 16, 2013, 11:14:34 PM10/16/13
to mundovisualfoxpro
Ruben,

De tanto que explicaste me quedé pensando cuál era el error?..

==> Y cuando toma el foco el campo combobox muestra el registro anterior al que debería ser:

Ya probaste un requery?


Saludos!


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

image001.png

Ruben Antunes

unread,
Oct 16, 2013, 11:17:17 PM10/16/13
to mundovis...@googlegroups.com
No lo he probado. Lo coloco debajo de poner el valor de la tabla al combo?
Tienes algun ejemplo para poder observar?
Gracias...
Ruben Antunes
image001.png

Analyzer

unread,
Oct 16, 2013, 11:21:33 PM10/16/13
to mundovisualfoxpro
No tiene nada de complicado. El requery hace lo mismo que haría un refresh en un grid. La ayuda dice:

Requery (Método)

Vea también

RowSource (Propiedad)

Se aplica a: ComboBox | ListBox

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



Saludos!
image001.png

Analyzer

unread,
Oct 16, 2013, 11:25:37 PM10/16/13
to mundovisualfoxpro
Por ahi en los foros encontré este ejemplo del Requery:

select categoria,convenio,basico,valor_hora,valorxdia,nroconv,nrocat ;
 from conv_cat ;
 where convenio.nroconv=conv_cat.nroconv ;
 into cursor tmpcateg
thisform.container1.combo4.rowsource='tmpcateg.categoria,convenio,basico,valor_hora,valorxdia,nroconv,nrocat'
thisform.container1.combo4.rowsourcetype= 6
thisform.container1.combo4.firstelement=1
thisform.container1.combo4.Requery


Saludos!


El 16 de octubre de 2013 22:17, Ruben Antunes <rubena...@gmail.com> escribió:
image001.png

Fidel Charny

unread,
Oct 17, 2013, 8:08:10 AM10/17/13
to mundovis...@googlegroups.com

*Init del ComboBox

SELECT dbfUNiones

GO top

WITH this

.RowSourceType= 6

.RowSource='dbfUNiones.nombre,id_union'

.BoundColumn=2

.ControlSource='dbfUniones.id_union'

.Style= 2

.FontSize=8

.ColumnCount=2

.ColumnWidths='120,80'

.ColumnLines=.f.

.Requery

.Refresh

ENDWITH

* Interactive Change ComboBox
* Alternativa 1 (por propiedades del objeto)
LOCAL nItem
nItem=This.ListitemId
if !empty(nitem)
        lcNombre=This.Listitem(nitem,1)      && en lugar de lcNombre deberá ir Thisform.TxtCuadroNombre.Value=
        lcIdUnion=This.ListItem(nitem,2)      && 
        && alternativa
        lcUnion=This.listitem(nitem,2)+" - "+This.Listitem(nitem,1)   && o a la inversa
endif
* Alternativa 2 (por puntero de registro)
* Válida porque en RowSourcetype=6 el ComboBox mueve el puntero de registro en la tabla asociada.
lcNombre=alltrim(dbfUnion.nombre)
lcIdUnion=dbfUnion.Id_Union


* Evento Valid: Colocar en Default

Si cambias el puntero de la tabla dbfUnion (por otra busqueda), para que se refleje en el comboBox;
Thisform.Combo1.refresh

Puse como ControlSource el Id_union. Fijate que como vos lo pusiste, tendría que ser nombre. Pero supuestamente el Id debe ser más específico. Un problema puede surgir si el Id es numérico.

Alternativamente.
También puedes asociar los TextBox a la tabla dbfUNion. Supongamos que el Combobox queda como dije.
* Init del form
With thisform
       .TExt1.ControlSource='DbfUnion.Id_Union'
       .Text2.ControlSource='DbfUnion.Nombre'
endwith
En este supuesto, en el InteractiveChange del Combobox va, simplemente:
with thisform
       .text1.refresh
       .text2.refresh
endwith
Esto deja coordinado desde el arranque el combo Selector y los cuadros de edición.


Notas 

1) Entiendo que tal vez estás buscando un problema, pero este código no tiene sentido:

                 _RecnoUnion=RECNO('DBFUniones')

                  SELECT DBFUniones

                  GO _RecnoUnion

2) En el Init del ComboBox, cuando estás poniendo Style=2, no te compliques con definiciones como estas:

This.Value=''

This.InputMask=REPLICATE('#',10)

This.Format='KL'

This.MaxLength=10

No son necesarias. En todo caso, cuando todo funcione puedes estudiar si eso aporta algo.


3) Asignando valores

Thisform.txtid_union.DisplayValue=DBFUniones.id_union && suprime esto

Thisform.txtid_union.Value=DBFUniones.id_union

4) Thisform.refresh
Si estás asignando todos los cuadros por la propiedad Value, el Thisform.refresh no tiene utilidad.
En general, evita usar Thisform.Refresh. Si estás utilizando controles asociados por ControlSource, crea un método de refresco y coloca ahí solamente los objetos que tienen ControlSource. Te ahorrarás algunos problemas. Para el ejemplo, si me desplazo por la tabla dbfUnion, no pongo Thisform.Refresh, sino Thisform.Combo1.refresh

5) Utiliza las referencias a objetos agrupada
with thisform
       .Text1.Value=""
       .text2.Value=""
       ** etc
endwith
Escribes menos y tu formulario caminará más rápido. Sobre todo con objetos más complejos
with thisform.pageframe1.page1
        .Text20.value=""
        .text21.Value=""
endwith
Reply all
Reply to author
Forward
0 new messages