PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 21 → Wx - MS Sql Server Busca Fonetica - Function SOUNDEX( )
Wx - MS Sql Server Busca Fonetica - Function SOUNDEX( )
Débuté par BOLLER, 11 nov. 2016 18:28 - 19 réponses
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 18:28
Prezados,

Recuperar informações armazenadas em uma fonte de dados não é tão simples quanto parece. Dependendo do ambiente esta tarefa pode ser uma tarefa crítica que deve ser tratada com todo o cuidado. Quanto tratamos com informações que estão armazenadas no formato de strings e que não possuem uma chave numérica para facilitar a busca podemos estar diante de uma tarefa complexa.

Em algumas situações necessitamos comparar duas frases e tentar identificar a proximidade entre elas. O MS SQL Server fornece a função "SOUNDEX" que nos permite comparar pela fonética se duas palavras são parecidas. Mas quando temos uma frase, é necessário comparar palavra por palavra, o que torna o processo um pouco chato de se realizar e oneroso no quesito performance.

Também, temos que levar em consideração que algumas palavras podem fornecer resultados parecidos. Mas não são a mesma palavra. Assim precisamos criar mecanismos para aumentar a assertividade de nossa função.

LINKS PARA ESTUDO DAS FUNÇÕES FONÉTICAS

https://sourceforge.net/p/soundexsqlserverportugues/wiki/Inicial/

http://gestaoemti.com.br/index.php/fontica-sql-server/

https://desenvolvendorespostas.blogspot.com.br/2016/06/pesquisa-por-fonetica-mssql-soundex.html

https://github.com/vyper/fonetica-sql/blob/master/mssql-function-foneticalize.sql

http://codigofonte.uol.com.br/artigos/pesquisa-fonetica-utilizando-sql-server-2005

http://www.macoratti.net/sql_sdex.htm

http://blog.larios.tecnologia.ws/iBlog/archives/48/

http://forum.imasters.com.br/topic/480032-pesquisa-fonetica/

https://msdn.microsoft.com/pt-br/library/ms187384.aspx

https://support.microsoft.com/pt-pt/kb/100365

Em breve postarei exemplos com WX.

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:38
As funções deste projeto foram desenvolvidas e adaptadas para substituir a função nativa "SOUNDEX" do SQL SERVER. A função SOUNDEX originalmente foi projetada para o idioma inglês ao utilizá-la para o português algumas particularidades do idioma não foram levados em consideração e com isso a busca perde eficácia.

"O Soundex é um índice para codificação de nomes, que se preocupa mais com o som do que com a forma de como um nome está escrito. Ele foi usado inicialmente para codificar sobrenomes (surnames) pela Administração de Arquivos e Registros Nacionais dos Estados Unidos (National Archives and Records Administration)75. Nomes que possuem o mesmo som, mas estão escritos de forma diferente, têm o mesmo código [Soundex].
O método foi criado e patenteado em 1918, por Margaret O’Dell e Robert C. Russel [Knuth 1973]. O departamento de censo dos Estados Unidos (U.S. Bureau of Census) codificou todos os registros relativos aos censos de 1880 a 1920 [Branting 2003] e [Oliveira 2007], utilizando Soundex.

O algoritmo Soundex produz um código padrão, composto pela primeira letra da palavra a ser codificada, seguida por três dígitos numéricos. Os dígitos variam de 0 a 6. Os seis números significativos representam classes fonéticas dos sons da fala humana: bilabial, labiodental, dental, alveolar, velar e glotal [Knuth 1973], [Bhagat e Hovy 2007] e [Oliveira 2007]. " [SOARES V.F.]¹

O Soundex iguala o código dos fonemas e realiza uma busca através dos códigos, sendo assim os valores "X" se igual a "CH", por exemplo.
Uma breve explicação dos arquivos do projeto

01_FUNC_FONETIZAR_DDL.sql
Função principal, parâmetros de entrada:

@STR VARCHAR(5000) = String de consulta
@CONSULTA CHAR(1) = Deve receber "0" ou "1"
@Consulta recebe 0: Resultado não adiciona caractere "%"
@Consulta recebe 1: Resultado adiciona "%" para utilização da condição "like".

Ex:
SELECT DBO.FUNC_FONETIZAR('TIJELA',0)
Resultado: 68C8A1


SELECT DBO.FUNC_FONETIZAR('TIJELA',1)
Resultado: %68C8A1%

02_FUNC_FONETIZAR_PARTICULA_DDL.sql
Realiza tratamentos, atribui valores para os códigos fonéticos e iguala fonemas semelhantes.

03_FUNC_REMOVE_ACENTO_DDL.sql
Remove acentos para comparações.

04_FUNC_SOMENTE_LETRAS_DDL.sql
Retira caracteres especiais

05_FUNC_SUBSTITUI_TERMINACAO_DDL.sql
Substitui terminações

06_FUNC_TRATA_CONSOANTE_MUDA_DDL.sql
Trata consoantes mudas

07_TABLE_TESTEFONETICO.sql
Tabela de teste com 29853 palavras² para testes.
Abaixo alguns resultados que foram obtidos e exemplos de utilização


SELECT DBO.FUNC_FONETIZAR('ADDDRIIANO',0)
--R.: ADDDRIIANO = 158I81E1

SELECT DBO.FUNC_FONETIZAR('ADRIIANO',0);
--R.: ADRIIANO = 158I81E1

SELECT DBO.FUNC_FONETIZAR('ADRIANO',0)
--R.: ADRIANO = 158I81E1

SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADDDRIIANO',0));

SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADRIIANO',0));

SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADRIANO',0));

--ADDDRIIANO = 158I81E1
--ADRIIANO = 158I81E1
--ADRIANO = 158I81E1

--SENDO ASSIM, MESMO ESCREVENDO ERRADO ACHA: "ADRIANO"

--Resultado Esperado: Pesquisar a palavra "CALSSADO", simulando um erro de grafia para a palavra "CALÇADO"
--Resultado Obtido: CALCADA / CALCADO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CALSSADO',0));
--Resultado Esperado: Pesquisar a palavra "CAUSSADO", simulando um erro de grafia para a palavra "CALÇADO"
--Resultado Obtido: CALCADA / CALCADO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CAUSSADO',0));
--Resultado Esperado: Pesquisar a palavra "CHICARA", simulando um erro de grafia para a palavra "XÍCARA"
--Resultado Obtido: XICARA
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('CHICARA',0));
--Resultado Esperado: Pesquisar a palavra "TIJELA", simulando um erro de grafia para a palavra "TIGELA"
--Resultado Obtido: TIGELA
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('TIJELA',0));
--Resultado Esperado: Pesquisar a palavra "SUMISSO", simulando um erro de grafia para a palavra "SUMIÇO"
--Resultado Obtido: SUMICO
SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('SUMISSO',0));


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:38
CREATE FUNCTION [dbo].[FUNC_FONETIZAR] (@STR VARCHAR(5000), @CONSULTA CHAR(1))
RETURNS VARCHAR(5000)
AS
BEGIN
DECLARE
@PARTICULA VARCHAR(5000),
@FONETIZADO VARCHAR(5000),
@FONETIZAR CHAR(1),
@AUX VARCHAR(5000),
@I INT,
@CONT INT,
@PREPOSICOES1 VARCHAR(1000),
@PREPOSICOES2 VARCHAR(1000),
@ALGROMANO1 VARCHAR(1000),
@NUMERO1 VARCHAR(1000),
@ALGROMANO2 VARCHAR(1000),
@NUMERO2 VARCHAR(1000),
@ALGROMANO3 VARCHAR(1000),
@NUMERO3 VARCHAR(1000),
@ALGARISMO VARCHAR(1000),
@ALGARISMOEXTENSO VARCHAR(1000),
@LETRAS VARCHAR(1000)

SELECT @STR = dbo.FUNC_REMOVE_ACENTO(@STR)

/*********************************************/
IF @STR = ' H '
SET @STR = ' AGA '

SELECT @STR = dbo.FUNC_SOMENTE_LETRAS(@STR)

/*ELIMINAR PALAVRAS ESPECIAIS*/
SELECT @STR = REPLACE(@STR,' LTDA ',' ')

/*ELIMINAR PREPOSICOES*/
SET @PREPOSICOES1 = ' DE DA DO AS OS AO NA NO '
SET @PREPOSICOES2 = ' DOS DAS AOS NAS NOS COM '

SET @I = 1

WHILE @I <= 32
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@PREPOSICOES1,@I,4),' ')
SET @I = @I + 4
END

SET @I = 1

WHILE @I <= 30
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@PREPOSICOES2,@I,5),' ')
SET @I = @I + 5
END

/*CONVERTE ALGARISMO ROMANO PARA NUMERO*/
SET @ALGROMANO1 = ' V I '
SET @NUMERO1 = ' 5 1 '
SET @I = 1
WHILE @I <= 6
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@ALGROMANO1,@I,3),SUBSTRING(@NUMERO1,@I,3))
SET @I = @I + 3
END

SET @ALGROMANO2 = ' IX VI IV II '
SET @NUMERO2 = ' 9 6 4 2 '
SET @I = 1
WHILE @I <= 16
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@ALGROMANO2,@I,4),SUBSTRING(@NUMERO2,@I+1,3))
SET @I = @I + 4
END

SET @ALGROMANO3 = ' VII III '
SET @NUMERO3 = ' 7 3 '
SET @I = 1
WHILE @I <= 10
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@ALGROMANO3,@I,5),SUBSTRING(@NUMERO3,@I+2,3))
SET @I = @I + 5
END

SELECT @STR = REPLACE(@STR,' X ',' 10 ')
SELECT @STR = REPLACE(@STR,' VIII ',' 8 ')


/*CONVERTE NUMERO PARA LITERAL*/
SELECT @STR = REPLACE(@STR,'0','ZERO')
SELECT @STR = REPLACE(@STR,'1','UM')
SELECT @STR = REPLACE(@STR,'2','DOIS')
SELECT @STR = REPLACE(@STR,'3','TRES')
SELECT @STR = REPLACE(@STR,'4','QUATRO')
SELECT @STR = REPLACE(@STR,'5','CINCO')
SELECT @STR = REPLACE(@STR,'6','SEIS')
SELECT @STR = REPLACE(@STR,'7','SETE')
SELECT @STR = REPLACE(@STR,'8','OITO')
SELECT @STR = REPLACE(@STR,'9','NOVE')


/*********************************************/
/*ELIMINAR PREPOSICOES E ARTIGOS*/
SET @LETRAS = ' A B C D E F G H I J K L M N O P Q R S T U V X Z W Y Ç ';

SET @I = 1
WHILE @I <= 81
BEGIN
SELECT @STR = REPLACE(@STR,SUBSTRING(@ALGROMANO2,@I,3),' ')
SET @I = @I + 3
END


SET @STR = LTRIM(@STR)
SET @STR = RTRIM(@STR)

SET @PARTICULA = ''
SET @FONETIZADO = ''

SET @CONT = 1

WHILE @CONT <= LEN(@STR)+1
BEGIN
IF @CONT < LEN(@STR) + 1
BEGIN
IF SUBSTRING(@STR,@CONT,1) <> ' '
BEGIN
SET @PARTICULA = @PARTICULA + SUBSTRING(@STR,@CONT,1)
SET @FONETIZAR = '0'
END
ELSE
SET @FONETIZAR = '1'
END
ELSE
SET @FONETIZAR = '1'
IF @FONETIZAR = '1'
BEGIN
SELECT @PARTICULA = dbo.FUNC_FONETIZAR_PARTICULA(@PARTICULA)
SET @FONETIZADO = @FONETIZADO + ' ' + @PARTICULA
SET @PARTICULA = ''
END
SET @CONT = @CONT + 1
END

SET @FONETIZADO = LTRIM(@FONETIZADO)
SET @FONETIZADO = RTRIM(@FONETIZADO)


/*PREPARA A STRING PARA UM LIKE*/
IF @CONSULTA = '1'
BEGIN
SET @AUX = '%'

SET @I = 1

WHILE @I <= LEN(@FONETIZADO)
BEGIN
IF SUBSTRING(@FONETIZADO,@I,1) = ' '
SET @AUX = @AUX + '% %'
ELSE
SET @AUX = @AUX + SUBSTRING(@FONETIZADO,@I,1)
SET @I = @I + 1
END

IF SUBSTRING(@FONETIZADO,LEN(@FONETIZADO),1) <> '%'
SET @AUX = @AUX + '%'

SET @FONETIZADO = @AUX
END
IF @FONETIZADO = ''
SET @FONETIZADO = NULL

RETURN @FONETIZADO

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:39
CREATE FUNCTION [dbo].[FUNC_FONETIZAR_PARTICULA] (@STR VARCHAR(5000))
RETURNS VARCHAR(5000)
AS
BEGIN
DECLARE
@AUX VARCHAR(5000),
@AUX2 VARCHAR(5000),
@I INT,
@N INT,
@J INT,
@LETRAS VARCHAR(27),
@CODFONETICO VARCHAR(27),
@CARACTERES VARCHAR(1000),
@CARACTERESSUB VARCHAR(1000)

/*CRIA A CODIFICAÇÃO DOS FONEMAS*/
SET @LETRAS = 'ABPCKQDTEIYFVWGJLMNOURSZX9Ç'
SET @CODFONETICO = '123444568880AABCAEE1AIJJL9J'

/*ELIMINA LETRAS IGUAIS SEGUIDAS UMA DA OUTRA*/

SET @AUX = SUBSTRING(@STR,1,1) /*RECEBE A PRIMEIRA LETRA*/
SET @I = 2

WHILE @I <= LEN(@STR)
BEGIN
IF SUBSTRING(@STR,@I - 1,1) <> SUBSTRING(@STR,@I,1)
SET @AUX = @AUX + SUBSTRING(@STR,@I,1)
SET @I = @I + 1
END

/*IGUALA FONEMAS PARECIDOS*/


IF SUBSTRING(@AUX,1,1) = 'W'
IF SUBSTRING(@AUX,2,1) = 'I'
SET @AUX = 'U' + SUBSTRING(@AUX,2,LEN(@AUX)) /*TROCA W POR U*/
ELSE
IF SUBSTRING(@AUX,2,1) IN ('A','E','O','U')
SET @AUX = 'V' + SUBSTRING(@AUX,2,LEN(@AUX)) /*TROCA W POR V*/



SELECT @AUX = dbo.FUNC_SUBSTITUI_TERMINACAO(@AUX)

SET @CARACTERES = 'TSCHSCH TSH TCH SH CH LH NH PH GN MN SCE SCI SCY CS KS PS TS TZ XS CE CI CY GE GI GY GD CK PC QU SC SK XC SQ CT GT PT Ç '
SET @CARACTERESSUB = 'XXXXXXX XXX XXX XX XX LI NN FF NN NN SSI SSI SSI SS SS SS SS SS SS SE SI SI JE JI JI DD QQ QQ QQ SQ SQ SQ 99 TT TT TT SS '

SET @I = 1
WHILE @I <= 152
BEGIN
SELECT @AUX = REPLACE(@AUX,LTRIM(RTRIM(SUBSTRING(@CARACTERES,@I,4))), LTRIM(RTRIM(SUBSTRING(@CARACTERESSUB,@I,4))))
SET @I = @I + 4
END



/*TRATAR CONSOANTES MUDAS*/
SELECT @AUX = dbo.FUNC_TRATA_CONSOANTE_MUDA(@AUX,'B','I')
SELECT @AUX = dbo.FUNC_TRATA_CONSOANTE_MUDA(@AUX,'D','I')
SELECT @AUX = dbo.FUNC_TRATA_CONSOANTE_MUDA(@AUX,'P','I')

-- TRATA LETRAS
-- RETIRA LETRAS IGUAIS
IF SUBSTRING(@AUX,1,1) = 'H'
BEGIN
SET @AUX2 = SUBSTRING(@AUX,2,1) -- RECEBE A SEGUNDA LETRA
SET @J = 3
END
ELSE
BEGIN
SET @AUX2 = SUBSTRING(@AUX,1,1) -- RECEBE A PRIMEIRA LETRA
SET @J = 2
END

WHILE @J <= LEN(@AUX)
BEGIN
IF (((SUBSTRING(@AUX,@J - 1,1) <> SUBSTRING(@AUX,@J,1))) AND
(SUBSTRING(@AUX,@J,1) <> 'H'))
SET @AUX2 = @AUX2 + SUBSTRING(@AUX,@J,1)
SET @J = @J + 1
END

SET @AUX = @AUX2

-- TRANSFORMA LETRAS EM CODIGOS FONETICOS
SET @AUX2 = ''

SET @I = 1

WHILE @I <= LEN(@AUX)
BEGIN
SET @N = 1
WHILE @N <= 27
BEGIN
IF SUBSTRING(@AUX,@I,1) = SUBSTRING(@LETRAS,@N,1)
SET @AUX2 = @AUX2 + SUBSTRING(@CODFONETICO,@N,1)
SET @N = @N + 1
END
SET @I = @I + 1
END

RETURN @AUX2
END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:39
CREATE FUNCTION [dbo].[FUNC_REMOVE_ACENTO] ( @TEXTO VARCHAR (5000))
RETURNS VARCHAR (5000)
AS
BEGIN
DECLARE @COMACENTOS VARCHAR(50)
DECLARE @SEMACENTOS VARCHAR(50)
DECLARE @QTD_TEXTO INT
DECLARE @CONTADOR INT
DECLARE @QTD INT
DECLARE @CONT INT
DECLARE @CONT_C INT
DECLARE @LETRA_T VARCHAR(1)
DECLARE @LETRA_C VARCHAR(1)
DECLARE @RESULTADO VARCHAR(5000)

SET @COMACENTOS = 'áÁàÀâÂãÃéÉèÈêÊíÍìÌîÎóÓòÒôÔõÕúÚùÙûÛüÜ'
SET @SEMACENTOS = 'AAAAAAAAEEEEEEIIIIIIOOOOOOOOUUUUUUUU'
SET @QTD_TEXTO = (SELECT LEN(@TEXTO))
SET @CONTADOR = 0
SET @RESULTADO = ''

INICIO:
WHILE @CONTADOR < @QTD_TEXTO
BEGIN
SET @CONTADOR = @CONTADOR + 1
SET @LETRA_T = (SELECT SUBSTRING(@TEXTO,@CONTADOR,1))
SET @CONT = (SELECT LEN(@COMACENTOS))
SET @QTD = 0
WHILE @QTD < @CONT
BEGIN
SET @QTD = @QTD + 1
SET @LETRA_C = (SELECT SUBSTRING(@COMACENTOS,@QTD,1))
IF @LETRA_C = @LETRA_T
BEGIN
SET @RESULTADO = @RESULTADO + (SELECT SUBSTRING(@SEMACENTOS,@QTD,1))
GOTO INICIO
END
ELSE
BEGIN
IF @QTD = @CONT
SET @RESULTADO = @RESULTADO + @LETRA_T
END
END
END

RETURN ( UPPER(@RESULTADO) )
END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:40
CREATE FUNCTION [dbo].[FUNC_SOMENTE_LETRAS] ( @TEXTO VARCHAR (5000))
RETURNS VARCHAR (5000)
AS
BEGIN
DECLARE @LETRAS VARCHAR(30)
DECLARE @QTD_TEXTO INT
DECLARE @CONTADOR INT
DECLARE @QTD INT
DECLARE @CONT INT
DECLARE @CONT_C INT
DECLARE @LETRA_ANT CHAR(1)
DECLARE @LETRA_T CHAR(1)
DECLARE @LETRA_C CHAR(1)
DECLARE @RESULTADO VARCHAR(5000)


SET @LETRAS = 'ABCÇDEFGHIJKLMNOPQRSTUVXZWY ';

SET @QTD_TEXTO = (SELECT LEN(@TEXTO)) + 1
SET @CONTADOR = 0
SET @RESULTADO = ''
SET @LETRA_ANT = (SELECT SUBSTRING(@TEXTO,1,1))
INICIO:
WHILE @CONTADOR < @QTD_TEXTO
BEGIN
SET @CONTADOR = @CONTADOR + 1
SET @LETRA_T = (SELECT SUBSTRING(@TEXTO,@CONTADOR,1))
SET @CONT = (SELECT LEN(@LETRAS)) + 1
SET @QTD = 0
WHILE @QTD < @CONT
BEGIN
SET @QTD = @QTD + 1
SET @LETRA_C = (SELECT SUBSTRING(@LETRAS,@QTD,1))
IF @LETRA_C = @LETRA_T
BEGIN
IF @LETRA_ANT = ' '
AND @LETRA_T = ' '
BEGIN
GOTO INICIO
END
ELSE
BEGIN
SET @RESULTADO = @RESULTADO + (SELECT SUBSTRING(@LETRAS,@QTD,1))
SET @LETRA_ANT = @LETRA_T
GOTO INICIO
END
END
END
END

RETURN ( UPPER(@RESULTADO) )

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:40
CREATE FUNCTION [dbo].[FUNC_SUBSTITUI_TERMINACAO] (@STR VARCHAR(5000))
RETURNS VARCHAR(5000)
AS
BEGIN
DECLARE
@TERMINACAO VARCHAR(1000),
@TERMINACAOSUB VARCHAR(1000),
@TAMANHOMINSTR VARCHAR(1000),
@I INT

/*
SUBSTITUI AS TERMINAÇÕES CONTIDAS NO VETOR $vTerminacao PELAS DO VETOR $vTerminacaoSub RESPEITANDO
O TAMANHO MÍNIMO DA STRING CONTIDO NO VETOR $vTamanhoMinStr.
NO CASO DA STRING TERMINAR COM 'N', O LAÇO CONTINUARÁ, POIS PODERÃO EXIXTIR NOVAS SUBSTITUIÇÕES COM
A TERMINAÇÃO 'M'.
*/
SELECT @STR = dbo.FUNC_REMOVE_ACENTO(@STR)

SET @TERMINACAO = 'N B D T W AM OM OIMUIMCAOAO OEMONSEIAX US TH'
SET @TERMINACAOSUB = 'M N N N N SSNN N N IA IS OS TI'
SET @TAMANHOMINSTR = '2 3 3 3 3 2 2 2 2 3 2 2 2 2 2 2 3'
SET @I = 1

LOOP:
BEGIN

IF RTRIM(SUBSTRING(@STR,LEN(@STR) - LEN(SUBSTRING(@TERMINACAO,@I,3)) + 1,LEN(SUBSTRING(@TERMINACAO,@I,3)))) = RTRIM(SUBSTRING(@TERMINACAO,@I,3)) AND
(LEN(@STR) >= CONVERT(INT,SUBSTRING(@TAMANHOMINSTR,@I,3)))
BEGIN
SET @STR = SUBSTRING(@STR,1,LEN(@STR) - LEN(SUBSTRING(@TERMINACAO,@I,3))) + RTRIM(SUBSTRING(@TERMINACAOSUB,@I,3))
IF @I > 1
GOTO FIM
END

SET @I = @I + 3

IF @I < 52
GOTO LOOP

END

FIM:
BEGIN
RETURN @STR
END

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:41
CREATE FUNCTION [dbo].[FUNC_TRATA_CONSOANTE_MUDA] (@STR VARCHAR(5000), @CONSOANTE CHAR(1), @COMPLEMENTO CHAR(1))
RETURNS VARCHAR(5000)
AS
BEGIN
DECLARE
@I int,
@CONTADOR int

/*
PARA TODAS AS OCORRÊNCIAS DA CONSOANTE $consoante QUE NÃO ESTIVER SEGUIDA DE VOGAL, SERÁ ADICIONADO
O CONTEÚDO DA VARIÁVEL $complemento NA string.
*/

SET @I = LEN(@STR)
SET @CONTADOR = 1

LOOP:
BEGIN

-- for i in 1..length(tStr) loop
IF ((SUBSTRING(@STR,@CONTADOR,1) = @CONSOANTE) AND
(SUBSTRING(@STR,@CONTADOR + 1,1) NOT IN ('A','E','I','O','U')))

SET @STR = SUBSTRING(@STR,1,@CONTADOR) + @COMPLEMENTO + SUBSTRING(@STR,@CONTADOR + 1,LEN(@STR))

SET @CONTADOR = @CONTADOR + 1

IF @CONTADOR <= @I
GOTO LOOP

END

RETURN @STR

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:42
Use [NomeSeuDataBase]
GO

create table TesteFonetico
(
[PALAVRA] nvarchar (50),
[PALAVRAINCORRETA] nvarchar (50),
[FONETIZAR] nvarchar (50)
)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 11 novembre 2016 - 20:43
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:51
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ADRIANO', NULL, N'158I81E1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZERADO', NULL, N'J8I151')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZERAR', NULL, N'J8I1I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZERO', NULL, N'J8I1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZERO-QUILOMETRO', NULL, N'J8I148A1E86I1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZETA', NULL, N'J861')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZEUGMA', NULL, N'J8ABE1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZI', NULL, N'J8')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIBELINA', NULL, N'J828A8E1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGOMA', NULL, N'J8B1E1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGOTO', NULL, N'J8B161')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGUEZAGUE', NULL, N'J8BA8J1BA8')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGUEZAGUEANTE', NULL, N'J8BA8J1BA81E68')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGUEZAGUEAR', NULL, N'J8BA8J1BA81I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIGURATE', NULL, N'J8BAI168')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIMBABUANO', NULL, N'J8E212A1E1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZINCO', NULL, N'J8EJ1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIPER', NULL, N'J838I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIPPADO', NULL, N'J83151')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZIRCONIO', NULL, N'J8IJ1E81')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZO', NULL, N'J1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOADA', NULL, N'J1151')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOAR', NULL, N'J11I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZODIACAL', NULL, N'J1581J1A')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZODIACO', NULL, N'J1581J1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOEIRA', NULL, N'J188I1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOMBAR', NULL, N'J1E21I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOMBARIA', NULL, N'J1E21I81')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOMBETEIRO', NULL, N'J1E28688I1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONA', NULL, N'J1E1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONADO', NULL, N'J1E151')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONAL', NULL, N'J1E1A')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONEAMENTO', NULL, N'J1E81E8E61')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONEAR', NULL, N'J1E81I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZONZO', NULL, N'J1EJ1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOO', NULL, N'J1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOOLOGIA', NULL, N'J1A1C81')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOOLOGICO', NULL, N'J1A1C8J1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOOLOGO', NULL, N'J1A1B1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOOM', NULL, N'JE')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOROASTRICO', NULL, N'J1I11J6I8J1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZOROASTRISMO', NULL, N'J1I11J6I8JE1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZORRA', NULL, N'J1I1')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZU', NULL, N'JA')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZULU', NULL, N'JAAA')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUM', NULL, N'JAE')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUMBI', NULL, N'JAE28')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUMBIDO', NULL, N'JAE2851')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUMBIR', NULL, N'JAE28I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUNIDO', NULL, N'JAE851')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUNIR', NULL, N'JAE8I')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZUNZUM', NULL, N'JAEJAE')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZURETA', NULL, N'JAI861')
INSERT [dbo].[TESTEFONETICO] ([PALAVRA], [PALAVRAINCORRETA], [FONETIZAR]) VALUES (N'ZURRAR', NULL, N'JAI1I')


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 11 novembre 2016 - 20:52
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:53
PARA TESTAR

SELECT DBO.FUNC_FONETIZAR('ADDDRIIANO',0)
--R.:ADDDRIIANO = 158I81E1

SELECT DBO.FUNC_FONETIZAR('ADRIIANO',0);
--R.: ADRIIANO = 158I81E1

SELECT DBO.FUNC_FONETIZAR('ADRIANO',0)
--R.: ADRIANO = 158I81E1



SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADDDRIIANO',0));

SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADRIIANO',0));

SELECT * FROM TESTEFONETICO WHERE FONETIZAR = (SELECT DBO.FUNC_FONETIZAR('ADRIANO',0));

--ADDDRIIANO = 158I81E1
--ADRIIANO = 158I81E1
--ADRIANO = 158I81E1


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 11 novembre 2016 - 20:59








:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 12 novembre 2016 - 09:49
SOUNDEX, SOUND LIKE

SOUNDEX e SOUND LIKE retornam a representação fonética de uma seqüência de caracteres (com base em um algoritmo em inglês).
SOUNDEX and SOUND LIKE return the phonetic representation of a character string (based on an English algorithm).

Use format:

SOUNDEX(string)


Sound LIKE(string)


Exemplo: O código SQL a seguir é usado para listar os clientes cujo nome foneticamente corresponde a "Henry":
Example: The following SQL code is used to list the customers whose name phonetically corresponds to "Henry":

SELECT CUSTOMER.CustomerLastName
FROM CUSTOMER
WHERE SOUNDEX(CUSTOMER.CustomerName) = SOUNDEX('Henry')



SELECT CUSTOMER.CustomerLastName
FROM CUSTOMER
WHERE CUSTOMER.CustomerName SOUND LIKE 'Henry'


Nota Portugues:
SOUNDEX usado em diferentes bancos de dados (HFSQL, Oracle, MySQL, ...) pode retornar resultados diferentes de acordo com o banco de dados utilizado. Acessos nativos SOUND LIKE não é suportado por Oracle, MySQL, Progress ou Informix. O SOUNDEX não é suportado pelo Informix.

Note Enghish:
SOUNDEX used on different databases (HFSQL, Oracle, MySQL, ...) may return different results according to the database used.
Native Accesses SOUND LIKE is not supported by Oracle, MySQL, Progress or Informix. SOUNDEX is not supported by Informix.

Mais informações:
http://help.windev.com/en-US/…

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 12 novembre 2016 - 09:50
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 12 novembre 2016 - 09:50
SOUNDEX2, SOUND2 LIKE

SOUNDEX2 e SOUNDs LIKE retornam a representação fonética de uma seqüência de caracteres (com base em um algoritmo próximo ao francês).
SOUNDEX2 and SOUND2 LIKE return the phonetic representation of a character string (based on an algorithm close to French).

Use format:

SOUNDEX2(string)


SOUND2 LIKE(string)


Exemplo: O código SQL a seguir é usado para listar os clientes cuja cidade foneticamente corresponde a "Montpellier":
Example: The following SQL code is used to list the customers whose city phonetically corresponds to "Montpellier":

SELECT CUSTOMER.CityName
FROM CUSTOMER
WHERE SOUNDEX2(CUSTOMER.CityName) = SOUNDEX2('Montpellier')


SELECT CUSTOMER.CityName
FROM CUSTOMER
WHERE CUSTOMER.CityName SOUND2 LIKE 'Montpellier'


Nota:
Acessos nativos SOUNDEX2 e SOUNDEX2 LIKE não são suportados pelo Oracle, SQL Server, MySQL, Progresso, Informix ou DB2.
Native Accesses SOUNDEX2 and SOUNDEX2 LIKE are not supported by Oracle, SQL Server, MySQL, Progress, Informix or DB2.

http://help.windev.com/en-US/…

http://help.windev.com/en-US/…

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 12 novembre 2016 - 09:51
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 12 novembre 2016 - 10:07
Ok,

Me perguntaram:

E onde está a vantagem de tudo isso Adriano?

Você vai criar uma tabela auxiliar indexada nao pelo codigo do cliente/produto..., nao pelo nome, e sim pelo resultado do comando SOUNDEX.

Dentro dessa tabela terá o codigo da tabela do cliente ou do produto, isso fará com que rapidamente encontre o dado localizado, mesmo escrevendo errado.

CREATE TABLE ClientesFoneticos
(
[COD_CLIENTE] INT,
[FONETICO] NVARCHAR (50) -- <------------------ CHAVE PRIMARIA INDEXADA
)


CREATE TABLE ProdutosFoneticos
(
[COD_PRODUTOS] INT,
[FONETICO] NVARCHAR (50) -- <------------------ CHAVE PRIMARIA INDEXADA
)


Tá, Adriano e como faço a carga nessas tabelas com o código fonético?

R.:

Simples, como sempre fez, vai ler a tabela de clientes por exemplo e colocar na primeira coluna o código do cliente e no campo FONETICO, vai fazer o soundex do nome assim:

Primeiro faz a carga normal colocando no codigo e no fonetico o codigo e o nome do cliente, dessa forma:
INSERT INTO ClientesFoneticos
(
COD_CLIENTE,
FONETICO
)
SELECT COD_CLIENTE, NOME_CLIENTE FROM TabelaClientes

--Agora que puchou os dados dos clientes para a tabela ClientesFoneticos, vamos alterar apenas a coluna FONETICO, da seguinte forma abaixo:

UPDATE ClientesFoneticos
SET
FONETICO = SELECT DBO.FUNC_FONETIZAR(FONETICO,0)


Muito simples né!

OU USANDO O SOUNDEX DO PROPRIO WL

COD_CLIENTE = COD_CLIENTE
FONETICO = SOUNDEX('ADRIANO BOLLER')
HAdd( ClientesFoneticos )


E vai fazer a gravacao dos dados.

Tendo os dados nessa tabela auxiliar as suas buscas nos campos, autocompletes nao vao buscar na tabela de Clientes ou de produtos, vão buscar nas tabelas FONETICAS. Assim o seu sistema vai fazer buscas muito mais rápidas e mesmo errando o texto ou nao tendo certeza do que busca o usuário vai ter a informação localizada.

SIMPLES ASSIM!!!!

Qualquer dúvida entre em contato para eu explicar melhor esse conceito.

SKYPE ID: ADRIANOBOLLER

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 12 novembre 2016 - 10:45
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 14 mars 2017 - 21:02
Prezados,

Stored procedure de conversao texto para fonetica para usar na interface do sistema
Ao pesquisar pela fonetica tem que fonetizar o texto para poder pesquisar, segue entao abaixo o codigo:

USE [BaseDados]
GO
/****** Object: StoredProcedure [dbo].[sp_fonetizar_string] Script Date: 14/03/2017 17:00:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

--CARGA CEP

ALTER PROCEDURE [dbo].[sp_fonetizar_string] @Texto varchar(max)

AS

SET NOCOUNT ON;

select dbo.Fonetizar(@Texto,0) as Resultado


Botão Buscar

//BUSCA
ok is boolean

Fonetico is string

TableDeleteAll(TABLE_Busca)

sqlexecucao is string = [
exec sp_fonetizar_string '@Busca@'
]

sqlexecucao = Replace(sqlexecucao,"@Busca@",EDT_Busca, IgnoreCase+WholeWord)

dsQuery is Data Source

ok = HExecuteSQLQuery(dsQuery,ConnAsplan360,hQueryWithoutCorrection,sqlexecucao)

IF ok = True THEN

FOR EACH dsQuery

IF HFound(dsQuery) = True THEN

Fonetico = dsQuery.Resultado

END

END

END


sqlexecucao = [
Select * from t0008_buscageralitens where t0008_fonetica_s like '%@Fonetico@%'
]


sqlexecucao = Replace(sqlexecucao,"@Fonetico@",Fonetico, IgnoreCase+WholeWord)

HFreeQuery(dsQuery)

ok = HExecuteSQLQuery(dsQuery,ConnAsplan360,hQueryWithoutCorrection,sqlexecucao)

IF ok = True THEN

FOR EACH dsQuery

IF HFound(dsQuery) = True THEN

TableAdd(TABLE_Busca,dsQuery.t0008_descricao_s +TAB+ dsQuery.t0008_fonetica_s)

TableDisplay(TABLE_Busca,taInit)

END

END

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 14 mars 2017 - 21:08
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 16 mars 2017 - 17:04
Prezados,

Outra técnica seria trabalhando com Buscas em Catalogo Fulltext usando Brasilian 1046


Uma ou mais palavras ou frases específicas
( termo simples ) Por exemplo, "croissant" é uma palavra, e "café au lait" é uma frase. Palavras e frases como essas são chamadas de termos simples.

Na pesquisa de texto completo, uma palavra (ou token ) é uma string cujos limites são identificados por disjuntores de palavras apropriados, seguindo as regras linguísticas do idioma especificado. Uma frase válida consiste em várias palavras, com ou sem quaisquer sinais de pontuação entre elas.

Para obter mais informações, consulte Pesquisando palavras específicas ou Frases (Termo Simples) , mais adiante neste tópico. CONTAINS e CONTAINSTABLE procurar uma correspondência exata para a frase.

FREETEXT e FREETEXTTABLE quebram a frase em palavras separadas .
Uma palavra ou uma frase onde as palavras começam com o texto especificado
( prefixo termo ) Para um único prefixo termo, qualquer palavra começando com o termo especificado será parte do conjunto de resultados. Por exemplo, o termo "auto *" corresponde a "automático", "automóvel", e assim por diante.

Para uma frase, cada palavra dentro da frase é considerada como um prefixo termo. Por exemplo, o termo "auto tran *" corresponde a "transmissão automática" e "transdutor de automóvel", mas não corresponde a "transmissão automática de motor".

Um termo prefixo refere-se a uma seqüência que é afixada na frente de uma palavra para produzir uma palavra derivada ou uma forma flexionada.

Para obter mais informações, consulte Realizando buscas de prefixo (Prefix Term) , mais adiante neste tópico. CONTAINS e CONTAINSTABLE
Formas flexionais de uma palavra específica
( termo de geração - inflexional ) Por exemplo, procure a forma flexional da palavra "unidade". Se várias linhas da tabela incluirem as palavras "drive", "drives", "drive", "driving" e "driven", todas elas estarão no conjunto de resultados porque cada uma delas pode ser gerada de forma flexível a partir da unidade de palavra.

As formas flexionais são os diferentes tempos e conjugações de um verbo ou as formas singular e plural de um substantivo.

Para obter mais informações, consulte Pesquisando o Formulário Flexível de uma Palavra Específica (Termo de Geração) , mais adiante neste tópico. FREETEXT e FREETEXTTABLE procure por termos flexionais de todas as palavras especificadas por padrão.

CONTAINS e CONTAINSTABLE suportam um argumento INFLECTIONAL opcional.
Formas sinônimas de uma palavra específica
( termo de geração - tesauro ) Por exemplo, se uma entrada, "{carro, automóvel, caminhão, van}", for adicionada a um dicionário de sinônimos, você pode pesquisar o formulário de sinônimos da palavra "carro". Todas as linhas da tabela consultada que incluem as palavras "automóvel", "caminhão", "van" ou "carro", aparecem no conjunto de resultados porque cada uma dessas palavras pertence ao conjunto de expansão de sinônimo que contém a palavra "carro".

Um dicionário de sinônimos define sinônimos definidos pelo usuário para termos.

Para obter informações sobre a estrutura de arquivos de dicionário de sinônimos, consulte Configurar e gerenciar arquivos de dicionário de sinônimos para pesquisa de texto completo . FREETEXT e FREETEXTTABLE usam o tesauro por padrão.

CONTAINS e CONTAINSTABLE suportam um argumento THESAURUS opcional.
Uma palavra ou frase próxima a outra palavra ou frase
( termo de proximidade ) Por exemplo, você quer encontrar as fileiras em que a palavra "gelo" está perto da palavra "hóquei" ou em que a frase "patinagem no gelo" está perto da frase "hóquei no gelo".

Um termo de proximidade indica palavras ou frases que estão próximas umas das outras. Você também pode especificar o número máximo de termos não-pesquisa que separam o primeiro eo último termos de pesquisa. Além disso, você pode procurar palavras ou frases em qualquer ordem ou na ordem em que as especifica.

Para obter mais informações, consulte Procurar palavras próximas a outro Word com NEAR . CONTAINS e CONTAINSTABLE
Palavras ou frases usando valores ponderados
( termo ponderado ) Por exemplo, em uma consulta procurando vários termos, você pode atribuir a cada palavra de pesquisa um valor de peso que indica sua importância em relação às outras palavras na condição de pesquisa. Os resultados para este tipo de consulta retornam as linhas mais relevantes primeiro, de acordo com o peso relativo que você atribuiu às palavras de pesquisa. Os conjuntos de resultados contêm documentos ou linhas contendo qualquer um dos termos especificados (ou conteúdo entre eles); Entretanto, alguns resultados serão considerados mais relevantes do que outros devido à variação nos valores ponderados associados a diferentes termos pesquisados.

Um valor de ponderação indica o grau de importância para cada palavra e frase dentro de um conjunto de palavras e frases. Um valor de peso de 0,0 é o mais baixo, e um valor de peso de 1,0 é o mais elevado.

Para maiores informações, CONTAINÁVEL
Pesquise por uma palavra ou frase específica (Termo simples)
Você pode usar CONTAINS , CONTAINSTABLE , FREETEXT ou FREETEXTTABLE para pesquisar uma tabela para uma frase específica .

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[enderecoscorreios](
[Sequencial] [bigint] IDENTITY(1,1) NOT NULL,
[LogradouroAbrev] [varchar](150) NULL,
[Logradouro] [varchar](150) NULL,
[LogradouroCompl] [varchar](150) NULL,
[Fonetica] [varchar](150) NULL,
[LogradouroTipo] [varchar](20) NULL,
[CEP] [varchar](8) NULL,
[Bairro] [varchar](150) NULL,
[BairroAbrev] [varchar](150) NULL,
[IDCidade] [bigint] NULL,
[Cidade] [varchar](150) NULL,
[SubCidadeAbrev] [varchar](150) NULL,
[SubCidade] [varchar](150) NULL,
[CodIBGECid] [bigint] NULL,
[CodIBGEUF] [bigint] NULL,
[UF] [varchar](2) NULL,
CONSTRAINT [PK_Sequencial] PRIMARY KEY CLUSTERED
(
[Sequencial] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO




ALTER DATABASE CEP
ADD FILEGROUP FulltextEnderecosCorreios
GO

ALTER DATABASE CEP
ADD FILE (NAME = N'EnderecosCorreios', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13\MSSQL\DATA\EnderecosCorreios.NDF')
TO FILEGROUP FulltextEnderecosCorreios
GO

Create Fulltext Catalog FulltextEnderecosCorreios
ON FILEGROUP FulltextEnderecosCorreios
GO

Create fulltext index on [dbo].[enderecoscorreios] (
[LogradouroAbrev] language 1046,
[Logradouro] language 1046,
[LogradouroCompl] language 1046,
[Fonetica] language 1046,
[LogradouroTipo] language 1046,
[CEP] language 1046,
[Bairro] language 1046,
[Cidade] language 1046,
[SubCidadeAbrev] language 1046,
[SubCidade] language 1046,
[UF] language 1046
)
key index [PK_Sequencial]
on FulltextEnderecosCorreios
with change_tracking auto;


Exemplo de uso

SELECT Logradouro
FROM enderecoscorreios
WHERE CONTAINS(Logradouro, '"Manoel Ribas"')
GO




SELECT Logradouro
FROM enderecoscorreios
WHERE CONTAINS (Logradouro, '"Ribas*"' ) //Com uso de caracteres Corringas
GO



SELECT Logradouro
FROM enderecoscorreios
WHERE CONTAINS (LogradouroCompl, 'FORMSOF(Logradouro, "Ribas")')



Outros exemplos de uso
SELECT AddressLine1, KEY_TBL.RANK
FROM Person.Address AS Address INNER JOIN
CONTAINSTABLE(Person.Address, AddressLine1, 'ISABOUT ("Bay*",
Street WEIGHT(0.9),
View WEIGHT(0.1)
) ' ) AS KEY_TBL
ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC



SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5 AND
CONTAINS(Description, 'aluminum AND spindle')



SELECT BusinessEntityID, JobTitle
FROM HumanResources.Employee
WHERE FREETEXT(*, 'Marketing Assistant');



SELECT BusinessEntityID,JobTitle
FROM HumanResources.Employee
WHERE CONTAINS(JobTitle, 'Marketing OR Assistant');



SELECT BusinessEntityID,JobTitle
FROM HumanResources.Employee
WHERE CONTAINS(JobTitle, 'Marketing AND Assistant');


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 16 mars 2017 - 17:06
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 16 mars 2017 - 17:11
/****** TRIGGER PARA FAZER A FONETIZACAO AUTOMATICA
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER TRIGGER [dbo].[TR_enderecoscorreios]
ON [dbo].[enderecoscorreios]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;

-- BY BOLLER
-- FONETIZAR AUTOMATICO NOVOS REGISTROS, REGISTROS ALTERADOS E EXCLUIDOS
DECLARE @action as char(1);

declare @SEQUENCIAL bigint, @DESCRICAO varchar(MAX)

IF NOT EXISTS(SELECT * FROM INSERTED)
begin

-- DELETE
SELECT * FROM INSERTED
-- DELETE

end

ELSE

IF NOT EXISTS(SELECT * FROM DELETED)
BEGIN
-- INSERT
select @action = 'i'

-- Incluindo Fonetica
select @SEQUENCIAL = i.Sequencial from inserted i;
select @DESCRICAO = i.Logradouro from inserted i;


UPDATE [dbo].[enderecoscorreios]
SET
[Fonetica] = dbo.fonetizar(@DESCRICAO,0)
WHERE
[Sequencial] = @SEQUENCIAL;


-- INSERT

PRINT '--INSERT [t0008_buscageralitens]';
end
ELSE

begin
-- UPDATE
select @action = 'u'

--Refazer fonetica
select @SEQUENCIAL = u.Sequencial from inserted u;
select @DESCRICAO = u.Logradouro from inserted u;


UPDATE [dbo].[enderecoscorreios]
SET
[Fonetica] = dbo.fonetizar(@DESCRICAO,0)
WHERE
[Sequencial] = @SEQUENCIAL;


-- UPDATE

end

END


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 05 avril 2017 - 19:05
Procedure PreencheListagem(Busca)

X is int = 0

Ok is boolean = False

TableDeleteAll(TABLE_List)

Qry_Pipe is Data Source

SQL_Execute is string = [
Select Concat('Tipo: ', t0008_tipo_s, ': Foram encontrado(s): ', COUNT(*) ,' registro(s), contendo: ', '"@Busca@"', ' na rotina: "', t0008_rotina_s, '" na tabela "', t0008_tabela_s,'" no campo "', t0008_coluna_s,'"') as Registros
From t0008_buscageralcab c , t0008_buscageralitens i
Where CONTAINS(t0008_descricao_s,'"@Busca@"')
and i.t0008_sequencialparametro_n = c.t0008_sequencialparametro_n
group by
t0000_empn01_n,
t0000_empn02_n,
t0000_empn03_n,
t0008_tipo_s,
t0008_rotina_s,
t0008_tabela_s,
t0008_coluna_s
order by t0008_tipo_s, t0008_rotina_s
]

SQL_Execute = Replace(SQL_Execute,"@Busca@",Busca,IgnoreCase+WholeWord)

Ok = HExecuteSQLQuery(Qry_Pipe,ConnAsplan360,hQueryWithoutCorrection+hQueryWithoutHFCorrection,SQL_Execute)

IF Ok = True THEN

FOR EACH Qry_Pipe

IF HFound(Qry_Pipe) = True THEN

X += 1

TableAdd(TABLE_List, Qry_Pipe.Registros)

END

END

END

IF X = 0 THEN

Busca = Fonetizar(Busca)

SQL_Execute = [
Select Concat('Tipo: ', t0008_tipo_s, ': Foram encontrado(s): ', COUNT(*) ,' registro(s), contendo: ', '"@Busca@"', ' na rotina: "', t0008_rotina_s, '" na tabela "', t0008_tabela_s,'" no campo "', t0008_coluna_s,'"') as Registros
From t0008_buscageralcab c , t0008_buscageralitens i
Where CONTAINS(t0008_fonetica_s,'"@Busca@"')
and i.t0008_sequencialparametro_n = c.t0008_sequencialparametro_n
group by
t0000_empn01_n,
t0000_empn02_n,
t0000_empn03_n,
t0008_tipo_s,
t0008_rotina_s,
t0008_tabela_s,
t0008_coluna_s
order by t0008_tipo_s, t0008_rotina_s
]

SQL_Execute = Replace(SQL_Execute,"@Busca@",Busca,IgnoreCase+WholeWord)

Ok = HExecuteSQLQuery(Qry_Pipe,ConnAsplan360,hQueryWithoutCorrection+hQueryWithoutHFCorrection,SQL_Execute)

IF Ok = True THEN

FOR EACH Qry_Pipe

IF HFound(Qry_Pipe) = True THEN

X += 1

TableAdd(TABLE_List, Qry_Pipe.Registros)

END

END

END

END

TableDisplay(TABLE_List,taReExecuteQuery)

TableDisplay(TABLE_List,taInit)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
//hostimage.webdev.info/avatars/RrpZpplIAjR9ZZaAh1xcw
Membre enregistré
2 464 messages
Popularité : +89 (91 votes)
Posté le 05 avril 2017 - 19:05
Procedure Fonetizar(Palavra)

Ok is boolean = False

Qry_Pipe is Data Source

SQL_Execute is string = [
exec sp_fonetizar_string '@Palavra@'
]

SQL_Execute = Replace(SQL_Execute,"@Palavra@",Palavra,IgnoreCase+WholeWord)

Ok = HExecuteSQLQuery(Qry_Pipe,ConnAsplan360,hQueryWithoutCorrection+hQueryWithoutHFCorrection,SQL_Execute)

IF Ok = True THEN

FOR EACH Qry_Pipe

IF HFound(Qry_Pipe) = True THEN

Palavra = Qry_Pipe.Fonetizado

END

END

END

RESULT Palavra


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/