Popular Combobox comparando valor de um edit ao campo de outra Tabela

Delphi

03/06/2013

olá a todos, Preciso de uma força de vcs.
meu form ao abrir já exibi o codigo do cliente em um edit ( Tabela Clientes).

neste form tenho um combobox que irá exibir as placas dos veiculos do cliente referente ao codigo do registro dele,
exibido no edit.

as placas dos veiculos, estão na tabela veiculos.
campos desta tabela Cod_Clie e Placa. Alphanumericos ( String)

preciso que ao abrir o form, seja filtrado, comparado, ou locate não sei?

se o codigo do edit no form da tabela clientes é igual ao campo cod_Clie da Tabela veiculos, se for igual fazer um add
( popular) o combobox somente com as placas dos veiculos deste cliente, caso este cliente tenha 3 veiculos exibi as tres
placas dos veiculos dele,para o usuario selecionar qual Placa (veiculo) do cliente será a ordem de serviço.

na tabela veiclos é gravado assim:

Cod_Clie Placa

34 DDD-9876
34 FFF-0033
34 AAA-0001
os cod_Clie são os mesmo do campo da tabela Cliente com o nome de codigo.

o Maximo que Consegui foi popular o combobox, porém sem um filtro, sendo assim ele lista todas as placas cadastradas que
não é o que preciso.

meu codigo:

TBCliente.refresh;
TBCliente.filter:='';

combobox1.clear;
TbVeiculos.first;
while not TbVeiculos.eof do begin
    combobox1.Items.Add(TbVeiculosPlaca.asstring);
    TbVeiculos.next;
end;
combobox1.itemindex:=0;
end;


peço a gentileza se possivel postar um exemplo do codigo desta rotina fazendo a comparação do veiculo do cliente pelo seu
codigo no edit e na tabela veiculos.


uso tabelas, banco de dados paradox, aplicativo pequeno.

contocom a juda de vcs, obrigado.
Gilvanio Gonçalves

Gilvanio Gonçalves

Curtidas 0

Respostas

André

André

03/06/2013

é so colocar assim ( while not TbVeiculos.eof do begin if tbclientesid = tbveiculosclie_id then
combobox1.Items.Add(TbVeiculosPlaca.asstring);
TbVeiculos.next; )
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

o código do Andreoid vai funcionar, mas vai navegar por todos os veículos de sua tabela.
O ideal mesmo é fazer um filtro nos veículos, pode ser feito no select se você estiver usando Query, ou usando a propriedade Filter em qualquer caso de outro DataSet.

Ex:

TBCliente.Refresh;
TBCliente.Filter := '';

TBVeiculos.Filter := 'COD_CLIE = ' + SEUEDIT.TEXT;
TBVeiculos.Filtered := True;

Combobox1.Clear;
TbVeiculos.First;
while not TBVeiculos.eof do 
begin
Combobox1.Items.Add(TbVeiculosPlaca.AsString);
TBVeiculos.Next;
end;
Combobox1.ItemIndex := 0;
TBVeiculos.Filtered := False;
GOSTEI 0
Guilherme Wiethaus

Guilherme Wiethaus

03/06/2013

Atençao: Quando se aplica uma propriedade Filter, os registros na realidade são restringidos ao que retorna um SELECT. Se um SELECT não houver restrição, primeiro buscará todos os registros do banco de dados e depois a exibição será restrita, mas os dados todos virão para a memória (na máquina cliente), causando enorme trafego de dados. É uma solução para conjunto de registros pequenos..mas se for buscar uma grande quantidade de veículos de todos os clientes e depois filtrar, não é uma boa. No caso de abertura de tabela usando um TTable, TADOTable, e por ai vai, este irá retornar todos os registros da tabela. Recomendo utilizar consultas SQL em um DataSet e não num Table.

Abraços
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

o código do Andreoid vai funcionar, mas vai navegar por todos os veículos de sua tabela.
O ideal mesmo é fazer um filtro nos veículos, pode ser feito no select se você estiver usando Query, ou usando a propriedade Filter em qualquer caso de outro DataSet.

Ex:

TBCliente.Refresh;
TBCliente.Filter := '';

TBVeiculos.Filter := 'COD_CLIE = ' + SEUEDIT.TEXT;
TBVeiculos.Filtered := True;

Combobox1.Clear;
TbVeiculos.First;
while not TBVeiculos.eof do 
begin
Combobox1.Items.Add(TbVeiculosPlaca.AsString);
TBVeiculos.Next;
end;
Combobox1.ItemIndex := 0;
TBVeiculos.Filtered := False;




Amigo Alands, seu codigo funcionou certissimo como eu queria.

ainda neste mesmo assunto do combobox. gostaria de perguntar o seguinte.

na tabela veiculos tem também os campos marca, tipo, cor e ano.

estes dados também devem ser exibidos no edits do mesmo form.

ou seja quando o usuario selecionar a placa deseja no combobox,
os edits receberam os restante dos dados do veiculo que corresponde
a placa selecionada.

pode me dar a luz de como fazer isto?.

eu não perguntei antes para não ficar confuso o meu topico já no inicio.

exemplo : edit com codigo do cliente, codigo 11, combobox populado com as
placas dos veiculos deste cliente codigo 11.

placas no combobox / Dados da Tabela de cada placa
marca tipo cor ano

gku-0000 wv fusca branco 83
gku-0001 fiat uno 1.0 Azul 2000
gku-0002 ford ka 1.0 prata 99/99

o usuario seleciona a placa gku-0002 e os edits recebem os dados deste veiculo.

pode me ajudar como fazer isto, conto com a ajuda de vcs me resta só isto para finalizar,obrigado.
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

Guilherme está correto, por isso eu citei o Filter para os datasets "não Query". (creio que você disse ser um projeto pequeno em Paradox, então inicialmente não tem maiores problemas usar o Filter)

Bom, dá pra você usar ao invés de uma Combobox um DBLookupComboBox ligado ao seu dataset de veículos filtrados, assim você não precisa populá-la e poderá usar os outros DBControls para apresentar os dados do veículo selecionado.

Agora, se for mesmo necessário trabalhar sem o auxílio dos DBControls, dá pra carregar um objeto com os dados do veículo na ComboBox e recuperá-los depois, mas isso é um recurso meio bobo, ou fazer um Locate no seu dataset de veículos e pegar os dados pelos Fields da sua Table.
GOSTEI 0
Guilherme Wiethaus

Guilherme Wiethaus

03/06/2013

Bom, o que faço geralmetne e é muito prático é popular o combobox manualmente só que utilziando dados virtuais. onde eu guardo os inides e chaves a qual pode ser recuperado facilmente o item selecionado através de seu dados virtuais, ou seja o ponteiro para TObject incluído. Depois claro ao finalizar o for ou quando dou um requeri também tenho o cuidado de desalocar isto e realocar novamente com novos dados o combobox. Se precisar da idéia eu posso postar aqui parte do código que faz isto, mas somente se precisar.

Abraços
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

Guilherme está correto, por isso eu citei o Filter para os datasets "não Query". (creio que você disse ser um projeto pequeno em Paradox, então inicialmente não tem maiores problemas usar o Filter)

Bom, dá pra você usar ao invés de uma Combobox um DBLookupComboBox ligado ao seu dataset de veículos filtrados, assim você não precisa populá-la e poderá usar os outros DBControls para apresentar os dados do veículo selecionado.

Agora, se for mesmo necessário trabalhar sem o auxílio dos DBControls, dá pra carregar um objeto com os dados do veículo na ComboBox e recuperá-los depois, mas isso é um recurso meio bobo, ou fazer um Locate no seu dataset de veículos e pegar os dados pelos Fields da sua Table.



Tem como me passar um exemplo como seria este locate?.
GOSTEI 0
Guilherme Wiethaus

Guilherme Wiethaus

03/06/2013

Sim, eu não estou com o código aqui funcional em meu trabalho, mas em breve vou colocar aqui. Aguarde.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

Guilherme está correto, por isso eu citei o Filter para os datasets "não Query". (creio que você disse ser um projeto pequeno em Paradox, então inicialmente não tem maiores problemas usar o Filter)

Bom, dá pra você usar ao invés de uma Combobox um DBLookupComboBox ligado ao seu dataset de veículos filtrados, assim você não precisa populá-la e poderá usar os outros DBControls para apresentar os dados do veículo selecionado.

Agora, se for mesmo necessário trabalhar sem o auxílio dos DBControls, dá pra carregar um objeto com os dados do veículo na ComboBox e recuperá-los depois, mas isso é um recurso meio bobo, ou fazer um Locate no seu dataset de veículos e pegar os dados pelos Fields da sua Table.


Amigo Alans no caso de usar o dblookupcombobox, tem como vc me orientar como seria as propridades dele
e como seria para o edits exibirem o dados da placa selecionada nele.
pode me ajudar se usando dblookcombobox é mais pratico eu mudo pra ele.

desde já agradeço a força.
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

basicamente vc vai precisar de três propriedades do DBLookupComboBox:

ListSource: o TDataSource ligado ao DataSet que você quer usar (no seu caso ligado ao TBVeiculos).
ListField: o campo que será listado pelo componente, no seu caso a placa do veículo.
KeyField: um campo de referencial, geralmente a PK de sua tabela ou um campo de id único (se a placa não se repetir pode até ser ela!)

para apresentar os outros dados, é só manter componentes TDBEdit ou TDBText (dependendo da sua necessidade) ligados nos campos que você quer que eles exibam.

Montei um exemplo bem rápido só pra ser usado como base (está BEM básico): [url]http://www.4shared.com/zip/pCgT4eXx/exemploLookup.html[/url]
GOSTEI 0
André

André

03/06/2013

Amigo Gilvanio

talvez nao der p usar dblookupcombobox
vc vai ter q usar varias query para fazer o que vc quer
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

se a sua tabela de veículos tiver todos esses dados, funciona como no meu exemplo.
agora se estiverem em várias tabelas espalhadas, realmente você vai precisar de uma Query que te retorne os dados para você ligar aos componentes, inclusive no DBLookupComboBox.
GOSTEI 0
Alisson Santos

Alisson Santos

03/06/2013

Dica.
Procure criar um metodo de verificação, aonde você monta um sql dinamico passando o código do veiculo e retornando o que precisa.
Quando sair do campo combobox você preenche os edits com o retorno das informações.
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

basicamente vc vai precisar de três propriedades do DBLookupComboBox:

ListSource: o TDataSource ligado ao DataSet que você quer usar (no seu caso ligado ao TBVeiculos).
ListField: o campo que será listado pelo componente, no seu caso a placa do veículo.
KeyField: um campo de referencial, geralmente a PK de sua tabela ou um campo de id único (se a placa não se repetir pode até ser ela!)

para apresentar os outros dados, é só manter componentes TDBEdit ou TDBText (dependendo da sua necessidade) ligados nos campos que você quer que eles exibam.

Montei um exemplo bem rápido só pra ser usado como base (está BEM básico): [url]http://www.4shared.com/zip/pCgT4eXx/exemploLookup.html[/url]



Amigo Alanps

Peguei o seu exemplo, porém não entendi bém.

no codigo para mim ficaria Asssim:

Table1.Filtered := False;
Table1.Filter := 'Placa = ' + QuotedStr('Davis');
Table1.Filtered := True;

onde esta davis eu devo colocar o que?

na proridade do dblookupcombobx fiz assim

ListField = Placa
KeyField = Cod // campo que não se repete.

mas ao filtrar ele exibi todas as placas da tabela. não de cliente expecifico.

como faço para que o dblookup tenha somente as placas desejadas.

exemplo cliente 11 no edit do form, exebi todas as placas do veiculos deste cliente.

como disse tenho duas tabelas uma cliente e outra veiculos.

na tabela cliente campo codigo.

na tabela veiculos
campo cod que não se repete.
campo placa / que pode sim uma placa se repetida devido a cidade e estado.
e campo cod_clie que contem o mesmo codigo do cliente, da tabela cliente.

te incomodando mais uma vez, pode me ajudar.
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

o filtro não muda, continua aquele que você tinha montado:

TBVeiculos.Filter := 'COD_CLIE = ' + SEUEDIT.TEXT;
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

o filtro não muda, continua aquele que você tinha montado:

TBVeiculos.Filter := 'COD_CLIE = ' + SEUEDIT.TEXT;




Alanps.

fiz como vc disse mas mesmo assim lista todas as placas e não as placas do
codigo do cliente que esta no edit1.

TbVeiculos.Filtered := False;
  TbVeiculos.Filter := 'Cod_Clie = ' + Edit1.Text;
  TTbveiculos.Filtered := True;



dblookupcombobox


listfield = placa

keyfield = cod / campo da tabela que não repete.

listsource = dsveiculos.// tabela veiculos

eu tenho que usar somente este codigo que vc me passou, ou tenho que aproveitar
os que te mostrei nos topicos acima porém sendo combobox, tenho que adaptar algo?

o que estou fazendo de errado.

o campo cod da tabela veiculos é autoincremento, vc acha que devo criar um campo tipo cod_veiculo
que também não se repetirá e usar ele no lugar do cod?.

sei que estou te incomadando muito, e te digo que estou é apanhando muiiiiiiiito.






GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

estranho, no teste que eu enviei vc chegou a ver? lá funciona o filtro no DBLookupComboBox...

esse dsVeiculos está vinculado ao TBVeiculos que vc está filtrando?
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

estranho, no teste que eu enviei vc chegou a ver? lá funciona o filtro no DBLookupComboBox...

esse dsVeiculos está vinculado ao TBVeiculos que vc está filtrando?


Amigo fiz o seguinte o aplicativo esta no 4Shared para vc dar uma olhada, não ~e o sistema todo
é o mesmo form que vc me enciou, nele fiz um teste com minhas tabelas, dê uma olhada por favor
e veja o que eu fiz errado.
pois o seu exemplo funciona sim mas tambem carega todos os dados da tabela.

http://www.4shared.com/rar/3Sk1Tmcv/aplicativo.html
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

depois vou dar uma olhada, mas no meu tem dois modos: com e sem filtro (só fiz para demonstrar como ficaria com os dados filtrados) e como eu disse, era um exemplo BEM básico...
GOSTEI 0
Alan Souza

Alan Souza

03/06/2013

seu código está certo, o problema é o filtro que vc está usando, que é pelo código do cliente, e não pela placa como vc montou...

no caso só substituí a linha do filtro para

TbVeiculos.Filter := 'cod_clie = ' + Edit1.Text;

que funciona do jeito que você quer!
GOSTEI 0
Gilvanio Gonçalves

Gilvanio Gonçalves

03/06/2013

seu código está certo, o problema é o filtro que vc está usando, que é pelo código do cliente, e não pela placa como vc montou...

no caso só substituí a linha do filtro para

TbVeiculos.Filter := 'cod_clie = ' + Edit1.Text;

que funciona do jeito que você quer!


Alanps. Muito Obrigado por me ajudar neste topico o tempo todo.

sei que tomei bastante o seu tempo, desculpe por isto.


deu certo como vc disse, o erro estava como estava sendo filtrado.
fiz como vc postou o filtro e deu certo como eu preciso.


DEUS te Abençoe e te Capacite sempre, poucos ajudam como vc me ajudou.


um Abraço e Muito Obrigado.
GOSTEI 0
POSTAR