[AccessD] Option Compare Binary Problem

MartyConnelly martyconnelly at shaw.ca
Fri Aug 15 15:13:33 CDT 2003


 One approach might be to use some variation of a hash function that creates
a new index field that is a hash of the alphnumeric characters  say 
 "1.0.1" that
appears as a double or series of fields converted to doubles. This 
method below
of hashing is called Base 37 Hash.  Numerical Methods text books might 
have documentation.
By changing  the decimal number of the character in code you can alter 
the sort order.
Say if you want to make A and Z equivalent in the sort order instead of 
z character being
assigned decimal 37 force  it to 11 in code.
I wrote this originally to sort on a field that was old Radio Tube
numbers that looked like 2AAW32 2ABW320 2AaW3223 etc and avoid upper 
lower case ordering. You are essentially assigning your own collation 
sequence.

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

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
Rocky Smolin - Beach Access Software wrote:

> I think it would require even more gyrations.  Access very nicely 
> sorts the ~ to the top of a list.  Client wanted it at the bottom.  So 
> everywhere I have to deal with the ~ I have to work around Access's 
> default methods.
>  
> The client just told me to abandon the ~ approach and go with a lower 
> case z prefix.  It's for defining a location where the default 
> location is 'No Building' and 'No Room', where the user hadn't 
> selected a location.  So prefixing with a _ or a ~ sorted the 'No' 
> choices to the top of the list.
>  
> Using z will sort to the bottom where he wants it.  So now all I have 
> to do it go in and undo all that tilde stuff.  So problem not solved, 
> but abandoned.
>  
> Still would like to know how to solve it but it's not a big priority.
>  
> Rocky
>  
>
>     ----- Original Message -----
>     From: Susan Harkins <mailto:harkins at iglou.com>
>     To: Access Developers discussion and problem solving
>     <mailto:accessd at databaseadvisors.com>
>     Sent: Friday, August 15, 2003 9:34 AM
>     Subject: Re: [AccessD] Option Compare Binary Problem
>
>     Can you assign ~ to a constant?
>      
>     Susan H.
>
>      
>
>         Dear List:
>          
>         I'm using Option Compare Binary in a module to get the code to
>         recognize that the tilde character "~" is greater than any
>         alphanumeric character.  (Using Option Compare Database it
>         sorts the tilde up front.)
>          
>         However when I assemble and run a SQL statement that has fld
>         >= "0" and fld <= "~" it return zero records.  If I switch it
>         around so that it says fld >= "~" and fld <= "0" the right
>         number of records is returned. 
>          
>         I found this out when I took the SQL and pasted it into a
>         query and tested the criterion both ways.  So apparently the
>         Option Compare Binary doesn't extend to string comparisons
>         when executing a SQL statement (reasonable).
>          
>         Is there a way to get the same Compare effect in a SQL statement?
>          
>         Thanks in advance to all and regards,
>          
>         Rocky Smolin
>         Beach Access Software
>          
>
>         ------------------------------------------------------------------------
>         _______________________________________________
>         AccessD mailing list
>         AccessD at databaseadvisors.com
>         http://databaseadvisors.com/mailman/listinfo/accessd
>         Website: http://www.databaseadvisors.com
>
>     ------------------------------------------------------------------------
>     _______________________________________________
>     AccessD mailing list
>     AccessD at databaseadvisors.com
>     http://databaseadvisors.com/mailman/listinfo/accessd
>     Website: http://www.databaseadvisors.com
>
>------------------------------------------------------------------------
>
>_______________________________________________
>AccessD mailing list
>AccessD at databaseadvisors.com
>http://databaseadvisors.com/mailman/listinfo/accessd
>Website: http://www.databaseadvisors.com
>  
>




More information about the AccessD mailing list