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
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

TDBComboBox y MySQL

Mensaje por ddupre »

Estimados.
Vengo peleando desde hace 2 dí­as con un TDBComboBox que quiero rellenar con datos de una tabla MySQL y
no logro hacerlo con el uso de queryarray, que según vi en la ayuda de Xailer viene perfecto para esto.
En el foro vi estos mensajes que copio aquí­ mas abajo donde se muestran algunas formas de hacerlo.
Carlos Ortis sugiere hacerlo con SaveToArray pero cuando pongo eso en mi código, aparece un error diciéndome esto:
TSQLQUERY:SAVETOARRAY(1485)
BASE/1004 Message or field name not found: TSQLQuery:SAVETOARRAY
Evidentemente tengo un entrevero de conceptos enormes, y no encuentro un ejemplo completo que pueda estudiar para ver como usar queryarray.
Alguien tendrí­a la amabilidad de indicarme donde hay "algo" para aprender sobre esto?
Desde ya les quedo muy agradecido.
Saludos
Daniel
AQUI LO QUE ENCONTRE.
y por que no com un query en lugar de un execute, el query() te retorna
directamente una tabla temporal que se lo podes asociar creando un dataset
en memoria y luego savetoarray()
oDBCombo:aItems := ::oDSTipProd:SaveToArray( { "CNOMTIPO" } )
oDBCombo:aItemsBound := ::oDSTipProd:SaveToArray( { "(str(NIDTIPO))" } )
Atte. Carlos Ortiz.
"Martin Del Angel"<mdangel@dymsasistemas.com> escribió en el mensaje
news:4999e16b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Juan Castañeda wrote:
>> Pedro te respondo por aca porque no tengo acceso al PRO.
>> Yo lo hago asi. Fijate si lo podes mejorar y me contas.
>>
>> METHOD DBComboBoxCondicionDeIvaCreate( oSender ) CLASS TFormABMclientes
>> Local aData, nI
>> Local aTempDeta := {}
>> Local aTempCodi := {}
>>
>> AppData:oBase:Execute( "select detalle,codigo from codigosdeiva",,
>> @aData )
>> For nI:= 1 to Len( aData )
>> Aadd( aTempDeta, aData[nI][1] )
>> Aadd( aTempCodi, aData[nI][2] )
>> Next
>> ::oDBComboBoxCondiciondeIva:aItems := aTempDeta
>> ::oDBComboBoxCondiciondeIva:aItemsBound := aTempCodi
>>
>>
>> "PEDRO DE LEON RODAS"<7773613810@prodigy.net.mx> escribió en el mensaje
>> news:[email=4997b870@svctag-j7w3v3j....]4997b870@svctag-j7w3v3j....[/email]
>>> Estimados amigos, saludos.
>>> Como puedo hacer que los datos de un campo de una tabla se carguen en un
>>> TdbCombox.
>>>
>>> Esto se puede hacer con Dbfs de la siguiente manera
>>>
>>> METHOD usuarioCreate( oSender ) CLASS entrada
>>> oSender:aItems := ::dbf:SaveToArray( "nombre" )
>>> RETURN Nil
>>>
>>> Pero esto no funciona con tablas de Mysql.
>>>
>>> He visto un ejemplo que tiene xailer con sqlite parecido a esto.
>>>
>>> IF ::oDB:Execute( "select nombre from tipo_prestamo order by nombre",,
>>> @aData )
>>> oSender:aItems := aData[1 ]
>>> ENDIF
>>>
>>> Pero aqui solo me da el valor de un solo registro.
>>>
>>> De antemano mil gracias.
>>>
>>>
>>>
>>
> Buen Dia Pedro
>
> Te pongo un pedazo de codigo de como lo hago cuando leeo los usuarios de
> una tabla de MySql
>
>
> METHOD LlenaCombo() CLASS TEntrada
> WITH OBJECT ::oComboUsuarios //<=== TComboBox
> IF LEN (:aITEMS) >0
> RETURN NIL
> ELSE
> AppData:USUARIOS:GoTop() //<=== Apunta a SQLQuery de Usuarios
> DO WHILE !(AppData:USUARIOS:EOF())
> //Extraigo nombre de Usuario y lo pongo en el Array aItems con el
> // metodo AddItem()
> :ADDITEM(AppData:USUARIOS:FIELDGETBYNAME('USUARIO'))
> AppData:USUARIOS:SKIP()
> ENDDO
> :nIndex:=1
> :REFRESH()
> ENDIF
> END
> RETURN NIL
>
>
> Me funciona perfecto y rapido
>
> hay mas maneras de hacerlo , pero lo hago a la antiguita
>
> Saludos...
>
>
Martin Del Angel
Mensajes: 360
Registrado: Mié Dic 03, 2008 5:05 am

TDBComboBox y MySQL

Mensaje por Martin Del Angel »

On 2/14/2013 3:04 PM, Daniel Du Pré wrote:
> Estimados.
> Vengo peleando desde hace 2 dí­as con un TDBComboBox que quiero rellenar
> con datos de una tabla MySQL y
> no logro hacerlo con el uso de queryarray, que según vi en la ayuda de
> Xailer viene perfecto para esto.
>
> En el foro vi estos mensajes que copio aquí­ mas abajo donde se muestran
> algunas formas de hacerlo.
> Carlos Ortis sugiere hacerlo con SaveToArray pero cuando pongo eso en mi
> código, aparece un error diciéndome esto:
>
> TSQLQUERY:SAVETOARRAY(1485)
> BASE/1004 Message or field name not found: TSQLQuery:SAVETOARRAY
>
> Evidentemente tengo un entrevero de conceptos enormes, y no encuentro un
> ejemplo completo que pueda estudiar para ver como usar queryarray.
>
> Alguien tendrí­a la amabilidad de indicarme donde hay "algo" para
> aprender sobre esto?
>
> Desde ya les quedo muy agradecido.
>
> Saludos
> Daniel
>
>
>
> AQUI LO QUE ENCONTRE.
>
> y por que no com un query en lugar de un execute, el query() te retorna
> directamente una tabla temporal que se lo podes asociar creando un dataset
> en memoria y luego savetoarray()
>
> oDBCombo:aItems := ::oDSTipProd:SaveToArray( { "CNOMTIPO" } )
> oDBCombo:aItemsBound := ::oDSTipProd:SaveToArray( { "(str(NIDTIPO))" } )
>
> Atte. Carlos Ortiz.
>
> "Martin Del Angel"<mdangel@dymsasistemas.com> escribió en el mensaje
> news:4999e16b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>
>> Juan Castañeda wrote:
>>> Pedro te respondo por aca porque no tengo acceso al PRO.
>>> Yo lo hago asi. Fijate si lo podes mejorar y me contas.
>>>
>>> METHOD DBComboBoxCondicionDeIvaCreate( oSender ) CLASS TFormABMclientes
>>> Local aData, nI
>>> Local aTempDeta := {}
>>> Local aTempCodi := {}
>>>
>>> AppData:oBase:Execute( "select detalle,codigo from codigosdeiva",,
>>> @aData )
>>> For nI:= 1 to Len( aData )
>>> Aadd( aTempDeta, aData[nI][1] )
>>> Aadd( aTempCodi, aData[nI][2] )
>>> Next
>>> ::oDBComboBoxCondiciondeIva:aItems := aTempDeta
>>> ::oDBComboBoxCondiciondeIva:aItemsBound := aTempCodi
>>>
>>>
>>> "PEDRO DE LEON RODAS"<7773613810@prodigy.net.mx> escribió en el mensaje
>>> news:[email=4997b870@svctag-j7w3v3j....]4997b870@svctag-j7w3v3j....[/email]
>>>> Estimados amigos, saludos.
>>>> Como puedo hacer que los datos de un campo de una tabla se carguen
>>>> en un
>>>> TdbCombox.
>>>>
>>>> Esto se puede hacer con Dbfs de la siguiente manera
>>>>
>>>> METHOD usuarioCreate( oSender ) CLASS entrada
>>>> oSender:aItems := ::dbf:SaveToArray( "nombre" )
>>>> RETURN Nil
>>>>
>>>> Pero esto no funciona con tablas de Mysql.
>>>>
>>>> He visto un ejemplo que tiene xailer con sqlite parecido a esto.
>>>>
>>>> IF ::oDB:Execute( "select nombre from tipo_prestamo order by
>>>> nombre",,
>>>> @aData )
>>>> oSender:aItems := aData[1 ]
>>>> ENDIF
>>>>
>>>> Pero aqui solo me da el valor de un solo registro.
>>>>
>>>> De antemano mil gracias.
>>>>
>>>>
>>>>
>>>
>> Buen Dia Pedro
>>
>> Te pongo un pedazo de codigo de como lo hago cuando leeo los usuarios de
>> una tabla de MySql
>>
>>
>> METHOD LlenaCombo() CLASS TEntrada
>> WITH OBJECT ::oComboUsuarios //<=== TComboBox
>> IF LEN (:aITEMS) >0
>> RETURN NIL
>> ELSE
>> AppData:USUARIOS:GoTop() //<=== Apunta a SQLQuery de Usuarios
>> DO WHILE !(AppData:USUARIOS:EOF())
>> //Extraigo nombre de Usuario y lo pongo en el Array aItems con el
>> // metodo AddItem()
>> :ADDITEM(AppData:USUARIOS:FIELDGETBYNAME('USUARIO'))
>> AppData:USUARIOS:SKIP()
>> ENDDO
>> :nIndex:=1
>> :REFRESH()
>> ENDIF
>> END
>> RETURN NIL
>>
>>
>> Me funciona perfecto y rapido
>>
>> hay mas maneras de hacerlo , pero lo hago a la antiguita
>>
>> Saludos...
>>
>>
Hola Daniel:
Usando QueryArray()
Fracción de un nuestros programas:
METHOD LlenaCombo() CLASS TEntrada
LOCAL aData:={},aDatos:={}
aData:=Appdata:cnn:QueryArray("SELECT USUARIO FROM tblusuarios ORDER BY
USUARIO")
IF LEN(aData)==0
MSGSTOP("NO EXISTEN USUARIOS PARA EL SISTEMA, FAVOR DE DARLOS DE ALTA
EN EL SISTEMA.")
::CLOSE()
ENDIF
AEval( aData, {|X,N| AADD(aDatos,X[1]) } )
::ocboUsuarios:aItems:=aDatos
::ocboUsuarios:Refresh()
RETURN NIL
Saludos....
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

TDBComboBox y MySQL

Mensaje por ddupre »

Hola Martí­n,
Mil gracias por la ayuda.
Saludos
El 14/02/2013 20:16, Martin Del Angel escribió:
> On 2/14/2013 3:04 PM, Daniel Du Pré wrote:
>> Estimados.
>> Vengo peleando desde hace 2 dí­as con un TDBComboBox que quiero rellenar
>> con datos de una tabla MySQL y
>> no logro hacerlo con el uso de queryarray, que según vi en la ayuda de
>> Xailer viene perfecto para esto.
>>
>> En el foro vi estos mensajes que copio aquí­ mas abajo donde se muestran
>> algunas formas de hacerlo.
>> Carlos Ortis sugiere hacerlo con SaveToArray pero cuando pongo eso en mi
>> código, aparece un error diciéndome esto:
>>
>> TSQLQUERY:SAVETOARRAY(1485)
>> BASE/1004 Message or field name not found: TSQLQuery:SAVETOARRAY
>>
>> Evidentemente tengo un entrevero de conceptos enormes, y no encuentro un
>> ejemplo completo que pueda estudiar para ver como usar queryarray.
>>
>> Alguien tendrí­a la amabilidad de indicarme donde hay "algo" para
>> aprender sobre esto?
>>
>> Desde ya les quedo muy agradecido.
>>
>> Saludos
>> Daniel
>>
>>
>>
>> AQUI LO QUE ENCONTRE.
>>
>> y por que no com un query en lugar de un execute, el query() te retorna
>> directamente una tabla temporal que se lo podes asociar creando un
>> dataset
>> en memoria y luego savetoarray()
>>
>> oDBCombo:aItems := ::oDSTipProd:SaveToArray( { "CNOMTIPO" } )
>> oDBCombo:aItemsBound := ::oDSTipProd:SaveToArray( { "(str(NIDTIPO))"
>> } )
>>
>> Atte. Carlos Ortiz.
>>
>> "Martin Del Angel"<mdangel@dymsasistemas.com> escribió en el mensaje
>> news:4999e16b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>>
>>> Juan Castañeda wrote:
>>>> Pedro te respondo por aca porque no tengo acceso al PRO.
>>>> Yo lo hago asi. Fijate si lo podes mejorar y me contas.
>>>>
>>>> METHOD DBComboBoxCondicionDeIvaCreate( oSender ) CLASS
>>>> TFormABMclientes
>>>> Local aData, nI
>>>> Local aTempDeta := {}
>>>> Local aTempCodi := {}
>>>>
>>>> AppData:oBase:Execute( "select detalle,codigo from codigosdeiva",,
>>>> @aData )
>>>> For nI:= 1 to Len( aData )
>>>> Aadd( aTempDeta, aData[nI][1] )
>>>> Aadd( aTempCodi, aData[nI][2] )
>>>> Next
>>>> ::oDBComboBoxCondiciondeIva:aItems := aTempDeta
>>>> ::oDBComboBoxCondiciondeIva:aItemsBound := aTempCodi
>>>>
>>>>
>>>> "PEDRO DE LEON RODAS"<7773613810@prodigy.net.mx> escribió en el
>>>> mensaje
>>>> news:[email=4997b870@svctag-j7w3v3j....]4997b870@svctag-j7w3v3j....[/email]
>>>>> Estimados amigos, saludos.
>>>>> Como puedo hacer que los datos de un campo de una tabla se carguen
>>>>> en un
>>>>> TdbCombox.
>>>>>
>>>>> Esto se puede hacer con Dbfs de la siguiente manera
>>>>>
>>>>> METHOD usuarioCreate( oSender ) CLASS entrada
>>>>> oSender:aItems := ::dbf:SaveToArray( "nombre" )
>>>>> RETURN Nil
>>>>>
>>>>> Pero esto no funciona con tablas de Mysql.
>>>>>
>>>>> He visto un ejemplo que tiene xailer con sqlite parecido a esto.
>>>>>
>>>>> IF ::oDB:Execute( "select nombre from tipo_prestamo order by
>>>>> nombre",,
>>>>> @aData )
>>>>> oSender:aItems := aData[1 ]
>>>>> ENDIF
>>>>>
>>>>> Pero aqui solo me da el valor de un solo registro.
>>>>>
>>>>> De antemano mil gracias.
>>>>>
>>>>>
>>>>>
>>>>
>>> Buen Dia Pedro
>>>
>>> Te pongo un pedazo de codigo de como lo hago cuando leeo los
>>> usuarios de
>>> una tabla de MySql
>>>
>>>
>>> METHOD LlenaCombo() CLASS TEntrada
>>> WITH OBJECT ::oComboUsuarios //<=== TComboBox
>>> IF LEN (:aITEMS) >0
>>> RETURN NIL
>>> ELSE
>>> AppData:USUARIOS:GoTop() //<=== Apunta a SQLQuery de Usuarios
>>> DO WHILE !(AppData:USUARIOS:EOF())
>>> //Extraigo nombre de Usuario y lo pongo en el Array aItems
>>> con el
>>> // metodo AddItem()
>>> :ADDITEM(AppData:USUARIOS:FIELDGETBYNAME('USUARIO'))
>>> AppData:USUARIOS:SKIP()
>>> ENDDO
>>> :nIndex:=1
>>> :REFRESH()
>>> ENDIF
>>> END
>>> RETURN NIL
>>>
>>>
>>> Me funciona perfecto y rapido
>>>
>>> hay mas maneras de hacerlo , pero lo hago a la antiguita
>>>
>>> Saludos...
>>>
>>>
>
> Hola Daniel:
>
> Usando QueryArray()
>
>
> Fracción de un nuestros programas:
>
> METHOD LlenaCombo() CLASS TEntrada
> LOCAL aData:={},aDatos:={}
>
> aData:=Appdata:cnn:QueryArray("SELECT USUARIO FROM tblusuarios ORDER
> BY USUARIO")
>
> IF LEN(aData)==0
> MSGSTOP("NO EXISTEN USUARIOS PARA EL SISTEMA, FAVOR DE DARLOS DE
> ALTA EN EL SISTEMA.")
> ::CLOSE()
> ENDIF
>
> AEval( aData, {|X,N| AADD(aDatos,X[1]) } )
>
>
> ::ocboUsuarios:aItems:=aDatos
>
> ::ocboUsuarios:Refresh()
>
> RETURN NIL
>
> Saludos....
>
>
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

TDBComboBox y MySQL

Mensaje por ddupre »

Martin,
Una consulta mas, el método LlenaCombo() ¿en que evento lo invocas,
alguno del formulario o uno propio del DBComboBox?
Gracias
Daniel
El 14/02/2013 20:16, Martin Del Angel escribió:
> On 2/14/2013 3:04 PM, Daniel Du Pré wrote:
>> Estimados.
>> Vengo peleando desde hace 2 dí­as con un TDBComboBox que quiero rellenar
>> con datos de una tabla MySQL y
>> no logro hacerlo con el uso de queryarray, que según vi en la ayuda de
>> Xailer viene perfecto para esto.
>>
>> En el foro vi estos mensajes que copio aquí­ mas abajo donde se muestran
>> algunas formas de hacerlo.
>> Carlos Ortis sugiere hacerlo con SaveToArray pero cuando pongo eso en mi
>> código, aparece un error diciéndome esto:
>>
>> TSQLQUERY:SAVETOARRAY(1485)
>> BASE/1004 Message or field name not found: TSQLQuery:SAVETOARRAY
>>
>> Evidentemente tengo un entrevero de conceptos enormes, y no encuentro un
>> ejemplo completo que pueda estudiar para ver como usar queryarray.
>>
>> Alguien tendrí­a la amabilidad de indicarme donde hay "algo" para
>> aprender sobre esto?
>>
>> Desde ya les quedo muy agradecido.
>>
>> Saludos
>> Daniel
>>
>>
>>
>> AQUI LO QUE ENCONTRE.
>>
>> y por que no com un query en lugar de un execute, el query() te retorna
>> directamente una tabla temporal que se lo podes asociar creando un
>> dataset
>> en memoria y luego savetoarray()
>>
>> oDBCombo:aItems := ::oDSTipProd:SaveToArray( { "CNOMTIPO" } )
>> oDBCombo:aItemsBound := ::oDSTipProd:SaveToArray( { "(str(NIDTIPO))"
>> } )
>>
>> Atte. Carlos Ortiz.
>>
>> "Martin Del Angel"<mdangel@dymsasistemas.com> escribió en el mensaje
>> news:4999e16b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>>
>>> Juan Castañeda wrote:
>>>> Pedro te respondo por aca porque no tengo acceso al PRO.
>>>> Yo lo hago asi. Fijate si lo podes mejorar y me contas.
>>>>
>>>> METHOD DBComboBoxCondicionDeIvaCreate( oSender ) CLASS
>>>> TFormABMclientes
>>>> Local aData, nI
>>>> Local aTempDeta := {}
>>>> Local aTempCodi := {}
>>>>
>>>> AppData:oBase:Execute( "select detalle,codigo from codigosdeiva",,
>>>> @aData )
>>>> For nI:= 1 to Len( aData )
>>>> Aadd( aTempDeta, aData[nI][1] )
>>>> Aadd( aTempCodi, aData[nI][2] )
>>>> Next
>>>> ::oDBComboBoxCondiciondeIva:aItems := aTempDeta
>>>> ::oDBComboBoxCondiciondeIva:aItemsBound := aTempCodi
>>>>
>>>>
>>>> "PEDRO DE LEON RODAS"<7773613810@prodigy.net.mx> escribió en el
>>>> mensaje
>>>> news:[email=4997b870@svctag-j7w3v3j....]4997b870@svctag-j7w3v3j....[/email]
>>>>> Estimados amigos, saludos.
>>>>> Como puedo hacer que los datos de un campo de una tabla se carguen
>>>>> en un
>>>>> TdbCombox.
>>>>>
>>>>> Esto se puede hacer con Dbfs de la siguiente manera
>>>>>
>>>>> METHOD usuarioCreate( oSender ) CLASS entrada
>>>>> oSender:aItems := ::dbf:SaveToArray( "nombre" )
>>>>> RETURN Nil
>>>>>
>>>>> Pero esto no funciona con tablas de Mysql.
>>>>>
>>>>> He visto un ejemplo que tiene xailer con sqlite parecido a esto.
>>>>>
>>>>> IF ::oDB:Execute( "select nombre from tipo_prestamo order by
>>>>> nombre",,
>>>>> @aData )
>>>>> oSender:aItems := aData[1 ]
>>>>> ENDIF
>>>>>
>>>>> Pero aqui solo me da el valor de un solo registro.
>>>>>
>>>>> De antemano mil gracias.
>>>>>
>>>>>
>>>>>
>>>>
>>> Buen Dia Pedro
>>>
>>> Te pongo un pedazo de codigo de como lo hago cuando leeo los
>>> usuarios de
>>> una tabla de MySql
>>>
>>>
>>> METHOD LlenaCombo() CLASS TEntrada
>>> WITH OBJECT ::oComboUsuarios //<=== TComboBox
>>> IF LEN (:aITEMS) >0
>>> RETURN NIL
>>> ELSE
>>> AppData:USUARIOS:GoTop() //<=== Apunta a SQLQuery de Usuarios
>>> DO WHILE !(AppData:USUARIOS:EOF())
>>> //Extraigo nombre de Usuario y lo pongo en el Array aItems
>>> con el
>>> // metodo AddItem()
>>> :ADDITEM(AppData:USUARIOS:FIELDGETBYNAME('USUARIO'))
>>> AppData:USUARIOS:SKIP()
>>> ENDDO
>>> :nIndex:=1
>>> :REFRESH()
>>> ENDIF
>>> END
>>> RETURN NIL
>>>
>>>
>>> Me funciona perfecto y rapido
>>>
>>> hay mas maneras de hacerlo , pero lo hago a la antiguita
>>>
>>> Saludos...
>>>
>>>
>
> Hola Daniel:
>
> Usando QueryArray()
>
>
> Fracción de un nuestros programas:
>
> METHOD LlenaCombo() CLASS TEntrada
> LOCAL aData:={},aDatos:={}
>
> aData:=Appdata:cnn:QueryArray("SELECT USUARIO FROM tblusuarios ORDER
> BY USUARIO")
>
> IF LEN(aData)==0
> MSGSTOP("NO EXISTEN USUARIOS PARA EL SISTEMA, FAVOR DE DARLOS DE
> ALTA EN EL SISTEMA.")
> ::CLOSE()
> ENDIF
>
> AEval( aData, {|X,N| AADD(aDatos,X[1]) } )
>
>
> ::ocboUsuarios:aItems:=aDatos
>
> ::ocboUsuarios:Refresh()
>
> RETURN NIL
>
> Saludos....
>
>
Avatar de Usuario
Carlos Ortiz
Mensajes: 872
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

TDBComboBox y MySQL

Mensaje por Carlos Ortiz »

Estimado;
puntualmente he simplificado un poco el armado de los combos por medio
de una clase TEliTabX() que recibe algunos parámetros y te setea un
DbComboBox, use este tipo de combo para poder hacer uso de la matriz
aItemsBound (en ella guardo los ID de los registros de la lista aItems)
serí­a algo mas o menos así­:
::oMemTipoIva:GetStructFrom(
{{"idtipoiva","N",10,0},{"descripcion","C",100,0}} )
Elitab( Self, "", ::oMemTipoIva, ::oDBComboTipoIva,"select descripcion,
idtipoiva from tipoiva order by descripcion" )
::oMemTipoIva // Le paso un Mem siempre con la misma estructura ID y
DESCRIPCION, adentro del elitab() le seteo como oDataSet ese Mem.
oDBComboTipoIva // Es el nombre del control DbCombo creado en el formulario.
Lo que sigue es la sentencia que va a cargar en el mem y listo.
Espero te sirva, seguro se puede mejorar ya que esto tiene muchos años,
viendola de nuevo da ganas de hacerlo de nuevo al Elitab().
#include "Xailer.ch"
CLASS TElitabX FROM TControl
DATA cValor INIT ""
DATA FoDbf INIT ""
DATA FoDataField INIT ""
DATA oDBCombo INIT NIL
DATA cSelect INIT "" // Consulta a ejecutar
DATA aItems INIT 1
DATA aItemsBound INIT 2
DATA cFiltro INIT "" // Filtro adicional para
agregar al Where
METHOD SetElitabX( oSender )
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD SetElitabX( oSender ) CLASS TElitabX
local aData
::FoDbf:=TMemDataSet():Create( Self )
IF !empty(alltrim(::cSelect))
// Puede ser que levante los elementos y los ID de una tabla o no
aData:=AppData:oOdbcDS:QueryArray( ::cSelect )
::oDBCombo:aItems := ArrayCol( aData, 1 )
::oDBCombo:aItemsBound := ArrayCol( aData, 2 )
ENDIF
::oDBCombo:oDataField := ::FoDataField
::oDBCombo:oDataSet := ::FoDbf
::FoDbf:Edit()
::FoDbf:Open( {::oDBCombo:aItems} )
RETURN Nil
//---------------------------------------------------------- --------------------
//---------------------------------------------------------- --------------------
FUNCTION Elitab( oForm, cFiltro, oDataSet, oDBCombo, cSelect,
valorxdefecto )
local oObjeto, ret
cFiltro:=if( pcount()<2, "", cFiltro )
WITH OBJECT oObjeto := TElitabX():New( oForm )
:oDBCombo := oDBCombo
:FoDbf := oDataSet
:aItems := 1
:aItemsBound := 2
:cText := ""
:cFiltro := cFiltro
:cSelect := cSelect
END WITH
oObjeto:SetElitabX(oForm, oDBCombo)
IF valorxdefecto # NIL
// Si hay un valor por defecto, lo busco en la lista
oDBCombo:nindex := aScan( oDBCombo:aitemsbound, valorxdefecto)
ELSE
// Sino lo posiciono en el primero
IF len(oObjeto:oDBCombo:aItems) > 0
oDBCombo:nindex := 1
ENDIF
ENDIF
RETURN .t.
Saludos.
Carlos Ortiz.
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

TDBComboBox y MySQL

Mensaje por ddupre »

Carlos,
Muchas gracias por la ayuda, la voy a probar.
Saludos
Daniel
El 15/02/2013 21:15, Carlos Ortiz escribió:
> Estimado;
> puntualmente he simplificado un poco el armado de los combos por medio
> de una clase TEliTabX() que recibe algunos parámetros y te setea un
> DbComboBox, use este tipo de combo para poder hacer uso de la matriz
> aItemsBound (en ella guardo los ID de los registros de la lista aItems)
> serí­a algo mas o menos así­:
>
> ::oMemTipoIva:GetStructFrom(
> {{"idtipoiva","N",10,0},{"descripcion","C",100,0}} )
> Elitab( Self, "", ::oMemTipoIva, ::oDBComboTipoIva,"select
> descripcion, idtipoiva from tipoiva order by descripcion" )
>
> ::oMemTipoIva // Le paso un Mem siempre con la misma estructura ID y
> DESCRIPCION, adentro del elitab() le seteo como oDataSet ese Mem.
> oDBComboTipoIva // Es el nombre del control DbCombo creado en el
> formulario.
> Lo que sigue es la sentencia que va a cargar en el mem y listo.
>
> Espero te sirva, seguro se puede mejorar ya que esto tiene muchos
> años, viendola de nuevo da ganas de hacerlo de nuevo al Elitab().
>
> #include "Xailer.ch"
>
> CLASS TElitabX FROM TControl
>
> DATA cValor INIT ""
> DATA FoDbf INIT ""
> DATA FoDataField INIT ""
> DATA oDBCombo INIT NIL
> DATA cSelect INIT "" // Consulta a ejecutar
> DATA aItems INIT 1
> DATA aItemsBound INIT 2
> DATA cFiltro INIT "" // Filtro adicional para
> agregar al Where
>
> METHOD SetElitabX( oSender )
>
> ENDCLASS
>
> //---------------------------------------------------------- --------------------
>
>
> METHOD SetElitabX( oSender ) CLASS TElitabX
>
> local aData
> ::FoDbf:=TMemDataSet():Create( Self )
> IF !empty(alltrim(::cSelect))
> // Puede ser que levante los elementos y los ID de una tabla o no
> aData:=AppData:oOdbcDS:QueryArray( ::cSelect )
> ::oDBCombo:aItems := ArrayCol( aData, 1 )
> ::oDBCombo:aItemsBound := ArrayCol( aData, 2 )
> ENDIF
> ::oDBCombo:oDataField := ::FoDataField
> ::oDBCombo:oDataSet := ::FoDbf
> ::FoDbf:Edit()
> ::FoDbf:Open( {::oDBCombo:aItems} )
>
> RETURN Nil
>
> //---------------------------------------------------------- --------------------
>
>
> //---------------------------------------------------------- --------------------
>
> FUNCTION Elitab( oForm, cFiltro, oDataSet, oDBCombo, cSelect,
> valorxdefecto )
> local oObjeto, ret
> cFiltro:=if( pcount()<2, "", cFiltro )
> WITH OBJECT oObjeto := TElitabX():New( oForm )
> :oDBCombo := oDBCombo
> :FoDbf := oDataSet
> :aItems := 1
> :aItemsBound := 2
> :cText := ""
> :cFiltro := cFiltro
> :cSelect := cSelect
> END WITH
> oObjeto:SetElitabX(oForm, oDBCombo)
> IF valorxdefecto # NIL
> // Si hay un valor por defecto, lo busco en la lista
> oDBCombo:nindex := aScan( oDBCombo:aitemsbound, valorxdefecto)
> ELSE
> // Sino lo posiciono en el primero
> IF len(oObjeto:oDBCombo:aItems) > 0
> oDBCombo:nindex := 1
> ENDIF
> ENDIF
> RETURN .t.
>
>
>
>
>
> Saludos.
> Carlos Ortiz.
Martin Del Angel
Mensajes: 360
Registrado: Mié Dic 03, 2008 5:05 am

TDBComboBox y MySQL

Mensaje por Martin Del Angel »

On 2/15/2013 4:05 PM, Daniel Du Pré wrote:
> Martin,
> Una consulta mas, el método LlenaCombo() ¿en que evento lo invocas,
> alguno del formulario o uno propio del DBComboBox?
>
> Gracias
> Daniel
>
> El 14/02/2013 20:16, Martin Del Angel escribió:
>> On 2/14/2013 3:04 PM, Daniel Du Pré wrote:
>>> Estimados.
>>> Vengo peleando desde hace 2 dí­as con un TDBComboBox que quiero rellenar
>>> con datos de una tabla MySQL y
>>> no logro hacerlo con el uso de queryarray, que según vi en la ayuda de
>>> Xailer viene perfecto para esto.
>>>
>>> En el foro vi estos mensajes que copio aquí­ mas abajo donde se muestran
>>> algunas formas de hacerlo.
>>> Carlos Ortis sugiere hacerlo con SaveToArray pero cuando pongo eso en mi
>>> código, aparece un error diciéndome esto:
>>>
>>> TSQLQUERY:SAVETOARRAY(1485)
>>> BASE/1004 Message or field name not found: TSQLQuery:SAVETOARRAY
>>>
>>> Evidentemente tengo un entrevero de conceptos enormes, y no encuentro un
>>> ejemplo completo que pueda estudiar para ver como usar queryarray.
>>>
>>> Alguien tendrí­a la amabilidad de indicarme donde hay "algo" para
>>> aprender sobre esto?
>>>
>>> Desde ya les quedo muy agradecido.
>>>
>>> Saludos
>>> Daniel
>>>
>>>
>>>
>>> AQUI LO QUE ENCONTRE.
>>>
>>> y por que no com un query en lugar de un execute, el query() te retorna
>>> directamente una tabla temporal que se lo podes asociar creando un
>>> dataset
>>> en memoria y luego savetoarray()
>>>
>>> oDBCombo:aItems := ::oDSTipProd:SaveToArray( { "CNOMTIPO" } )
>>> oDBCombo:aItemsBound := ::oDSTipProd:SaveToArray( { "(str(NIDTIPO))"
>>> } )
>>>
>>> Atte. Carlos Ortiz.
>>>
>>> "Martin Del Angel"<mdangel@dymsasistemas.com> escribió en el mensaje
>>> news:4999e16b$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
>>>
>>>> Juan Castañeda wrote:
>>>>> Pedro te respondo por aca porque no tengo acceso al PRO.
>>>>> Yo lo hago asi. Fijate si lo podes mejorar y me contas.
>>>>>
>>>>> METHOD DBComboBoxCondicionDeIvaCreate( oSender ) CLASS
>>>>> TFormABMclientes
>>>>> Local aData, nI
>>>>> Local aTempDeta := {}
>>>>> Local aTempCodi := {}
>>>>>
>>>>> AppData:oBase:Execute( "select detalle,codigo from codigosdeiva",,
>>>>> @aData )
>>>>> For nI:= 1 to Len( aData )
>>>>> Aadd( aTempDeta, aData[nI][1] )
>>>>> Aadd( aTempCodi, aData[nI][2] )
>>>>> Next
>>>>> ::oDBComboBoxCondiciondeIva:aItems := aTempDeta
>>>>> ::oDBComboBoxCondiciondeIva:aItemsBound := aTempCodi
>>>>>
>>>>>
>>>>> "PEDRO DE LEON RODAS"<7773613810@prodigy.net.mx> escribió en el
>>>>> mensaje
>>>>> news:[email=4997b870@svctag-j7w3v3j....]4997b870@svctag-j7w3v3j....[/email]
>>>>>> Estimados amigos, saludos.
>>>>>> Como puedo hacer que los datos de un campo de una tabla se carguen
>>>>>> en un
>>>>>> TdbCombox.
>>>>>>
>>>>>> Esto se puede hacer con Dbfs de la siguiente manera
>>>>>>
>>>>>> METHOD usuarioCreate( oSender ) CLASS entrada
>>>>>> oSender:aItems := ::dbf:SaveToArray( "nombre" )
>>>>>> RETURN Nil
>>>>>>
>>>>>> Pero esto no funciona con tablas de Mysql.
>>>>>>
>>>>>> He visto un ejemplo que tiene xailer con sqlite parecido a esto.
>>>>>>
>>>>>> IF ::oDB:Execute( "select nombre from tipo_prestamo order by
>>>>>> nombre",,
>>>>>> @aData )
>>>>>> oSender:aItems := aData[1 ]
>>>>>> ENDIF
>>>>>>
>>>>>> Pero aqui solo me da el valor de un solo registro.
>>>>>>
>>>>>> De antemano mil gracias.
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>> Buen Dia Pedro
>>>>
>>>> Te pongo un pedazo de codigo de como lo hago cuando leeo los
>>>> usuarios de
>>>> una tabla de MySql
>>>>
>>>>
>>>> METHOD LlenaCombo() CLASS TEntrada
>>>> WITH OBJECT ::oComboUsuarios //<=== TComboBox
>>>> IF LEN (:aITEMS) >0
>>>> RETURN NIL
>>>> ELSE
>>>> AppData:USUARIOS:GoTop() //<=== Apunta a SQLQuery de Usuarios
>>>> DO WHILE !(AppData:USUARIOS:EOF())
>>>> //Extraigo nombre de Usuario y lo pongo en el Array aItems
>>>> con el
>>>> // metodo AddItem()
>>>> :ADDITEM(AppData:USUARIOS:FIELDGETBYNAME('USUARIO'))
>>>> AppData:USUARIOS:SKIP()
>>>> ENDDO
>>>> :nIndex:=1
>>>> :REFRESH()
>>>> ENDIF
>>>> END
>>>> RETURN NIL
>>>>
>>>>
>>>> Me funciona perfecto y rapido
>>>>
>>>> hay mas maneras de hacerlo , pero lo hago a la antiguita
>>>>
>>>> Saludos...
>>>>
>>>>
>>
>> Hola Daniel:
>>
>> Usando QueryArray()
>>
>>
>> Fracción de un nuestros programas:
>>
>> METHOD LlenaCombo() CLASS TEntrada
>> LOCAL aData:={},aDatos:={}
>>
>> aData:=Appdata:cnn:QueryArray("SELECT USUARIO FROM tblusuarios ORDER
>> BY USUARIO")
>>
>> IF LEN(aData)==0
>> MSGSTOP("NO EXISTEN USUARIOS PARA EL SISTEMA, FAVOR DE DARLOS DE
>> ALTA EN EL SISTEMA.")
>> ::CLOSE()
>> ENDIF
>>
>> AEval( aData, {|X,N| AADD(aDatos,X[1]) } )
>>
>>
>> ::ocboUsuarios:aItems:=aDatos
>>
>> ::ocboUsuarios:Refresh()
>>
>> RETURN NIL
>>
>> Saludos....
>>
>>
>
Daniel:
Lo Invoco en el Initialize() de la Forma
Saludos...
Responder