PDA

Vollständige Version anzeigen : DS löschen in mehreren Tabellen


kayd
25.01.2008, 10:54
Hallo,

habe ein Problem mit Löschabfragen für mehrere Tabellen.

Tabellen und Beziehungen:
-"Aktionen" Spalte: Aktionscode
-"Weitergeben" Spalten: ID und Aktionscode
- "Weitergeben Hist" Spalte: ID

Nun möchte ich nicht mehr benötigte DS über die Beziehungen in allen Tabellen löschen. Dazu beziehe ich mich auf ein Kombifeld in einem Formular mit DS-Herkunft Tabelle "Aktionen" wie folgt:

DELETE Aktionen.Aktionen
FROM Aktionen
WHERE (((Aktionen.Aktionen)=[Formulare]![Weitergeben]![Aktionen]));

DELETE WEITERGEBEN.id, WEITERGEBEN.Abgleich, WEITERGEBEN.id_ref, WEITERGEBEN.AS400_Code, WEITERGEBEN.ADM, WEITERGEBEN.Aktionscode FROM WEITERGEBEN
WHERE (((WEITERGEBEN.Aktionscode)=[Formulare]![Weitergeben]![Aktionen]));

Bis hierher funktioniert es. Nun möchte ich aus der Tabelle "Weitergeben Hist"
alle DS löschen die nicht in der Tabelle "Weitergeben" vorhanden sind.

DELETE [WEITERGEBEN HIST].id, [WEITERGEBEN HIST].Abgleich, [WEITERGEBEN HIST].id_ref, [WEITERGEBEN HIST].AS400_Code, [WEITERGEBEN HIST].ADMFROM [WEITERGEBEN HIST]
WHERE ((([WEITERGEBEN HIST].id)<>[WEITERGEBEN]![id]));

Nun wird entweder nach dem Parameter "ID" gefragt oder es kommt die Meldung: löschen aus angegebenen Tabellen nicht möglich

Geht das überhaupt so?

Kay

CptChaos
25.01.2008, 10:57
Wenn in den Beziehungen referentielle Integrität und da die entsprechende Aktualisierungs- und Löschweitergabe gesetzt wurde, sollte es reichen den Masterdatensatz zu löschen.

kayd
25.01.2008, 11:15
Das geht leider nicht weil in der Tabelle "Weitergeben" kein eindeutiger Index möglich ist.

Kay

CptChaos
25.01.2008, 12:00
Dann versuch es über eine Inkonsistenz-Abfrage (kannst Du über den Assistenten erstellen).
Diese liefert die DS der Tabelle Weitergeben Hist, die in keiner Beziehung zu Weitergeben stehen.

Daraus machst Du dann die entsprechende Löschabfrage

Josef P.
25.01.2008, 12:16
Irgendwie versteh ich das Datenmodell nicht.
Warum kann keine RI (referenzielle Integriät) zw. [WEITERGEBEN HIST] und [WEITERGEBEN] eingestellt werden?

[WEITERGEBEN HIST] sieht für mich wie eine Tabelle aus, in der die Werte vor einer DS-Änderung der Tabelle [WEITERGEBEN] gespeichert werden.
[ID] wird vermutlich der PK von [WEITERGEBEN] sein. => RI müsste möglich sein. Ich könnte mir vorstellen, dass RI nicht erwünscht ist, da auch DS in [... HIST] enthalten sein sollen, die bereits aus [WEITERGEBEN] entfernt sind. Aber laut der Beschreibung des Löschvorhabens, ist das nicht erwünscht.

unabhängig, ob RI definiert ist oder nicht:
DELETE FROM [WEITERGEBEN HIST]
WHERE NOT EXISTS (SELECT * FROM WEITERGEBEN
WHERE WEITERGEBEN.ID = [WEITERGEBEN HIST].ID)

kayd
25.01.2008, 16:50
Danke für die schnelle Hilfe. Josef seine Variante funktioniert.

Das Datenmodell arbeitet mit einer Haupt DB und mehreren Benutzer DB welche alle lokal getrennt sind. History hat dabei nur informativen Karakter.

RI wird wohl nicht gehen weil "Weitergeben" keine eindeutigen ID´s enthält. D.h. es dürfen dort zwar neue DS angelegt werden aber keine ID´s vergeben werden, da diese von der Zentral DB kommen müssen. Meine Vermutung.

Eigentlich müsste dieses Modell webbasierend einfacher und besser laufen, aber da traue ich mich noch nicht ran.

Kay