Fórum Filtrar comparando campo com conteúdo de uma Edit #348593
07/11/2007
0
Por exemplo:
Tenho registros numa tabela que que pode ter no campo CPF o mesmo número, ou seja, o mesmo CPF registrado diversas vezes em ocorrencias diferentes.
Quero que no DBGrid só apareçam as ocorrências de um único CPF.
Vou inserir numa Edit o número do CPF para ser comparado aos registros que contenham esse mesmo número.
Já tentei DataSet1.Filter := ´CPF=Edit1.Text´, porem não funciona.
Alguem pode me ajudar?
Agradeço.
Cps.art
Curtir tópico
+ 0Posts
07/11/2007
Vitor Alcantara
Para isso existe uma função chamanda QuotedStr(´Seu Texto´) que faz isso.
Tenta isso pra ver:
DataSet1.Filtered := False;//Desativa o filtro caso ja exista DataSet1.Filter := ´CPF= ´+ QuotedStr(Edit1.Text); DataSet1.Filtered := True;//Ativa o filtro
Agora diga qual banco de dados esta utilizando?
Você poderia colocar essa restrição diretamente no banco de dados criando um constraint unique para o campo, assim evitando que números de cpf duplicados sejam inseridos.
Gostei + 0
07/11/2007
Cps.art
Já tentei essa sua sugestão e o DBGrid não mostra registro nenhum, fica em branco.
O que eu preciso é que no DBGrid apareça somente os registros que contenham no campo CPF, o número de CPF que eu digitar no Edit.
A tabela vai conter, obrigatoriamente, mais de um registro com o mesmo CPF, pois são ocorrências registradas para os CPFs, ou seja, o CPF que der motivo para se registrar nele 3 ocorrências, ele constará 3 vezes na tabela.
Na pesquisa que eu fizer nesse CPF, terão que aparecer tantas quantas forem as ocorrências registradas para ele, como data, a própria ocorrência, número de protocolo e outros dados mais.
O que eu acho que está provocando o não funcionamento do filtro é que a tabela é um Banco de Dados do DBase, com indexadores .NTX usados pelo Clipper.
Eu tenho um componente chamado HALCYON que permite ao Delphi utilizar os banco de dados e indexadores do Clipper, permitindo inclusive que rotinas em clipper continuem a manipular tudo isso, atualizando, acrescentando, etc., e o Delphi ´pega´ de onde o clipper parou e vice-versa.
Utilizo isso porque não quero ´encostar´ o clipper totalmente, pois algumas rotinas são muito mais fáceis de manipular em clipper, principalmente para impressão de relatórios.
De qualquer forma agradeço sua colaboração.
Gostei + 0
08/11/2007
Vitor Alcantara
Caso isso seja verdade irá ocasionar que fiquem alguns espaços em branco ao final do último digito, acredito que isso também ocasionária o não disparamento do filtro corretamente, pois ´999.999.999-54´ é diferente de ´999.999.999-54 ´ (espaços em branco no final).
Ou será que não seria a formatação do campo que esteja diferente.?
´99999999954´ <> ´999.999.999.-54´.
Caso não de certo por que você não tenta jogar em uma tabela em memória, como um DataSetProvider+ClientDataSet por exemplo, se não for possivel isso jogue os dados em uma tabela temporária somente com um ClientDataSet sem o DataSetProvider.
Com ClientDataSet provavelmente os filtros irão funcionar.
Gostei + 0
15/11/2007
Cps.art
Sua sugestão estava certa.
Eu só tinha colocado as linhas de comando no lugar errado, ou seja, na procedure do FormCreate.
Mudei para dentro de uma função que checa a validade do CPF e obrigatoriamente tinha que passar pelo filtro, e aí funcionou.
Estou tendo dificuldade para recompor no Delphi, rotinas que eu usava em Clipper.
Tenho pouco tempo de Delphi e ainda não ´peguei´ bem o funcionamento dele.
No clipper eu criava as procedures e elas eram executadas somente atraves de uma chamada tipo ´DO PROCEDURE TAL´, e no Delphi eu ainda não entendi quais as procedures que ele executa automaticamente e quais são as que ele executa só a partir de um comando tipo clicar num botão.
Existe uma maneira de uma procedure ser executada atraves de uma linha de comando e retornar na linha seguinte à da sua chamada?
Vamos citar o exemplo do filtro que estou usando como disse acima.
Ao invez de colocar o filtro dentro dessa procedure que checa a validade do CPF, eu poderia colocar o filtro em outra procedure tipo ´[b:43183c12a1]procedure TCadCliente.FiltraCpf(Sender: TObject);[/b:43183c12a1]´?
No clipper, ele sempre retornava para a linha seguinte da chamada de uma procedure, desde claro, que na procedure chamada houvesse uma linha com o ´Return´.
Se alguem puder me dar alguma dica, ficarei muito grato.
Gostei + 0
15/11/2007
Vitor Alcantara
Procedimentos que retornam valores são determinados functions, procedimentos que não retornam valores são determinados procedures.
A sintaxe das functions (funções) são básicamente assim:
function NomeDaFuncao(Parametros:TipoParametro):TipoResultado; Begin end;
function fSomaNumeros(Numero1,Numero2:Double):Double; Begin result := Numero1 + Numero2;//Acho que deve funcionar parecido com return. end;
A sintaxe das procedures (procedimentos que não retornam valores) é parecida com a da function só que não retorna nenhum valor no final.
procedure NomeDaProcedure(Parametros:TipoParametro); begin end;
procedure pSomaNumeros(Numero1,Numero2:Double); Begin ShowMessage(FloatToStr(Numero1 + Numero2));//Executa uma ação sem retornar nenhum valor. end;
Para utilizar a função ou procedimento basta colocar o nome da função/proceidmento dentro de algum evento.
O exemplo a seguir eu chamo dentro de um evento OnClick de um botão qualquer.
procedure TForm1.BitBtn1Click(Sender: TObject); Begin ShowMessage(´A soma de 1 + 2 é = ´+ StrToFloat(fSomaNumeros(1,2)));//Chamei a função fSomaNumero criada acima pSomaNumeros(1,2);//Chamei a procedure pSomaNumero criada acima. end;
No caso do exemplo que você fez ´[b:bdbda602ca]procedure TCadCliente.FiltraCpf(Sender:TObject)[/b:bdbda602ca]´, poderia ser feito do segunte modo ´[b:bdbda602ca]procedure TCadCliente.FiltraCpf(filtro:String)[/b:bdbda602ca]´ .
Onde filtro seria a string contendo o cpf.
Na hora de chamar você poderia fazer assim em qualquer evento (com um click em um botão (onClick) por exemplo).
procedure TCadClient.BitBtn1Click(Sender: TObject); Begin FiltraCPF(EditCPF.Text);//Onde editCpf é um edit. end;
Gostei + 0
15/11/2007
Cps.art
Foram boas as suas dicas quanto à diferença entre uma procedure e uma função.
Acho que eu não soube explicar bem quanto a minha dúvida com respeito ao funcionamento das procedures dentro de uma Unit.
Vou tentar explicar melhor.
Vamos supor que eu tenha numa unit as seguintes procedures:
[b:122502d531]procedure[/b:122502d531] TCadCli.ChecaCpf(Sender: TObject);
[b:122502d531]begin[/b:122502d531]
*** aqui checaria se o CPF é válido ou não
[b:122502d531]if[/b:122502d531] cpfval = ´OK´ [b:122502d531]then[/b:122502d531] //se o CPF for válido vá filtrar
**aqui eu colocaria uma chamada para a outra procedure, a que filtraria
[b:122502d531]else[/b:122502d531] //se não for válido
**aqui daria a mensagem que o CPF não é valido e voltaria para a mesma Edit.
[b:122502d531]end[/b:122502d531];
[b:122502d531]procedure[/b:122502d531] TCadCli.FiltraCpf(Sender: TObject);
[b:122502d531]begin[/b:122502d531]
****aqui faria a filtragem etc etc e iria pedir dados da segunda edit.
[b:122502d531]end[/b:122502d531];
Então o que eu quero fazer é chamar a procedure de filtragem de dentro da procedure de checagem sem ter que clicar em nenhum botão, pois estou tentando desenvolver uma rotina que não utilizaria o mouse, passando de campo só com o Enter.
A checagem do CPF eu consegui fazendo com que quando todos os 11 dígitos forem preechidos na edit, já vai executar a procedure, e se não for válido dá a mensagem e com um Enter já volta para a edit para redigitar o CPF.
Já procurei na ajuda do Delphi mas não consegui nada.
Obrigado por qualquer ajuda que puderem me dar.
Gostei + 0
15/11/2007
Vitor Alcantara
procedure TCadCli.ChecaCpf(Sender: TObject); begin *** aqui checaria se o CPF é válido ou não if cpfval = ´OK´ then //se o CPF for válido vá filtrar FiltraCpf(Sender) //Iso já bastaria para chamar a sua função. **aqui eu colocaria uma chamada para a outra procedure, a que filtraria else //se não for válido **aqui daria a mensagem que o CPF não é valido e voltaria para a mesma Edit. end;
Entenda que basta você colocar o nome da função ou procedimento e seus parâmetros.
No caso da procedure FiltraCpf(Sender:TObject), para chamala de dentro da procedure ChecaCPF bastaria fazer FiltraCPF(Sender).
Não tem erro, não precisa de comandos especiais para chamar uma procedure ou function, basta o nome da mesma, salvo em casos especiais onde o procedimento ou function está declarado em outra classe, dai eu teria que colocar o objeto antes da função.
Ex: Button1.Click;
No caso acima para chamar o procedimento Click tive que chamar a classe Button1 que é aonde está declarado o procedimento Click, se eu fizesse apenas click o compilador iria me retornar um erro avisando que não foi declarado o procedimento click.
No seu caso como o procedimento ChecaCPF e FiltraCPF estão dentro da mesma classe (TCadCli) basta chamar o nome e passar o parâmetro das mesmas de qualquer parte dentro da mesma classe, que nesse caso é o form CadCli.
Se por ventura eu fosse chamar um desses procedimentos de dentro de outro form bastaria fazer [b:6c870aceac]NomeDaClasse.NomeDoProcedimento(parametros)[/b:6c870aceac] ([b:6c870aceac]CadCli.ChecaCPF(Sender)[/b:6c870aceac]).
Caso você não tenha etendido, fique a vontade de colocar sua dúvida novamente, com certeza se eu souber lher responder terei maior prazer em ajudalo.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)