Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-05-2015
oscjae oscjae is offline
Miembro
 
Registrado: may 2005
Posts: 70
Poder: 19
oscjae Va por buen camino
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!!!
Responder Con Cita
  #2  
Antiguo 17-05-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 19-05-2015
oscjae oscjae is offline
Miembro
 
Registrado: may 2005
Posts: 70
Poder: 19
oscjae Va por buen camino
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???
Responder Con Cita
  #4  
Antiguo 27-05-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola oscjae.

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

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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Creando campos en tiempo de ejecucion edgwin Conexión con bases de datos 7 31-03-2009 18:08:14
Creación de campos en tiempo de ejecución fjcg02 OOP 5 27-08-2008 08:05:35
Problema con DBGRiD y campos en Tiempo de ejecución EITB OOP 0 14-10-2004 17:59:17
Añadir campos persistentes en tiempo ejecucion Firibiri Conexión con bases de datos 3 22-12-2003 11:43:08
Agregando campos en tiempo de ejecucion Markoz Firebird e Interbase 3 31-10-2003 02:32:23


La franja horaria es GMT +2. Ahora son las 10:54:16.


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
Copyright 1996-2007 Club Delphi