SQL - Pesquisa fonética com Soundex (VB6)

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.

O armazenamento de nome e sobrenome em base de dados relacionais pode estar sujeito a uma imprecisão que pode prejudicar recuperação das informações. Vou mostrar um exemplo do que estou querendo dizer usando o SQL Server 2000.

A primeira coisa a fazer é criar uma banco de dados usando o Enterprise Manager. Eu vou criar um banco de dados chamado Teste04.

A seguir vamos abrir o Query Analizer do SQL Server 2000 e criar uma tabela chamada SoundexTeste com apenas duas colunas : nome char(30) e sobrenome char(30)

Na sequência vamos incluir alguns nomes e sobrenomes usando a instrução SQL INSERT INTO conforme figura abaixo:

O script para criar uma tabela e incluir alguns dados O resultado da inclusão na tabela

Observando a figura que exibe os dados inseridos na tabela você já sentiu aonde eu quero chegar. Agora eu pergunto como você criaria a sua instrução SQL para recuperar as informações desta tabela a partir do Sobrenome ?

A informação Sobrenome possui valores que se assemelham quanto a pronúncia ( Brown , Braun , Broon, Braum, etc.) portanto não seria tão simples recuperar a informação baseada nos valores desta coluna.

Felizmente o SQL Server possui uma função que nos ajuda a resolver o problema. A função SOUNDEX.

SOUNDEX(a) retorna um código SOUNDEX de quatro caracteres para determinar a semelhança entre duas strings.

Vamos ver como ela funciona: Vamos selecionar todos os clientes com sobrenome parecido com Brown. Para isto vou usar uma instrução SQL SELECT . Abaixo temos a utilização da função Soundex e do resultado obtido:

A seleção retornou os valores acima pois todos eles possuem o mesmo valor para SOUNDEX.

Mas como funciona este tal de SOUNDEX ?

A função SOUNDEX é baseada no algoritimo Soundex. Este algoritmo foi criado pelo governo Americano para recuperar nomes para a administração da Seguridade Social nos arquivos Nacionais. O algoritmo é simples e esta explicado a seguir.

- Se o código for maior que quatro caracteres os demais não serão considerados . Se for menor serão acrescidos Zeros.

- Você preserva o primeiro caractare da String e atribui valores conforme a tabela abaixo até 3 caracteres.

- As vogais A,E,I,O,U os caracteres Y,W e H e os demais demais caracteres não são considerados.

- Os caracteres numéricos são considerados apenas para a primeira casa , os demais não considerados

- Havendo caracteres repetidos somente o primeiro será considerado

Valor a ser atribuído ao Caractere   Caractere Calculando o valor SOUNDEX p/ a palavra Brown : B605

 B =   B
 r  =   6
 o =   -
 w =   0
 n =   5

Valor igual a B605.

0 Todas as demais letras ou palavras muito curtas
1 B , P , F , V
2 C , S , G , J . K , Q , X , Z
3 D , T
4 L
5 M , N
6 R

A palavra SOUNDEX tem o valor SOUNDEX igual a S532 . Veja se chegou a este resultado: S(é mantido) , OU(não considerados), N=5 , D=3 , E(não considerado) , X=2

E onde entra o Visual Basic nesta história ? Podemos criar uma função com base no algoritmo que retorne os mesmos valores que a função SOUNDEX.

Abaixo a função Soundex que passa uma string como parâmetro . O valor SOUNDEX para cada caractere é calculado pela função ValorSoundex.

Function Soundex(ByVal texto As String) As String

Dim resultado As String
Dim i As Long
Dim ivalorSoundex As Integer
Dim valorPrimeiraLetra As Integer

' soundex é case-insensitive
texto = UCase$(texto)
' a primeira letra é copiada no resultado

resultado = Left$(texto, 1)
valorPrimeiraLetra = ValorSoundex(resultado)

For i = 2 To Len(texto)
     ivalorSoundex = ValorSoundex(Mid$(texto, i, 1))

     If ivalorSoundex <> 0 And valorPrimeiraLetra <> ivalorSoundex Then
        resultado = resultado & ivalorSoundex
     End If

     valorPrimeiraLetra = ivalorSoundex
     ivalorSoundex = 0

Next

Soundex = Mid$(resultado, 1, 4)

If Len(resultado) < 4 Then
    Soundex = Soundex & String(4 - Len(resultado), "0")
End If

End Function
Function ValorSoundex(sCaractere As String) As Integer

Select Case sCaractere
    Case "B", "F", "P", "V"
         ValorSoundex = "1"
     Case "C", "G", "J", "K", "Q", "S", "X", "Z"
         ValorSoundex = "2"
     Case "D", "T"
          ValorSoundex = "3"
     Case "L"
          ValorSoundex = "4"
     Case "M", "N"
          ValorSoundex = "5"
     Case "R"
          ValorSoundex = "6"
End Select

End Function

Vamos testar a 'bichinha' (ela precisa de uma otimizada , não acha ?? ).

Crie um novo projeto no VB do tipo STANDARD EXE e no formulário padrão inclua os controles conforme a figura abaixo:

No evento Click do botão de comando insira o código que chama a função Soundex e atribui o valor retornado a Label1:

Private Sub Command1_Click()
    Label1.Caption = Soundex(Text1.Text)
End Sub

Com certeza você encontrará outros usos para SOUNDEX. Bons códigos...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?


             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti