Ir al contenido


Foto

[RESUELTO] Ayuda con el componente DBLookupComboBox


  • Por favor identifícate para responder
9 respuestas en este tema

#1 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 17 mayo 2010 - 11:00

Hola como estan, yo de nuevo jeje!

Esta vez necesito que me ayuden con este componente. Estoy trabajando con Firebird 2.1 y Delphi7
Tengo la siguiente situacion:

Tengo una tabla clientes y otra articulos.
2 DBLookupComboBox, en los que cargue por medio del siguiente codigo, los valores nombre de cliente y titulo de articulo respectivamente.



delphi
  1.   zquery1.close;
  2.   zquery1.sql.Clear;
  3.   zquery1.sql.Add('select id_cliente, nombre from Tclientes');
  4.   zquery1.open;
  5.   DBLookUpComboBox2.ListSource:=Datasource3;
  6.   DBLookUpComboBox2.ListField:='nombre';
  7.   DBLookUpComboBox2.KeyField:='id_cliente';
  8.  
  9.   zquery2.close;
  10.   zquery2.sql.Clear;
  11.   zquery2.sql.Add('select id_Articulo, titulo from Tarticulos');
  12.   zquery2.open;
  13.   DBLookUpComboBox3.ListSource:=Datasource4;
  14.   DBLookUpComboBox3.ListField:='titulo';
  15.   DBLookUpComboBox3.KeyField:='id_articulo';



Ahora lo que quiero es poder seleccionar un nombre de cliente, un articulo y almacenar los ID de cada uno en una tabla pedidos, ademas de otros valores que ingreso por Tedit, pero el problema es con estos dos valores.

Se que tengo que asignar en las propiedades DataSource, la tabla de destino y en DataField, el campo en el que se guardará el valor que hay en KeyField. (si me equivoco pido que me corrijan).

Lo que no se es como va la secuencia del codigo o como es el codigo con respecto al almacenamiento de estos valores, probe de la siguiente manera:



delphi
  1.   TPedidos.Insert;
  2.   DBLookUpComboBox2.DataSource:=DataSource5;
  3.   DBLookUpComboBox2.DataField:='id_cliente';
  4.   DBLookUpComboBox3.DataSource:=DataSource5;
  5.   DBLookUpComboBox3.DataField:='id_articulo';
  6.   TPedidos.FieldByName('cantidad').asinteger:=strtoint(Ecantidad.Text);
  7.   TPedidos.FieldByName('fecha').AsDateTime:=DTFecha.DateTime;
  8.   TPedidos.Post;



A este codigo lo tengo en un boton. Lo que pasa se que de alguna manera guarda valores, no me da error. Pero a los combobox, los deja vacio. Cuando quiero volver a elegir ya sea un cliente o un articulo, los campos combobox del registro que supuestamente se habian guardado vacios, se modifican almacenando el correspondiente id_cliente e id_articulo.
Hago click nuevamente en guardar y pasa lo mismo. Valores en blanco hasta que vuelvo a seleccionar y recien se visualizan.

Todo esto lo veo en un DBGrid que tengo.

Espero que me hayan entendido.

Estoy experimentando (aprendiendo) con todo esto, quizas no sea correcto lo que estoy haciendo, pero imagino que se puede realizar.

Muchisimas gracias por su tiempo!
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2010 - 07:06

Saludos.

En la primera parte de tu código veo la asignación de las propiedades para desplegar la información (eso esta correcto), debes de realizar ahí también la asignación del destino, con eso no te pondrá en modo de inserción o edición directamente.

Tus combos pueden estar vació por dos razones:
1.- Tus tablas están vacías.
2.- No has configurado los DataSource con los respectivos TQuery del ListSource de tus combos.

Prueba y postea. (y)
  • 0

#3 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 18 mayo 2010 - 11:28

Gracias por la respuesta Rolphy Reyes!

Lo que sigo sin entender es como tiene que ser el codigo para poder seleccionar una de las opciones de los combo y despues al apretar en el boton "guardar", se guarden esos valores en una tabla.
Los valores en los combos se cargan sin problemas por medio del primer codigo que muestro al iniciar este hilo.
Lo que decia anteriormente es que en la tabla se guarda como vacio y luego cuando elijo otro, recien se modifica. eso es lo que veo en el DBGrid

Con un ejemplo creo que bastaria.

Saludos!
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2010 - 12:38

Saludos.

No me queda claro todavía tu inquietud.

Una vez le indicas al LookUpComboBox cual es el DataField y DataSource el solo se encarga de asignar la data al campo correspondiente en dicha propiedad.

Para hacer la asignación al primer registro, puedes hacer algo como:


delphi
  1. If not MiQuery.IsEmpty then
  2. MiLookUpComboBox.ItemIndex := 0;



Cuando un usuario selecciona un registro del LookUp, "Delphi" hace la asignación.

Prueba y postea.
  • 0

#5 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 18 mayo 2010 - 12:50

Lo que me genera duda es lo siguiente: Teniendo este codigo, se cargan los valores de una tabla en el combo y lugo se almacenan en otra.



delphi
  1.  
  2.   zquery1.close;
  3.   zquery1.sql.Clear;
  4.   zquery1.sql.Add('select id_cliente, nombre from Tclientes');
  5.   zquery1.open;
  6.   DBLookUpComboBox2.ListSource:=Datasource3;
  7.   DBLookUpComboBox2.ListField:='nombre';
  8.   DBLookUpComboBox2.KeyField:='id_cliente';
  9.   DBLookUpComboBox2.DataSource:=DataSource5;
  10.   DBLookUpComboBox2.DataField:='id_cliente';



Pero ¿como confirmo ese guardado? ya que tengo en cuenta como se hace siempre:

Tabla.insert;
.
.
.
Tabla.post;

Como esta el codigo veo que se guard el valor, pero cuando vuelvo a ejecutar el programa, elijo otros valores y no se almacenan sino que se modifican los anteriores.
Se me hace dificil explicar lo que quiero asi que imagino que es mas dificil entenderlo.

Gracias por tu tiempo
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2010 - 01:48

Saludos.

Estoy entendiendo mas o menos tu problema, sucede que los DataSource tienen la propiedad AutoEdit y tiene por defecto True; por eso al entrar a tu programa y seleccionar cualquier registro de los Combos te modifica el guardado.

Para evitar ese comportamiento cambia el valor a False, entonces seras tu quien decida cuando se hace la Inserción y Modificación con los métodos "normales" (Tabla.Insert, Tabla.Edit) y para guardar lo de siempre el Post, salvo que estes trabajando con CachedUpdates.

Prueba y postea. (y)
  • 0

#7 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 18 mayo 2010 - 03:00

Gracias por tu ayuda Rolphy Reyes, ya modifique las propiedades del Datasource y puedo ver bien los valores que se van a guardar en la tabla. Ahora ¿el codigo de Insercion seria de la siguiente manera? O ¿como capturo el valor que tiene en ese momento del combo?



delphi
  1.  
  2.   TPedidos.Insert;
  3.   DBLookUpComboBox2.DataSource:=DataSource5;
  4.   DBLookUpComboBox2.DataField:='id_cliente';
  5.   DBLookUpComboBox3.DataSource:=DataSource5;
  6.   DBLookUpComboBox3.DataField:='id_articulo';
  7.   TPedidos.FieldByName('cantidad').asinteger:=strtoint(Ecantidad.Text);
  8.   TPedidos.FieldByName('fecha').AsDateTime:=DTFecha.DateTime;
  9.   TPedidos.Post;



Saludos!
  • 0

#8 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2010 - 03:28

Saludos.

Si deseas hacer la asignaciones de propiedades manualmente, lo indicado sería hacer ese proceso en un evento donde ocurra una vez, porque al parecer tu atacaras una sola tabla en esa pantalla a la vez y no cambiaras a otra tabla en el formulario.

Vuelvo y te reitero una vez hagas las asignaciones de lugar (propiedades del LookUp) ya sea manual o "visual", Delphi se encarga de asignar los valores a los campos ya configurados; no tienes necesidad de capturar el valor del campo para asignárselos a la tabla destino, salvo que quieras realizar algún proceso adicional y aún así puedes tomar el valor de tu tabla destino.

Si ya solucionaste tu problema, favor de cambiar el hilo a RESUELTO.
  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 18 mayo 2010 - 11:01

El dblookupcombobox se carga desde dos querys o un query como sea. Al cargar un valor este es lo que hace es cargar el registro correspondiente. Ejemplo:
para insertar lo que esta en el dblookupcombobox - siendo llenado este por el query1

query1.codigo.asstring;

este es el valor que debes pasarle por ejemplo al campo codigo de tu tabla.

Seria bueno que pongas en showmessage en el evento closeup del combobox y le pases los valores que deseas copiar a la otra tabla.

Ejemplo.
Showmessage(query1.codigo.asstring) 

asi sabras si ese es el valor que quieres pasarle a tu tabla.
  • 0

#10 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 21 mayo 2010 - 09:21

Perdon que me perdi en estos dias, pero tuve unos problemas con mi conexion!
Les doy las gracias por la ayuda que me dieron, me costo pero pude entender como funciona el componente, doy el tema como [RESUELTO]

Saludos!!
  • 0




IP.Board spam blocked by CleanTalk.