In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

TDBCombobox y MySQL

Foro público de Xailer en español
Responder
Avatar de Usuario
jasm
Mensajes: 447
Registrado: Mar Jul 08, 2008 8:12 pm

TDBCombobox y MySQL

Mensaje por jasm »

Hola,

Tengo un TDCombobox al que le he asignado un dataset de MySQL y solo me muestra la primera fila de la consulta.

¿Alguna pista?

Gracias.
Avatar de Usuario
jasm
Mensajes: 447
Registrado: Mar Jul 08, 2008 8:12 pm

Re: TDBCombobox y MySQL

Mensaje por jasm »

Después de todo el día buscando la forma de echarlo a andar, he terminado "retocando" la clase TComboBox de esta forma:

Código: Seleccionar todo

CLASS TComboBox from XComboBox
   
   DATA oDataSet

   METHOD isEmpty() INLINE empty( ::aItems )
   METHOD setValue( value )
   METHOD setItem( dataSearch, item )
   METHOD getItem()

END CLASS

METHOD setValue( value ) CLASS TComboBox

   ::oDataSet:goTop()
   while !::oDataSet:eof()
      ::AddItem( ::oDataSet:FieldGetByName(value) )
      ::oDataSet:skip()
   end
   ::nIndex := 1

RETURN nil

METHOD setItem( dataSearch, item ) CLASS TComboBox

   local n := 1

   ::nIndex := 1
   ::oDataSet:goTop()
   while !::oDataSet:eof()
      if ::oDataSet:FieldGetByName(dataSearch) == item
         ::nIndex := n
      end if
      n++
      ::oDataSet:skip()
   end

RETURN nil

METHOD getItem() CLASS TComboBox

   ::oDataSet:goto( ::nIndex )
 
RETURN ::oDataSet
 


INFORMACION de datas y métodos:

oDataSet -> Data que contiene el dataset que se desea controlar.
isEmpty() -> Método que retorna .t. si el combobox está vacío.
setvalue( value ) -> Método que indica que FIELD del DataSource se va a usar para mostrar en el comboBox. Asigna el FIELD y carga el comboBox.
setItem( dataSearch, item ) -> Método que sirve para colocar el combobox en la posicion indicada en dataSearch -> FIELD por el que se buscará el dato y item -> Valor del dato.
getItem() -> Método para seleccionar el Dataset actual. Devuelve el DataSet de la fila seleccionada en el comboBox.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9250
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TDBCombobox y MySQL

Mensaje por ignacio »

Buenos días,

Me temo que no está pensado para ser usado de esa forma. La lista del DBCombo no se alimenta con un recordset, hay que alimentarla manualmente. La conexión con su dataset se refiere a su valor actual y no los items de su lista.

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
jasm
Mensajes: 447
Registrado: Mar Jul 08, 2008 8:12 pm

Re: TDBCombobox y MySQL

Mensaje por jasm »

Hola Ignacio,

Gracias por la aclaración.

El tema es que en el 95% de los casos necesitamos el comportamiento que he descrito.

Saludos.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9250
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TDBCombobox y MySQL

Mensaje por ignacio »

Hola,

No voy a discutir el hecho de que lo necesitéis de esa forma, pero en mi opinión no es coherente con el resto de los datacontrols. En cualquier caso todo se resuelve con muy pocas líneas de código:

Código: Seleccionar todo

aItems := oDataSource:QueryArray( "..." )
Aeval( aItems, {|v,e| aItems[e] := v[1] } )
oDbCombo:aItems := aItems
Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
jasm
Mensajes: 447
Registrado: Mar Jul 08, 2008 8:12 pm

Re: TDBCombobox y MySQL

Mensaje por jasm »

Ignacio,

Es una solución para cargar el comboBox, si; aunque le falta:

1.- Acceder directamente al elemento seleccionado (en este caso on DataSet) de forma directa y que puedas tener a mano todos los campos del DataSet.
2.- No hay un método de clase directo para saber si el comboBox está vacío, tienes que tirar del aItems y de nIndex.
3.- No es POO.

Saludos.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9250
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: TDBCombobox y MySQL

Mensaje por ignacio »

José Alfonso,

Para ti la perra gorda ;-)

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder