Fórum Duvidas com comando ComboBox e Locate? #333553

23/11/2006

0

Boa tarde a todos usuarios do forum

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;
Assim funciona que uma beleza

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;
Pois no caso ele esta assim [] para localizar o campo sequencia (ou seja codigo exato). Entao soh funciona como postei acima sem essa linha em negrito que eu mostrei.

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

Adriano_servitec

Responder

Posts

23/11/2006

Marco Salles

tem com usar o locate em mais de dois campos... Mas no seu caso acho que não precisa

Porque que voce não trata o texto a ser pesquisado...

procedure TForm8.ComboBox1Click(Sender: TObject); var TextoTratado:String; begin textoTratado:=combobox1.text; [b:33ac186227]delete(textoTratado,pos(´-´,textoTratado),maxInt);[/b:33ac186227]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;


se tudo tivar bem formatado , acho que resolve.


Responder

Gostei + 0

23/11/2006

Adriano_servitec

Eh isso mesmo fera.

Valeu pela dica

Muito obrigado amigo.


Responder

Gostei + 0

23/11/2006

Adriano_servitec

Desculpe amigo, eu me preciptei no post, nao deu certo ainda, Nao tinha percebido que estava com essa linha desligada do compilador

 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]


Responder

Gostei + 0

24/11/2006

Marco Salles

mas olha so o que eu disse:

se tudo tivar bem formatado , acho que resolve.



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);
var TextoTratado:String; begin textoTratado:=combobox1.text; //espaço vazio ao inves do traço [b:d8603aaee0]delete(textoTratado,pos(´ ´,textoTratado),maxInt);[/b:d8603aaee0]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;



Responder

Gostei + 0

24/11/2006

Adriano_servitec

Obrigado por me ajudar [b:a688bcd944]Marco Salles[/b:a688bcd944], mais acho que nao estou conseguindo resolver desta forma. Pra nao ficar aqui matutando sobre como fazer, descedi colocar um dbLoockupComboBox mesmo, assim fica mais pratico e facil, pois resolvi colocar os campos necessarios dentro da propriedade ListFields do componente.

Bom amigo, obrigado por me ajudar.

Valeu

Adriano


Responder

Gostei + 0

24/11/2006

Marco Salles

Fico chateado quando perco uma partida :lol: :lol:

mas fico feliz por ter resolvido :P :P


Responder

Gostei + 0

24/11/2006

Adriano_servitec

[quote:496215f5c4=´Marco Salles´]Fico chateado quando perco uma partida :lol: :lol:

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
campo------type-------syze matricula--varchar-----6----FK (esse campo matricula pertence a outra tabela) sequencia--integer associado--varchar-----55 dtmatricula--date mespgto-----date mesrefini----date mesreffim---date


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;
Ateh aqui tudo certo, mais como pode haver varias datas do associado solicitado posso ter que selecionar a sequencia em que devo fazer a alteração, por isso resolvi usar um combobox, para mostrar as sequencias a qual deve ser alterada (mais facil usar o dbLoockupCombobx), ai automaticamente aparece as datas dentro desses maskedits que estao dentro do locate assim:
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;
Repare que tambem tirei o traço e deixei somente um espaço entre os campos, mais nao deu certo, ou seja pelo menos eu nao consequi fazer com que funcionasse o LOCATE.

Bom amigo, agora se possivel for, gostaria de saber se tem como fazer via SQL em vez do Locate tipo + ou - assim:
select sequencia || mespgto from corrente

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


Responder

Gostei + 0

25/11/2006

Marco Salles

para carregar voce usa:

ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + [b:e763f1b6c2]´ ´[/b:e763f1b6c2] + (dm.qrylimpa.fieldbyname(´mespgto´).AsString));


voce insere o espaço vazio....

para pesquisar voce usa:

delete(textoTratado,pos([b:e763f1b6c2]´´[/b:e763f1b6c2],textoTratado),maxInt);


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

delete(textoTratado,pos([b:e763f1b6c2]´ ´[/b:e763f1b6c2],textoTratado),maxInt);


usar o[b:e763f1b6c2] espaço entre as aspas [/b:e763f1b6c2], para manter as devidas ..formataçoes


Responder

Gostei + 0

25/11/2006

Adriano_servitec

[quote:75a9235477=´Marco Salles´]para carregar voce usa:

ComboBox1.items.add( StrZero( StrToInt( dm.qrylimpa.fieldbyname(´sequencia´).AsString), 3 ) + [b:75a9235477]´ ´[/b:75a9235477] + (dm.qrylimpa.fieldbyname(´mespgto´).AsString));


voce insere o espaço vazio....

para pesquisar voce usa:

delete(textoTratado,pos([b:75a9235477]´´[/b:75a9235477],textoTratado),maxInt);


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

delete(textoTratado,pos([b:75a9235477]´ ´[/b:75a9235477],textoTratado),maxInt);


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


Responder

Gostei + 0

25/11/2006

Marco Salles

Detalhe tao pequeno, mais que faz a diferença


Mais tinha outro defeitinho no meu codigo tinha colocado zero a esquerda tambem ai nao apontava certo para campos inferiores a 100


Repare esta linha (Estava colocando zero a esquerda sem necessidade) ComboBox1.items.add( StrZero( StrToInt(


[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]
if DM.QRYLIMPA.LOCATE(´SEQUENCIA´,strtoint(textoTratado),[]) then
[/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.


Responder

Gostei + 0

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

Aceitar