Adicionar Tfields em tempo de execução
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á
Se alguém souber....
Agradeço desde já
Vitor Rubio
Curtidas 0
Melhor post
Nbs Ltda
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
SuaQuery.FieldList.Create(SuaQuery);
com isto ele irá criar os fields com base no sql que você rodou
GOSTEI 1
Mais Respostas
Koplin
28/06/2004
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.
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.
GOSTEI 0
Vitor Rubio
28/06/2004
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:
GOSTEI 0
Danielrossi
28/06/2004
tbm estou querendo utilizar esse esquema, mas para colocar valor no displayformat dos campos q forem ftInteger, ftFloat,....
GOSTEI 0
Bon Jovi
28/06/2004
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.
GOSTEI 0
Vitor Rubio
28/06/2004
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?
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?
GOSTEI 0
Bon Jovi
28/06/2004
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);
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);
GOSTEI 0
Everton
28/06/2004
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;
GOSTEI 0
Vitor Rubio
28/06/2004
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!
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!
GOSTEI 0