Popular ComboBox + link com outra tabela delphi

23/07/2024

0

Sei que o mais pratico seria usar o DbLookupComboBox, mas não quero usar componente com conexão ao banco.
A situação é a seguinte:

Tabela de Grupo de Contas
Tabela Fornecedores
Tabela Contas a Pagar

Na tabela de fornecedores eu gravo o codigo do Grupo de Conta.
Na tabela de Contas a pagar eu gravo o codigo do fornecedor e e codigo do grupo de contas

Então, ao inserir uma nova conta a pagar eu preciso popular o combobox com o nome do Grupo de Contas

Query.First;
while not Query.Eof do
  begin
    ComboGrupoContas.Items.Add(Query.FieldByName('NOME_GRUPO').AsString);
    Query.Next;
  end;


Porém, quando eu chamar o Fornecedor, preciso que o combobox, além de ter todos os grupos de contas, que me permitem alterar, mostre o grupo de conta que está vinculado ao fornecedor que chamei na pesquisa.
Renan

Renan

Responder

Posts

23/07/2024

Arthur Heinrich

Dá para tentar algo do tipo:

ComboGrupoContas.ItemIndex:=ComboGrupoContas.Items.IndexOf(Fornecedor.GrupoConta);
Responder

24/07/2024

Renan

Tentei o seguinte, mas o combo não mostra o Grupo de Conta

cbGrupoContas.ItemIndex := cbGrupoContas.Items.IndexOf(IntToStr(qrAux.FieldByName(''COD_GRUPO_CONTAS'').AsInteger));
Responder

24/07/2024

Renan

No entanto, entendo que a proposta do IndexOf seria buscar o nome do grupo de contas e não o codigo.
Porém na tabela onde eu busco a informação, tenho apenas o codigo gravado.
Neste caso eu teria que reestruturar a SQL para trazer o nome de uma outra tabela, certo?
Responder

24/07/2024

Arthur Heinrich

Correto. O que você procura tem que ser a mesma informação.

Talvez dê para fazer uma "gambiarra".

Sempre que um componente possui um TStringList, como é o caso do ComboBox.Items, o componente possui dois arrays. Uma para os objetos (Objects) e outro para as descrições (Strings).

É comum trabalharmos apenas com a descrição, que inclusive é a propriedade padrão.

Ao utilizar ComboBox.Items[3], estamos acessando ComboBox.Items.Strings[3], Mas também podemos acessar o ComboBox.Items.Objects[3].

O array Objects contém uma lista de TObject, que é a referência para uma classe. Um ponteiro tipado, de 4 bytes.

Podemos carregar o ComboBox.Items usando a função AddObject(const S: string; AObject: TObject) ao invés do Add(const S: string).

Query.First;
while not Query.Eof do
  begin
    ComboGrupoContas.Items.AddObject( Query.FieldByName('NOME_GRUPO').AsString, TObject(Query.FieldByName('COD_GRUPO').AsInteger) );
    Query.Next;
  end;


Feito isso, você terá tanto o código como o nome do grupo no seu ComboBox e poderá fazer a pesquisa pelo código:

  cbGrupoContas.ItemIndex := cbGrupoContas.Items.Objects.IndexOfObject( TObject( qrAux.FieldByName(''COD_GRUPO_CONTAS'').AsInteger ) );

Responder

25/07/2024

Renan

Obrigado pela dica, Arthur, funcionou perfeitamente.

Vou deixar aqui como ficou meu código

No show do form eu carrego o combo com os grupos ativos

  Qry := TIBQuery.Create(nil);
  try
    Qry.Database := FrmDm.dbBoletos;
    Qry.SQL.Clear;
    Qry.SQL.Add('SELECT CODIGO, NOME_GRUPO FROM GRUPO_CONTAS');
    Qry.SQL.Add('WHERE STATUS = :ST');
    Qry.SQL.Add('ORDER BY NOME_GRUPO');
    Qry.ParamByName('ST').AsString := 'ATIVO';
    Qry.Open;

    while not Qry.eof do
    begin
      cbGrupoContas.Items.AddObject(Qry.FieldByName('NOME_GRUPO').AsString, TObject(Integer(Qry.FieldByName('CODIGO').AsInteger)));
      Qry.Next;
    end;

  finally
    FreeAndNil(Qry);
  end;


no evento de enter do combo eu busco o item relacionado ao fornecedor que pesquisei

  cbGrupoContas.ItemIndex := cbGrupoContas.Items.IndexOfObject(TObject(qrAux.FieldByName('COD_GRUPO_CONTAS').AsInteger));


por fim, no evento de exit do combo, eu armazeno o codigo no edit, para posteriormente gravar

edCodGrupoContas.Text := IntToStr(Integer(cbGrupoContas.Items.Objects[cbGrupoContas.ItemIndex]));
Responder

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

Aceitar