 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
cobaiaoo Colaborador

Registrado: Domingo, 1 de Abril de 2012 Mensagens: 1283
|
Enviada: Sáb Abr 13, 2013 4:04 pm Assunto: clientdataset.filter [resolvido] |
|
|
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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Sáb Abr 13, 2013 9:43 pm Assunto: |
|
|
| 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 |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Dom Abr 14, 2013 5:27 am Assunto: |
|
|
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 |
|
 |
cobaiaoo Colaborador

Registrado: Domingo, 1 de Abril de 2012 Mensagens: 1283
|
Enviada: Dom Abr 14, 2013 10:28 am Assunto: |
|
|
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 |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Dom Abr 14, 2013 10:53 am Assunto: |
|
|
| 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 |
|
 |
cobaiaoo Colaborador

Registrado: Domingo, 1 de Abril de 2012 Mensagens: 1283
|
Enviada: Dom Abr 14, 2013 12:37 pm Assunto: |
|
|
| 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!  _________________ I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor." |
|
| Voltar ao Topo |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Dom Abr 14, 2013 1:10 pm Assunto: |
|
|
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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Dom Abr 14, 2013 4:18 pm Assunto: |
|
|
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 |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Dom Abr 14, 2013 4:51 pm Assunto: |
|
|
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 |
|
 |
cobaiaoo Colaborador

Registrado: Domingo, 1 de Abril de 2012 Mensagens: 1283
|
Enviada: Dom Abr 14, 2013 4:56 pm Assunto: |
|
|
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
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 |
|
 |
cyberdisk Colaborador

Registrado: Domingo, 4 de Julho de 2010 Mensagens: 2391 Localização: São José dos Campos - SP
|
Enviada: Dom Abr 14, 2013 5:08 pm Assunto: |
|
|
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 |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Dom Abr 14, 2013 6:49 pm Assunto: |
|
|
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 |
|
 |
cobaiaoo Colaborador

Registrado: Domingo, 1 de Abril de 2012 Mensagens: 1283
|
Enviada: Seg Abr 15, 2013 10:59 am Assunto: |
|
|
cyberdisk nao conhecia n, muito obrigado, acredito q em breve me deva me ser util
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  _________________ I João 4:8 - "Aquele que não ama não conhece a Deus; porque Deus é amor." |
|
| Voltar ao Topo |
|
 |
marcosalles Moderador

Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Seg Abr 15, 2013 1:19 pm Assunto: |
|
|
| 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 |
|
 |
informacaoweed Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013 Mensagens: 268 Localização: Porto Alegre / RS
|
Enviada: Sex Abr 06, 2018 3:03 pm Assunto: Reavivando o tópico!!! |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|