Ir para conteúdo
Fórum Script Brasil
  • 0

Pesquisa Usando Ztable


hencker

Pergunta

Estou usando o seguinte script para a pesquisa:

rocedure TPesqFuncionarios.BBLocalizarClick(Sender: TObject);
begin
  inherited;
  if RGOpcoes.ItemIndex = 1 then
   begin
      with MasterCadFuncionarios.TabelaMaster do
        begin
          close;
          Filtered := true;
          Filter   := 'nome LIKE '+EditPesquisa.Text+'';
          open;
        end;
   end
   else
    begin
      with MasterCadFuncionarios.TabelaMaster do
        begin
          close;
          Filtered := true;
          Filter   := 'cpf LIKE '+EditPesquisa.Text+'';
          open;
        end;
  end;
end;

Porém está apresentando uns erros estranhos:

[1] - Quando eu tento usar uma palavra composta (tipo "Tiago Henrique", sem as aspas claro) ele me dá a seguinte mensagem de erro: "Sintax error near "Henrique"".

[2] - Se eu tento buscar somente pelo primeiro nome ele não acha nada, mesmo tendo no banco;

[3] - Se eu tento procurar pelo CPF completo (com 11 dígitos) ele dá a seguinte mensagem: "'xxxxxxxxxxx' is not a valid integer value". O mais estranho é que meu campo é do tipo "character varing" e não integer.

[4] - Se eu tento buscar por apenas parte do CPF ele não acha nada.

Se alguém puder me dar uma ajuda eu agradeço!

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Olá,

[1] - Quando eu tento usar uma palavra composta (tipo "Tiago Henrique", sem as aspas claro) ele me dá a seguinte mensagem de erro: "Sintax error near "Henrique"".

Tenta usar o QuotedStr(EditPesquisa.Text).

Ex.:

Filter   := 'nome LIKE '+QuotedStr(EditPesquisa.Text)+'';
[2] - Se eu tento buscar somente pelo primeiro nome ele não acha nada, mesmo tendo no banco;
Para fazer esse tipo de busca, use o %. Ex.:
Filter   := 'nome LIKE '+QuotedStr('%' + EditPesquisa.Text + '%')+'';

Abs.

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Kikonanet, eu mudei essa parte do código como você falou:

Filter := 'nome LIKE '+QuotedStr('%' + EditPesquisa.Text + '%')+'';

Ficando assim:

procedure TPesqFuncionarios.BBLocalizarClick(Sender: TObject);
begin
  inherited;
  if RGOpcoes.ItemIndex = 0 then
   begin
      with MasterCadFuncionarios.TabelaMaster do
        begin
          close;
          Filtered := true;
          Filter   := 'nome LIKE '+QuotedStr('%'+EditPesquisa.Text+'%')+'';
          open;
        end;
   end
   else
    begin
      with MasterCadFuncionarios.TabelaMaster do
        begin
          close;
          Filtered := true;
          Filter   := 'cpf LIKE '+QuotedStr('%'+EditPesquisa.Text+'%')+'';
          open;
       end;
  end;
end;

Ele até parou de dar os erros mas não está pesquisando nada...

Link para o comentário
Compartilhar em outros sites

  • 0

hencker, por "padrão" você desabilita o filtro antes de atribuir novo filtro e volta a habilitá-lo após a alteração do mesmo (acho que nem seria preciso o Close e Open). Veja se será por isso.

Outra coisa, no seu código, observe que em função do valor de RGOpcoes.ItemIndex você fará apenas uma única coisa diferente: a atribuição à propriedade Filter; Logo, todo o resto é repetido e então você poderia simplificar o procedimento para isto:

procedure TPesqFuncionarios.BBLocalizarClick(Sender: TObject);
begin
  with MasterCadFuncionarios.TabelaMaster do
  begin
    Close;
    Filtered := False;

    if RGOpcoes.ItemIndex = 0 then
      Filter   := 'nome LIKE '+QuotedStr('%'+EditPesquisa.Text+'%')+''
    else
      Filter   := 'cpf LIKE '+QuotedStr('%'+EditPesquisa.Text+'%')+'';

    Filtered := True;
    Open;
   end
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus eu tentei usar o código que você me passou, mas continua sem retornar resultado algum...
henker, desculpe a demora em responder.

Caso ainda não tenha resolvido o problema, a solução que encontrei (após debugar o processo de filtragem) é a seguinte:

procedure TPesqFuncionarios.BBLocalizarClick(Sender: TObject);
begin
  with MasterCadFuncionarios.TabelaMaster do
  begin
    if RGOpcoes.ItemIndex = 0 then
      Filter   := 'nome LIKE '+QuotedStr('*'+EditPesquisa.Text+'*')+''
    else
      Filter   := 'cpf LIKE '+QuotedStr('*'+EditPesquisa.Text+'*')+'';
   end
end;
você deve definir a propriedade Filtered = True já em design-time - não há necessidade de fazer em run-time. (a princípio, isto vale apenas para a Zeos Lib, não afirmo pelas demais ;)) Utilizei deste modo no evento EditPesquisa.OnChange e funcionou que é uma beleza:
procedure TMainForm.EDpesquisaChange(Sender: TObject);
begin
  with DMMain.ZTable1 do
    Filter := 'nome LIKE '+QuotedStr('*'+EDPesquisa.Text+'*')+'';
end;
Observe que o maior problema está no fato de ter que ser utilizado "*" e não "%" como máscara. Seguindo a execução do programa fui parar na unit ZMatchPattern, onde a função IsMatch (utilizada no processo da filtragem) está codificada e fui logo dar de cara com estas constantes:
{ Character defines }
  MATCH_CHAR_SINGLE            = '?';
  MATCH_CHAR_KLEENE_CLOSURE     = '*';
  MATCH_CHAR_RANGE_OPEN            = '[';
  MATCH_CHAR_RANGE            = '-';
  MATCH_CHAR_RANGE_CLOSE        = ']';
  MATCH_CHAR_CARET_NEGATE       = '^';
  MATCH_CHAR_EXCLAMATION_NEGATE    = '!';
daí caiu a ficha - nem continuei debugando. :D O novo código que lhe postei acima, está bem simplificado - nada de close e open. Também, diferente do que nomalmente vejo por ai (e lhe havia sugerido) não tem essa de Filtered = False / atribui o filtro / Filtered = True, porque no Zeos o filtro é aplicado na atribuição do texto (Filter := ...). Então, Filtered pode ficar ativo o tempo todo. Observe que método SetFilterText, na unit ZAbstractRODataset, faz a releitura das linhas de sua tabela no momento da alteração do texto, desde que o filtro esteja habilitado:
procedure TZAbstractRODataset.SetFilterText(const Value: string);
begin
  inherited SetFilterText(Value);
  FilterExpression.DefaultVariables.Clear;
  FilterExpression.Expression := Value;
  InitFilterFields := False;
  if FilterEnabled then
    RereadRows;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...