GARANTIR DESCONTO

Fórum DLL Para retirar Acento #202300

20/12/2003

0

Pessoal boa tarde, postei esta pergunta logo abaixo mas acredito que a pessoa que respondeu não entendeu bem a pergunta continuo precisando da ajuda de vocês!!!

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

Ari

Responder

Posts

20/12/2003

Maicongabriel

O que eu entendi é q a sua consulta tem que ser ´case insensitive´, onde consultar por João vai retornar ´joão´ e ´joao´.

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!


Responder

Gostei + 0

21/12/2003

Ari

Maicom, li novamente o artigo vi os exemplos que foi passado , primeiro que quando mudei o o character set já sumiram alguns registros e depois analisando o exemplo verifiquei que esta configuração é muito utilizada ´para indice más não vi onde e como aplicar na minha necessidade, por favor se puder me explicar como utilizar isso eu agradeceria e muito

um abraço


Responder

Gostei + 0

22/12/2003

Ari

Maicon e a todos que possa Ajudar,

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar