Gustav Brock
gustav at cactus.dk
Tue Apr 20 09:12:58 CDT 2004
Hi Harry
> I am searching for a function that determines the need for barcketing and
> need for apostrophing/stringing of variable names. For example a tablename
> stored in variable strTableName with value "table1" would not need
> bracketing, while value "table 1" definitly needs bracketing, e.g. as part
> of an SQL string "FROM [" & strTableName & "]".
Brackets don't harm, so just apply them if you feel they could be
needed.
> To make it a bit more difficult the value could also be "John's Table". This
> would cause problems when we need to string the variable in an SQL string,
> e.g. "SELECT '" & strTableName & "' AS TableName, " would result in "SELECT
> 'Peter's table' AS FromTable," which obviously is not correct, it should be
> "SELECT 'Peter''s table' AS FromTable,". It would also cause problems when
> we decide to code using something like rst(strTableName).
Jürgen Welz have posted a proven clean-up function for this purpose:
A problem with the """" or chr$(34) and such solutions is that if you have a
string with apostrophes in it, like "John O'Conner" or "8' 4" Block Wall",
the sql/find/dAgg will choke. My users are accustomed to mixing both quotes
and apostrophes in their input fields (although we are metric here, we still
get a fair bit of feet and inches stuff and our new Seattle office is
definitely going to be using imperial units of measure). The 97 ADH has a
general solution for fixing mixed quotes and apostrophes.... but it doesn't
work. I use:
<quote>
Function fnFixQuotes(Srch As String) As String
Dim strout As String
Dim Qt As String
Dim IntI As Integer
Qt = """"
For IntI = 1 To Len(Srch)
If InStr(Chr$(34), Mid$(Srch, IntI, 1)) Then
strout = strout & Chr$(34) & "& Chr$(34) &" & Chr$(34)
Else
strout = strout & Mid$(Srch, IntI, 1)
End If
Next
fnFixQuotes = Qt & strout & Qt
End Function
An example of how it's called with wildcards to find a string anywhere in a
field:
Private Sub txtNameCrit_AfterUpdate()
Dim strCrit As String
If Not IsNull(Me.txtNameCrit) Then
strCrit = Me.txtNameCrit
strCrit = fnFixQuotes("*" & strCrit & "*")
Else
strCrit = ""
End If
Call GetCompanies(strCrit)
End Sub
Private Sub GetCompanies(strIn)
Dim strSql As String
With Me
If len(strCrit) Then
strSql = "SELECT CompanyID, CompanyName FROM tblCompany WHERE
CompanyID > 0 AND " & _
"Deleted = False AND CompanyName Like " & strIn
& " ORDER BY CompanyName WITH OWNERACCESS OPTION"
.lstAvailable.RowSource = strSql
.lstAvailable.SetFocus
Else
'sql without criteria
End if
End With
End Sub
If you use a function like this to generate your delimiters, it is
completely unnecessary to use special delimiters in your sql/find/dAgg code.
I've never written a fix to the pipe character (which chokes any sql) but
that can be mostly fixed by replacing it a token). You can write a more
generic procedure yet that will choose your date or string delimiters and
apply them where necessary. I always thought that if you declared a
variable as a string, Access should implicitly add the delimiters. It would
have been easy enough for them to build in an internal delimiter function to
look after this ubiquitous issue.
Ciao
Jürgen Welz
Edmonton, Alberta
</quote>
/gustav