Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Obtener valor de Campo Calculado (https://www.clubdelphi.com/foros/showthread.php?t=72849)

jhonalone 15-03-2011 19:17:21

Obtener valor de Campo Calculado
 
Agradecería que alguien me echara una mano. Vaya por delante que son un novato con las BD.

A ver si soy capaz de explicame.

Tengo dos tablas maestro/detalle en un formulario donde presento los datos detalle en una rejilla (DBgrid) y los datos maestro en DBEdit. Uno de los campos de la rejilla es un campo calculado (Con su OnCalcFields, su nombre, procedure de cálculo, etc).

Todo funciona de maravilla: si cambio el cliente se actualizan los datos del cliente y de la rejilla (incluyendo el campo calculado).

Mi problema surge cuando intento obtener los datos de la rejilla desde OTRO FORMULARIO.

Obtengo todos los datos referentes a los campos de la rejilla sin dificultad, hasta que llego al campo calculado, en el que siempre obtengo un resultado vacío.

Paradógicamente, si entro primero en el formulario de la tabla y a continuación en el segundo formulario SI OBTENGO el resultado, pero si entro antes en el segundo forrmulario (en cuya "Uses" tengo declarado el anterior), puedo obtener TODOS los valores de todos los campos MENOS el campo calculado.

Por más vueltas que le doy no llego a comprenderlo.

Si he sido capaz de explicarme y alguien puede ayudarme...

!!MUCHAS GRACIAS¡¡

ecfisa 15-03-2011 22:48:03

Hola jhonalone.

Utilizando un TDataModule, con los TDataSets, sus respectivos TDataSources declarados y el evento OnCalcFied asignado, un
TDBGrid que tenga la propiedad DataSource= 'DataModule.DataSourceDetail', mostrará el campo calculado, esté ubicado en el
form que esté.
Claro que siempre y cuando ese form incluya a la unit del TDataModule y esté definido el campo calculado en las columnas del TDBgrid.


Un saludo.

jhonalone 16-03-2011 11:42:05

Ante todo muchas gracias, ecfisa.

Puede que el problema sea ése. He prescindido del Data Module y he conectado las bases y el DBGrid manualmente. He añadido el campo calculado a la BD detalle y he conectado el procedimiento de cálculo al evento OnCalcFields de la misma BD detalle. Después he añadido el campo calculado a la rejilla.

Ahora, si tengo que meterlo todo en un Data Module, me da algo, porque no sé como hacerlo cuando ya está todo conectado. Y rehacerlo todo y empezar de nuevo es lo último que quisiera hacer. Tengo mucho código repartido en otros formularios afectado.

Ecfisa, si crees que hay alguna otra solución, tal y como están las cosas, por favor ayúdame, yo también seguiré buscando otras alternativas.

Gracias de nuevo por tus esfuerzos.
Saludos.

ecfisa 17-03-2011 00:25:10

Hola jhonalone.

Lo importante es que todos los DBGrids, estén en el form que estén, hagan referencia al DataSource asociado al DataSet.
Por ejemplo, si pusiste el DataSet/DataSource/OnCalcFields en Form1, y pones un DBGrid en Form2, en su propiedad
DataSource debe figurar: 'Form1.DataSourceDetail', lo mismo para Form3, etc.

De este modo siempre estarás haciendo referencia al mismo DataSet y por supuesto al mismo campo calculado y evento. Por lo tanto,
no puede diferir el comportamiento de un DBGrid situado en un form al situado en otro.

Espero haberme explicado bien.

Un saludo.

jhonalone 18-03-2011 19:46:54

Hola, de nuevo, ecfisa. Te explicaste mucho mas que perfectamente.

La cuestión es la siguiente:
desde el Form2 pretendo recuperar los valores del DBGrid que pertenece al Form1. No tengo definido otro DBGrid en el Form2. Los presento (algunos valores, no todos) en un TListBox de la forma que tú me enseñaste. Uno de ellos es el campo calculado.
Como te dije toma valor, si antes he entrado en el Form1, si entro directamente en el Form2 toman valor todos los campos excepto el campo calculado.
Estoy desarrollando un Procedure para volverlo a calcular desde el Form2, con los datos del Form1. Esto no sería necesario si pudiera conseguir el valor directamente.
Estoy empezando a pensar que la causa del problema es: que hasta que no se ejecuta al Form1, no se carga en memoria el Procedure que calcula el valor del campo. He intentado ejecutarlo desde el Form2 y, aunque no me da error, no soluciona el problema.

Gracias de nuevo. Saludos.

ecfisa 18-03-2011 22:20:46

Hola jhonalone.

Cita:

desde el Form2 pretendo recuperar los valores del DBGrid que pertenece al Form1. No tengo definido otro DBGrid en el Form2. Los presento (algunos valores, no todos) en un TListBox de la forma que tú me enseñaste. Uno de ellos es el campo calculado.
Como te dije toma valor, si antes he entrado en el Form1, si entro directamente en el Form2 toman valor todos los campos excepto el campo calculado.
Disculpame, recién ahora que me refrescas la memoria busqué (y encontré) el post anterior.

Me parece que este caso podrías prescindir del DBGrid y trabajar directamente sobre el DataSet:
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
var
  BM: TBookMarkStr;
  i: Integer;
  s: string;
begin
  ListBox1.Clear;
  with Form1 do  // (si el DataSet reside en Form1)
  begin
    DataSet.Open; // Opcional: ( si no esta abierto)
    BM:= DataSet.Bookmark;
    DataSet.DisableControls;
    DataSet.First;
    while not DataSet.Eof do
    begin
      s:= '';
      for i:= 0 to DataSet.FieldCount - 1 do
      begin
        s:= s + DataSet.Fields[i].AsString;
        if i < DataSet.FieldCount - 1 then
          s:= s + '  -  ';
      end;
      ListBox1.Items.Add(s);
      DataSet.Next;
    end;
    DataSet.Bookmark:= BM;
    DataSet.EnableControls;
    DataSet.Close; // Opcional ( si queres cerrarlo )
  end;
end;
Por que en realidad, el campo calculado está definido en el TDataSet no en el TDBGrid.

Un saludo.

jhonalone 19-03-2011 16:54:52

Ecfisa, eres GRANDE, MUY GRANDE. ¡¡FUNCIONÓ!!.

Espero no tener que abusar de tu inestimable ayuda muchas veces.

Gracias. Un especial saludo.

ecfisa 21-03-2011 17:10:17

Hola jhonalone.

Se nota que me estas mirando con una lupa... :D:D:D

Me alegro que hayas solucionado el problema.

Un saludo.


La franja horaria es GMT +2. Ahora son las 12:13:10.

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