![]() |
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? |
AW: Daten aus der Detailtabelle löschen
Code:
gruß
delete from childtable where masterid=xxxx;
delete from mastertable where masterid=xxxx; K-H |
AW: Daten aus der Detailtabelle löschen
Im Event BeforeDelete greifst du dir den Wert des Primärschlüsselfeldes ab:
Delphi-Quellcode:
Damit kannst du dir mit einer weiteren SQL-Anweisung die Detaildatensätze löschen:
procedure TForm1.MasterTableBeforeDelete(Dataset:TDataset);
var masterkey : string; begin masterkey := Dataset['PrimaerschlFeld']; // hier werden später die Detaildatensätze gelöscht ... end;
Delphi-Quellcode:
Hinweis: Übergabe des masterkey in der WHERE Bedingung sollte über einen Parameter erfolgen.
procedure TForm1.DeleteDetail1ByMasterkey(const masterkey:string);
begin QueryDel1.SQL.Text := 'DELETE FROM DetailTable1 WHERE MKey='+QuotedStr(masterkey); QueryDel1.Execute; end; 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. |
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.
|
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? |
AW: Daten aus der Detailtabelle löschen
Habe noch nie mit sql gearbeitet. In meinem Programm sieht der Code so aus:
Delphi-Quellcode:
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.
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; 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? |
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 |
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; |
AW: Daten aus der Detailtabelle löschen
Zitat:
Delphi-Quellcode:
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 ;)
// 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; Außerdem ergeben sich bei einigen DBMS auch Performance-Vorteile, wenn das Statement nur oft genug ausgeführt wird :) |
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 07:52 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 by Thomas Breitkreuz