MartyConnelly
martyconnelly at shaw.ca
Fri Oct 29 23:37:05 CDT 2004
I am willing to be corrected about this but you can use this method to hash the index field and change the ascii collating sequence. The easy way <grin> to handle this is to use a hash function that creates a new index field that is a hash of the alphnumeric characters that appears as a double or series of fields converted to doubles. This method of hashing is called Base 37 Hash. I have misplaced my written documentation on this. On a Zip drive somewhere. Numerical Methods text book might have documentation. I wrote this originally to sort on a field that was old Radio Call Sign numbers that looked like 2AAW32 2ABW320 2AaW3223 etc. Option Compare Database Option Explicit Const hashFactor As Integer = 37 Const hashLength As Integer = 9 Function HashString(strHash As String) As Double ' Create Hash string for indexing using 'Base 37 Hash Value ' Convert ' spaces punctuation odd chars = 0 ' numeric = 0 - 9 1-10 ' alpha chars a-z A-Z 11-37 ' only use lower case 'such that string "Ab-12" = ' A b - 1 2 ' (11*37^4) + (12*37^3) + (0*37^2) + (2*37^1) + (3*37^0) 'The Hash Length is 9 so it fits a double without precision loss Dim iStrLen As Integer Dim decAsc As Double Dim i As Integer Dim strPad As Integer Dim strToHash As String HashString = 0 ' convert to all lower case strToHash = UCase(strHash) iStrLen = Len(strToHash) 'pad out string to 9 chars with blanks If iStrLen < hashLength Then For strPad = (iStrLen + 1) To hashLength strToHash = strToHash & " " Next Else ' or just grab first nine chars of string If iStrLen > hashLength Then strToHash = Left(strToHash, hashLength) End If End If For i = 1 To hashLength decAsc = Asc(Right(strToHash, i)) 'convert all odd Ascii character values and punctuation to 0 If (decAsc < 48) Or (decAsc >= 58) And (decAsc <= 64) _ Or (decAsc > 91) Then decAsc = 0 Else 'numbers If (decAsc >= 48) And (decAsc <= 57) Then decAsc = decAsc - 47 Else 'letters If (decAsc >= 65) And (decAsc <= 91) Then decAsc = decAsc - 54 ' 54 not 64 as want to start "A" as 11 End If End If End If HashString = HashString + (decAsc * hashFactor ^ (i - 1)) Next End Function OK now how to call this and use it Assume you have a table named [legalnumbering] and two fields one called [LegalNumber] containing your 1.1, 1.0.1 numbers; the other field that you have added as a Double called [HashTitle1]. This will read your 1.0.1 numbered field and create a hash number in the new double field. Then just run this routine below and then a query sorting on the hash field in the table and displaying your legal number field in correct order. Function HashUpdateHierarchLegalNumber() 'Update Method Example 'This example demonstrates the Update method in conjunction with Edit method. Updates the hash field from original index field in the original table. Dim dbs As Database Dim rst As Recordset Dim String1 As String Dim String2 As String ' Set dbs = OpenDatabase("c:\access2\hashing\HashStringA.mdb") Set dbs = CurrentDb() Set rst = dbs.OpenRecordset("LegalNumbering") With rst Do While Not .EOF .Edit String1 = Left(![LegalNumber], 9) 'String2 = Mid(![TubeNumbers], 10, 9)'chunk out further 'String2 = Right(![TubeNumbers], 9) 'if number longer than 9 digits !HashTitle1 = HashString(String1) '!HashTitle2 = HashString(String2) .Update .MoveNext Loop End With rst.Close dbs.Close End Function Not sure but may have stolen this code from part of an article in 1998 Office Access VB mag article by Jim Inscore on Documentation Sets www.advisor.com Mark Rider wrote: >On Sat, 30 Oct 2004 00:35:23 +0000, Billy Pang <tuxedo_man at hotmail.com> wrote: > > >>Hello: >> >>I have a table that contains one column with the following six values: >> >>a1 >>a2 >>a21 >>a10x >>a2a >>a10 >> >>Currently if that column is sorted, it is sorted this way: >> >>a1 >>a10 >>a10x >>a2 >>a21 >>a2a >> >>But I want it to be sorted this way: >> >>a1 >>a2 >>a2a >>a10 >>a10x >>a21 >> >> > >What are you using to view the sorted column? That will be the best >thing to use to figure out the sort. Pull the data from the column, >and have the program sort it as you want.If you are looking at the >column in EM then it will sort according to how the database sees it, >and that is the way the text will be sorted. > > > -- Marty Connelly Victoria, B.C. Canada