Entwickler-Ecke

Datenbanken - Löschweitergabe programmieren


TimHa - Do 16.02.06 19:05
Titel: Löschweitergabe programmieren
Hallo zusammen!

Ich habe eine Datenbank (Rechnung.db und Rechnungsposition.db) in der ich eine Löschweitergabe realisieren möchte. Wenn ich eine Rechnung lösche sollen auch alle zugehörigen Rechnungspositionen gelöscht werden.

Bis jetzt habe ich die Rechnung.db über eine Table Komponente (table_rechnung) an eine Datascource Komponente (Datasource_rechnung) angebunden. Ein dbNavigator greift auf die Datasource_rechnung zu.
Klicke ich beim dbNavigator auf löschen wird die aktuell angezeigte Rechnung gelöscht.

Was muss ich tun, damit auch die zugehörigen Rechnungspositionen gelöscht werden?

Kann ich den dbNavigator durch einen Button ersetzen? Wie muss dann der Button zum löschen der Rechnung aussehen und wie muss ich ihn ergänzen um die zugehörigen Rechnungspositionen zu löschen?

Stehe da total aufm Schlauch...


uwewo - Do 16.02.06 20:48

Hi Tim,

da die Rechnungsnummer in der Haupt und Detail Tabelle vermutlich gleich sind,
lösche zuerst die Daten aus der Detailtabelle und danach aus der Haupttabelle.

Am besten beim Ereignis "BeforeDelete" in der HauptTabelle

SQL Syntax:

Delete from Detailtabelle
where RechnungsNr = ????

Die Rechnung aus der Haupttabelle wird ja sowieso gelöscht
beim klick auf den DBNavigator

Uwe


TimHa - Do 16.02.06 21:04

Hi Uwe!

Ja, die Rechnungsnr ist in beiden Tabellen gleich. Hat auch in beiden Tabellen den gleichen Namen. :)

Jetzt komme ich aber schon nicht mehr weiter. Wo finde ich das Ereignis "BeforeDelete"? Wenn ich die Ereignisse des DBNavigators angucke dann finde ich nur "BeforeAction". Das kann es ja eigentlich nicht sein.

Wie bzw. wo baue ich denn dann meinen SQL Code ein?

Ich brauche ne Anleitung für Dumme. Hab so was noch nie gemacht! Kannst du mir alles bitte etwas ausführlicher beschreiben? Danke. :)

Gruß,
Tim


uwewo - Do 16.02.06 21:13

Hi,

"BeforeDelete" findest Du im Objektinspektor wenn Du die
jeweilige Tabelle markierst.

Auf der Komponenten Registerkarte "Datenzugriff" findest Du neben der
Komponente "Table" auch eine mit dem Namen "Query" mit dieser
kannst Du SQL Abfragen ausführen.

Ich weiß natürlich nicht mit welcher Tabellen-Typ Du arbeitest,
dann sind die Komponenten woanders.

Uwe


TimHa - Do 16.02.06 21:35

Moin!

Also, mein SQL Code im Query würde dann wie folgt aussehen:


Quelltext
1:
2:
3:
Delete *
From Rechnungsdaten
Where Rechnungsnr = Rechnungsnr;


Was wäre denn die DataSource von meine Query?

Ich habe noch keine Table Komponente für die Tabelle Rechnungsdaten. Kann ich das BeforeDelete Ereignis einfach in die Table Komponente Rechnung (table_rechnung) reinschreiben? Oder muss ich das da sogar zwingend reinschreiben?

Wenn ich einen Doppelklick in das BeforeDelete Ereignis mache geht ja eine neue Prozedur auf. Was schreibe ich da rein?

Tim


uwewo - Do 16.02.06 21:51

Vergiß den *

Query Komponente auf die Form ziehen

Dann in das BeforeDelete Ereignis eingeben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Query.Sql.Clear; //Text in Query löschen
Query.Sql.Add('Delete from Rechnungsdaten');//1. Zeile Text hinzufügen
Query.Sql.Add('Where Rechnungsnr = ' + QuotedtStr(IntToStr(TabelleName.Rechnungsnr.Value)));//2. Zeile Text hinzufügen

Query.Active := True;// Query asuführen
Query.Close // Query schliessen


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


TimHa - Do 16.02.06 22:15

Wow... da wäre ich nie im Leben drauf gekommen.

Ich habe folgende Zeile auf meine Bedürfnisse angepasst:

Query.Sql.Add('Where Rechnungsnr = ' + QuotedtStr(IntToStr(Rechnung.Rechnungsnr.Value)));

(Query heißt bei mir auch Query, die Tabelle von der die Rechnungsnr kommt heißt Rechnung)

Jetzt sagt Delphi:
Undefinierter Bezeichner QuotedStr
Undefinierter Bezeichner Rechnung
Operator oder Semikolon fehlt

Was muss ich jetzt noch ändern?

Tim


uwewo - Do 16.02.06 22:37

1. Binde in die uses Klausel Sysutils ein
dann kennt Delphi den Befehl QuotedStr

2. Ersetze Rechnung.RechnungsNr.Value durch
RechnungRechnungsNr.Value

Um den genauen Feldnamen rauszukriegen klicke doppelt auf Deine Tabelle
Markiere das Feld RechnungsNr. Im Objektinspektor unter Name siehst Du die genaue Bezeichnung.

Das Semikolon sollte er Dir anzeigen wo genau es fehlt


TimHa - Do 16.02.06 22:54

Danke für deine Geduld. :)

in der Unit steht ganz oben im Interface Teil uses SysUtils. Damit müsste das Programm doch wissen, dass es die SysUtils nutzen soll?


uwewo - Do 16.02.06 22:59

Das stimmt,

im allgemeinen wenn Du Befehle aus Delphi verwendest die Du nicht kennst,
markiere das Wort und drücke F1.

Im Beispiel "QuotedStr" zeigt er Dir an welche Unit diesen Befehl beinhaltet,
oftmals gibt es auch Beispiele für die Befehle.

So heute kannst Du mich nicht mehr erreichen, aber Morgen ab ca. 18.00 Uhr

Ciao


TimHa - Do 16.02.06 23:03

Ich habs! :)
In der Befehlszeile stand Quotedt... hab das t gelöscht und schon gings!

Nochmals vielen Dank für deine Hilfe!!

Tim


TimHa - Do 16.02.06 23:04

Ich werde jetzt mal testen ob das Programm auch alles macht, was ich möchte. Werde dir morgen sagen ob alles funktioniert hat. :)

Tim