Löschabfrage in Access

Liebe Experten,

habe folgendes Access97-Problem:
Tabelle A (groß)
Tabelle B (klein, Teilmenge aus A)

Bei dem Versuch, die Sätze der Tabelle B in der Tabelle A zu löschen (mittels Löschabfrage), wird die Eingabe von Parameterwerten für das Verknüpfungsfeld in Tabelle B verlangt.
Ich will aber natürlich nicht die Einzelwerte des Verknüpfungsfeldes aus Tabelle B eingeben, dafür habe ich ja die Tabelle B.

Was mache ich falsch?

Gruß
Cassius

Hallo,

falsch ist, den SQl-String der Löschabfrage nicht zu posten…

und die Tabellen mit ihren Schlüsselfeldern zu beschreiben

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Franz,

ich wollte auf der Ebene des Entwurfs-Assistenten bleiben und die SQL-Ebene meiden, da ich in der Syntax nicht zu Hause bin.
Aber wenn es hilft, hier der SQL-String:

DELETE Basis.*, Basis.[MARA-MATNR]
FROM Basis
WHERE (((Basis.[MARA-MATNR]) Like [Tab-Altteile]![MARA-MATNR]));

Gruß
Cassius

Hallo,

ich wollte auf der Ebene des Entwurfs-Assistenten bleiben und
die SQL-Ebene meiden, da ich in der Syntax nicht zu Hause bin.

der Fehler tritt ja bei der Ausführung der Abfrage auf, nicht beim Erstellen der Abfrage…

Aber wenn es hilft, hier der SQL-String:

Klar hilft er, weil ich(!) dann sehe , was Sache ist… :wink:

und als Antwort Dir auch nur einen SQL-String bieten kann und keine Abfrageassistenten-Bedienung.

DELETE Basis.*, Basis.[MARA-MATNR]
FROM Basis
WHERE (((Basis.[MARA-MATNR]) Like
[Tab-Altteile]![MARA-MATNR]));

so:

DELETE * FROM Basis inner join [Tab-Altteile] on Basis.[MARA-MATNR}=[Tab-Altteile]![MARA-MATNR]

Verzichte auf Sonder- und Leerzeichen in Namen, auch wenn da im Hintergrund SAP werkelt.

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Franz,

Dein SQL-String
DELETE * FROM Basis inner join [Tab-Altteile] on Basis.[MARA-MATNR}=[Tab-Altteile]![MARA-MATNR]
führt zu der Meldung
„Verknüpfungsausdruck nicht unterstützt.“

Zählt „-“ im Tabellennamen als Sonderzeichen? Bisher hatte ich in Access damit keine Probleme.

Gruß an den Bodensee
Cassius

Ergänzung:

alle anderen Abfragetypen funktionieren, nur die Löschabfrage will und will nicht :frowning:(

Gruß rheinaufwärts
Cassius

Hallo,

die geschweifte Klammer ist falsch und muss eine Eckklammer sein, sowie das Ausrufezeichen muss ein Punkt sein:

DELETE * FROM Basis inner join [Tab-Altteile] on Basis.[MARA-MATNR]=[Tab-Altteile**].[**MARA-MATNR]

„-“ ist ein Sonderzeichen, soll heißen der Subtraktions-Operant. Wenn solche Namen nicht in Eckklammern eingeschlossen werden, versucht halt die SQL zu agieren (hier zu subtrahieren), was gleich in die Hose geht.

Hallo,

habe deine SQL-Zeile in eine neue Abfrage kopiert und erhalte die Aufforderung, die Tabelle anzugeben, in der gelöscht werden soll.

Wenn ich über den Assistenten komme und dann nach SQL wechsle, erzeugt er mir
DELETE Basis.*, Basis.[MARA-MATNR]
FROM Basis, [Tab-Reifen]
WHERE (((Basis.[MARA-MATNR]) Like [Tab-Reifen]![MARA-MATNR]));
In der Entwurfsansicht sehe ich beide Tabellen aufgerufen, die Felder verknüpft und keine Bedingung.

und beim Auslösen die Nachricht „Operation muß eine aktualisierbare Abfrage verwenden.“
Das Ersetzen des ! durch . ändert daran nichts, die Klammern sind auch alle richtig.

Liegt es daran, daß ich Access97 verwende?

Cassius

Hallo

habe deine SQL-Zeile in eine neue Abfrage kopiert und erhalte
die Aufforderung, die Tabelle anzugeben, in der gelöscht
werden soll.

Prüfe in diesem SQL-String, ob die Tabellen wirklich entspr. meiner Erklärung unten angegeben wurden.

Algemeiner Syntax (das Sternchen kann auch weggelassen werden):

Delete * from tblTabelleInDerGelöschtWerdenSoll
inner Join tblTabelleDieVerbundenWerdenSoll
on tblTabelleInDerGelöschtWerdenSoll.FeldNameZurVerknüpfung = tblTabelleDieVerbundenWerdenSoll.FeldNameZurVerknüpfung

Syntax entspr. den angegebenen Tabellen-/Feldnamen:

DELETE * FROM Basis
inner join [Tab-Reifen]
on Basis.[MARA-MATNR] = [Tab-Reifen].[MARA-MATNR]

Die Tabelle, in der gelöscht wird heißt „Basis“
Die Tabelle, die die Datensätze in „Basis“ bestimmt, heißt „Tab-Reifen“

Die Felder, die inhaltlich auf Gleichheit verglichen werden, heißen „MARA-MATNR“ (Gleicher Name in beiden Tabellen)

Wenn ich über den Assistenten komme und dann nach SQL wechsle,
erzeugt er mir

Was ist der Assistent? Meinst Du den Abfragentwurf?

die folgende SQL ist insofern unsinnig, als dass bei DELETE keine einzelnen Felder gelöscht werden können, sondern immer nur ganze Datensätze.
Sodann besteht die Abfrage aus einer Kreuztabelle(2 Tabellen in der From-Klauses) mit Kriterium, und nicht aus einem inner Join, was die Nicht-Aktualisierbarkeit auslöst.

Sodann ist „Like“ ein denkbar ungünstiger Vergleichsoperator.

DELETE Basis.*, Basis.[MARA-MATNR]
FROM Basis, [Tab-Reifen]
WHERE (((Basis.[MARA-MATNR]) Like [Tab-Reifen]![MARA-MATNR]));
In der Entwurfsansicht sehe ich beide Tabellen aufgerufen, die
Felder verknüpft und keine Bedingung.

und beim Auslösen die Nachricht „Operation muß eine
aktualisierbare Abfrage verwenden.“
Das Ersetzen des ! durch . ändert daran nichts, die Klammern
sind auch alle richtig.

Liegt es daran, daß ich Access97 verwende?

Nein. (zumindest glaube ich das nicht. A97 ist schon lange her…)

Sollte es tatsächlich in A97 keinen inner join für Delete geben, dann versuch:

Delete * from Basis where [Mara-Matnr] in (Select [Mara_Matnr] from [tab-Reifen])

Viele Grüße vom Bodensee
Franz, DF6GL

1 Like

Hallo Franz,

Syntax entspr. den angegebenen Tabellen-/Feldnamen:

DELETE * FROM Basis
inner join [Tab-Reifen]
on Basis.[MARA-MATNR] = [Tab-Reifen].[MARA-MATNR]

Die Tabelle, in der gelöscht wird heißt „Basis“
Die Tabelle, die die Datensätze in „Basis“ bestimmt, heißt „Tab-Reifen“

Die Felder, die inhaltlich auf Gleichheit verglichen werden, heißen :„MARA-MATNR“ (Gleicher Name in beiden Tabellen)

Von A bis Z o.k.
Access meldet: „Geben Sie die Tabelle an, die die zu löschenden Felder enthält.“

  1. Variante
    Delete * from Basis where [Mara-Matnr] in (Select [Mara _ Matnr] from [tab-Reifen])
    Unterstrich durch Bindestrich ersetzt (hätte mir auch passieren können :smile:) )

ES GEEEEHT!

Vielen Dank für Deine Geduld!
Noch zwei Wochen Sonne am Bodensee
wünscht
Cassius

Hallo,

Syntax entspr. den angegebenen Tabellen-/Feldnamen:

DELETE * FROM Basis
inner join [Tab-Reifen]
on Basis.[MARA-MATNR] = [Tab-Reifen].[MARA-MATNR]

Die Tabelle, in der gelöscht wird heißt „Basis“
Die Tabelle, die die Datensätze in „Basis“ bestimmt, heißt „Tab-Reifen“

Die Felder, die inhaltlich auf Gleichheit verglichen werden, heißen :„MARA-MATNR“ (Gleicher Name in beiden Tabellen)

Von A bis Z o.k.
Access meldet: „Geben Sie die Tabelle an, die die zu
löschenden Felder enthält.“

dann halt so:

DELETE Basis.* FROM Basis
inner join [Tab-Reifen]
on Basis.[MARA-MATNR] = [Tab-Reifen].[MARA-MATNR]

  1. Variante
    Delete * from Basis where [Mara-Matnr] in (Select [Mara _ Matnr]
    from [tab-Reifen])
    Unterstrich durch Bindestrich ersetzt (hätte mir auch
    passieren können :smile:) )

ES GEEEEHT!

Vielen Dank für Deine Geduld!
Noch zwei Wochen Sonne am Bodensee
wünscht
Cassius