Have you ever had to search for a name on a database without knowing the exact spelling? Tricky, isn't it? This problem was solved many years ago with the creation of a 'sounds like' routine which takes a character string and converts it into something known as a SOUNDEX KEY. In essence this takes the sounds of certain characters and assigns them a number, with similar sounds having the same number. Thus a search on 'MARSTON' will include 'MARSDON' and 'MARSDEN' in the result.
The format of the Soundex Key is 'Xnnn' where:
The rules for converting characters into numbers are as follows:
I had a version of this routine added to my COBOL development environment way back in 1989, but here it is converted for Uniface:
entry SOUNDEX
params
string pi_Name : IN
string po_SoundexKey : OUT
endparams
variables
string lv_LookUp, lv_Char
numeric lv_Num, lv_PrevNum
endvariables
; establish list of letters and corresponding numbers
; (those letters not in the list do not have numbers)
lv_LookUp = "B=1;F=1;P=1;V=1;C=2;G=2;J=2;K=2;Q=2;S=2;X=2;Z=2;D=3;T=3;L=4;M=5;N=5;R=6"
uppercase pi_Name,pi_Name ; must be uppercase
po_SoundexKey = pi_Name[1:1] ; move first character
pi_Name = pi_Name[2] ; drop first character
while (pi_Name != "") ; until all chars have been examined
lv_Char = pi_Name[1:1] ; extract next character
pi_Name = pi_Name[2] ; drop it from input string
; convert this character (if it is in the list) into a number
getitem/id lv_Num, lv_Lookup,lv_Char
if ($status > 0) ; character found
if (lv_Num != lv_PrevNum) ; ignore if same as previous number
po_SoundexKey = "%%po_SoundexKey%%lv_Num" ; append to output
lv_PrevNum = lv_Num ; save number
endif
length po_SoundexKey
if ($result = 4) break ; stop here
endif
endwhile
while ($result < 4)
po_SoundexKey = "%%po_SoundexKey%%%0" ; pad with zeros until length = 4
length po_SoundexKey
endwhile
return(0)
end SOUNDEX
The best way to use this routine is to include the soundex key on the database along with the name and make it an index. Not only is this shorter than the name string, but it allows the name to be stored in a mixture of upper and lower case, which is not usual for an indexed field. The search form must then be modified to convert the user's input into a soundex key so that the search can be performed on this key and not the original name.
Tony Marston
24th March 2001
mailto:tony@tonymarston.net
mailto:TonyMarston@hotmail.com
http://www.tonymarston.net