Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Löschen von 1 zu n und 1 zu n (https://www.delphipraxis.net/11037-loeschen-von-1-zu-n-und-1-zu-n.html)

Tau 30. Okt 2003 09:29


Löschen von 1 zu n und 1 zu n
 
Hallo Leute

das Löschen der ersten 1 zu n Verbindung ist kein Problem aber bei der zweiten da habe ich leider keinen Lösungsansatz vielleicht hat jemand einen Tipp für mich.

besten Dank in voraus

mfg
Tau

Treffnix 30. Okt 2003 09:58

Re: Löschen von 1 zu n und 1 zu n
 
:gruebel:
Wo genau bist du? Also gedanklich? Bei was für einer Datenbank und was genau hast du damit vor?

Tau 30. Okt 2003 10:16

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Treffnix

Die Daten Bank sollte keine Rolle Spielen

mit der AdoQuery ( Where ) Filtere ich mir die Daten und Lösche sie mit einer Schleife bis keine Daten mehr vorhanden sind.

mfg
Tau

MrSpock 30. Okt 2003 10:24

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Tau,

ich verstehe auch nur :stupid: Bahnhof.

Du kannst die Daten direkt löschen:

SQL-Code:
DELETE FROM myTable WHERE ...
oder in deiner Vorgehensweise nach dem Löschen die Query schließen. Die neue Bedingung formulieren, die Query wieder öffnen und alle Datensätze löschen u.s.w.

Treffnix 30. Okt 2003 10:27

Re: Löschen von 1 zu n und 1 zu n
 
Ich fürchte, ich bin immer noch nicht ganz auf deiner Höhe.

Du machst also ein Delete from XY Where ... ?

oder wie soll das aussehen? Vielleicht bin ich auch einfach zu doof... :roll:

Und was genau passiert wenn du was auch immer versuchst?

*edit*
Oh, da hab ich aber scheinbar lange getippt. War der Vulkanier schneller... :wink:

Tau 30. Okt 2003 10:40

Re: Löschen von 1 zu n und 1 zu n
 
Hallo MrSpock

Delete kann ich in der AdoQuery nicht ausführen da ich ja keine Daten zurück bekomme
sondern nur eine Fehlermeldung. usw.

Also wo kann ich bei einer Ado Komponenten einen Delete Befehl absetzen :wall:
mfg
Tau

r_kerber 30. Okt 2003 10:44

Re: Löschen von 1 zu n und 1 zu n
 
Das sollte gehen, in dem Du den Aufruf ADOQuery.ExecSQL ausführst!

Tau 30. Okt 2003 11:01

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Treffnix


Delphi-Quellcode:
      with AdoQuery1 do
         begin
            with SQL do
               begin
               Clear;
               Add('SELECT * From Demo1');
               Add('WHERE');
               Add('TestID LIKE');
               Add(#39 + SuchID + '%' + #39);
            end;
         Open;
      end;
      for Y := 0 to AdoQuery1.RecordCount -1 do
         begin
            if AdoQuery1.RecordCount > 0 then
            AdoQuery1.Delete;
            AdoQuery1.Next;
         end;
      end;

mfg
Tau

MrSpock 30. Okt 2003 11:16

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Tau,

nach dem Löschen steht der Datensatzzeiger automatisch auf dem nächsten Satz.

Mit
Code:
if AdoQuery1.RecordCount > 0 then
            AdoQuery1.Delete;
AdoQuery1.Next;
überspringst du jeden 2. Satz.

Tau 30. Okt 2003 11:32

Re: Löschen von 1 zu n und 1 zu n
 
Hallo MrSpock

es werden aber alle Daten gelöscht den ich habe es Überprüft mit RecordCount :-D
und es sind keine Daten mehr vorhanden.

Delphi-Quellcode:
DELETE FROM myTable WHERE ...
mit dieser Anweisung werden auch nur die Daten in einer Tabelle Gelöscht.

Ich möchte aber in zwei oder auch mehrere Tabellen Löschen.

mfg
Tau

MrSpock 30. Okt 2003 12:02

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Tau,

nein, es werden nicht alle Daten gelöscht, sondern nur die, die die where-Klausel erfüllen.

Recordcount macht hier keinen Sinn, weil eine DELETE Query keine Datenmenge zurückliefert, sondern die Daten direkt auf dem Server löscht. Mit einem anschließendem SELECT kannst du das prüfen.

Treffnix 30. Okt 2003 12:08

Re: Löschen von 1 zu n und 1 zu n
 
Zitat:

es werden aber alle Daten gelöscht den ich habe es Überprüft mit RecordCount
und es sind keine Daten mehr vorhanden.
Das wundert mich jetzt allerdings auch ein bisschen. Aber wenns klappt umso besser...


Zitat:

mit dieser Anweisung werden auch nur die Daten in einer Tabelle Gelöscht.

Ich möchte aber in zwei oder auch mehrere Tabellen Löschen.
In deinem Select-Statement hast du doch auch nur eine Tabelle ausgewählt, oder? Wie willste dann mehr löschen?
Grundsätzlich halte ich den Delete-Befehl jedenfalls sauberer und schneller, als Datensatz für Datensatz abzuklappern.

Aber wie gesagt: Wenns klappt is joa alles in Buddha. Klappts denn? :)

*edit*
Ich bin soooo langsam.... :cry:

Treffnix 30. Okt 2003 12:14

Re: Löschen von 1 zu n und 1 zu n
 
Aber diesmal hat der Vulkanier nicht aufgepasst.

Zitat:

nein, es werden nicht alle Daten gelöscht, sondern nur die, die die where-Klausel erfüllen
Ich glaube Tau meinte, dass mit seiner Variante alle Daten gelöscht werden, statt jedem 2. , wie von dir vermutet.

Zitat:

Recordcount macht hier keinen Sinn, weil eine DELETE Query keine Datenmenge zurückliefert, sondern die Daten direkt auf dem Server löscht. Mit einem anschließendem SELECT kannst du das prüfen.
Und bei seiner Variante macht Recordcount schon Sinn.

Sollte ich derjenige sein, der Tau falsch verstanden hat, nehme ich alles zurück und behaupte das Gegenteil :stupid:

Tau 30. Okt 2003 12:48

Re: Löschen von 1 zu n und 1 zu n
 
Hallo MrSpock und Treffnix

es ist trotzdem noch die Frage offen wie kann ich über mehrere
Tabellen Löschen die mit einer 1 zu n Verbindung zusammen hängen.

mfg
Tau

Tyrael Y. 30. Okt 2003 12:55

Re: Löschen von 1 zu n und 1 zu n
 
Hallo,

wenn du inmehreren Tabellen etwas über ein SQL-Statement löschen möchtest
musst du diese Tabellen im Statement mit LeftJoin verbinden.


Gruß Tyrael

MrSpock 30. Okt 2003 15:48

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Tau,

da kommt es jetzt doch auf die Datenbank an. Manche Datenbanken erlauben die "Löschweitergabe" CASCADE als CONSTRAINT im Rahmen der referenziellen Integrität festzulegen. D.h. diese Datenbanken löschen alle über einen Fremdschlüssel verbundenen Daten, wenn der Masterdatensatz gelöscht wird.

Wenn das die Datenbank nicht kann, dann machst du es am besten in dem BeforeDelete Ereignis des zu löschenden Mastersatzes. Idealerweise unter Transaktionskontrolle, damit bei einem Fehler alles mit ROLLBACK wieder rückgaängig gemacht werden kann.

Beim DeforeDelete Ereignis erstellt du eine weitere Löschquery für die Detailtabelle und stellst über einen Parameter sicher, dass nur die Daten gelöscht werden, die zu dem Masterdatensatz gehören. Bei einem Fehler bricht du die Delete Operation dann ab.

Tau 3. Nov 2003 05:34

Re: Löschen von 1 zu n und 1 zu n
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo MrSpock

Sorry, das ich mich erst jetzt melde musste meinen PC neu Installieren?
Gibt jedes mal 2 Tage Arbeit

Habe es ausprobiert leider mit sehr geringen erfolg. Der wink mit Transaktionskontrolle ist gut, aber leider steht in der Hilfe relativ wenig drin. z.B. über wie viele Tabellen es geht usw.

Mit BeforeDelete bekomme ich immer dieselbe Fehlermeldung. Verstehe aber nicht warum? :wall:


Habe ein kleines Demo gebastelt könntest du mir bitte einmal anschauen.

Besten Dank


mgf
Tau

MrSpock 4. Nov 2003 21:59

Re: Löschen von 1 zu n und 1 zu n
 
Hallo Tau,

was mir auf die Schnelle aufgefallen ist, ist dass du vor dem Löschen des Datensatz diesen in den Edit Mode setzt, das ist aber falsch. Du solltest nur myTable.Delete aufrufen und den vorherigen Edit Aufruf löschen.

Tau 5. Nov 2003 01:31

Re: Löschen von 1 zu n und 1 zu n
 
Hallo MrSpock

Danke für denn Tipp

mfg
Tau


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 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