2017-04-18 17 views
0

関数の中で、SQLを実行するために文字列を使用しています。私は、ユーザーの選択に応じて文字列の一部を変更する必要があります。簡潔にするために、私は各テーブルから1つのフィールドだけを含めました。また、これらは実際のテーブル名ではありません。MS Access VBA:動的SQL

strSQL = "DELETE * FROM tblWax" 
db.Execute strSQL, dbFailOnError 

strSQL = "INSERT INTO tblWax (strPortName, lngShortSet) " & _ 
     "SELECT tblAAA.strPastName, tblBBB.lngShortID " & _ 
     "FROM tblAAA INNER JOIN tblBBB ON tblAAA.Parameter = tblBBB.Parameter" 
db.Execute strSQL, dbFailOnError 

私は、ユーザーの選択にと(フィールドstrChoice内で)同じ選択を依存tblBBBためtblSSSを代用したいと思い、tblWaxはtblHatする必要があります。すなわち: strChoice = 1の場合、tblWax、tblAAA、tblBBB strChoice = 2の場合は、次にtblHat、tblAAA、tblSSS

は、そうでない場合、文字列(複数可)の残りの部分は同じです。

答えて

1

To文字列変数をテーブル名に使用する際の@ Smandoliと@ Gustavの答えを展開してください。これにより、SQL文字列で変数名が失われることなく、複数のケースを作成できます。

Select Case strChoice 

    Case 1: 
     strTarget = "tblWax" 
     strJoin = "tblBBB" 

    Case 2: 
     strTarget = "tblHat" 
     strJoin = "tblSSS" 

end select 

strSQL = "DELETE * FROM " & strTarget 
db.Execute strSQL, dbFailOnError 

strSQL = "INSERT INTO " & strTarget & " (strPortName, lngShortSet) " & _ 
     "SELECT tblAAA.strPastName, " & strJoin & ".lngShortID " & _ 
     "FROM tblAAA INNER JOIN " & strJoin & _ 
     " ON tblAAA.Parameter = " & strJoin & ".Parameter" 

db.Execute strSQL, dbFailOnError 
1

は単にVBAのあなたも、1ケース

Case 1, 3, 5 
... 
Case 2, 4, 6 
... 

そして、他のCase

に従わない残りのため Elseを使用して複数の値を使用することができます SELECT...CASE

Select Case strChoice 

    Case 1 
     strSQL = "DELETE * FROM tblWax" 
     db.Execute strSQL, dbFailOnError 

     strSQL = "INSERT INTO tblWax (strPortName, lngShortSet) " & _ 
       "SELECT tblAAA.strPastName, tblBBB.lngShortID " & _ 
       "FROM tblAAA INNER JOIN tblBBB ON tblAAA.Parameter = tblBBB.Parameter" 

    Case 2 
     strSQL = "DELETE * FROM tblHat" 
     db.Execute strSQL, dbFailOnError 

     strSQL = "INSERT INTO tblHat (strPortName, lngShortSet) " & _ 
       "SELECT tblAAA.strPastName, tblSSS.lngShortID " & _ 
       "FROM tblAAA INNER JOIN tblSSS ON tblAAA.Parameter = tblSSS.Parameter" 

End Select 

db.Execute strSQL, dbFailOnError 

のような条件付きロジックを使用します

Case Else 
... 
+3

これは、SQLで文字列変数を使用してリファクタリングすることができます。たとえば、 'strTargetTable =" tblWax "'です。 – Smandoli

+1

確かに。 SQLは変更されないので、_select-case_を使用してテーブル名を決定し、SQLのプレースホルダをテーブル名に置き換えます。 – Gustav

+0

私はそれだけで選択したケースが好きですが、ケースの数が少なくなった今、将来的にはそうではないかもしれません。そこで、select caseを使用して変数をテーブル名に変更し、その変数をSQLに配置します。ありがとうございます。 – random13