Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Columnas adicionales en TDBGrid (https://www.clubdelphi.com/foros/showthread.php?t=62430)

noob 23-12-2008 05:04:25

Columnas adicionales en TDBGrid
 
Hola tengo un componente TDBGrid que muestra el contenido de una tabla MySQL con los campos Codigo Cantidad y Precio, yo lo que quiero es añadir una columna a mi TDBGrid para almacenar información útil para el usuario pero que no se almacene en la base de datos.
Para crear una nueva columna hago lo siguiente en el evento OnCreate de mi formulario:

Código Delphi [-]
DBGrid1.Columns.Add.Title.Caption := 'Nueva Columna';

hasta aquí bien, mi columna adicional es creada pero no se cómo introducir datos en ella, ni a mano, porque todo lo que meto no se guarda ni mediante código.

Tal vez lo que intente hacer no se pueda, ¿me ayudáis?

Feliz Navidad y muchas gracias.

Fenareth 23-12-2008 05:16:00

Cita:

Empezado por noob (Mensaje 331922)
Hola tengo un componente TDBGrid que muestra el contenido de una tabla MySQL con los campos Codigo Cantidad y Precio, yo lo que quiero es añadir una columna a mi TDBGrid para almacenar información útil para el usuario pero que no se almacene en la base de datos.
Para crear una nueva columna hago lo siguiente en el evento OnCreate de mi formulario:

Código Delphi [-]DBGrid1.Columns.Add.Title.Caption := 'Nueva Columna';


hasta aquí bien, mi columna adicional es creada pero no se cómo introducir datos en ella, ni a mano, porque todo lo que meto no se guarda ni mediante código.

Tal vez lo que intente hacer no se pueda, ¿me ayudáis?

Feliz Navidad y muchas gracias.

Hola noob :)

Soy yo o eso me suena un poco contradictorio ???? :confused: :o

luisgutierrezb 23-12-2008 05:54:45

lo que necesitas es crear un campo calculado, en el dataset boton derecho del mouse en la opcion field Editor, ahi podras crear uno nuevo y lo veraz en el dbgrid, modificas el valor en el evento oncalcfields

Caro 23-12-2008 11:25:05

Hola noob, creo que deberías explicar un poco mas para que necesitas tu nuevo campo, ¿pertenece a tu tabla?, si utilizas un ClientDataSet todo lo que vayas registrando e inclusive campos temporales se almacenan en memoria hasta que no apliques ApplyUpdates, menos en el caso de que te crees un campo en memoria, ya que no estara en tu tabla.

Saluditos

noob 23-12-2008 16:33:39

Cita:

Empezado por Fenareth (Mensaje 331923)
Cita:

Empezado por noob
...pero que no se almacene en la base de datos...
...porque todo lo que meto no se guarda ni mediante código...

Hola noob :)

Soy yo o eso me suena un poco contradictorio ???? :confused: :o

Fenareth, no es contradictorio porque esa información no quiero que se guarde en la base de datos pero sí quiero que se guarde temporalmente en memoria principal mientras se está ejecutando mi aplicación.

Cita:

Empezado por luisgutierrezb
lo que necesitas es crear un campo calculado, en el dataset boton derecho del mouse en la opcion field Editor, ahi podras crear uno nuevo y lo veraz en el dbgrid, modificas el valor en el evento oncalcfields

Supongo que eso dependerá del tipo de Dataset utilizado porque en mi caso no veo dicha opción.

Cita:

Empezado por Caro
Hola noob, creo que deberías explicar un poco mas para que necesitas tu nuevo campo, ¿pertenece a tu tabla?, si utilizas un ClientDataSet todo lo que vayas registrando e inclusive campos temporales se almacenan en memoria hasta que no apliques ApplyUpdates, menos en el caso de que te crees un campo en memoria, ya que no estara en tu tabla.

Saluditos

Hola Caro, te explico un poco, tengo una tabla Ventas con los campos Producto Unidades Precio Proveedor, el campo Producto mostrará el código de producto (en mi base de datos tengo también una tabla Productos con los campos Codigo y Descripcion). Lo que hago es esto:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  ListaProductos: TStringList;
  i: integer;
begin
  ListaProductos := TStringList.Create;
  with BaseDatos.Tabla('Producto') do
    try
      Active := true;
      First;
      DisableControls;
      while not EOF do
        begin
          ListaProductos.Add(FieldByName('Codigo').AsString);
          Next;
        end;
    finally
      Active := false;
      for i := 0 to DBGrid1.Columns.Count - 1 do
        begin
          if (DBGrid1.Columns[i] as TColumn).FieldName = 'Producto' then
            begin
              DBGrid1.Columns[i].PickList := ListaProductos;
              Break;
            end;
        end;
      EnableControls;
      ListaProductos.Free;
    end;
end;

De este modo en el campo Producto del TDBGrid tengo todos los códigos de producto que hay en la tabla Productos listos para que el usuario escoja uno de ellos. El problema es que yo quiero añadir una columna adicional para que me muestre también la descripción del producto ya que seleccionar el producto "PR0034" puede que no diga mucho sin embargo si selecciono el producto "PR0034" y nada más seleccionarlo se me rellena la columna de al lado con "2 GB Memoria RAM DDR 400 MHz" entonces el usuario sabe bien qué producto ha cogido, pero claro esa información adicional no ha de guardarse en la tabla Ventas sino que sólo ha de mostrarse para dar información adicional al usuario.

Lo que hago es crear esa columna nueva:

Código Delphi [-]
DBGrid1.Columns.Add.Title.Caption := 'Descripcion';

Pero no sé cómo asignar al contenido de la celda de la nueva columna la descripción del producto cuyo código es el seleccionado. Primero porque no encuentro un evento que se dispare al escoger un código del PickList (el que más se ajusta a lo que quiero es el evento OnColExit del TDBGrid) y segundo porque no veo ninguna propiedad que sea el contenido de una celda.

Espero haberme explicado.

Saludos.

Kipow 23-12-2008 17:23:48

Con los calcfields creo que no te funcionara porque estos se resetearan cada vez que se ejecute el evento. podrias probar talvez on el componente de las Jedi el jvMemoryData que es una tabla en memoria.

noob 23-12-2008 17:31:03

¿No se puede hacer con el TDBGrid sin más o cómo mucho usando alguna estructura de datos tipo array dinámico?

PepeLolo 24-12-2008 02:29:54

Cita:

Empezado por noob (Mensaje 331994)
¿No se puede hacer con el TDBGrid sin más o cómo mucho usando alguna estructura de datos tipo array dinámico?

No necesitas hacer nada de eso, la vida es muy sencilla con delphi. Lo que tienes que hacer en primer lugar es olvidarte del Picklist, eso no sirve para lo que quieres, lo que necesitas es un lookup combo box, en el cual expecifiques las columnas que quieres visualizar (Código y descripción).

Antes que nada, si de lo que hablo no entiendes algo, busca en la ayuda de delphi las palabras en negrita.

Empecemos, primero tienes que crear los TField de la tabla "Producto", una vez creados, posicionado en el campo "Codigo" y pulsa F11 para mostrar las prompiedades del TField, veras las propiedades "LookupDataSet, LookupKeyFields y LookupResultField)

Segundo, añade un dataset nuevo que devuelva los datos del código y descripción que quieres visualizar. Añade un dataSource y asociale el DataSet creado.

Tercero asocia el dataSource creado a la propiedad TField.LookupDataSet del campo "Codigo". En la propiedad TField.LookupKeyFields pones los campos del DataSet creado separados por ";" ejemplos: "CODIGO;DESCRIPCION". En la propiedad TField.LookupResultField poner el campo del que tomará el valor a guardar en tu tabla por ejemplo: 'CODIGO'.

Cuarto, tienes que abrir el DataSet creado con el resto de los DataSet.

Fin, ahora cuando en el dbgrid pulses sobre el botón del campo "CODIGO"SE mostrará el código y descripción, justo lo que quieres.:D

un saludo

noob 24-12-2008 03:05:40

Gracias, estoy en el paso de crear los TField de la tabla Producto pero he visto en la ayuda que pone esto:

Cita:

Do not create instances of TField. TField descendants are created automatically each time a dataset is activated.
La duda es ¿qué dataset he de utilizar?

PepeLolo 24-12-2008 03:24:10

Cita:

Empezado por noob (Mensaje 332104)
Gracias, estoy en el paso de crear los TField de la tabla Producto pero he visto en la ayuda que pone esto:
La duda es ¿qué dataset he de utilizar?

Creo que me he liado con los nombres de tus tablas

Tienes un DataSet que tienes conectado al DBGrid, de ese dataset tienes que crear los TField. En el TField "Producto" asignar las propiedades lookup como te he comentado anteriormente.

Del dataset que has de crear nuevo no es necesario crear lo TField.

un saludo.

noob 24-12-2008 03:40:44

Ya te entiendo, he sacado un TDBGrid, dos TDataSource y dos dataset, mi estructura es la siguiente:

DBGrid1 --> DataSourceVentas --> DataSetVentas
DataSourceProductos --> DataSetProductos

he hecho esto pero no ocurre nada de nada, simplemente están todos los campos de la tabla Ventas pero no hay ningún botón en el campo Producto:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  with DatasetVentas do
    begin
      Open;
      FieldByName('Producto').LookupDataSet := DatasetProductos;
      FieldByName('Producto').LookupKeyFields := 'Codigo; Descripcion';
      FieldByName('Producto').LookupResultField := 'Codigo';
    end;
end;

¿Falta algo?

Un saludo.

PepeLolo 24-12-2008 04:34:40

Cuando piensa abrir DataSetProductos, supongo que has añadido los campos de DataSetVentas al dbgrid. Por último cuando en el DBGrid pulses sobre el botón del campo "Producto" se desplegará el lookup.

un saludo.

noob 24-12-2008 04:40:25

Cita:

Empezado por PepeLolo
Cuando piensa abrir DataSetProductos

Lo abro antes de asignar las propiedades Lookup.

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  with DatasetVentas do
    begin
      Open;
      DatasetProductos.Open;
      FieldByName('Producto').LookupDataSet := DatasetProductos;
      FieldByName('Producto').LookupKeyFields := 'Codigo; Descripcion';
      FieldByName('Producto').LookupResultField := 'Codigo';
    end;
end;

Cita:

Empezado por PepeLolo
supongo que has añadido los campos de DataSetVentas al dbgrid

Sí, están añadidos.

Cita:

Empezado por PepeLolo
Por último cuando en el DBGrid pulses sobre el botón del campo "Producto" se desplegará el lookup.

No sale ningún botón en el campo Producto.

¿Qué está fallando?

Saludos.

Al González 24-12-2008 07:25:57

¡Hola!

Hace varios años que no creo campos de búsqueda (lookup fields), pero trataré de orientar un poco.

Son cuatro las propiedades especiales involucradas en la definición de un campo de búsqueda: KeyFields (el campo "apuntador" en la tabla de captura), LookupDataSet (la tabla en donde se buscará), LookupKeyFields (el campo de LookupDataSet que debe coincidir con el campo KeyFields de la tabla de captura) y LookupResultField (el campo de LookupDataSet cuyo valor es el que se "verá").

Además la propiedad FieldKind del campo de búsqueda debe tener un valor de fkLookup.

En el cuadro de diálogo New Field (cuyo caption debería ser "New field" :p) de Delphi 7 y otras versiones, hay cinco controles que representan a las cinco anteriores propiedades que mencioné. En Field type debes seleccionar la opción "Lookup" y luego rellenar los cuatro cuadros contenidos en el grupo "Lookup definition".

El botón Help que ahí se encuentra te permite llegar con relativa facilidad al tema "Defining a lookup field" de la ayuda de Delphi, el cual está ampliamente explicado.

De cualquier forma en estos foros ya se ha tratado con anterioridad el tema de los campos lookup, así que, buscando un poco más, haciendo pruebas y retroalimentando este hilo, llegarás pronto a buen puerto.

Ante cualquier duda no dejes de preguntar.

Saludos.

Al González. :)

noob 25-12-2008 01:38:22

Cita:

Empezado por Al González (Mensaje 332124)
En el cuadro de diálogo New Field (cuyo caption debería ser "New field" :p) de Delphi 7 y otras versiones, hay cinco controles que representan a las cinco anteriores propiedades que mencioné. En Field type debes seleccionar la opción "Lookup" y luego rellenar los cuatro cuadros contenidos en el grupo "Lookup definition".

El problema es que debo de hacerlo todo por código porque mi dataset no me permite hacerlo de otro modo. ¿Se puede hacer por código?

Al González 25-12-2008 01:43:52

Cita:

Empezado por noob (Mensaje 332182)
El problema es que debo de hacerlo todo por código porque mi dataset no me permite hacerlo de otro modo. ¿Se puede hacer por código?

Eso cuesta trabajo creerlo, ¿qué componente es? ¿Qué pasa cuando le das doble clic en tiempo de diseño? (al data set, no a la rejilla)

luisgutierrezb 25-12-2008 02:22:53

a mi tambien me cuenta creerlo que no tenga esa opcion, conste que es dataset y no datasource y el dataset puede ser un TTable, TQuery, AdoQuery, ZQuery, IBQuery, etc, etc, es la parte donde le das la instruccion SQL o le dices que tabla va a abrir

Al González 25-12-2008 02:30:19

Cita:

Empezado por luisgutierrezb (Mensaje 332185)
a mi tambien me cuenta creerlo que no tenga esa opcion, conste que es dataset y no datasource y el dataset puede ser un TTable, TQuery, AdoQuery, ZQuery, IBQuery, etc, etc, es la parte donde le das la instruccion SQL o le dices que tabla va a abrir

¿Eso fue una pregunta o una afirmación? :confused:

noob 25-12-2008 14:22:34

Cita:

Empezado por Al González (Mensaje 332184)
Eso cuesta trabajo creerlo, ¿qué componente es?

Es un componente TSQlite3Dataset.

Cita:

Empezado por Al González (Mensaje 332184)
¿Qué pasa cuando le das doble clic en tiempo de diseño? (al data set, no a la rejilla)

Me sale un editor de tablas Sqlite para cree una tabla.

Al González 25-12-2008 21:49:26

Cita:

Empezado por noob (Mensaje 332197)
Me sale un editor de tablas Sqlite para cree una tabla.

Vale, y si le das clic con el botón derecho / secundario del ratón, ¿qué opciones de menú te aparecen? Por otro lado, ¿no habrá dentro de ese editor una sección para definir los campos persistentes?


La franja horaria es GMT +2. Ahora son las 18:58:58.

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