Popular ComboBox + link com outra tabela delphi
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
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.
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
Curtidas 0
Respostas
Arthur Heinrich
23/07/2024
Dá para tentar algo do tipo:
ComboGrupoContas.ItemIndex:=ComboGrupoContas.Items.IndexOf(Fornecedor.GrupoConta);
ComboGrupoContas.ItemIndex:=ComboGrupoContas.Items.IndexOf(Fornecedor.GrupoConta);
GOSTEI 0
Renan
23/07/2024
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));
GOSTEI 0
Renan
23/07/2024
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?
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?
GOSTEI 0
Arthur Heinrich
23/07/2024
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).
Feito isso, você terá tanto o código como o nome do grupo no seu ComboBox e poderá fazer a pesquisa pelo código:
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 ) );
GOSTEI 0
Renan
23/07/2024
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
no evento de enter do combo eu busco o item relacionado ao fornecedor que pesquisei
por fim, no evento de exit do combo, eu armazeno o codigo no edit, para posteriormente gravar
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]));
GOSTEI 0