Autor |
Beitrag |
Josef-B
      
Beiträge: 293
2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
|
Verfasst: 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:
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:
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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: 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 
      
Beiträge: 293
2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
|
Verfasst: Sa 10.04.04 23:22
Das mit dem '=' ist hier ein Schreibfehler, im Prog hab ichs drin, daran liegts nicht.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 11.04.04 03:07
Josef-B hat folgendes geschrieben: | Jetzt möchte ich aber den aktuellen Datensatz löschen mit folgendem Code:
Delphi-Quelltext 1: 2: 3:
| ibdatasetauftragskopf.delete; ibdatasetauftragskopf.Transaction.Commit; ibdatasetauftragskopf.Active:= true; |
|
Das sieht nach etwas Durcheinander aus.  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.
P.S.: uff, Auftragskopf  Was passiert denn mit den zugehörigen Positionen, sobald es gelingt, deren "Chef" zu löschen ?
_________________ Gruß
Hansa
|
|
Josef-B 
      
Beiträge: 293
2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
|
Verfasst: 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.  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
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: 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 
      
Beiträge: 293
2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
|
Verfasst: 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 
|
|
|