Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Daten aus der Detailtabelle löschen (https://www.delphipraxis.net/160809-daten-aus-der-detailtabelle-loeschen.html)

BBoy 1. Jun 2011 17:21

Datenbank: BDE • Version: 5.1 • Zugriff über: TurboDB

Daten aus der Detailtabelle löschen
 
Ich verwende eine Mastertabelle mit den Hauptdaten und 2 Detailtabellen. Das ganze ich einfach über Mastersource und Masterfields verbunden.
Nun möchte ich einen Datensatz aus der Mastertabelle löschen und es sollen alle daten die in der detailtabellen damit verbunden sind ebenfalls gelöscht werden. Wie bekomme ich das hin?

p80286 1. Jun 2011 17:26

AW: Daten aus der Detailtabelle löschen
 
Code:
delete from childtable where masterid=xxxx;
delete from mastertable where masterid=xxxx;
gruß
K-H

shmia 1. Jun 2011 17:30

AW: Daten aus der Detailtabelle löschen
 
Im Event BeforeDelete greifst du dir den Wert des Primärschlüsselfeldes ab:
Delphi-Quellcode:
procedure TForm1.MasterTableBeforeDelete(Dataset:TDataset);
var
  masterkey : string;
begin
  masterkey := Dataset['PrimaerschlFeld'];
  // hier werden später die Detaildatensätze gelöscht
  ...
end;
Damit kannst du dir mit einer weiteren SQL-Anweisung die Detaildatensätze löschen:
Delphi-Quellcode:
procedure TForm1.DeleteDetail1ByMasterkey(const masterkey:string);
begin
  QueryDel1.SQL.Text := 'DELETE FROM DetailTable1 WHERE MKey='+QuotedStr(masterkey);
  QueryDel1.Execute;
end;
Hinweis: Übergabe des masterkey in der WHERE Bedingung sollte über einen Parameter erfolgen.
Das habe ich mir gespart, weil es so einfacher zu verstehen ist.


PS: bei einer richtigen Datenbank werden Detaildaten bei Bedarf automatisch gelöscht.
Paradox ist aber zu alt dafür.

DeddyH 1. Jun 2011 18:54

AW: Daten aus der Detailtabelle löschen
 
TurboDB kenn ich nur dem Namen nach. Unterstützt das Ding evtl. Löschregeln? Dann könnte man das wie erwähnt darüber machen (ON DELETE CASCADE) und muss sich in Delphi nicht darum kümmern.

BBoy 2. Jun 2011 09:36

AW: Daten aus der Detailtabelle löschen
 
Ok, werde das mal probieren.

Dachte eigentlich das ein einfacher .delete Befehl reicht da ja die richtigen Datensätze in den detailtables schon ausgefiltert sind. Kann man denn nicht einfach sagen das alle im detailtable angezeigten gelöscht werden sollen?

BBoy 3. Jun 2011 08:58

AW: Daten aus der Detailtabelle löschen
 
Habe noch nie mit sql gearbeitet. In meinem Programm sieht der Code so aus:
Delphi-Quellcode:
  TdbQuery1.Active := false;
  TdbQuery1.SQL.Clear;
  TdbQuery1.SQL.add ('delete from logs where gccode='+chr(39)+TourTable1gccode.AsString+chr(39));
  datamodule1.TdbQuery1.ExecSQL;
  LogTable2.Refresh;
  TdbQuery1.Open;
In dem Fall kommt nach der Ausführung immer eine Meldung in der die SQL Anweisung steht und OK mehr nicht. Lasse ich das Open am ende weg, kommt keine Meldung aber es wird auch nix gelöscht.

Dem TBQuery ist das DataSet und die Datenbank zugewiesen. Die Tabelle logs sollte er also finden und da Feld gccode ebenfalls.
Was mache ich falsch?

p80286 3. Jun 2011 09:11

AW: Daten aus der Detailtabelle löschen
 
das .open funktioniert im allg. nur wenn Daten von der DB zurück gegeben werden. Du könntest es mal mit .SQLEXEC versuchen.

Gruß
K-H

shmia 3. Jun 2011 09:13

AW: Daten aus der Detailtabelle löschen
 
Du solltest das so machen, wie ich im Betrag #3 gezeigt habe; mit einer eigenen Methode.
Ausserdem solltest du eine eigene Query nur zu dem Zweck des Löschens vorhalten:
Dein Problem ist, dass du die Query TdbQuery1 einerseits zum Anzeigen und andererseits zum Löschen verwenden willst.
Delphi-Quellcode:
// Lösche in Tabelle Logs alle Datensätze die den gccode haben
procedure TForm1.DeleteLogs(const gccode:string);
begin
  QueryDelLogs.SQL.Text := 'delete from logs where gccode='+QuotedStr(gccode);
  QueryDelLogs.ExecSQL;
end;

schlecki 3. Jun 2011 09:23

AW: Daten aus der Detailtabelle löschen
 
Zitat:

Zitat von shmia (Beitrag 1104381)
Delphi-Quellcode:
// Lösche in Tabelle Logs alle Datensätze die den gccode haben
procedure TForm1.DeleteLogs(const gccode:string);
begin
  QueryDelLogs.SQL.Text := 'delete from logs where gccode='+QuotedStr(gccode);
  QueryDelLogs.ExecSQL;
end;

Dann aber bitte gleich mit Parametern
Delphi-Quellcode:
// Lösche in Tabelle Logs alle Datensätze die den gccode haben
procedure TForm1.DeleteLogs(const gccode:string);
begin
  QueryDelLogs.SQL.Text := 'delete from logs where gccode = :gccode';
  QueryDelLogs.ParamByName('gccode').AsString := gccode;
  QueryDelLogs.ExecSQL;
end;
Das hat den Vorteil, dass SQL-Injection direkt erledigt ist, außerdem muss man sich um keinster Weise um Datum-Formatierungskram kümmern, weil man direkt den Parameter.AsDateTime setzen kann ;)
Außerdem ergeben sich bei einigen DBMS auch Performance-Vorteile, wenn das Statement nur oft genug ausgeführt wird :)

BBoy 3. Jun 2011 09:37

AW: Daten aus der Detailtabelle löschen
 
Danke für den neuen code, der ist wohl besser. Aber der Fehler kommt immer noch.

Wenn ich diese Anweisung: delete from logs where GCCode='GC1XZ2Q'
direkt in den sql editor der DB eingebe kommt ebenfalls eine Fehlermeldung in der die Anweisung wiederholt wird. mehr nicht.

Ich habe eine Datenbank mit 3 Tabellen, Tour, Logs und Wpts
Das Query ist mit der DB und der Datasource verbunden.

Diese Anweisung wird ordnungsgemäß ausgeführt: select GCCode from logs

Warum dann die Fehlermeldung bei Delete?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Seite 1 von 2  1 2      

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