none
Aktualisierungsabfragen erstellen

    Frage

  • Hallo zusammen

    Ausgangslage:

    Ich habe eine Tabelle A, welche ich mit Daten aus Tabelle A1 aktualisiern möchte.
    Weiter habe ich eine Tabelle B, welche ich mit Daten aus Tabelle B1 aktualisiern möchte.
    Ich habe noch wenige weitere Tabellenkonstrukte (C aus C1, D aus D1 etc.)

    Die Tabellen A/A1 haben die genau gleiche Datenstruktur, die Tabellen B/B1 haben die genau gleiche Datenstruktur, aber eine andere wie A etc.

    Ich möchte jeweils alle Felder updaten. Jetzt kann ich für die jeweiligen Tabellen eine eigene Abfrage machen, da es nur sehr wenige sind (5). Aber als Freund von dynamischen Lösungen frage ich mich, ob man das nicht anders machen kann. Eine Update-Abfrage mittels * ist leider nicht möglich. Gibt es da andere Lösungen?

    Vielen Dank für Eure Antworten.


    Danke und Gruss Thomas
    Dienstag, 10. Januar 2012 23:37

Antworten

  • Hallo,

    Alphawolfi wrote:

    Ich möchte jeweils alle Felder updaten. Jetzt kann ich für die
    jeweiligen Tabellen eine eigene Abfrage machen, da es nur sehr wenige
    sind (5). Aber als Freund von dynamischen Lösungen frage ich mich, ob
    man das nicht anders machen kann.

    Du koenntest die Tabellen ueber die TableDefs-Collection abarbeiten und individuelle Statements erzeugen. Beispiel (Luftcode):

    Dim Db As DAO.Database
    Dim Rst As DAO.RecordSet
    Dim Tdf As DAO.TableDef
    Dim Fld As DAO.Field
    Dim strSQL As String
    Dim strTables As String
    
    strTables = "'A', 'B', 'C', 'X'" 'deine zu aktualisierenden Tabellen.
    strSQL = "SELECT [Name] FROM MSysObjects " & _
         " WHERE [Name] In (" & strTables & ") AND [Type]=1"
    
    Set Db = CurrentDb
    Set Rst = Db.OpenRecordset(strSQL, dbOpenDynaset)
    
    Do While Not Rst.EOF
        Set Tdf = Db.TableDefs(Rst.Fields(0).Value)
    
        strSQL = "UPDATE [" & Rst.Fields(0).Value & "] AS T1 INNER JOIN [" & _
            Rst.Fields(0).Value & "1] AS T2 ON T1.ID=T2.ID SET "
    
        For Each Fld In Tdf.Fields
            If Fld.Name<>"ID" Then
                strSQL = strSQL & "T1.[" & Fld.Name &"]=T2.[" & Fld.Name &"],"
            End If
        Next Fld
    
        strSQL = Left(strSQL, Len(strSQL)-1)
        Db.Execute strSQL, dbFailOnError
    
        Rst.MoveNext
    Loop
    
    Rst.Close
    Set Rst=Nothing
    Set Fld=Nothing
    Set Tdf=Nothing
    Set Db =Nothing

    Wie du siehst, setzt die Prozedur voraus, dass jede Tabelle einen PK namens
    ID enthaelt, sowie, dass sich die Tabellennamen durch die 1 am Ende
    unterscheiden. Sollte das anders sein, musst du das entsprechend
    angleichen.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    • Als Antwort markiert Alphawolfi Mittwoch, 11. Januar 2012 13:51
    Mittwoch, 11. Januar 2012 11:43
    Moderator

Alle Antworten

  • Hallo Thomas
    Die einfachste (und generische) Methode, wenn die Tabellenstrukturen von X und X1 identisch sind und alle Datensätze von X1 in X vorhanden und aktualisiert werden sollen, ist wohl folgende:
    [sql]
    DELETE FROM X WHERE ID IN (SELECT ID FROM X1)
    INSERT INTO X SELECT * FROM X1
    [/sql]
     
    Randbedingung ist natürlich, dass Du keine Fremdschlüssel hast, die auf X1 verweisen. Sonst müsstest Du diese vorgängig löschen und anschliessend wieder anlegen.
     
    HTH
    Henry

    Hallo zusammen

    Ausgangslage:

    Ich habe eine Tabelle A, welche ich mit Daten aus Tabelle A1 aktualisiern möchte.
    Weiter habe ich eine Tabelle B, welche ich mit Daten aus Tabelle B1 aktualisiern möchte.
    Ich habe noch wenige weitere Tabellenkonstrukte (C aus C1, D aus D1 etc.)

    Die Tabellen A/A1 haben die genau gleiche Datenstruktur, die Tabellen B/B1 haben die genau gleiche Datenstruktur, aber eine andere wie A etc.

    Ich möchte jeweils alle Felder updaten. Jetzt kann ich für die jeweiligen Tabellen eine eigene Abfrage machen, da es nur sehr wenige sind (5). Aber als Freund von dynamischen Lösungen frage ich mich, ob man das nicht anders machen kann. Eine Update-Abfrage mittels * ist leider nicht möglich. Gibt es da andere Lösungen?

    Vielen Dank für Eure Antworten.


    Danke und Gruss Thomas
    Mittwoch, 11. Januar 2012 02:15
  • Hallo Henry

    Ich habe eine Beziehung von Tab X (1-Teil) mit einer anderen Tabelle (n-Teil). Deswegen geht das so nicht.

    Aber falls keine anderen Ideen auftauchen:
    Wie lösche ich eine Beziehung und erstelle diese neu?


    Danke und Gruss Thomas
    Mittwoch, 11. Januar 2012 11:05
  • Hallo,

    Alphawolfi wrote:

    Ich möchte jeweils alle Felder updaten. Jetzt kann ich für die
    jeweiligen Tabellen eine eigene Abfrage machen, da es nur sehr wenige
    sind (5). Aber als Freund von dynamischen Lösungen frage ich mich, ob
    man das nicht anders machen kann.

    Du koenntest die Tabellen ueber die TableDefs-Collection abarbeiten und individuelle Statements erzeugen. Beispiel (Luftcode):

    Dim Db As DAO.Database
    Dim Rst As DAO.RecordSet
    Dim Tdf As DAO.TableDef
    Dim Fld As DAO.Field
    Dim strSQL As String
    Dim strTables As String
    
    strTables = "'A', 'B', 'C', 'X'" 'deine zu aktualisierenden Tabellen.
    strSQL = "SELECT [Name] FROM MSysObjects " & _
         " WHERE [Name] In (" & strTables & ") AND [Type]=1"
    
    Set Db = CurrentDb
    Set Rst = Db.OpenRecordset(strSQL, dbOpenDynaset)
    
    Do While Not Rst.EOF
        Set Tdf = Db.TableDefs(Rst.Fields(0).Value)
    
        strSQL = "UPDATE [" & Rst.Fields(0).Value & "] AS T1 INNER JOIN [" & _
            Rst.Fields(0).Value & "1] AS T2 ON T1.ID=T2.ID SET "
    
        For Each Fld In Tdf.Fields
            If Fld.Name<>"ID" Then
                strSQL = strSQL & "T1.[" & Fld.Name &"]=T2.[" & Fld.Name &"],"
            End If
        Next Fld
    
        strSQL = Left(strSQL, Len(strSQL)-1)
        Db.Execute strSQL, dbFailOnError
    
        Rst.MoveNext
    Loop
    
    Rst.Close
    Set Rst=Nothing
    Set Fld=Nothing
    Set Tdf=Nothing
    Set Db =Nothing

    Wie du siehst, setzt die Prozedur voraus, dass jede Tabelle einen PK namens
    ID enthaelt, sowie, dass sich die Tabellennamen durch die 1 am Ende
    unterscheiden. Sollte das anders sein, musst du das entsprechend
    angleichen.

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    • Als Antwort markiert Alphawolfi Mittwoch, 11. Januar 2012 13:51
    Mittwoch, 11. Januar 2012 11:43
    Moderator
  • Hallo Peter

    Herzlichen Dank. Das ist eine super Lösung (und ohne Tippfehler ;o) ). Die kann ich bestens für mich adaptieren.

    Wünsche noch einen schönen Nachmittag.


    Danke und Gruss Thomas
    Mittwoch, 11. Januar 2012 13:51