Campo calculado em tempo de execução!!!

12/12/2003

0

Tem como eu criar um campo calculado em tempo de execução? Eu não queria criar 6 querys para em cada uma colocar o mesmo campo calculado!!!

Obrigada!
:?:


Xandraveiga

Xandraveiga

Responder

Posts

12/12/2003

Rob

Poderia ser mais explicativa???
Não entendi bem a pergunta


Responder

14/12/2003

Xandraveiga

Eu tenho uma tabela com um campo chamado Status podendo conter os valores 1, quando for habilitado, 2 para desabilitado e 3 para indefinido! Mas não quero que apareça no grid 1,2, ou 3 e sim ´Habilitado´ ou ´Desabilitado´ ou ´Indefinido´ e só posso fazer isso criando um campo calculado. Mas por conta da aplicação, só posso criar a clausula SQl da query em tempo de execução, impossibilitando a criação do campo calculado em tempo de projeto... Então gostaria de saber como criar um campo calculado em tempo de execução, ou seja, ao clicar no botão OK o campo for criado!!! Não sei se consegui explicar melhor, qq coisa retorna o email, ok?

Obrigada!


Responder

14/12/2003

Adilsond

  private
    { Private declarations }
    Table1Estado: TStringField;
  public


procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
  case Table1Preferred.Value of
    True : Table1Estado.Value := ´Sim´;
    False: Table1Estado.Value := ´Não´;
  else
    Table1Estado.Value := ´Não informado´;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Table1Estado := TStringField.Create(Table1);
  Table1Estado.Name := ´Table1Estado´;
  Table1Estado.FieldName := ´Estado´;
  Table1Estado.Size := 15;
  Table1Estado.Calculated := True;
  Table1Estado.Visible := True;
  Table1Estado.DataSet := Table1;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  Table1Estado.Free;
end;



Responder

15/12/2003

Xandraveiga

Muito Obrigada!!! Testei na minha aplicação e funcionou perfeitamente... Mas tenho outra dúvida! Como faço para criar em tempo de execução todos os campo da minha query? Eu quero agora fazer isso pra todos os campos já existentes, mas sem precisar ir de um por um e criar!!!!

Obrigada!


Responder

15/12/2003

Xandraveiga

Oi, Explicando melhor, gostaria de criar todos os StringFields pra minha qry em tempo de execução, mas todos de uma vez, sem precisar de ir de um por um... Será possível?

Obrigada!


Responder

16/12/2003

Adilsond

Peguei na net.

var
fCampo : TStringField;
fNome : TStringField;
fCodigo : TFloatField;
fFloat : TFloatField;
fData : TDateField;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
// Fecha a query
Query.Close;

// Limpa o sql
Query.SQL.Clear;

// Cria o sql
Query.SQL.Add(´Select(codigo, nome from funcionarios´);

// Campo nome
if not Assigned(fNome) then
begin
fNome := TStringField.Create(Self);
fNome.FieldName := ´nome´;
fNome.FieldKind := fkData;
fNome.Size := 30;
fNome.DisplayWidth := 30;
fNome.DataSet := Query;
end;

// Campo Código
if not Assigned(fCodigo) then
begin
fCodigo := TFloatField.Create(Self);
fCodigo.FieldName := ´codigo´;
fCodigo.FieldKind := fkData;
fCodigo.DisplayWidth := 10;
fCodigo.DataSet := Query;
end;

// Campo Calculado
if Assigned(fCampo) then
begin
fCampo := TStringField.Create(Self);
fCampo.FieldName := ´Inicial´;
fCampo.FieldKind := fkCalculated;
fCampo.Alignment := taCenter;
fCampo.Size := 1;
fCampo.DisplayWidth := 1;
fCampo.DataSet := Query;
end;

// Campo Calculado
if Assigned(fFloat) then
begin
fFloat := TFloatField.Create(Self);
fFloat.FieldName := ´Mult´;
fFloat.FieldKind := fkCalculated;
fFloat.Alignment := taCenter;
fFloat.DisplayWidth := 10;
fFloat.DataSet := Query;
end;

// Campo Calculado
if Assigned(fData) then
begin
fData := TDateField.Create(Self);
fData.FieldName := ´Data´;
fData.FieldKind := fkCalculated;
fData.Alignment := taCenter;
fData.DisplayWidth := 10;
fData.DataSet := Query;
end;

// Abre a Query...
Query.Open;

// Cria as colunas (OPCIONAL) usado para criar os titles.
with Grid.Columns do
begin
Items[0].Title.Caption := ´Cód.´;
Items[1].Title.Caption := ´Nome´;
Items[2].Title.Caption := ´Letra Inicial´;
Items[3].Title.Caption := ´2x Cód.´;
Items[4].Title.Caption := ´Data´;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// Se o campo foi criado tira-o da memória
if Assigned(fCampo) then fCampo.Free;
if Assigned(fNome) then fNome.Free;
if Assigned(fCodigo) then fCodigo.Free;
if Assigned(fFloat) then fFloat.Free;
if Assigned(fData) then fData.Free;
end;

procedure TForm1.QueryCalcFields(DataSet: TDataSet); // <------ Preste atenção para criar este evento!!
begin
Query.FieldByName(´Inicial´).asString := Copy(Query.Campo(´nome´),1,1);
Query.FieldByName(´mult´).asFloat := Query.GetInteger(´codigo´) * 2;
Query.FieldByName(´data´).asDateTime := Now;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Query.Select(´codigo,nome from funcion´);
with Grid.Columns do
begin
Items[0].Title.Caption := ´Cód.´;
Items[1].Title.Caption := ´Nome´;
end;
end;


Responder

16/12/2003

Xandraveiga

Obrigada!!! Consegui fazer, mas a linha if assign(campo) then só funcionou quando coloquei campo.free e campo:= nil depois.

Muitíssimo obrigada pela sua ajuda!!!


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar