2016-04-12 16 views
1

私の質問はTable_1とTable_2という名前の次の2つのアクセステーブルに関連しています。アクセスVBA:動的列を連結してループ内で実行

Table_1 enter image description here

以下のコードは、同じテーブルの他の二つの列を連結することによって、[Table_2.CombinedField]列を更新することを目的とします。 2つの列の1つは[Table_2.BookName]でなければならず、もう1つの列はTable_1で定義されています。
たとえば、Table_1で見られるように、新規BookTypeはAuthorを使用してBookNameと連結し、Research BookTypeはPublishYearなどを使用する必要があります。つまり、Table_2の連結に使用する列はTable_1に基づいています。 理想的には、以下のコードのターゲット結果は次のようになります。

CombinedField
トム - titleA
ジョン - titleB
2010 - titleC
2011から
company5題し - titleE

しかし、上記のTable_2のTable_2.CombinedFieldを参照してください。コードはTable_1(Author)の最初の行のみを使用し、Table_2のすべての行に適用されます。

Function CombineVariableFields_NoLoop() 
On Error Resume Next 

    Dim ws As Workspace 
    Dim strSQL As String 
    Dim fieldname As String 

    fieldname = DLookup("[SelectCombineField]", "Table_1") 

    Set ws = DBEngine.Workspaces(0) 
    Set db = CurrentDb() 

On Error GoTo Proc_Err 
    ws.BeginTrans 

    strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]![" & fieldname & "] & ' - ' & [Table_2]![BookName]" 
    db.Execute strSQL, dbFailOnError 

    ws.CommitTrans 

Proc_Exit: 
    Set ws = Nothing 
    Exit Function 

Proc_Err: 
    ws.Rollback 
    MsgBox "Error updating: " & Err.Description 
    Resume Proc_Exit 

End Function 

私の質問
私はループのようなものを使用する必要がありますね。しかし、私はこのシナリオでどのようにコードにループを適用すべきか分かりません。 (申し訳ありません、私はVBAを初めて使っています)。以下のコードはTable_2.CombinedFieldのターゲット結果を生成するために正確なコードが何であるべきかを指摘してくれる人が助けてくれれば幸いです。どうもありがとう。

次のコードこれはBESTの方法ではないかもしれないが、それは動作するはず

Function CombineVariableFields_Loop() 
On Error Resume Next 

    Dim ws As Workspace 
    Dim strSQL As String 
    Dim fieldname As String 
    Set ws = DBEngine.Workspaces(0) 
    Set db = CurrentDb() 

On Error GoTo Proc_Err 
    ws.BeginTrans 

    Set rst = db.OpenRecordset("Select distinct SelectCombineField FROM Table_1", dbOpenDynaset) 
    With rst 
    Do While Not .EOF 
     fieldname = DLookup("[SelectCombineField]", "Table_1", "BookType = " & DLookup("BookType", "Table_2")) 
     strSQL = "UPDATE Table_2 INNER JOIN Table_1 ON Table_2.BookType = Table_1.BookType SET Table_2.CombinedField = [Table_2]![" & fieldname & "] & ' - ' & [Table_2]![BookName]" 
     db.Execute strSQL, dbFailOnError 
     .MoveNext 
    Loop 
    End With 

    ws.CommitTrans 

Proc_Exit: 
    Set ws = Nothing 
    Exit Function 

Proc_Err: 
    ws.Rollback 
    MsgBox "Error updating: " & Err.Description 
    Resume Proc_Exit 

End Function 

答えて

1

はこれを試してみてください。

Set rst = db.OpenRecordset("Select SelectCombineField, BookType FROM Table_1 Where BookType In(Select Distinct BookType From Table_2)", dbOpenDynaset) 
With rst 
Do While Not .EOF 
    strSQL = "UPDATE Table_2 SET Table_2.CombinedField = [Table_2].[" & !SelectCombineField & "] & ' - ' & [Table_2].[BookName] Where BookType = '" & !BookType & "'" 
    db.Execute strSQL, dbFailOnError 
    .MoveNext 
Loop 
End With 
+0

それは動作します!どうもありがとう!! – Will

0

だけ私の推測です:

"UPDATE Table_2 a INNER JOIN Table_1 b ON a.BookType = b.BookType" _ 
     & "SET Table_2.CombinedField = " _ 
      & "Iif(b.[SelectCombinedField = 'Author', a.[Author], " _ 
       & " Iif(b.[SelectCombinedField = 'PublishYear', a.[PublishYear], " _ 
        & "a.[Publisher])) & ' - ' & a.[BookName]" 
+0

この例ではベット"Iif"よりrが 'Switch'になりますが、どちらも条件でtable_1の値を使用する必要があります...コードはいくつかの簡単な更新を行い、フィールドの名前を書く必要はありません。 –

関連する問題