[firebase-br] Achei Busca fonética com fontes em Delphi

fuzari em task.com.br fuzari em task.com.br
Sex Jan 28 11:07:13 -03 2005


Pessoal, consegui uma UDF (fontes em delphi) que faz a busca fonética no FB. 

A UDF possui duas funções: Fonetica e FoneticaLike. 

A primeira funciona legal (não é 100% mas ajuda). A segunda eu não estou 
conseguindo instalar. Coloco aqui para quem interessar. Já vi outros colegas 
precisando da pesquisa. Quem conseguir fazer funcionar as duas, podem me 
ajudar? Obrigado. 

Código Fonte com créditos do autor: 

//***************************************************************
{ ZCI Fonética
 ------------ 

 Lauro César Araujo,
 04 de junho de 2004 23:10" 

 Enviada ao concurso UploaderMaster da revista ClubeDelphi
 em www.clubedelphi.net
 } 


library ZCIFonetica;
uses
 SysUtils; 

type
 TChars = set of Char; 

//Tirar acentos
function TirarAcentos(Palavra: PChar): PChar;
begin
Result:= Palavra;
if Palavra= nil then
 Exit;
while Palavra^<> #0 do
begin
 case Palavra^ of
  'á', 'â', 'ã', 'à', 'ä', 'å', 'Á', 'Â', 'Ã', 'À', 'Ä', 'Å': Palavra^:= 
'a';
  'é', 'ê', 'è', 'ë', 'É', 'Ê', 'È', 'Ë': Palavra^:= 'e';
  'í', 'î', 'ì', 'ï', 'Í', 'Î', 'Ì', 'Ï': Palavra^:= 'i';
  'ó', 'ô', 'õ', 'ò', 'ö', 'Ó', 'Ô', 'Õ', 'Ò', 'Ö': Palavra^:= 'o';
  'ú', 'û', 'ù', 'ü', 'Ú', 'Û', 'Ù', 'Ü': Palavra^:= 'u';
  'ç', 'Ç': Palavra^:= 'c';
  'ñ', 'Ñ': Palavra^:= 'n';
  'ý', 'ÿ', 'Ý', 'Ÿ': Palavra^:= 'y';
 else
  if Ord(Palavra^)> 127 then Palavra^ := #32;
 end; 

 Inc(Palavra);
end;
end; 

//Filtrar caracteres
function FilterChars(const S: String; const ValidChars: TChars): String;
var i: Integer;
begin
Result:= '';
for i:= 1 to Length(S) do
 if S[i] in ValidChars then
   Result:= Result+S[i];
end; 

//Função que recebe um texto e retorna sua string fonética
function fonetica(Texto: PChar): Pchar; cdecl; export;
var i: Integer;
    S, T, L: String; 

procedure Subst(Procurar, Substituir: String);
 var Posicao: Integer;
begin
 T:= ''; 

 Posicao:= pos(Procurar, S);
 if Posicao> 0 then
  repeat
   T:= Copy(S, 1, Posicao-1)+Substituir+
    Copy(S, Posicao+Length(Procurar), Length(S));
   S:= T;
   Posicao:= pos(Procurar, S);
  until (Posicao<= 0)
 else
  T:= S; 

 S:= T;
end; 

procedure SubstSeAntes(Procurar, Substituir: String; AntesDe: TChars);
 var i: Integer;
begin
 T:= ''; 

 for i:= 1 to Length(S) do
  if (i+1)<= Length(S) then
   if (S[i]= Procurar) and (S[i+1] in AntesDe) then
    T:= T+Substituir
   else
    T:= T+S[i]
  else
   T:= T+S[i]; 

 S:= T;
end; 

begin
S:= String(Texto); 

if (Length(S)> 2) then
begin
  //Converter Minúsculas
  S:= PChar(LowerCase(S)); 

  //Substituir Ç por S
  Subst('ç', 's'); 

  //Tirar Acentos
  S:= TirarAcentos(PChar(S)); 

  //Filtra os caracteres considerando apenas letras e números
  S:= FilterChars(S, ['a'..'z', ' ', '0'..'9']); 

  //Substituir PH por F
  Subst('ph',  'f'); 

  //Substituir SCH por C {trocar com X: Ex.: Schimenes
  Subst('sch',  'c'); 

  //Excluindo H
  Subst('h', ''); 

  //Substituir Z por S
  Subst('z', 's'); 

  //Substituir X por C
  Subst('x', 'c'); 

  //Substituir Y por I
  Subst('y',  'i'); 

  //Substituir W por V
  Subst('w',  'v'); 

  //Substituir K por c
  Subst('k',  'c'); 

  //Substituir QU por C   (Substituir por K)
  Subst('qu',  'c'); 

  //Substituir irt e ert por iut e eut  (Substituir por ilt e elt) Ex: 
Airton e Ailton
  Subst('irt',  'iut');
  Subst('ert',  'eut'); 

  //Tirar G antes de T Ex: em welington
  Subst('gt',  't'); 

  //Adicionando um espaço no final para as regras a seguir
  S:= S+' '; 

  //Retirar de, da, do, dos, das, d'
  Subst(' de ', ' ');
  Subst(' da ', ' ');
  Subst(' do ', ' ');
  Subst(' d ', ' '); // d'  Ex.: d'alva
  Subst(' dos ', ' ');
  Subst(' das ', ' '); 

  //Substituir N no final por M
  Subst('n ', 'm '); 

  //Substituir C antes de E e I por S Ex. Celina: Selina
  Subst('ce', 'se');
  Subst('ci', 'si'); 

  //Substituir GIU por JU Ex. Giuliano e Juliano
  Subst('giu', 'ju'); 

  //Substituir GEO por JO Ex. George e Jorge
  Subst('geo', 'jo'); 

  //Substituir G antes de E e I por J Ex. Geferson e Jerferson
  Subst('ge', 'je');
  Subst('gi', 'ji'); 

  //Substituir I e E no final por A Ex: Camili, Camile e Camila
  Subst('e ', 'a ');
  Subst('i ', 'a '); 

  //Substituindo UI ou EU no início por VI ou VE. Ex: Wilson -> vilson = 
uilson
  if Length(S)>= 2 then
   if (Copy(S, 1, 2)= 'ui') or (Copy(S, 1, 2)= 'ue') then
    S:= 'v'+Copy(S, 2, Length(S)); 

  //Substituir N antes de P e B por M
  Subst('np', 'mp');
  Subst('nb', 'mb'); 

  //Substituir M antes de consoantes diferente de P e B por n
  SubstSeAntes('m', 'n', ['c', 'd', 'f', 'g', 'h', 'j', 'l',
   'm', 'n', 'q', 'r', 's', 't', 'v', 'x', 'z', 'w', 'k', 'y']); 

  //Substituir L antes de consoante, menos L, por U. Ex: Alves e Auves
  SubstSeAntes('l', 'u', ['b', 'c', 'd', 'f', 'g', 'h', 'j',
   'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'x', 'z', 'w', 'k', 'y']); 

  //Tira vogais no início dos nomes. Ex. Stela e Estela
  if Length(S)>= 2 then
   if (S[1] in ['a', 'e', 'i', 'o', 'u', 'y']) and
    (S[2] in ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'l',
    'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'x', 'z', 'w', 'k', 'y']) then
    S:= Copy(S, 2, Length(S)); 

  //Tirar letras dobradas
  if Length(S)>= 2 then
  begin
   T:= S[1];
   L:= S[1];
   for i:= 2 to Length(S) do
    if S[i]<> L[1] then
    begin
     T:= T+S[i];
     L:= S[i];
    end;
   S:= T;
  end; 

  //Tirar Espaços
  S:= FilterChars(S, ['a'..'z', '0'..'9']);
end; 

Result:= PChar(S);
end; 

//Mesma função só que retorna o caracter % antes e depois da string
function foneticaLike(Texto: PChar): Pchar; cdecl; export;
begin
Result:= PChar(String('%'+fonetica(Texto))+'%');
end; 

exports
 fonetica,
 foneticaLike;
begin
end.
***************************-- Fim do código
Modelo de Utilização: 

SELECT NOME FROM CLIENTES
  WHERE Fonetica(NOME) = Fonetica(:parametro)
  ORDER BY NOME 


SELECT NOME FROM CLIENTES
  WHERE FoneticaLike(NOME) LIKE FoneticaLike(:parametro)
  ORDER BY NOME 

O problema: 

Ao tentar instalar a FoneticaLike, recebo uma mensagem do FB que a função 
não existe ou não pode ser instalada. 

sds 

Fuzari. 






Mais detalhes sobre a lista de discussão lista