PDA

Vollständige Version anzeigen : Abfragen nacheinander ausführen


St Patrik
23.03.2006, 11:23
Hallo, ich habe ein Problem mit der Abarbeitung von zwei Aktionsabfragen:

Ich habe eine Tabelle mit den Feldern: Projekt, Person, Rolle die über m:n-Beziehungen mit den Tabellen Projekte, Personen und Rollen verknüpft ist.

Wenn ich eine Rolle löschen will, starte ich folgenden code:


Private Sub Delete_Click()
On Error GoTo Err_Delete_Click

If MsgBox("Are you sure?", vbYesNo) = vbYes Then
DoCmd.OpenQuery "change role"
DoCmd.OpenQuery "delete role"
DoCmd.Close
End If


Exit_Delete_Click:
Exit Sub

Err_Delete_Click:
MsgBox Err.Description
Resume Exit_Delete_Click

End Sub


"Change role" verändert die Rollen der Personen auf "deleted", "delete role" löscht die Rolle aus der Tabelle "Rollen".

Wenn ich nun DoCmd.OpenQuery "delete role" mit ' auskommentiere, wird die Rolle der Person durch die erste Aktionsabfrage auf "deleted" gestellt und erscheint auch so in der Kombobox (natürlich wird aber die alte Rollenbezeichnung dabei nicht aus der Tabelle "Rollen" gelöscht).

Ist Docmd.openquery "delete role" nicht auskommentiert, bleibt die Kombobox leer und die Rolle wurde auch nicht auf "deleted" umgestellt. Woran liegt das? Der Logik nach müsste Access doch erst die Rollen der betroffenen Personen auf "deleted" stellen und erst dann die Rolle löschen. Werden Sie verkehrt herum ausgeführt, ist delete schneller als change?

Thomas Gasche
24.03.2006, 08:04
Hallo,
ich habe Dich so verstanden, dass Du folgendes abbilden willst:
Eine Person A arbeitet im Projekt B in der Funktion/Rolle C mit.
Jetzt soll die Rolle C "gelöscht" werden.
Hier sehe ich schon ein logisches Problem - Wenn Du die Rolle einfach löscht, verlierst Du den Nachweis, dass A im Projekt ja mal die Rolle C "bekleidet" hat.
Überdenke noch mal die Logik, evtl. ist es besser die Projektzugehörigkeit in Deiner Tabelle zeitabhängig zu gestalten.
Du müßtest dann Deine Tabelle um zwei Datumsfelder erweitern, also
Person, Projekt, Rolle, von, bis.
Auf die Art ersparst Du Dir das löschen von Rollen (nicht mehr gewünschte Rollen kann man ja über einen Schalter ja/nein auf inaktiv setzen) und hast immer den Nachweis, dass eine Person im Projekt in einer gewissen Funktion tätig war.

Falls Du bei dem geschilderten Ansatz bleiben willst, solltest Du folgendes prüfen:
- Gibt es zwischen der Zuordnungstabelle und der Rollen-Tabelle eine 1:n-Beziehung und welche Zusatzbedingungen sind gesetzt (Aktualisierungweitergabe, Löschweitergabe)?
- Gibt es eine RI, brauchst Du eine Rolle "deleted", sonst gibt es eine Verletzung der RI. Deine "Change Role"-Abfrage muss dann bei den betroffenen Sätzen die Rolle "deleted" eintragen (wahrscheinlich den PK-Wert). Oder aber Du veränderst in Deiner "Change Role"-Abfrage nur den Text der Rolle x auf "deleted" - dann ist aber klar, dass die folgende "Delete Role"- Abfrage auch die betroffenen DS in der Zuordnungstabelle löscht (bei OnDeleteCascade) oder aber die Abfrage schief geht.

Das Ganze ist mE kein zeitliches sondern ein logisches Problem.

Anne Berg
24.03.2006, 08:18
Aktionsabfragen führst du am besten mit Execute aus!