Fórum DLL Para retirar Acento #202300
20/12/2003
0
preciso fazer uma consulta sql no banco e a consulta tem que ser Case sensitive a acento ou seja vou passar como parâmetro ´João e o sistema que me retornar todos os joão tendo acento ou não , pois bem construi uma DLL com esta função fiz uma mini aplicação chamando esta DLL e funciona perfeitamente, registrei esta função no banco e ao dar um select passando como parametro a função o banco esta caindo isso provavelmente deve se ao fato de ter registrado a função de forma errada no banco, segue abaixo o Fonte da DLL e como declarei no banco se alguém puder me ajudar agradeço.
Declaração no Banco
DECLARE EXTERNAL FUNCTION ANSITOASCII
CSTRING(256) CHARACTER SET NONE
RETURNS VARCHAR(256) CHARACTER SET NONE FREE_IT
ENTRY_POINT ´AnsiToAscii´ MODULE_NAME ´Acento´;
Fonte da DLL
Library Acento;
uses
ShareMem,
SysUtils,
Forms,
dialogs,
Classes;
{$R *.RES}
function AnsiToAscii( str: String ): String; Export;Stdcall;
var
i: Integer;
begin
for i := 1 to Length(str) do
case str[i] of
´á´: str[i] := ´a´;
´é´: str[i] := ´e´;
´í´: str[i] := ´i´;
´ó´: str[i] := ´o´;
´ú´: str[i] := ´u´;
´à´: str[i] := ´a´;
´è´: str[i] := ´e´;
´ì´: str[i] := ´i´;
´ò´: str[i] := ´o´;
´ù´: str[i] := ´u´;
´â´: str[i] := ´a´;
´ê´: str[i] := ´e´;
´î´: str[i] := ´i´;
´ô´: str[i] := ´o´;
´û´: str[i] := ´u´;
´ä´: str[i] := ´a´;
´ë´: str[i] := ´e´;
´ï´: str[i] := ´i´;
´ö´: str[i] := ´o´;
´ü´: str[i] := ´u´;
´ã´: str[i] := ´a´;
´õ´: str[i] := ´o´;
´ñ´: str[i] := ´n´;
´ç´: str[i] := ´c´;
´Á´: str[i] := ´A´;
´É´: str[i] := ´E´;
´Í´: str[i] := ´I´;
´Ó´: str[i] := ´O´;
´Ú´: str[i] := ´U´;
´À´: str[i] := ´A´;
´È´: str[i] := ´E´;
´Ì´: str[i] := ´I´;
´Ò´: str[i] := ´O´;
´Ù´: str[i] := ´U´;
´Â´: str[i] := ´A´;
´Ê´: str[i] := ´E´;
´Î´: str[i] := ´I´;
´Ô´: str[i] := ´O´;
´Û´: str[i] := ´U´;
´Ä´: str[i] := ´A´;
´Ë´: str[i] := ´E´;
´Ï´: str[i] := ´I´;
´Ö´: str[i] := ´O´;
´Ü´: str[i] := ´U´;
´Ã´: str[i] := ´A´;
´Õ´: str[i] := ´O´;
´Ñ´: str[i] := ´N´;
´Ç´: str[i] := ´C´;
end;
Result := str;
End;
Exports
AnsiToAscii index 1;
begin
end.
Ari
Curtir tópico
+ 0Posts
20/12/2003
Maicongabriel
Você leu o texto do link que eu passei ?
Segundo aquele texto, você pode fazer isso, sem uma função externa, utilizando somete um characterset e um collate apropriado para isso, ou seja algo muito mais leve, simples e rápido.
Pela sua dll...
Imagine o seguinte, mesmo que você tivesse erado na declaração da sua função, você não acha que fazer [i:60cc84528a][b:60cc84528a]n[/b:60cc84528a][/i:60cc84528a] chamadas a função externa é ruim? Imagine se mais de uma pessoa fizer mesma consulta? Pense o quanto de processo que vai gerar para a máquina! O quanto de desempelho que a sua aplicação vai perder!
Gostei + 0
21/12/2003
Ari
um abraço
Gostei + 0
22/12/2003
Ari
Novamente li o artigo que você mencionou nas respostas abaixo e o que entendi do artigo é que ele muda a forma de ordenação más não que ele ignora os acentos com relação a consulta, vou mostrar um exemplo abaixo que é parecido ao que eu quero:
por exemplo quero consultar o nome de um cliente no banco de dados porem não sei como ele foi cadastrado(Maisculo ou Minusculo) então como eu faço
Sql.add(´select * from clientes´)
sql.add(´Where lower(str_nomecliente = :Nome´)
Qry_cliente.parambyname(´Nome´).asstring := lowercase(edtnome.text)
Qry_Cliente.open
Ou seja converto o nome que esta no banco para minusculo e o conteúdo que estou comparando para minusculo também, o que eu preciso e algo semelhante com os acentos
quero passar um nome como parâmetro e o mesmo buscar no banco independente se tem acento ou não.
Por favor preciso de uma solução urgente para isso, estou usando Delphi5 com Firebird
já criei uma UDF (DLL) porém quando executo no banco dá Pau.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)