2016-10-21 4 views
0

Ich habe eine Access 2010-Datenbank mit zwei Tabellen T1 und T2. Ich möchte eine Update-Abfrage schreiben, so dass Werte in T1 mit Werten aus T2 aktualisiert werden. T2 hat zusätzliche Felder, die T1 nicht hat. Diese Felder sollten für das Update ignoriert werden. Abgesehen von diesen Feldern teilen T1 und T2 dieselben Felder und Feldnamen.Aktualisieren von Werten in ms-Zugriffstabelle mit Werten aus einer anderen Tabelle

Da die Anzahl der Felder ziemlich groß ist (mindestens 50), habe ich versucht, nach einem einfachen Drag & Drop-Konfiguration der Abfrage zu suchen. Ich habe beide Tabellen in der Entwurfsansicht verbunden, indem ich den Primärschlüssel von T1 auf den Primärschlüssel von T2 gezogen habe. Dann habe ich alle Felder von T1 zum Datagrid unterhalb der Tabellenansicht hinzugefügt.

Zugriff jetzt möchte ich jedes Feld ([T2]. [Feldname]) unter den hinzugefügten Feldern auswählen und eingeben. Will ich versuche zu erreichen ist, dass diese Informationen automatisch ausgefüllt werden. Ich bezweifle, dass Access eine so essentielle Funktionalität nicht hat und ich wäre dankbar, wenn jemand mir in die richtige Richtung zeigen würde oder einen Einblick geben würde, warum dies NICHT der richtige Weg ist, meinen Tisch zu aktualisieren.

Antwort

2

Betrachten wir ein INNER JOIN in Update-Abfrage:

UPDATE Table1 t1 
INNER JOIN Table2 t2 ON t1.ID = t2.ID 
SET 
    t1.Col1 = t2.Col1, 
    t1.Col2 = t2.Col2, 
    t1.Col3 = t2.Col3, 
    ... 

jedoch die SET Linien für 50 Felder zu schreiben, ist ein bisschen langweilig und wie Sie mit der Entwurfsansicht nicht leicht getan herausgefunden. Daher sollten Sie die Abfrage programmatisch mit VBA die Schaffung eines Querydef verwenden, durch eine tabledef die Felder Iterieren:

Public Sub CreateUpdateQuery() 
    Dim tbl As DAO.TableDef 
    Dim qdf As DAO.querydef 
    Dim fld As DAO.Field 
    Dim strSQL As String 

    strSQL = "UPDATE Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID SET " 

    For Each tbl In CurrentDb.TableDefs 
     If tbl.Name = "Table1" Then 
      For Each fld In tbl.Fields 
       If fld.Name <> "ID" Then 
        strSQL = strSQL & " t1.[" & fld.Name & "] = t2.[" & fld.Name & "]," 
       End If 
      Next fld 
     End If 
    Next tbl 

    strSQL = Left(strSQL, Len(strSQL) - 1) & ";"     ' REPLACING LAST COLUMN 

    For Each qdf In CurrentDb.QueryDefs 
     If qdf.Name = "QryName" Then 
      CurrentDb.Execute "DROP TABLE " & qdf.Name   ' DELETES QUERY IF EXISTS 
     End If 
    Next qdf 

    Set qdf = CurrentDb.CreateQueryDef("QryName", strSQL) ' SAVES A STORED QUERY 

    Set tbl = Nothing 
    Set qdf = Nothing 
End Sub 
+0

Ohne es noch getestet zu haben, scheint dies der perfekte Weg zu sein. Ich war nur sehr verwirrt, wie Access diese Funktionalität nicht mit dem Designer anbietet, da es möglich ist, Beziehungen zwischen zwei Tabellen zu erstellen. Danke für den Code und die SQL-Abfrage! – dm1988

1

Ich bin mir nicht sicher, was das Problem mit dem Versuch, aber Ihr Ziel soll eine codierte Update-Abfrage verwenden, so etwas wie einfach sein:

UPDATE T1 
SET T1.col1 = T2.col1, 
    T1.col2 = T2.col2, 
    T1.col3 = T2.col3, 
    [repeat for each field you're updating] 
WHERE T1.pKey = T2.pKey 

von nur einschließlich den Felder aus T1, die Sie mögen, update, sind die zusätzlichen Felder in T2 egal.

+0

ich nach einem Weg suchen, um nicht eine Abfrage zu schreiben, dass alle 50 Felder ist enthalten, die Änderungen unterliegen können, auch. Danke für deine Mühe noch! – dm1988

Verwandte Themen