Fórum Duvidas com comando ComboBox e Locate? #333553
23/11/2006
0
Bom minha duvida agora eh sobre o LOCATE e um codigo que eu fiz no ComboBox (Veja bem NAO quero usar o DBLoockupComboBox ou outro da paleta Data Controls) tem que ser com o combobox mesmo
entao o codigo que eu criei no combobox
var c: string; begin //referente ao combobox******** with dm.qrylimpa do begin close; sql.clear; combobox1.Clear; sql.add(´select * from corrente´); sql.add(´where (matricula = :pMatricula)´); parambyname(´pmatricula´).asString := edit1.text; sql.add(c); Open; while dm.qrylimpa.Eof = false do begin ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 )); // + ´ - ´ + (dm.qrylimpa.fieldbyname(´mespgto´).AsString)); dm.qrylimpa.next; end; end; end;
Mais se eu quiser colocar nesta linha abaixo do EOF desta forma:
[b:39a2c3fb24]ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + ´ - ´ + (dm.qrylimpa.fieldbyname(´mespgto´).AsString));[/b:39a2c3fb24] Ou seja mostra certinho dentro do combobox os dois campos, mais ai vem o probelma com o LOCATE
procedure TForm8.ComboBox1Click(Sender: TObject); begin if DM.QRYLIMPA.LOCATE(´SEQUENCIA´,(combobox1.text),[]) then BEGIN MASKEDIT1.TEXT:=DM.QRYLIMPA.FieldByName(´MESPGTO´).VALUE; MASKEDIT2.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFINI´).VALUE; MASKEDIT3.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFFIM´).VALUE; maskedit1.enabled:=true; maskedit2.enabled:=true; maskedit3.enabled:=true; end; end;
Bom entao vem a pergunta:
Tem como usar o LOCATE em mais de um campo? E tambem devo titar essa linha [b:39a2c3fb24]´ - ´[/b:39a2c3fb24] que separa um campo do outro?
Ou tenho que fazer via SQL?
Se for fazer via SQL devo fazer como o filtro? No caso em SQL sei que se filtrar na dbGrid vai aparecer somente o campo que satisfaça a condiçao.
Por isso achei melhor o LOCATE pois nele posso mostrar todos os dados na grade, pois no caso essa grade as consultas nao repetem datas pq nao eh permitido la no form de lançamento.
Bom se nao entenderam posso reformular a pergunta
do mais
No aguardo
sem mais agradeço a ajuda de todos
Adriano.
Adriano_servitec
Curtir tópico
+ 0Posts
23/11/2006
Marco Salles
Porque que voce não trata o texto a ser pesquisado...
se tudo tivar bem formatado , acho que resolve.
Gostei + 0
23/11/2006
Adriano_servitec
Valeu pela dica
Muito obrigado amigo.
Gostei + 0
23/11/2006
Adriano_servitec
ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + ´ - ´ + (dm.qrylimpa.fieldbyname(´mespgto´).AsString)); dm.qrylimpa.next;
Tentei assim tambem e nao funcionou
if DM.QRYLIMPA.LOCATE(´SEQUENCIA´,(copy(combobox1.text, 0,(pos(´-´, combobox1.text)))),[]) then BEGIN MASKEDIT1.TEXT:=DM.QRYLIMPA.FieldByName(´MESPGTO´).VALUE; MASKEDIT2.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFINI´).VALUE; MASKEDIT3.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFFIM´).VALUE; maskedit1.enabled:=true; maskedit2.enabled:=true; maskedit3.enabled:=true; end;
Veja bem o combo esta carregando assim
003 - 31/01/2006
005 - 15/04/2006
Nao consigo usar o locate assim com dois campos dentro do combo[/code]
Gostei + 0
24/11/2006
Marco Salles
me parece que a sua formatação , coloca um espaço vazio depois do campo Sequencia e antes do Traço ´-´
então se na sua tabela tiver gravado assim [b:d8603aaee0]´003´[/b:d8603aaee0] e voce tiver fazendo um locate assim [b:d8603aaee0]´003 ´[/b:d8603aaee0] e claro que não vai dar certo...
[b:d8603aaee0]´Acreditando´[/b:d8603aaee0] que o campo Sequencia é numerico , corrija-me se eu estiver errado ´ voce pode usar como delimitador o espaço vazio ao inves do Traço..Ficandio assim :
procedure TForm8.ComboBox1Click(Sender: TObject);
Gostei + 0
24/11/2006
Adriano_servitec
Bom amigo, obrigado por me ajudar.
Valeu
Adriano
Gostei + 0
24/11/2006
Marco Salles
mas fico feliz por ter resolvido :P :P
Gostei + 0
24/11/2006
Adriano_servitec
mas fico feliz por ter resolvido :P :P[/quote:496215f5c4]
Bom amigo, se vc quiser dar continuidade vamos partir do começo entao
1º - Tenho uma tabela em Firebird 2.0 chamada corrente que esta assim
Entao tenho um form aonde digito dentro de um edit digito a matricula referente ao associado, ai esse form eh um form de alteraçao de datas, o que eu fiz: Uso o campo sequencia para fazer um update assim
procedure TForm8.b2Click(Sender: TObject);
begin
with dm.QryLimpa do
begin
sql.clear;
sql.add(´select * from corrente´);
sql.add(´WHERE (matricula = :pmatricula) and (mespgto = :pmp) and (mesrefini = :pmi) and (mesreffim = :pmf)´);
parambyname(´pmatricula´).asString := edit1.text;
parambyname(´pmp´).asdate := StrToDate(maskedit1.text);
parambyname(´pmi´).asdate := StrToDate(maskedit2.text);
parambyname(´pmf´).asdate := StrToDate(maskedit3.text);
open;
end;
if DM.qryLimpa.RecordCount > 0 then begin
showmessage(´Dados Duplicados! Inserção não permitida!´);
dm.QryLimpa.CLOSE;
dm.QryLimpa.OPEN;
MASKEDIT1.SETFOCUS;
end else begin
{comandos de inserção }
if application.messagebox(Pchar(´Deseja Alterar este Lançamento:´ + #13+ dm.qrylimpa.FieldByName(´Sequencia´).AsString +´ ´+ 13+ dm.qrylimpa.FieldByName(´associado´).AsString), Pchar(´Alterar Dados ´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
with dm.qrylimpa do begin
close;
SQL.Clear;
SQL.text:=´update corrente set mespgto = :pmp, mesrefini = :pmi, mesreffim = :pmf ´+´Where (SEQUENCIA = :pSEQUENCIA)´;
parambyname(´pSEQUENCIA´).asString := edit2.text;
parambyname(´pmp´).asdate := StrToDate(MASKEDIT1.text);
parambyname(´pmi´).asdate := StrToDate(MASKEDIT2.text);
parambyname(´pmf´).asdate := StrToDate(MASKEDIT3.text);
try
ExecSQL;
dm.tlimpa.commit;
dm.qrylimpa.close;
dm.qrylimpa.sql.clear;
dm.qrylimpa.sql.text := ´select * from corrente where matricula = :matricula´;
dm.qrylimpa.Open;
sbar.SimpleText := ´Dados Alterados...´;
b2.enabled:=false;
maskedit1.enabled:=false;
maskedit2.enabled:=false;
maskedit3.enabled:=false;
edit1.enabled:=false;
edit2.enabled:=false;
b1.enabled:=true;
b1.setfocus;
except
On E:Exception do begin
dm.ibt2.Rollback;
dm.tlimpa.Rollback;
sbar.SimpleText := ´Abortado...´;
Showmessage(´Falha na Alteração dos Dados!´#1310´Mensagem: ´+E.Message);
end;
end;
end;
end;
end;
end;procedure TForm8.ComboBox1Exit(Sender: TObject); var TextoTratado:String; begin textoTratado:=combobox1.text; //espaço vazio ao inves do traço delete(textoTratado,pos(´´,textoTratado),maxInt); if DM.QRYLIMPA.LOCATE(´SEQUENCIA´,(textoTratado),[]) then begin MASKEDIT1.TEXT:=DM.QRYLIMPA.FieldByName(´MESPGTO´).VALUE; MASKEDIT2.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFINI´).VALUE; MASKEDIT3.TEXT:=DM.QRYLIMPA.FieldByName(´MESREFFIM´).VALUE; maskedit1.enabled:=true; maskedit2.enabled:=true; maskedit3.enabled:=true; end; end;
Pq. optei pelo combobox se o dbLoockuoComboBox eh bem mais facil? Talvez seja para obter mais conhecimentos sobre usar esse componente.
Entao para carregar o combobox resolvi fazer assim
var c: string; begin //referente ao combobox******** with dm.qrylimpa do begin close; sql.clear; combobox1.Clear; sql.add(´select * from corrente´); sql.add(´where (matricula = :pMatricula)´); parambyname(´pmatricula´).asString := edit1.text; sql.add(c); Open; while dm.qrylimpa.Eof = false do begin ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + ´ ´ + (dm.qrylimpa.fieldbyname(´mespgto´).AsString)); dm.qrylimpa.next; end;
Bom amigo, agora se possivel for, gostaria de saber se tem como fazer via SQL em vez do Locate tipo + ou - assim:
Se tiver como gosatria de saber como criar um SQL certinho, pois pode ser que fique ateh melhor de usar.
Bom amigo eh isso ai, se quiser me ajudar, fico grato.
Adriano
Gostei + 0
25/11/2006
Marco Salles
voce insere o espaço vazio....
para pesquisar voce usa:
voce não usa a mesma formatação.. então de duas uma. Ou o Locate não ira funcionar ou dara erro dizendo que o campo sequencia é do tipo integer
Para esta formatação voce deve fazer
usar o[b:e763f1b6c2] espaço entre as aspas [/b:e763f1b6c2], para manter as devidas ..formataçoes
Gostei + 0
25/11/2006
Adriano_servitec
voce insere o espaço vazio....
para pesquisar voce usa:
voce não usa a mesma formatação.. então de duas uma. Ou o Locate não ira funcionar ou dara erro dizendo que o campo sequencia é do tipo integer
Para esta formatação voce deve fazer
usar o[b:75a9235477] espaço entre as aspas [/b:75a9235477], para manter as devidas ..formataçoes[/quote:75a9235477]
Realmente esta diferente mesmo amigo (Detalhe tao pequeno, mais que faz a diferença, nao tinha reparado), testei e agora ficou 100¬ :D
Mais tinha outro defeitinho no meu codigo tinha colocado zero a esquerda tambem :D ai nao apontava certo para campos inferiores a 100
o certo eh assim (Trecho)
while dm.qrylimpa.Eof = false do begin ComboBox1.items.add(dm.qrylimpa.fieldbyname(´sequencia´).AsString + ´ ´ + dm.qrylimpa.fieldbyname(´mespgto´).AsString); dm.qrylimpa.next;
e nao assim como estava (trecho)
while dm.qrylimpa.Eof = false do begin ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + ´ ´ + (dm.qrylimpa.fieldbyname(´mespgto´).AsString)); dm.qrylimpa.next;
Repare esta linha (Estava colocando zero a esquerda sem necessidade)
[b:75a9235477] ComboBox1.items.add( StrZero( StrToInt([/b:75a9235477]
Bom amigo o importante eh que agora esta certo como eu queria, valeu por ter me ajudade e por sua percistencia sobre o poste, pois eu ja tinha desistido...hehehehe
Eh isso ai fera.
Agora ta 100¬
Valeu mesmo
Gostei + 0
25/11/2006
Marco Salles
[b:7e8dd00a5b]eu tinha reparado nisso também[/b:7e8dd00a5b].... Mas acho que não faz
diferença..[b:7e8dd00a5b] Voce tem certeza que faz diferença [/b:7e8dd00a5b]????
[b:7e8dd00a5b]Se o conteudo a ser pesquisado é 008 Ou somente 8 , acho que dá o mesmo resultado....[/b:7e8dd00a5b]
Se por ventura não der , é so usar um Strtoint(TextoTratado) que esse 008 sera transformado em 8
Asiim:
[b:7e8dd00a5b]
Em termos visuais no Combobox eu prefiro[b:7e8dd00a5b] 008 do que 8 [/b:7e8dd00a5b], portanto acho que voce deveria insistir nisso também.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)