Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mehrere Datensätze von mehreren Tabellen löschen (https://www.delphipraxis.net/164980-mehrere-datensaetze-von-mehreren-tabellen-loeschen.html)

Impulz 8. Dez 2011 13:50

Delphi-Version: 5

Mehrere Datensätze von mehreren Tabellen löschen
 
Hallo,
liebe Com ich habe mal wieder ein Problem:

ich sitze immer noch an meiner DB (IBExpert) und meiner Delphi Oberfläche.

ich habe überall gesucht, ohne überhaupt das stichwort zu kennen nachdem ich suchen sollte.

ich habe ein pmMenu , dass Löschen soll... mir fehlt nur noch der richtige SQL befehl.. DELETE FROM TABELLE WHERE BEDINGUNG geht leider nicht, weil ich PK und FK's habe. Dort steht dann ich lösche nen PK auf den sich ein FK bezieht und desshalb gehts nicht.

wie lösche ich also nun den datensatz und die datensätze in den anderen tabellen die mit dem einen zusammenhängen?


hoffe es ist halbwegs verständlich.




Liebe Grüße,

DeddyH 8. Dez 2011 13:51

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Entweder in der richtigen Reihenfolge löschen (erst abhängige Datensätze, dann den Hauptdatensatz) oder eine entsprechende Löschregel festlegen (ON DELETE SET NULL/CASCADE).

Impulz 8. Dez 2011 14:10

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Wie immer danke für deine schnelle Antwort :),

wie würde das mit der reihenfolge als BSP aussehen?

weil hintereinander wäre mir zu unsicher.... wenn da was schiefgeht dann habe ich den salat.

Nersgatt 8. Dez 2011 14:16

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Wie die richtige Reihenfolge aussieht, kannst nur Du wissen. Dafür muss man die Struktur der DB kennen. Meiner Meinung ist es aber besser, das in der Datenbank zu definieren (wie DeddyH schon sagte, ON DELETE CASCADE).

Impulz 8. Dez 2011 14:22

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
ok danke euch :)

DeddyH 8. Dez 2011 14:24

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Nehmen wir mal eine 1:n-Beziehung, in der Du den Hauptsatz(1) löschen möchtest.
Code:
Haupttabelle:
ID
Name

Detailtabelle:
ID
ID_Haupt --FK auf Haupttabelle
Name
Wuppdi
Nun soll aus der Haupttabelle der Satz mit ID 42 gelöscht werden.
SQL-Code:
DELETE FROM Detailtabelle WHERE ID_Haupt = 42
DELETE FROM Haupttabelle WHERE ID = 42
Das Ganze in einer Transaktion, dann sollte das auch klappen. Alternativ kannst Du natürlich auch eine SP dafür schreiben oder eben die schon erwähnte Löschregel definieren.

[edit] *Oops* zu spät, Sch**ß Telefon :oops: [/edit]

Impulz 8. Dez 2011 14:35

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
ok danke :)

Impulz 9. Dez 2011 05:56

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Code:
delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';';
delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';';
meintet ihr das so?

es funktioniert nicht... kriege eine fehlermeldung. Obwohl ich Sendungsverfolgung_ID lösche steht da, das es nicht geht weil beim Kunden immer noch ein FK zu kunden besteht.

so vielleicht? WHERE Sendungsverfolgung_ID = Kunden.Kunden_ID

???

SO sieht es insgesammt aus im Code:
Code:
procedure TDataconnect.deleteKunde(AKunde: TKunde);
var
  delKuQuery: TIBOQuery;
  delKuTransa: TIBOTransaction;
begin
  delKuQuery:= TIBOQuery.Create(nil);
  delKuQuery.IB_Connection:=FDataBase;
  delKuTransa:= TIBOTransaction.Create(nil);
  delKuTransa.IB_Connection:= FDataBase;
  delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';';
  delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';';
  delKuQuery.ExecSQL();
  delKuTransa.Commit;
  //TRY FINALY EINBAUEN
  delKuQuery.Free;
  delKuTransa.Free;

end;

Bummi 9. Dez 2011 06:31

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Code:
Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))
wird wirklich die KundenID zur Sendungsverfolgung verwendet??

Impulz 9. Dez 2011 06:55

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
ja, die Kunden ID ist der PK für die Sendungsverfolgung_ID.

damit 1 Kunde auch mehrere Bestellungen haben kann, aber gleichzeitig nix durcheinander kommt

PS: Die Kunden_ID ist in der Tabelle Kunden

Bummi 9. Dez 2011 06:58

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
wenn ich nicht völlig übermüdet bin, hast Du Dir gerade selbst widersprochen.
Wenn ich als Kunde 17 3 Sachen bestelle haben drei Sendungen die ID 17 ?

DeddyH 9. Dez 2011 07:01

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Zitat:

Delphi-Quellcode:
delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';';
  delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';';

So wird der erste SQL-Befehl durch den zweiten überschrieben und somit nie ausgeführt. Versuch es stattdessen einmal mit SQL.Add.

Impulz 9. Dez 2011 07:19

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
dann sagt er mir unknown: DELETE (Er versteht das 2te delete nicht)



delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = '''+(Inttostr(AKunde.ID))+ ''';';
delKuQuery.SQL.Add(' DELETE FROM Kunden WHERE Kunden_ID = '''+(Inttostr(AKunde.ID))+ ''';');

DeddyH 9. Dez 2011 07:24

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Dann scheint es wohl wirklich so zu sein wie gestern bereits vermutet: eine Query kann nur einen einzigen Befehl ausführen. Du brauchst also entweder eine andere Komponente (welche, weiß ich allerdings auch nicht) oder musst die Befehle getrennt nacheinander zuweisen und ausführen.

Impulz 9. Dez 2011 07:26

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
:( mist...

DeddyH 9. Dez 2011 07:30

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Ist doch so schlimm auch nicht:
- Transaktion starten
- Detaildatensätze löschen
- Hauptsatz löschen
- Commiten
- Bei Fehler zurückrollen (Rollback)

Oder eine SP schreiben und die dann ausführen ;)

Impulz 9. Dez 2011 07:32

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Okay habe eine andere Möglichkeit entdeckt...

----try except block-------
zB. Query.SQL.TEXT ' DELETE BLA FROM TABELLEBLA WHERE BLA_ID =.... '
Query.Exec.SQL
Query.SQL.TEXT ' DELETE BLUB FROM TABELLEBLUB WHERE BLUB_ID =.... '
Query.Exec.SQL

finaly...
free.

Impulz 9. Dez 2011 07:33

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
:) danke hab ich auch grad so gedacht :)


vielen Dank wieder für deine Hilfe

Impulz 9. Dez 2011 07:36

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
@ Bummi. ja warum nicht? die Send_ID ist dann mit dem Kunden Verknüpft und hat die gleiche KundenSendung_NR...
was gesendet wird sieht man dann über die Bücher_ID zb

DeddyH 9. Dez 2011 07:36

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
So sollte es hoffentlich klappen:
Delphi-Quellcode:
procedure TDataconnect.deleteKunde(AKunde: TKunde);
var
  delKuQuery: TIBOQuery;
  delKuTransa: TIBOTransaction;
begin
  delKuQuery:= TIBOQuery.Create(nil);
  try
    delKuQuery.IB_Connection:=FDataBase;
    delKuTransa:= TIBOTransaction.Create(nil);
    try
      delKuTransa.IB_Connection:= FDataBase;
      try
        delKuQuery.SQL.Text :=' DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = :id';
        delKuQuery.ParamByName('id').Value := AKunde.ID;
        delKuQuery.ExecSQL();
        delKuQuery.SQL.Text :=' DELETE FROM Kunden WHERE Kunden_ID = :id';
        delKuQuery.ParamByName('id').Value := AKunde.ID;
        delKuQuery.ExecSQL();
        delKuTransa.Commit;
      except
        on E: Exception do
          begin
            //Fehlermeldung ausgeben oder etwas in der Art
            delKuTransa.Rollback;
          end;
      end;
    finally
      delKuTransa.Free;
    end;
  finally
    delKuQuery.Free;
  end;
end;

Medium 9. Dez 2011 08:02

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Warum denn nicht übers Constraint? Das wäre doch so viel sauberer, und genau dafür ist doch CASCADE gedacht! :(

DeddyH 9. Dez 2011 08:04

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Woher sollen wir das denn wissen? Die Löschregel wurde mehrfach erwähnt, der TE wird schon seine Gründe haben, wieso er sie nicht definiert.

Impulz 9. Dez 2011 08:10

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
So ist das schon optimal, vielen,vielen Dank!!
läuft

VG

Medium 9. Dez 2011 08:16

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
So lange, bis weitere Tabellen dazu kommen, die die gleiche Spalte als Fremdschlüssel bekommen ;) Das mag im Kleinen weniger schlimm erscheinen, aber es gibt wenig nervigeres, als für sowas dann in einem mittelgroßen Projekt immer wieder an etlichen Stellen die nötigen Statements zu ergänzen. Mitnichten "optimal", finde ich. (Ich hoffe, du packst die 2 Statements wenigstens in eine Transaktion.)

Impulz 9. Dez 2011 08:27

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
das habe ich...
Ich verstehe deine aufregung jetzt hier auch garnicht

p80286 9. Dez 2011 08:52

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Wenn Du cascade nutzt, dann liegen die notwendigen Regeln für die DB in der DB und niemand muß sich kümmern!
Deine Vorgehensweise ist schlicht schlampig und unprofessionell.

(Entschuldige, aber mir hat ein Profi auch mal so eine Lösung verkauft, darüber kann ich mich noch immer aufregen)

Gruß
K-H

Medium 9. Dez 2011 09:27

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Ich reg mich nicht auf, sondern ich durfte mal ein mittelgroßes DB-lastiges Projekt machen, mit einer DB die keine FKs kannte, und zu dem gezwungen war, wie du es gelöst hast. Es war eine kleine Hölle auf Erden, und diese Erfahrung will ich dir einfach weitergeben, in der Hoffnung, dass du dir die hereinbrechende "Maintainance-Hell" ersparen kannst. Es sei denn, du musst einen hochpreisigen Wartungsvertrag rechtfertigen, dann will ich nix gesagt haben :)

Impulz 9. Dez 2011 09:46

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Ja, mein ausgangspunkt ich bin ein Azubi (im ersten Lehrjahr) zum Informatikkaufmann...
Dies soll ein relativ kleines Projekt sein zum üben :)
die großen Sachen muss man hier nur noch pflegen, denn die sind schon vorhanden.

Vielen Dank an euch alle nochmal für die Hilfe
@p80286 ich hoffe es kam jetzt auch nicht rüber als ob ich auf Profi tuh?

Bummi 9. Dez 2011 09:46

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
wg. #10

Erklär mir doch noch mal wie das funktioniert.
Verstanden habe ich es so:

-Sendungsverfolgung_ID ist der Primärschlüssel von Sendungsverfolgung
-eingetragen werden soll hier die Kunden_ID

wie funktioniert es bei diesem Schema 2 Sendungen an einen Kunden zu erstellen.

Impulz 9. Dez 2011 09:48

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Also die sendungsverfolgung hat dann noch einen FK zur KUnden.ID
sprich:

S.K.ID

Bummi 9. Dez 2011 09:53

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
ich gebs auf ....

Sir Rufo 9. Dez 2011 10:06

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Zitat:

Zitat von Bummi (Beitrag 1140479)
ich gebs auf ....

Ich versuche es noch mal ;)

Es geht um diesen Code (ich habe der Übersichtlichkeit mal den SQL als Parameter-Variante aufgeschrieben):
Code:
DELETE FROM Sendungsverfolgung WHERE Sendungsverfolgung_ID = :KundeID;
DELETE FROM Kunden WHERE Kunden_ID = :KundeID;
Wenn die Tabelle jetzt so definiert ist:
Code:
Sendungsverfolgung:
Sendungsverfolgung_ID (Primary Key) => ID der Sendungsverfolgung
Kunden_ID => Referenz zum Kunden
...
Müsste es nicht eher so sein:
Code:
DELETE FROM Sendungsverfolgung WHERE Kunden_ID = :KundeID;
DELETE FROM Kunden WHERE Kunden_ID = :KundeID;

Medium 9. Dez 2011 10:08

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Zitat:

Zitat von Impulz (Beitrag 1140471)
zum üben

Dann doch erst recht die saubere Variante üben! Du bekämst für einen Bruchteil des Aufwandes und weniger Zeilen Code die gleiche Funktionalität in robuster, sicherer, wartungsfreundlicher und erweiterungsoffener, zudem an strukturell sinnvollerer Stelle. Noch ein Vorteil: Du lernst gleich ein wenig das DBMS besser kennen, was insbesondere bei der Wartung bestehender Projekte verdammt praktisch werden dürfte. Ganz ehrlich, du tätest dir wirklich einen Gefallen, egal ob "zum üben" oder in einem echten Projekt. (Nichtzuletzt schleicht sich ja auch gerne mal gelerntes in Produktiveinsätzen ein ;P)

p80286 9. Dez 2011 13:45

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Zitat:

Zitat von Impulz (Beitrag 1140419)
es funktioniert nicht... kriege eine fehlermeldung. Obwohl ich Sendungsverfolgung_ID lösche steht da, das es nicht geht weil beim Kunden immer noch ein FK zu kunden besteht.

@Bummi
Nehmen wir zu seinen Gunsten an, daß er sich zwischen den ganzen Schlüsseln verlaufen hat. Da es nur ein Projekt zum Üben ist....
Hoffentlich gibt es einen Backup.

@Impulz
Wie wäre es, wenn Du uns mal die Tabellendefinition zeigst?
Dann ist die Hilfe u.U. etwas einfacher.

Gruß
K-H

Impulz 12. Dez 2011 06:11

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
vielen Dank erstmal.
also erstmal zu dem code (um es nochmal zu erklärgen das sieht dann bei mir so aus:
Code:
 DELETE FROM RECHNUNGEN R WHERE R.Kunden_ID = :id';
das 'R' ist da entscheidend. ich meinte nicht Kunden_ID (aus der Kundentabelle) sondern den fk R.Kunden_ID (oder S kunden Id, was an dieser stelle egal ist)

Sir Rufo 12. Dez 2011 09:20

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Zitat:

Zitat von Impulz (Beitrag 1140908)
Code:
DELETE FROM RECHNUNGEN R WHERE R.Kunden_ID = :id';
das 'R' ist da entscheidend. ich meinte nicht Kunden_ID (aus der Kundentabelle) sondern den fk R.Kunden_ID (oder S kunden Id, was an dieser stelle egal ist)

Ich wüsste nicht wofür das R da gut sein sollte, IMHO ist das völlig egal, denn es sind keine weiteren Tabellen (mit gleichlaufenden Feldnamen im Spiel).

Darum muss das auch so funktionieren:
Code:
DELETE FROM RECHNUNGEN WHERE Kunden_ID = :id';

Impulz 12. Dez 2011 09:23

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
grad schon, nur das ist ja nur ein auszug... das sieht so aus , dass Kunden ja Fks in 3 Tabellen haben...

diese müssen ja erst ALLE weg bevor man den kunden löscht
zb

Sendungsverfolgung---- Kunden
Rechnung---------"
Buecher----------"
und desshalb nutze ich da das s., r. und b.

so komme ich nicht durcheinander

Sir Rufo 12. Dez 2011 10:37

AW: Mehrere Datensätze von mehreren Tabellen löschen
 
Ich weiß zwar nicht, warum man hierbei durcheinander kommen kann/soll
Code:
DELETE FROM RECHNUNGEN WHERE Kunden_ID = :id;
DELETE FROM SENDUNGVERFOLGUNG WHERE Kunden_ID = :id;
DELETE FROM KUNDEN WHERE ID = :id;
aber da ist ja jeder in seiner eigenen Verwirrung gefangen ;)
Den SQL-Server verwirrt es auf jeden Fall schon mal gar nicht (und der braucht immer eine 100% eindeutige Referenzierung)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz