アクセスDBに、パイプ( "|")文字を含む文字列を格納する"OperationDesc"というフィールドを持つレコードセットがあります。VBA SQLメソッドを使用してレコードセットを検索し、パイプ文字を含む特定の文字列を特定するたびに、エラー3077「式での垂直バーの使用が無効です。
エラーを引き起こすセクションは次のとおりです。
Set dbs = CurrentDb
qr = "SELECT * FROM [A500Constants] ORDER BY [A500Constants].[ID];"
Set rs = dbs.OpenRecordset(qr)
qr = "[A500Constants].[ID] = " & Me.Controls("AddRoutDesc" & spot).Value
**rs.FindFirst qr**
If rs.Fields("ID") = 1 And Not rs.Fields("OperationDesc") = Me.Controls("AddRoutDesc" & CStr(spot)).Value Then
'If true at start of rs when not suppose to be - signifies new entry time
'if Me.Controls("AddRoutDesc" & CStr(Spot)).Value returned a description rather than ID the If would evaluate properly for the 1st item on the routing too
'beginning process of validating new operation data
Me.Controls( "AddRoutDesc"&spot).Valueが|を含む文字列である場合、プログラムは"rs.FindFirstqr"でバグアウトします。パイプ文字。
これがやろうとしていること: 命名規則AddRoutDesc0、AddRoutDesc1、....のコンボボックスはn個あり、そこからユーザーが任意のテキストを入力できるようにしています。コンボボックスを離れるときに、「OperationDesc」というタイトルの列でテーブル/レコードセットを検索して、この説明が以前に使用されたことがあるかどうかを確認します。(私は現在IDを検索していることを知っています-複数列のコンボボックス間の競合のb / cと同時にユーザーが新しい説明を入力できるようにする唯一の方法であるため、OperationDescフィールドで検索したいと思いますリストプロパティへのリンク。)コンボボックスには、選択可能な事前の説明が入力されており、その一部にはパイプがあります。キャラクター。このエラーは、そのような説明を選択し、上記を実行するコンボボックスを離れるときに発生します。もっと簡単な方法があれば-私はSQLにパイプを文字列の単なる別の部分として表示させる方法、それは完璧でしょう。
現在、次のコードを用意しており、|を検索するために機能します。(または実際には何でも)そしてそれをいくつかの追加の区切り文字とパイプに置き換えて、SQLでw/eにフラグを立てないようにします。
Private Function SQLStringFixer(InputString As String, ByVal FindString As String, ByVal ReplacementString As String, ByVal CompType As Integer) As String
If Not IsNull(InputString) Then
Dim WorkingStr As String
Dim Pntr As Integer
WorkingStr = InputString
Pntr = InStr(1, WorkingStr, FindString, CompType)
Do While Pntr > 0
WorkingStr = Left(CStr(WorkingStr), CLng(Pntr - 1)) & ReplacementString & Mid(WorkingStr, Pntr + Len(FindString))
Pntr = InStr(Pntr + Len(ReplacementString), WorkingStr, FindString, CompType)
Loop
SQLStringFixer = WorkingStr
Else
SQLStringFixer = ""
End If
End Function
Private Function FixStr4JetSQL(InputString As String) As String
Dim Temp As String
Temp = SQLStringFixer(InputString, "'", "''", vbBinaryCompare)
FixStr4JetSQL = SQLStringFixer(Temp, "|", "' & chr(124) & '", vbBinaryCompare)
End Function
最終的には、SQLのクエリで|が表示される文字または文字のセットを知る必要があります。パイプとしてのパイプであり、w/eを行うためのいくつかのキーシンボルではありません。誰かがこれが何であるかを知っているなら-それは大きな助けになるでしょう-そのような些細な事柄は私にとても多くの時間を費やしました。