Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Lookup y dbGrid (https://www.clubdelphi.com/foros/showthread.php?t=77638)

Vlady 14-02-2012 16:13:26

Lookup y dbGrid
 
Amigo buenos días despues de buscar en todos los foros y en google no he podido encontrar la solución a mi problema.
Primero trabajo con delphi 7 y firebird 2.0, estoy trabajando con el componente TClientDataSet en el cual he creado un campo lookup todo me funciona bien, el problema que tengo es que la consulta que llena el Lookup es dinamica dependiendo de un campo que se seleccione se consultan los registros a mostrar en el lookup el problema radia es por ejemplo si en el primer registro que se selecciona un valor que no va a estar en el segundo registro, es decir en la consulta que se hace me pone el campo lookup en blanco del primer registro ya insertado. El programa graba bien la información, el problema es que el usuario puede creer que el campo lookup de campo anterior se ha borrado, espero haya sido claro. Espero me puedan dar una luz para solucionar este problema.

Vlady 15-02-2012 15:42:10

Hola amigos alguien puede ayudarme?

Casimiro Notevi 15-02-2012 15:54:50

Yo no lo he entendido, la verdad :confused:

elaguna 15-02-2012 16:23:58

Algunas dudas.

Cita:

TClientDataSet en el cual he creado un campo lookup ...
¿"lookup" es un nuevo tipo de dato?

Cita:

...dependiendo de un campo que se seleccione ...
¿Se seleccione en donde?

Cita:

...si en el primer registro que se selecciona un valor que no va a estar en el segundo registro...
¿Primer registro?, ¿segundo registro?...de dónde?

Cita:

...en la consulta que se hace me pone el campo lookup en blanco del primer registro ya insertado.
...?????

Te recomiendo las Guía de Estilo y la Guía alternativa del foro.

Te sugiero también el uso de signos de puntuación.

Saludos.


Eduardo Laguna.

Vlady 15-02-2012 16:41:58

Gracias por su ayuda repito mi problema, tengo un producto ejemplo gaseosa, el cual se vende por ejemplo en dos puntos almacen1, almacen2 y tengo otro producto ejemplo cerveza que solo se vende en almacen1.
Los valores almacen1 y almacen2 son los que se despliegan en el campo Lookup, cuando estoy llenando la DBGrid estoy en el primer registro llenando el valor de la gaseosa al seleccionar el punto me aparece almacen1 y almacen2, el usuario selecciona almacen2 cuando paso al segundo registro, cerveza la consulta se actualiza porque solo se vende en almacen1 el usuario solo selecciona almacen1, pero el problema es cuando pasa al tercer registro. Como la consulta que llena el lookup esta solo con el punto almacen2 el primer registro de la gaseosa queda en blanco. Espero sea mas claro.

elaguna 15-02-2012 17:18:15

Me quedé igual.

Cuando dices:

Cita:

...campo Lookup...
Supongo que te refieres a un "componente" Lookup y no a un "campo" de tu DB?

Cita:

...cuando estoy llenando la DBGrid estoy en el primer registro llenando el valor de la gaseosa...
Estás en el "primer registro" de la consulta de los almacenes? o estás en el primer registro del ClientDataSet donde (supongo) estás escribiendo los datos de tu gaseosa.

Con "llenando el valor de la gaseosa" te refieres al precio ($)? o a qué? en particular lo de "llenando".

Cita:

...al seleccionar el punto me aparece almacen1 y almacen2,...
Cuál "punto"?

Cita:

...el problema es cuando pasa al tercer registro. Como la consulta que llena el lookup esta solo con el punto almacen2 el primer registro de la gaseosa queda en blanco...
En esta parte... no entendí nada.


Eduardo Laguna

elaguna 15-02-2012 17:38:35

Haciendo otro intento.

Supongo que lo que deseas es manejar las existencias de determinado producto en varios almacenes.

Si es así, entonces lo que te sugiero es que manejes un Query con tu catálogo de productos y lo muestres en el componente que quieras, un TDBListBox es bueno. Cuando selecciones algún elemento (producto) de éste TDBListBox entonces haces "otro" Query a la DB (no al ClientDataSet) para saber en qué almacenes se encuentra tu producto y lo muestras en otro TDBListBox.

Ahora sí, ya puedes agregar los datos de tu producto y el almacén seleccionado al ClientDataSet.

En resumen:
  • 2 Query's, uno para productos y otro para almacenes (éste último es el dinámico)
  • 1 ClientDataSet para colocar los datos seleccionados y lo que quieras
Espero haberte entendido. Saludos.


Eduardo Laguna

Vlady 16-02-2012 15:54:06

La verdad no se ya como explicar, el problema no es de lógica de programación ni de relación de tablas el problemas es del campo lookup que se relaciona con la tabla que consulta las opciones que se va a listar, en el primer registro existen dos opciones almacen1 y almacen2 que son los datos para la gaseosa pero para el segundo registro como la cerveza solo se vende en almacen2 muestra almacen2 pero almacen1 ya no se muestra en el primer registro.

Casimiro Notevi 16-02-2012 16:19:11

Cita:

Empezado por Vlady (Mensaje 425273)
La verdad no se ya como explicar

Ese es el problema, si no sabes explicarlo, ¿cómo quiéres que los demás lo entiendan? :confused:

elaguna 17-02-2012 02:18:23

Pues a mí me parece que efectivamente es un problema de lógica.

Si los datos de los almacenes los tomas tomando como parámetro el producto, es normal que cuando el parámetro sea un producto que solamente está en un almacén pues... solamente te muestre ese almacén.

Por otra parte, si lo que tienes es un lookup dentro de un grid, es correcto que se actualice el lookup con cada registro y te muestre los mismos para todo el grid, es decir:

Si en tu primer registro llenaste el lookup con las cadenas "Almacén1" y "Almacén2", y con el segundo registro solamente llenaste el lookup con "Almacén1", el último cambio que hayas realizado al lookup es el que se queda activo para todo el Grid.

Espero haberte comprendido (créeme realmente lo estoy intentando) . ;-)

Saludos.


Eduardo Laguna

Vlady 17-02-2012 15:41:05

Señor laguna gracias por tu ayuda

Cita:

Empezado por elaguna (Mensaje 425320)
Pues a mí me parece que efectivamente es un problema de lógica.

Si en tu primer registro llenaste el lookup con las cadenas "Almacén1" y "Almacén2", y con el segundo registro solamente llenaste el lookup con "Almacén1", el último cambio que hayas realizado al lookup es el que se queda activo para todo el Grid.

Aquí es donde me has comprendido, entonces si no es con un lookup como puedo hacer esto ya que lo debe hacer de forma dinamica para cada registro?

elaguna 17-02-2012 21:01:06

Cita:

Empezado por Vlady (Mensaje 425355)
Señor laguna gracias por tu ayuda



Aquí es donde me has comprendido, entonces si no es con un lookup como puedo hacer esto ya que lo debe hacer de forma dinamica para cada registro?


Pues el uso de controles dentro del Grid... así funcionan, me parece que no hay mucho que hacer.

Por otra parte, si el lookup lo estás llenando de forma dinámica, cada que vez que actualizas la consulta, por lógica actualizas el contenido del lookup y por ende "muy probablemente" los datos no siempre serán válidos para cada uno de tus registros.

Como alternativa se me ocurre (si es que los datos de almacén son sólo de consulta), que dejes el campo con tu catálogo de almacenes con todos los conceptos (Almacen1, Almacén2, ..., AlmacénX) y que los datos de almacén que le correspondan a cada artículo los coloques en un tercer control dentro del grid (por ejemplo un memo en la DB y un TText en el Grid), para que cada que cambies de registro no se actualicen los datos para todos.

Saludos.


Eduardo Laguna.

marcoszorrilla 17-02-2012 21:31:45

Creo que debes utilizar un campo calculado para evaluar si el LookUp te devuelve algo o no, en caso de que devuelva datos dejas los datos que devuelva y en caso contrario por ejemplo lo rellenas con <<< No hay movimientos>>> o lo que te convenga.

Situación los Lookup los usamos pero no los mostramos en la rejilla, esto lo hacemos por medio de campos calculados que actuaran evaluando como dije antes si hay que dejar el contenido extraido por el LookUp si lo hay o un texto personalizado.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 17:39:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi