2017-06-25 11 views
0

Run time Error messageとのAND句のSQL、アクセス、VBA

こんにちはみんな、WTFの別の割賦は、私が行方不明ですか? このコードを実行すると、不足している演算子の実行時エラーが発生します。添付の​​写真を参照してください。

私はそれを把握できないようです。この文字列は、フォームに入力するレコードセットを開くために使用されます。

Private Sub BtnUseSelection_Click() 

Dim CompSQL As String 

CompSQL = "SELECT T1Company.LegalName, T2AddressType.AddressType, T1Addresses.City" & _ 
        " FROM T2AddressType INNER JOIN (T1Addresses INNER JOIN (T1Company INNER JOIN T3Company_Addresses ON T1Company.CompanyID = T3Company_Addresses.CompanyID) ON T1Addresses.AddressID = T3Company_Addresses.AddressID)" & _ 
        " ON T2AddressType.AddressTypeID = T1Addresses.AddressType" & _ 
        " WHERE T1Company.LegalName = " & Me.LstboxCompanies.Column(0) & " And T2AddressType.AddressType = " & Me.LstboxCompanies.Column(1) & " And T1Addresses.City = " & Me.LstboxCompanies.Column(2) 

Set db = CurrentDb 

Set RSCompany = db.OpenRecordset(CompSQL, dbOpenSnapshot, dbSeeChanges) 

私が紛失しているかどうかは不明ですが、どんな助けでも大歓迎です。

答えて

0

あなたの文字列リテラルの周りを忘れてしまったようです。代わりに

... WHERE T1Company.LegalName = " & Me.LstboxCompanies.Column(0) & " ... 

使用の

... WHERE T1Company.LegalName = '" & Me.LstboxCompanies.Column(0) & "' ... 

ます。また、コマンド(またはSQLインジェクション)の破損を避けるために、あなたの文字列をエスケープする必要があります。いくつかの情報のためにherehereを見てください。

2

parameterizing queryを引用してエンクロージャまたは文字列の連結を避けることを検討してください。

SQL(データベースエンジンは、最適な実行計画を保存して、保存されたAccessクエリとして以下VBA文字列のクエリよりも効率的な保存)

PARAMETERS [LegalNameParam] Text(255), [AddressTypeParam] Text(255), 
      [CityParam] Text(255); 
SELECT T1Company.LegalName, T2AddressType.AddressType, T1Addresses.City 
FROM T2AddressType 
INNER JOIN (T1Addresses INNER JOIN (T1Company 
      INNER JOIN T3Company_Addresses 
      ON T1Company.CompanyID = T3Company_Addresses.CompanyID) 
    ON T1Addresses.AddressID = T3Company_Addresses.AddressID) 
    ON T2AddressType.AddressTypeID = T1Addresses.AddressType 
WHERE T1Company.LegalName = [LegalNameParam] 
AND T2AddressType.AddressType = [AddressTypeParam] 
AND T1Addresses.City = [CityParam] 

VBA(上記のクエリとバインドを呼び出します値を名前付きパラメータに変更)

Dim db As Database, RSCompany As Recordset, qdef As QueryDef 
Dim CompSQL As String 

Set db = CurrentDb  
Set qdef = db.QueryDefs("myStoredQuery") 

qdef!LegalNameParam = Me.LstboxCompanies.Column(0) 
qdef!AddressTypeParam = Me.LstboxCompanies.Column(1) 
qdef!CityParam = Me.LstboxCompanies.Column(2) 

Set RSCompany = qdef.OpenRecordset(dbOpenSnapshot, dbSeeChanges) 
+0

私は再調査する前にそれを見たことがありませんより多くの....パラメータは、独自の関数/サブまたは同じサブで、コーディングするでしょうか? –

+0

私がアドバイスしたとおりに正確に実行され、保存されたクエリとしてSQLを保存し、VBAを投稿として実行します。 'PARAMETERS'節はAccess SQLの方言で有効です。実行時に、SQLクエリの指定されたparamsにVBAの値が割り当てられていることに注意してください。何か問題がありましたか? – Parfait

+0

FYIと同様に、スナップショットレコードセットは更新可能ではないため、dbSeeChangesは必要ありません。 – Minty