Campo calculado em tempo de execução!!!
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!
:?:
Obrigada!
:?:
Xandraveiga
Curtidas 0
Respostas
Rob
12/12/2003
Poderia ser mais explicativa???
Não entendi bem a pergunta
Não entendi bem a pergunta
GOSTEI 0
Xandraveiga
12/12/2003
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!
Obrigada!
GOSTEI 0
Adilsond
12/12/2003
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;
GOSTEI 0
Xandraveiga
12/12/2003
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!
Obrigada!
GOSTEI 0
Xandraveiga
12/12/2003
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!
Obrigada!
GOSTEI 0
Adilsond
12/12/2003
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;
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;
GOSTEI 0
Xandraveiga
12/12/2003
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!!!
Muitíssimo obrigada pela sua ajuda!!!
GOSTEI 0