GARANTIR DESCONTO

Fórum Adicionar Tfields em tempo de execução #240220

28/06/2004

0

Pessoal, estou com essa dúvida faz tempo, e parece que existem no forum outros colegas nossos com a mesma duvida: Se mudamos a consulta SQL a uma tabela em tempo de execução, num ibtable ou ibdataset, como mudar tb os fields? :shock: o que eu quero fazer é dar um ´add all fields´ em tempo de execução!!!, Mas não sei como :cry:
Se alguém souber....

Agradeço desde já


Vitor Rubio

Vitor Rubio

Responder

Post mais votado

10/08/2017

Se oque você quer é definir os fields dinamicamente em run-time é simples:

SuaQuery.FieldList.Create(SuaQuery);


com isto ele irá criar os fields com base no sql que você rodou

Nbs Ltda

Nbs Ltda
Responder

Gostei + 1

Mais Posts

28/06/2004

Koplin

Se a tabela vai exibir dados diversos, é melhor não definir os TFields em design time.
Quando a consulta mudar, os campos serão mopstrados, acrescidos ou suprimidos normalmente. Para evitar que o titulo dos campos (field name) apareçam com nomes estranhos tipo COD_CLI faça a consulta como algo assim:
select COD_CLI as Codigo, NOME_CLI as Nome...

Pode-se mudar os TFields usando a propriedade FieldsDef. Se preferir este caminho, dê uma olhada nesta propriedade.


Responder

Gostei + 0

28/06/2004

Vitor Rubio

Mas o que eu queria era justamente isso! Ao mudar a tabela da minha consulta, automaticamente adicionar os Tfields com os nomes padrão do delphi mesmo, assim eu poderia referencia-los como ibquery1COD_CLI.value numa tabela que traz o cod do cliente, ou ibquery1.COD_FOR.value, numa consulta que traria o cod do fornecedor, mas valeu, obrigado mesmo assim! :wink:


Responder

Gostei + 0

28/06/2004

Danielrossi

tbm estou querendo utilizar esse esquema, mas para colocar valor no displayformat dos campos q forem ftInteger, ftFloat,....


Responder

Gostei + 0

28/06/2004

Bon Jovi

tbm estou querendo utilizar esse esquema, mas para colocar valor no displayformat dos campos q forem ftInteger, ftFloat,....

DanielRossi,

Como os TFields já são criados dinamicamente pelo Delphi após o Open, então no seu caso basta alterar a propriedade depois do Open...

Exemplo:
procedure TForm1.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
  PreencheDisplayFormat(DataSet);
end;

procedure TForm1.PreencheDisplayFormat(DataSet: TDataSet);
var
  i: integer;
begin
  for i := 0 to DataSet.Fields.Count - 1 do
  begin
    if DataSet.Fields[i] is TFloatField then
      TFloatField(DataSet.Fields[i]).DisplayFormat := ´,0.00´
    else if DataSet.Fields[i] is TIntegerField then
      TIntegerField(DataSet.Fields[i]).DisplayFormat := ´000´;    
  end;
end;


E vitor^_^, não entendi exatamente qual sua necessidade.


Responder

Gostei + 0

29/06/2004

Vitor Rubio

Minha necessidade é a seguinte: em tempo de design eu posso mudar o SQL da query, ativar, abrir o fields editor e dar um ´add all fields´, Certo?

O que eu queria era fazer tudo isso em run-time, por ex.: uma query do tipo ´select cod_cli, nome_cli from cleites´ tem os campos cod_cli e nome_cli, mas, e se em runtime eu alterar a query para ´select * from fornecedores´, os campos seriam outros, como adicionar esses Tfields em tempo de execução?


Responder

Gostei + 0

30/06/2004

Bon Jovi

Isso é possível, mas no seu caso também não vejo necessidade, pois o Delphi já recria automaticamente ao reabrir a query. Vc só não pode criar os TFields em tempo de design. Delete todos os TFields que tenha criado caso tenha feito isso. E se o tipo de DataSet que esteja usando tiver a propriedade FieldDefs, também remova em design.

DataSet.Close;
DataSet.SQL.Text := ´SELECT CODIGO, NOME FROM PRODUTO´;
DataSet.Open;
//Delphi criou os TFields para Codigo e Nome
ShowMessage(DataSet.FieldByName(´NOME´).AsString);

DataSet.Close;
DataSet.SQL.Text := ´SELECT TELEFONE FROM CLIENTE´;
DataSet.Open;
//Delphi limpou os TFields do DataSet e criou o TField para para Telefone
ShowMessage(DataSet.FieldByName(´Telefone´).AsString);


Responder

Gostei + 0

30/06/2004

Everton

Vitor, o código abaixo pode te dar uma ´luz´.

procedure InsereFields(Form: TForm; ADataSet: TDataSet);
var I: Integer;
    Field: TComponent;
begin
  ADataSet.Active := False;
  For I := 0 to (ADataSet.Fields.Count - 1) do
  begin
    Case ADataSet.Fields[I].DataType of
       ftBlob:
         begin
           Field := TBlobField.Create(Form);
           TBlobField(Field).FieldName := ADataSet.Fields[I].FieldName;
           TBlobField(Field).DisplayLabel := ADataSet.Fields[I].DisplayLabel;
           TBlobField(Field).Size := ADataSet.Fields[I].Size;
           TBlobField(Field).DisplayWidth := ADataSet.Fields[I].DisplayWidth;
           TBlobField(Field).Required := ADataSet.Fields[I].Required;
           TBlobField(Field).DataSet := ADataSet;
         end;
       ftBoolean:
         begin
           Field := TBooleanField.Create(Form);
           TBooleanField(Field).FieldName := ADataSet.Fields[I].FieldName;
           TBooleanField(Field).DisplayLabel := ADataSet.Fields[I].DisplayLabel;
           TBooleanField(Field).Size := ADataSet.Fields[I].Size;
           TBooleanField(Field).DisplayWidth := ADataSet.Fields[I].DisplayWidth;
           TBooleanField(Field).Required := ADataSet.Fields[I].Required;
           TBooleanField(Field).DataSet := ADataSet;
         end;
         // E por aí vai ...
    end;
    Field.Name := ADataSet.Name + ADataSet.Fields[I].FieldName;
  end;
end;



Responder

Gostei + 0

30/06/2004

Vitor Rubio

Pessoal, na verdade, o que eu estou fazendo é um componente filho de TibDataset onde eu pudesse, em tempo de design, abrir um arquivo-texto com uma query, colocar essa query na propriedade SQL e adicionar os tfields, em tempo de design mesmo, automaticamente (assim que ativasse a query). Mas para saber como adicionar os Tfields automaticamente em tempo de design, eu teria que saber como fazer isso em tempo de execução. [b:b01b3be96e]A Penúltima dica, do nosso amigo Bon Jovi deu certo, Funcionou legal, mas em Run-time. Especialmente útil foi a última dica, do nosso amigo Everton, que eu pretendo aplicar agora.

Pessoal, muito obrigado mesmo!!!![/b:b01b3be96e] qualquer coisa, me ponho a disposição, meu e-mail e outros contatos vc´s podem conferir no meu perfil!

FLW!


Responder

Gostei + 0

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

Aceitar