Fórum Popular ComboBox + link com outra tabela delphi #622387
23/07/2024
0
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
1 2 3 4 5 6 | 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
Curtir tópico
+ 0Posts
23/07/2024
Arthur Heinrich
ComboGrupoContas.ItemIndex:=ComboGrupoContas.Items.IndexOf(Fornecedor.GrupoConta);
Gostei + 0
24/07/2024
Renan
1 | cbGrupoContas . ItemIndex := cbGrupoContas . Items . IndexOf(IntToStr(qrAux . FieldByName( '' COD_GRUPO_CONTAS '' ).AsInteger)); |
Gostei + 0
24/07/2024
Renan
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
24/07/2024
Arthur Heinrich
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).
1 2 3 4 5 6 | 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:
1 | cbGrupoContas.ItemIndex := cbGrupoContas.Items.Objects.IndexOfObject( TObject( qrAux.FieldByName(''COD_GRUPO_CONTAS'').AsInteger ) ); |
Gostei + 0
25/07/2024
Renan
Vou deixar aqui como ficou meu código
No show do form eu carrego o combo com os grupos ativos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 | 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
1 | edCodGrupoContas . Text := IntToStr( Integer (cbGrupoContas . Items . Objects[cbGrupoContas . ItemIndex])); |
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)