Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Campos calculados en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=88299)

oscjae 17-05-2015 12:44:14

Campos calculados en tiempo de ejecucion
 
Hola, he estado buscando por el foro, he encontrado algunas dudas parecidas a las mías, pero no he visto nada que me pueda ayudar, les expongo mi caso:

Tengo un dataset en el que le paso una sentencia en tiempo de ejecución, no tiene campos persistentes, depende del select que le paso,
pongo un ejemplo

Código Delphi [-]
...
var
sentencia:String,
begin
sentencia:='select campo1,campo2,campo3 from TABLA where campo1=Valor';
vTabla.Close;
vTabla.SelectSQL.Clear;
vTabla.SelectSQL.Text:=sentencia;
vTabla.Open;
...

Evidentemente, esta sentencia varía según opciones, si no, crearía los campos persistentes, y el problema es que debo crear un campo calculado, pero no es tan fácil como operar con campos de la sentencia, como (campo1*campo2) o cosas así, es bastante complejo, necesito hacer operaciones en el evento OnCalcFields de la tabla, y no se como crear ese campo calculado en tiempo de ejecución, lo he intentado creando el campo de esta forma:

Código Delphi [-]
...
var
vCampoCalculado:TFloatField;
begin
vCampoCalculado:=TFloatField.Create(vTabla);
vCampoCalculado.FieldName:='CampoCalc';
vCampoCalculado.FieldKind:=fkCalculated;
vCampoCalculado.DataSet:=vTabla;
...

Metiendo el código antes del Open de la tabla (solo me muestra ese campo), después (da error porque no se puede hacer con un dataset abierto, como es normal), etc...

No se si se puede hacer realmente, a ver si alguien me podría ayudar, gracias!!!

ecfisa 17-05-2015 19:31:20

Hola oscjae.

Un ejemplo de como podes implementar lo que solicitas:
Código Delphi [-]
...
procedure TForm1.FormCreate( Sender: TObject );
var
  i: Integer;
  Field: TField;
begin
  with tu_DataSet do
  begin
    Close;
    SQL.Text :=  'SELECT CAMPO1, CAMPO2, ... FROM TU_TABLA';
    Open;
  end;

  tu_DataSet.Close;

  for i :=0 to tu_DataSet.FieldDefs.Count - 1 do
    Field := tu_DataSet.FieldDefs[i].CreateField( tu_DataSet );

  Field := TFloatField.Create( tu_DataSet );
  with Field do
  begin
    FieldName  := 'CalcFld';
    Calculated := True;
    DataSet    := tu_DataSet;
  end;

  tu_DataSet.Open;
end;

procedure TForm1.tu_DataSetCalcFields( DataSet: TDataSet );
begin
  with DataSet do
  begin
    FieldByName('CalcFld').AsFloat := PI * ( Fields[0].Value + Fields[1].Value );
    //...
  end;
end;

Saludos :)

oscjae 19-05-2015 08:42:49

Gracias ecfisa, va perfecto, pero hay una cosa que no entiendo.


Código Delphi [-]
  for i :=0 to tu_DataSet.FieldDefs.Count - 1 do
    Field := tu_DataSet.FieldDefs[i].CreateField( tu_DataSet );

Esto porque???

ecfisa 27-05-2015 19:31:24

Hola oscjae.

No había visto tu mensaje, disculpas por la demora de la respuesta. :o

El motivo de esas líneas es crear los campos y poder usar por ejemplo:
Código Delphi [-]
procedure TForm1.tu_DataSetCalcFields( DataSet: TDataSet );
begiin
  with DataSet do  
    FieldByName('CalcFld').AsFloat := PI * ( Fields[0].Value + Fields[1].Value );

Pueden quitarse sin ningún problema y hay que referirse a los campos por su nombre:
Código Delphi [-]
procedure TForm1.tu_DataSetCalcFields( DataSet: TDataSet ); 
begin
  with DataSet do  
    FieldByName('CalcFld').AsFloat := PI * ( FieldByName('CAMPO1').Value + FieldByName('CAMPO2').Value );

Saludos :)


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

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