Ir para conteúdo
Fórum Script Brasil
  • 0

erro ao criar campo lookup em tempo de execução


flavioavilela

Pergunta

boa tarde galera...

estou tentando criar um campo lookup em tempo de execução...

if dm.qryficha_anotacao_geral.FindField('Situacao') = Nil then
                            begin
                              with TStringField.Create(dm.qryficha_anotacao_geral) do
                                begin
                                  FieldKind:= fkLookup;
                                  FieldName:= 'Situacao';
                                  DataSet:= dm.qryficha_anotacao_geral;
                                  Name:= DataSet.Name + FieldName;
                                  KeyFields:= 'Codigo_Situacao';
                                  LookupDataSet:= dm.qrycadastro_situacao;
                                  LookupKeyFields:= 'Codigo_Situacao';
                                  LookupResultField:= 'Situacao';
                                  LookupCache:= true;
                                  dm.qryficha_anotacao_geral.FieldDefs.Add(Name, FTString, 30, True);
                                end;
                            end;

até então está quase certo, só que, quando eu dou um .Open na query ele fala que o campo Codigo_Situacao não foi encontrado e minha query no meu dm está toda em branco, pois é uma query que uso pra fazer outras operações, então, ela está toda em branco, não tem nenhum campo nela, justamente pra fazer outras tarefas dentro do sistema.... ai, eu tendo dar o .Open antes de criar o campo lookup, porque dai ele iria achar o campo Codigo_Situacao, só que ai ele fala que não pode criar o campo em um dataset aberto...

alguém tem uma dica???? desde já, agradeço a todos....

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0
ai, eu tendo dar o .Open antes de criar o campo lookup, porque dai ele iria achar o campo Codigo_Situacao, só que ai ele fala que não pode criar o campo em um dataset aberto...

alguém tem uma dica???? desde já, agradeço a todos....

De maneira bem simples seria isso... É só adaptar ao seu código

procedure TForm1.FormActivate(Sender: TObject);
begin
   Query1.Active := false;
   Query1.SQL.Clear;
   Query1.SQL.Append('SELECT Cidade, Estado FROM Cidades');
   Query1.Active := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   with DBLookupComboBox1 do
   begin
      ListSource := DataSource1;
      ListField := 'Cidade'; // nome do campo definido na Query
      KeyField := 'Cidade';  // nome do campo definido na Query
   end;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

o lance é que eu não estou querendo usar ele num dblookupcombobox... eu quero é transformar o Codigo_Alguma_Coisa em Alguma_Coisa saca... estou fazendo um select na query e chamo um codigo saca, que é uma chave estrangeira... ai eu quero chamar a descrição daquele código no dbgrid...

Link para o comentário
Compartilhar em outros sites

  • 0

Criando um campo lookup em tempo de execução

Uses 
Forms, Classes, Controls, StdCtrls, Db, DBTables, DBCtrls; 
type 
TForm1 = class(TForm) 
Table1: TTable; 
Table2: TTable; 
Button1: TButton; 
DBLookupComboBox1: TDBLookupComboBox; 
DataSource1: TDataSource; 
Table2Codigo: TFloatField; // Objeto campo chave código usado pelo lookup 
procedure Button1Click(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 
var 
Form1: TForm1; 
implementation 
{$R *.DFM} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
Nome : string; 
begin 
with TStringField.Create(Table2) do 
begin 
FieldName := 'MeuCampoLookup'; 
FieldKind:= fkLookup; 
DataSet := Table2; 
Nome := Dataset.Name + FieldName; 
KeyFields:= 'Codigo'; //Campo Chave 
LookUpDataset:= Table1; 
LookUpKeyFields:= 'Codigo'; //Campo Chave 
LookUpResultField:= 'Nome'; //Resultado da campo lookup criado 
DbLookupCombobox1.DataField:= FieldName; 
DataSource1.DataSet:= Dataset; 
Table2.FieldDefs.Add(Nome, ftString, 20, false); 
end; 
DbLookupCombobox1.DataSource:= Datasource1; 
Table1.Active:= True; 
Table2.Active:= True; 
end; 
end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
cara, não deu certo... da a mensagem de erro query1: Field 'Field1' not found...

ah, só uma coisa, não uso dblookupcomobox, estou mostrando esse resultado num dbgrid junto com outros campos..

como voce pode perceber, no código existe um componente DbLookupCombobox que recebe o nome do campo lookup criado .... DbLookupCombobox1.DataField:= FieldName;

Voce pode criar o componente em tempo de execução tambem

Quanto ao erro, veja que o exemplo que te passei usa table e não query ... entretanto isso não impediria de usar query no lugar do table .... como a query usa um select voce não pode especificar campos, senão o erro query1: Field 'Field1' not found... ( Campo 'Campo1' não encontrado ) irá ocorrer.

Tente entender o código para poder aplica-lo ao seu proposito

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
certo, então se a query não posso especificar campos, como faço isso com a query???

A select da query deve estar assim

select * from tabela //

Fiz um teste usando query .... segue o código

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, Db, DBTables, StdCtrls, DBCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBLookupComboBox1: TDBLookupComboBox;
    DataSource2: TDataSource;
    Query1: TQuery;
    Query2: TQuery;
    Query1PAPEL: TStringField;
    Query1COD: TStringField;
    Query1NUM: TFloatField;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Nome : string;
begin
   with TStringField.Create(Query2) do
   begin
      FieldName := 'MeuCampoLookup';
      FieldKind:= fkLookup;
      DataSet := Query1;
      Nome := Dataset.Name + FieldName;
      KeyFields:= 'COD'; //Campo Chave
      LookUpDataset:= Query2;
      LookUpKeyFields:= 'COD'; //Campo Chave
      LookUpResultField:= 'COD'; //Resultado da campo lookup criado
      DbLookupCombobox1.DataField:= FieldName;
      DataSource1.DataSet:= Dataset;
      Query2.FieldDefs.Add(Nome, ftString, 20, false);
   end;
   DbLookupCombobox1.DataSource:= Datasource1;
   Query1.Active:= True;
   Query2.Active:= True;
end;
end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

desculpe a demora para responder, mas é q estou incucado com outros problemas q acabei "esquecendo" desse...

mas, então deve ser por causa da minha query que não estou chamando assim 'select * from tabela' que não está funcionando... mas eu não posso chamar todos os campos, é uma exigencia do relatório ter apenas alguns campos principais saca.... e ai, tem alguma outra solução ou só alterando o sql da query???

Link para o comentário
Compartilhar em outros sites

  • 0
desculpe a demora para responder, mas é q estou incucado com outros problemas q acabei "esquecendo" desse...

mas, então deve ser por causa da minha query que não estou chamando assim 'select * from tabela' que não está funcionando... mas eu não posso chamar todos os campos, é uma exigencia do relatório ter apenas alguns campos principais saca.... e ai, tem alguma outra solução ou só alterando o sql da query???

Faça um teste com o código acima e especifice os campos que voce quer na select e veja se funciona

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...