none
für alle Datensätze aus SQL soll den passender Datensatz aus Tabelle DATA abgeändert werden

    Frage

  • in Access mit VBA möchte ich das Feld "Status" aus Tabelle "DATA" anpassen.

    Mit eine Aktualisierungsabfrage funktioniert es nicht weil die Selektion der Datensätze über mehrere Tabellen geht.

    Hier bekomme ich die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden".

    Für die Selektion verwende ich also eine Abfrage die mir den letzten Datensatz zeigt (MAX_Datum), und aus [(MAX_Datum + Wert)<Heute] werden die zu aktualisierende Datensätze ermittelt.

    1_Hier die Abfrage als SQL:

    SELECT DATA.ID, sql_Max_Prüfdatum.PD_MAX AS [LETZTE PRÜF], DATA.Intervall AS INTERVALL, [PD_MAX]+[INTERVALL] AS NÄCHSTE_PRÜF, DATA.PRÜF_STATUS, DATA.STATUS
    FROM sql_Max_Prüfdatum INNER JOIN Daten ON sql_Max_Prüfdatum.Prüf_ID = DATA.ID
    WHERE (([PD_MAX]+[INTERVALL])<Now()) 
    ORDER BY [PD_MAX]+[INTERVALL];

    2_Tabelle DATA sind die Felder ID = identisch zur Prüf_ID und STATUS wichtig

    3_für alle Datensätze aus SQL soll den passender Datensatz aus Tabelle DATA abgeändert werden.

    Vielen Dank

    Donnerstag, 2. Februar 2017 10:42

Alle Antworten

  • Hallo AL1_F,

    eine Frage noch, die Datentypen von INTERVALL und PD_MAX sind jeweils DateTime?

    Ich werde versuchen eine Abfrage mit Subquery zu beschreiben mit der es funktionieren sollte.

    Grüße

    Roland

    Donnerstag, 2. Februar 2017 12:35
  • Hallo AL1_F,

    so würde das mit einer Subquery aussehen:

    SELECT DATA.ID, DATA.Intervall, DATA.Status
    FROM DATA
    WHERE DATA.ID in
     ( SELECT PruefId From [sql_MAX_Pruefdatum]
       WHERE PD_MAX > NOW()   
     );
    

    Die WHERE Bedingung kannst Du natürlich an Deine Bedürfnisse anpassen.

    Diese Abfrage ist dann aber aktualisierbar.

    Grüße

    Roland

    Donnerstag, 2. Februar 2017 12:45
  • Hallo,

    INTERVALL = ZAHL

    PD_MAX = DATUM

    NÄCHSTE_PRÜF = DATUM

    Als SQL funktioniert die Selektion. Ziel ist es über diese SQL die passende Datensätze der Haupttabelle zu aktualisieren.

    Danke

    Donnerstag, 2. Februar 2017 12:45
  • ...ich war zu schnell die Abfrage steht im Beitrag über Deinem. Du musst darin nur die WHERE Bedingung an Deine anpassen.

    Bzw. hier noch einmal komplett:

    UPDATE DATA SET DATA.Status = "Neu"
    WHERE (((DATA.ID) In
     (SELECT PruefId From [sql_MAX_Pruefdatum]
       WHERE (PD_MAX+DATA.Intervall) > NOW()   
     )));


    • Bearbeitet Roland Franz Donnerstag, 2. Februar 2017 13:26 Tippfehler
    Donnerstag, 2. Februar 2017 12:47
  • Danke... und wie kann ich das in VBA einbinden ?
    Donnerstag, 2. Februar 2017 14:34
  • Hier auf das minimum reduziert:

    Public Sub Update()
    Dim db As Database
    Dim qdf As DAO.QueryDef
        Set db = CurrentDb
        Set qdf = db.QueryDefs("qryUpdate")
        qdf.Parameters("Neuer Status").Value = "Neu"
        qdf.Execute dbFailOnError
    End Sub

    Voraussetzung dafür, dass Du den Parameter "Neuer Status" in die Abfrage einbaust.

    Die dazu nötige Abfrage mit dem Namen "qryUpdate" würde dann also so aussehen:

    UPDATE DATA SET DATA.Status = [Neuer Status]
    WHERE (((DATA.ID) In (SELECT PruefId From [sql_MAX_Pruefdatum]
       WHERE (PD_MAX+DATA.Intervall) > NOW()   
     )));

    Grüße

    Roland


    Donnerstag, 2. Februar 2017 14:53