Autor Beitrag
Josef-B
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Sa 10.04.04 22:47 
Habe mal wieder mit nem IBDATASET meine Anfänger-Probleme:

Ich habe eine kleine Auftragsverwaltung, wobei ich die Köpfe und die Positionen jeweils an eine IBDataset gebunden habe. Finde ich eigentlich so auch nicht schlecht, weil ich so z.B. immer schön von einem Auftrag zum nächsten blättern kann mit prior, next und so.

Jetzt möchte ich aber den aktuellen Datensatz löschen mit folgendem Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
ibdatasetauftragskopf.DeleteSQL.text :=
'DELETE from AUFTRAGKOPFS where AUFTRAGSNUMMER = ' + auftragsnummertext;
ibdatasetauftragskopf.delete;
ibdatasetauftragskopf.Transaction.Commit;
ibdatasetauftragskopf.Active:= true;


Bei Ausführung kommt die Fehlermeldung: Aus der Datenmenge kann nichts gelöscht werden, keine Löschabfrage

wenn ich die Zeile:
ausblenden Delphi-Quelltext
1:
2:
ibdatasetauftragskopf.DeleteSQL.text :=
'delete from AUFTRAGKOPFS where AUFTRAGSNUMMER = ' + auftragsnummertext;


weglasse passiert nichts. Keine Fehlermeldung, allerdings wird der Satz auch nicht gelöscht. Müßte er da nicht die im Dataset gespeicherte Standardanweisung für deletesql ausführen?


Zuletzt bearbeitet von Josef-B am Sa 10.04.04 23:23, insgesamt 1-mal bearbeitet
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 10.04.04 22:51 
ich rate:
Zitat:
'DELETE from AUFTRAGKOPFS where AUFTRAGSNUMMER ' + auftragsnummertext;

ändere dieses zu

Zitat:
'DELETE from AUFTRAGKOPFS where AUFTRAGSNUMMER =' + auftragsnummertext;


(Ist gleich "=" fehlt, where verlangt eine Bedingung a la =, >, <, like etc).

dann funktioniert's auch, schätze ich.

grez
msch

//edit

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Sa 10.04.04 23:22 
Das mit dem '=' ist hier ein Schreibfehler, im Prog hab ichs drin, daran liegts nicht.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 11.04.04 03:07 
Josef-B hat folgendes geschrieben:
Jetzt möchte ich aber den aktuellen Datensatz löschen mit folgendem Code:

ausblenden Delphi-Quelltext
1:
2:
3:
ibdatasetauftragskopf.delete;
ibdatasetauftragskopf.Transaction.Commit;
ibdatasetauftragskopf.Active:= true;


Das sieht nach etwas Durcheinander aus. :P Zuerst versuchst Du einen Record zu löschen, der nicht im Zugriff ist. Dann wird diese Transaktion bestätigt. Zu guter letzt bringst Du dann den Datensatz in den Speicher. Der zu löschende Datensatz muß normalerweise verfügbar sein (besser auch Open statt active verwenden, wer weiß ?) Dann das Delete und dann Commit. 8)

P.S.: uff, Auftragskopf :?: Was passiert denn mit den zugehörigen Positionen, sobald es gelingt, deren "Chef" zu löschen ?

_________________
Gruß
Hansa
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 11.04.04 09:03 
Hallo Hansa,

das Dataset auf active, habe ich nur gesetzt, nach dem Commit, damit es wieder aktiviert wird. Insofern gehört das hier nicht in den Code, sorry.

Und vor dem delete ist das Dataset auch aktiv.

Die Positionen habe ich mit IBSQL bereits gelöscht, das klappt auch. :lol: Allerdings möchte ich bei den Köpfen vermeiden, dass der Zeiger dann wieder beim letzten oder ersten landet. Ich möchte einen Satz zwischendurch mal löschen und dann gleich wieder weiterblättern können.
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: So 11.04.04 12:42 
Hi Josef,

Du bringst hier was gewaltg durcheinander!

Eine IBDataSet funktioniert wie folgt:

Du schreibst In die SelectSQL eine "normale" SelectSQL Anweisung für einen Datensatz aus einer Tabelle. Jetzt kannst Du mit den restlichen SQL (die du über den SQL-Editor erstellen lassen kannst) ganz einfach über die eingebauten Methoden Delete, Insert,... arbeiten. Die IBDataset verwendet dann entsrepchend den mit der SelectSQL geholten Datensatz die anderen SQL's. Willst Du jetzt ein spezielles DML-Statement absetzen, so wie Du es vorhast, musst Du folgendes machen:

Setze das Statemnt in das SelectSQL-Property, füge evtl. die Parameter hinzu und führe das Statement mit IBDataSet.ExecSQL aus!

Grüße
Lemmy
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: So 11.04.04 13:03 
Ja , ich habe das delete auch ohne das SQL statement ausgeführt.

Ich glaube, der Fehler war:

Ich hatte über IB-Expert drei Felder zur Tabelle zugefügt. Allerdings hatte ich die im DATASET Feldeditor noch nicht aktualisiert. Deshalb konnte er das anscheinend nicht löschen. Nachdem ich die drei Felder mit eingetragen hatte, gings auf jeden Fall.

Habe aber noch ein anderes Problem, da mache ich mal ein neues Thema draus, wieder was mit dem Dataset :cry: