ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

clientdataset.filter [resolvido]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
cobaiaoo
Colaborador
Colaborador


Registrado: Domingo, 1 de Abril de 2012
Mensagens: 1283

MensagemEnviada: Sáb Abr 13, 2013 4:04 pm    Assunto: clientdataset.filter [resolvido] Responder com Citação

pessoal consigui perguisar dois campos ao mesmo tempo e ignorando os caracteres maiusculos e minusculos

caso eu digitar um nome sem acento ex.: ANDRE, e no banco estiver ANDRÉ ele me ignora este campo e n retorna na grid, como posso resolver este problema?

Código:

  DM.CDSEMPRESA.Filtered := False;
  DM.CDSEMPRESA.FilterOptions := [foCaseInsensitive];
  DM.CDSEMPRESA.Filter := '(RAZAOSOCIAL LIKE '+#39+'%'+editNome.Text+'%'+#39+') OR '+'(NOMEFANTASIA LIKE '+#39+'%'+editNome.Text+'%'+#39+')';
  DM.CDSEMPRESA.Filtered := True;

_________________
I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor."


Editado pela última vez por cobaiaoo em Seg Abr 15, 2013 11:00 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Sáb Abr 13, 2013 9:43 pm    Assunto: Responder com Citação

Citação:
caso eu digitar um nome sem acento ex.: ANDRE, e no banco estiver ANDRÉ ele me ignora este campo e n retorna na grid, como posso resolver este problema?


simples ... basta digitar no editNome.Text assim:

ANDR_

voce estará usando um caracter curinga ( _ ) para procurar uma palavra acentuada ou não

ANDRÉ

ANDRE

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Abr 14, 2013 5:27 am    Assunto: Responder com Citação

Muito boa a sua dica. Não sabia que o caracter ( _ ) erá curinga

Ele pega Tudo .....

Tem alguma tabela disso ?

Onde achou esta preciosidade ?

Bem voltando ao Filtro , fiz um teste aqui e não sei se é meu Delphi ou se é umBug ou se é sono , ou se é qualuqer coisa . Mas o Filtro Utilizado não pega
simplesmente assim

supor
André e Andre .. carregados no CDS

Digito no editNome

caracter : e -->>>> Ele pega e retorna corretamente

caracter: é --->>> Ele não traz nada ????????????

isto para qq acento ( Fiz com á e com ó ....)

estou testando com Mybase , mas acho que não iria influenciar na situação Real

Estranho , alguém pode testar esta condição ai ???

[]sds e mais uma vez muito boa a dica
_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cobaiaoo
Colaborador
Colaborador


Registrado: Domingo, 1 de Abril de 2012
Mensagens: 1283

MensagemEnviada: Dom Abr 14, 2013 10:28 am    Assunto: Responder com Citação

cyberdisk perfeito,
marcosalles fiz um teste aki (firebird 2.5 (n sei se influencia)) mas aconteceu a msma coisa, rs
_________________
I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor."
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Abr 14, 2013 10:53 am    Assunto: Responder com Citação

cobaiaoo escreveu:
cyberdisk perfeito,
marcosalles fiz um teste aki (firebird 2.5 (n sei se influencia)) mas aconteceu a msma coisa, rs


perfeito mesmo ..

Mas enfim , talves em versões anteriores do Delphi isto talves não aconteça (Ja vimos a indepedência dos Dados , eu testei no Mybase e vc testou no Feribird 2.5) . eu testei no xe2 e vc não sei

Agora temos dois inconvenientes que devem ser colocados na balança . O Curinga _ representa qq caracter , o que não restringe os dados. Ate ai tudo bem , pq realmente ao fazer Andr_ não deve ter muito registros . mesmo que venha alguns que não utilizam a Vogal e , acho que não seria um problema . O maior inconveneinte para mim é ensinar é informar ao usuário que para ele achar André ou Andre ele tem que utilizar o _

Digo isto pq o usuário é preguiçoso eu sou preguiçoso e quase ninguem que ler um manual de utilização de softaware . Nos queremos utilizar de imediato e ai esta funcionalidade parece meio escondida. Se bobear ate a gente esqueçe esta funcionalidade com o tempo. Eu ja fiz alguns softawares que pergunto ao usário (que o utiliza frequentemente) como utiliza-lo .

Isto poderia ser evitado , utilizando o onfilterRecord porém a digitação é inevitável . Claro que esta codificação pode ser feita de modo mais orientado , porém é bem mais do que um Caracter _

[]sds
_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cobaiaoo
Colaborador
Colaborador


Registrado: Domingo, 1 de Abril de 2012
Mensagens: 1283

MensagemEnviada: Dom Abr 14, 2013 12:37 pm    Assunto: Responder com Citação

marcosalles escreveu:
cobaiaoo escreveu:
cyberdisk perfeito,
marcosalles fiz um teste aki (firebird 2.5 (n sei se influencia)) mas aconteceu a msma coisa, rs


perfeito mesmo ..

Mas enfim , talves em versões anteriores do Delphi isto talves não aconteça (Ja vimos a indepedência dos Dados , eu testei no Mybase e vc testou no Feribird 2.5) . eu testei no xe2 e vc não sei

Agora temos dois inconvenientes que devem ser colocados na balança . O Curinga _ representa qq caracter , o que não restringe os dados. Ate ai tudo bem , pq realmente ao fazer Andr_ não deve ter muito registros . mesmo que venha alguns que não utilizam a Vogal e , acho que não seria um problema . O maior inconveneinte para mim é ensinar é informar ao usuário que para ele achar André ou Andre ele tem que utilizar o _

Digo isto pq o usuário é preguiçoso eu sou preguiçoso e quase ninguem que ler um manual de utilização de softaware . Nos queremos utilizar de imediato e ai esta funcionalidade parece meio escondida. Se bobear ate a gente esqueçe esta funcionalidade com o tempo. Eu ja fiz alguns softawares que pergunto ao usário (que o utiliza frequentemente) como utiliza-lo .

Isto poderia ser evitado , utilizando o onfilterRecord porém a digitação é inevitável . Claro que esta codificação pode ser feita de modo mais orientado , porém é bem mais do que um Caracter _

[]sds


utilizo o xe 3

concordo com o q vc disse acima, eu ate estou pensado em fazer algo caso algum caracter especial for inserido ele ser substituido por "_" apenas no codigo, mas n consegui pensar em nada, rs

*mas eu ainda espero os amigos pq quem sabe alguem ainda tenha uma outra solucao para buscar tanto os registros com e sem acento! Smile
_________________
I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor."
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Abr 14, 2013 1:10 pm    Assunto: Responder com Citação

Blz Cobaio ..Então eu fiz uma função que tem como objetivo substituir
todos os acentos de uma string pelo Curinga. Assim vc passa a função
para o Filtro

tipo isto

Código:
function StringReplacelettersNotAccents(Str:String):String;
type
 USASCIIString = type AnsiString(20127);
var
 C:Char;
begin
  result:='';
  for C in Str do
    if String(USASCIIString(C)) <> C then
      result:=result+'_'
    else
      result:=result+C;
end;



Código:
DM.CDSEMPRESA.Filtered := False;
  DM.CDSEMPRESA.FilterOptions := [foCaseInsensitive];
  DM.CDSEMPRESA.Filter := '(RAZAOSOCIAL LIKE '+#39+'%'+StringReplacelettersNotAccents(editNome.Text)+'%'+#39+') OR '+'(NOMEFANTASIA LIKE '+#39+'%'+StringReplacelettersNotAccents(editNome.Text)+'%'+#39+')';
  DM.CDSEMPRESA.Filtered := True;

_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Dom Abr 14, 2013 4:18 pm    Assunto: Responder com Citação

a pesquisa de palavras com ou sem acento pode pode ser feito dessa maneira

Código:
SELECT * FROM atestado WHERE EMPRESA LIKE '%COM_RCIO%'


ou

Código:
SELECT * FROM CADEMPRESA WHERE EMPRESA LIKE '%COMERCIO%'
OR EMPRESA LIKE '%COMÉRCIO%'


Serve para procurar todas as palavras que contenham COMÉRCIO OU COMERCIO

ou seja palavras acentuas ou não

entretanto outra coisa deve ser levada em consideração:

Nome varchar(50) CHARACTER SET WIN1252 COLLATE PXW_INTL850, desta forma o collate serve como auxílio de ordenação também dos valores com acento.

Código:
IBQ.SQL.Add('select * from TB_NOME');
IBQ.SQL.Add('where Upper(COL_CIDADE collate win_ptbr) like "%' + edLocalizar.Text + '%"');


Código:
IBQ.SQL.Add('where Upper(COL_CIDADE COLLATE PXW_INTL850) like "%' + edLocalizar.Text + '%"');


no banco de dados você tem que colocar o charset WIN1252 e o collate win_ptbr


outra curiosidade:

Collate Win_PTBR e PT_BR - Firebird

Citação:
O collate Win_PTBR (Character Set Win1252) tem as seguintes características:

- não diferencia letras maiúsculas de minúsculas e nem acentuadas de
não acentuadas nas operações de procura/comparação e ordenação.

- pode ser criado um índice com campo de até 250 caracteres (os demais collates só aceitam 83)


Citação:

O collate PT_BR (Character Set ISO8859-1) tem as seguintes características:

- não diferencia letras maiúsculas de minúsculas e nem acentuadas de
não acentuadas nas operações de procura/comparação e ordenação.

- pode ser criado um índice com campo de até 250 caracteres (os demais
collates só aceitam 83)


á é í ó ú ã ç ... etc

mais uma interessante:

digamos que queremos trazer como resultado da nossa pesquisa apenas os nomes que contenham 05 letras...
para isso é simples...
usamos o curinga "_" que significa qualquer caracter...
seria algo assim:

mysql> SELECT * FROM clientes WHERE nomes LIKE"_____";

note que usamos cinco vezes o coringa "_" para retornar todos dados da coluna nome que contenham apenas 05 caracteres...

===========================

mais dicas

http://forum.imasters.com.br/topic/101610-algumas-dicas-para-consultas-no-mysql/

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Abr 14, 2013 4:51 pm    Assunto: Responder com Citação

Sim cyberdisk , no caso De requisição no banco sim . Mas no caso do Filtro pressupõem-se que esses dados ja esteja na Mémoria. Ai o Caracter Curinga substituindo as vogais com acento é uma Boa opção . Ai foi sugeido que para evitar o usário digitar esse caracter Curinga uma função substitua todas as vogais do Texto a ser Filtrado que tiver acento pelo Curinga

[]sds
_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cobaiaoo
Colaborador
Colaborador


Registrado: Domingo, 1 de Abril de 2012
Mensagens: 1283

MensagemEnviada: Dom Abr 14, 2013 4:56 pm    Assunto: Responder com Citação

marcosalles muito obrigado essa rotina ajudou o bastante mas ainda n seria a melhor solucao, pq ela resolve em partes
ex.: se eu digitar ANDRE, mas na dgrid estiver ANDRÉ ele n vai me trazer, se eu digitar ANDRÉ e na grid estiver ANDRE ou ANDRÉ ele vai me trazer
*o problema foi resolvido parcialmente mas agradeco desde ja todo o seu apoio e sua boa vontade Smile

sem sombra de duvidas o q o cyberdisk sugeriu foi a melhor opcao q eu uso inclusive em outros sistemas, acontece q como o uso sera em rede n qria criar trafego (pois ele sugeriu SQL direto no banco) eu estava tentando resolver todo o problema apenas pelo clientdataset (q como vcs sabem manipula os dados em memoria)

mas agradeco muito a ajuda de vcs
_________________
I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor."
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
cyberdisk
Colaborador
Colaborador


Registrado: Domingo, 4 de Julho de 2010
Mensagens: 2391
Localização: São José dos Campos - SP

MensagemEnviada: Dom Abr 14, 2013 5:08 pm    Assunto: Responder com Citação

blz cobaiaoo... talvez voce conheça essa rotina ... utilizo muito em meus sistemas em rede, pois ajuda muito no trafego da rede

ela é usada para sortear uma determinada coluna da tabela e limitar o numero de registros da pesquisa .. ( pode filtrar a tabela antes )

se o retorno for 5000 registros, voce pode limitar a 2000 ou 200

Código:
function fDbiSortTable(SrcTbl, DestTbl: TTable; SortField: TField): Longint;
var
  Field: Word;
  CaseIns: Boolean;
  Recs: Longint;
begin
  Recs := 2000;  //SrcTbl.RecordCount; // <- neste traz todos os registros
  CaseIns := True;
  Field := SortField.Index + 1;
  if not DestTbl.Active then
    raise EDatabaseError.Create('Não pode concluir a operação com ' +
      'a tabela destino fechada');
  Check(DbiSortTable(SrcTbl.DBHandle, nil, nil, SrcTbl.Handle, nil, nil,
    DestTbl.Handle, 1, @Field, @CaseIns, nil, nil, False, nil, Recs));

  Result := Recs;
end;


veja que no Recs voce pode limitar a quantidade de registros que voce quer trazer para o DBGrid

abraço
_________________
O conhecimento abre muitas portas
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Dom Abr 14, 2013 6:49 pm    Assunto: Responder com Citação

entendo , quando dei a solução direto pelo clientdataset achei que vc quisesse assim . Tento siguir o roteiro dá dúvida há não ser que o conceito dela estivesse errado. No seu caso , claro que não esta errado querer fazer um Filtro no CDS.

Quanto a rotina passada , vc tem razão quando se digita Andre e no banco tem André .. Realmente não tinha antenado para esta problema

Porém se vc quiser mesmo Um Filtro vou te dar uma solução baseado em Filtro , se vc quiser um Sql o que acho que não é a origem dá sua dúvida ai o que seguirá abaixo lhe não servirá

Faça o Código

Código:

procedure TSEUFORM.FilterlettersNotAccents(
     DataSet: TClientdataSet;
     Fields:Array of TField ;
     Values:Array of String);

{$J+}
const
_Fields:Array of TField = nil;
_Values: Array of String = nil;
{$J-}

procedure FilterRecord (self,DataSet: TDataSet;var Accept: Boolean);
 type
   USASCIIString = type AnsiString(20127);
var
index:Integer;

begin
index:=0;
Accept:=false;
for Index := Low(_Values) to High(_Values) do
    Accept:= (pos(Uppercase(String(USASCIIString(_Values[index]))),
                 Uppercase(String(USASCIIString(_Fields[index].AsString)))) > 0)or(Accept);
end;

var
value:String;
Field:TField;
index:Integer;
M:TMethod;

begin
index:=0;

setlength(_Fields,length(Fields));
for Field in Fields do
  begin
    _Fields[index]:=Field;
     inc(index);
  end;

index:=0;
setlength(_Values,length(Values));
for Value in Values do
  begin
    _Values[index]:=Value;
     inc(index);
  end;
 dataSet.DisableControls;
 dataset.Filtered:=false;
 M.Data := DataSet;
 M.Code := @FilterRecord;
 DataSet.OnFilterRecord:= TFilterRecordEvent(M);
 dataset.Filtered:=true;
  dataSet.EnableControls;
end;


para chamar utilize assim

Código:
self.FilterlettersNotAccents(CDSEMPRESA,
  [CDSEMPRESA.FieldByName('RAZAOSOCIAL'),CDSEMPRESA.FieldByName('NOMEFANTASIA')],
  [editNome.Text,editNome.text]);

_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cobaiaoo
Colaborador
Colaborador


Registrado: Domingo, 1 de Abril de 2012
Mensagens: 1283

MensagemEnviada: Seg Abr 15, 2013 10:59 am    Assunto: Responder com Citação

cyberdisk nao conhecia n, muito obrigado, acredito q em breve me deva me ser util Wink
marcosalles rotina perfeita eu so precisei fazer o seguinte:

Código:

if editNome.text <> '' then
self.FilterlettersNotAccents(CDSEMPRESA,
  [CDSEMPRESA.FieldByName('RAZAOSOCIAL'),CDSEMPRESA.FieldByName('NOMEFANTASIA')],
  [editNome.Text,editNome.text]);


pq caso o edit estivesse vazio a grid ficava em branca, rs

tem um detalhe agora se colocar so o "é" funciona, kkk perfeito Wink
_________________
I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor."
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Seg Abr 15, 2013 1:19 pm    Assunto: Responder com Citação

Citação:
marcosalles rotina perfeita eu so precisei fazer o seguinte:

...

pq caso o edit estivesse vazio a grid ficava em branca, rs

tem um detalhe agora se colocar so o "é" funciona, kkk perfeito


além disso limita tb as outras vogais que apareceriam com o uso do Curinga

Antes
Andr_ aparece .. AdrQualquer_Coisa

Agora não ...

[]sds
_________________
http://marcosalles.wordpress.com

Desenvolvo FreeLancer e presto Consultoria
Orientação Online DataSnap DbX ClientDataSet
POO , Padrões de Projeto e dúvidas de Delphi em
Geral
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
informacaoweed
Aprendiz
Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013
Mensagens: 268
Localização: Porto Alegre / RS

MensagemEnviada: Sex Abr 06, 2018 3:03 pm    Assunto: Reavivando o tópico!!! Responder com Citação

Olá, galera!

Estou precisando de uma solução para o mesmo problema, porém, ao invés de se aplicar ao TDataSet.Filter, a solução que eu necessito é para o TDataSet.Locate.

Alguém pode me iluminar?
_________________
Aguarde... nossa Evolução está sendo processada.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB