AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Daten aus der Detailtabelle löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Daten aus der Detailtabelle löschen

Ein Thema von BBoy · begonnen am 1. Jun 2011 · letzter Beitrag vom 3. Jun 2011
Antwort Antwort
Seite 1 von 2  1 2      
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Daten aus der Detailtabelle löschen

  Alt 1. Jun 2011, 18:21
Datenbank: BDE • Version: 5.1 • Zugriff über: TurboDB
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Daten aus der Detailtabelle löschen

  Alt 1. Jun 2011, 18:26
Code:
delete from childtable where masterid=xxxx;
delete from mastertable where masterid=xxxx;
gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Daten aus der Detailtabelle löschen

  Alt 1. Jun 2011, 18:30
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Daten aus der Detailtabelle löschen

  Alt 1. Jun 2011, 19:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#5

AW: Daten aus der Detailtabelle löschen

  Alt 2. Jun 2011, 10:36
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?
  Mit Zitat antworten Zitat
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: Daten aus der Detailtabelle löschen

  Alt 3. Jun 2011, 09:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Daten aus der Detailtabelle löschen

  Alt 3. Jun 2011, 10:11
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Daten aus der Detailtabelle löschen

  Alt 3. Jun 2011, 10:13
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;
Andreas
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#9

AW: Daten aus der Detailtabelle löschen

  Alt 3. Jun 2011, 10:23
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
  Mit Zitat antworten Zitat
BBoy

Registriert seit: 17. Jan 2007
418 Beiträge
 
Delphi 10 Seattle Professional
 
#10

AW: Daten aus der Detailtabelle löschen

  Alt 3. Jun 2011, 10:37
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
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