![]() |
Datenbank: MySql • Version: 5 • Zugriff über: DBX
"MySql:CDS: Die Änderungen müssen vor der Aktualisierun
Liebe Spezialisten,
"CDS: Die Änderungen müssen vor der Aktualisierung der Daten übernommen werden." Diese Fehlermeldung kommt sporadisch beim Ändern von Datensätzen. Also, es sieht so aus, dass bei ca 100 Datensätzen eine inhaltliche Änderung in einer Schleife funktioniert. Ich kontrolliere das dann auch gleich in der Tabelle. Wenn aber der o.G. Fehler ein einziges mal erscheint, dann kann der Datensatz nicht mehr geändert werden, d.h. wenn ich dann mein kleines Proggi zu mache und wieder öffne, kommt der gleiche Fehler wieder, bei der gleichen Datensatz-ID. Irgendwie scheint da was am Datensatz zu sein. Ich habe aber keine Ahnung wie ich genau diesen einen Datensatz so hin ändere, dass er mit der DBX wieder geändert werden kann. Achja das gleiche tritt natürlich bei Löschungen auch auf. 100 mal gehtz, (damit meine ich oft, die Anzahl ist für mich unvorhersehbar) und wenn der Fehler einmal auftritt, kann ich genau diesen Satz nicht mehr löschen, andere jedoch schon. Verstehe ich nicht. Der Code sieht so aus:
Delphi-Quellcode:
Also ich hab keinen Plan, dsInsert, dsEdit hab ich auch schon abgefragt, und die würden soweit schon passen (was ja auch ganz oft funktioniert).
Procedure Tsich.DS_LM_loeschen(satz : Longword);
begin SQL_Str:='Select * from Pack where ID='+IntToStr(satz); Data.DataModule1.CDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.CommandText:=sql_str; Data.DataModule1.SDSLMPs.Active:=True; Data.DataModule1.CDSLMPs.Active:=True; if Data.DataModule1.CDSLMPs.RecordCount=1 then begin Data.DataModule1.CDSLMPs.Edit; Data.DataModule1.CDSLMPs.Delete; Data.DataModule1.CDSLMPs.ApplyUpdates(-1); //<-kommt manchmal hier end else showmessage ('bei '+intToStr(satz)+'stimmt was nicht! Nur '+intToStr(Data.DataModule1.CDSLMPs.RecordCount)+' Datensätze'); end; Vielen Dank für Ihre Hilfe. |
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
Normalerweise sollte das '.Edit' vor dem '.Delete' überflüssig bzw. falsch sein.
|
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
Hm, den .edit hab ich raus gescmissen.
Das Verhalten ist immer noch das gleiche. |
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
eine Andere Möglichkeit wäre aber auch per SQL-Befehl den Datensatz zu löschen.
geht das so? Bei meinem Versuch klappt das nicht, weiss aber nicht warum:
Delphi-Quellcode:
Vielleicht gibt es ja einen anderen Wort, wo ich meinen SQL-Befehl von der MySQL-Datenbank direkt ausführen kann.
query:='Delete from Packingstructure where ID='+intToStr(satz);
Data.DataModule1.CDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.CommandText:=query; Data.DataModule1.SDSLMPs.Active:=True; Data.DataModule1.CDSLMPs.Active:=True; Hat jemand eine Idee? |
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
Also ich bin noch nicht weiter gekommen.
Habs versucht mit einer Stored Procedure und den Parametern. Bin gegen die Wand gelaufen. Nun bin ich wieder so weit wie vorher.
Delphi-Quellcode:
hab dann in die
Procedure TLMobilesicherung.DS_LM_loeschen(satz : Longword);
begin SQL_Str:='Select * from Pack ID='+IntToStr(satz); Data.DataModule1.SDSLMPs.Refresh; Data.DataModule1.CDSLMPs.Refresh; Data.DataModule1.CDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.Active:=False; Data.DataModule1.SDSLMPs.CommandText:=sql_str; Data.DataModule1.SDSLMPs.Active:=True; Data.DataModule1.CDSLMPs.Active:=True; if Data.DataModule1.CDSLMPs.RecordCount=1 then begin Data.DataModule1.CDSLMPS.Active:=False; Data.DataModule1.SDSLMPS.Active:=False; Data.DataModule1.SDSLMPS.CommandText:=SQL_Str; Data.DataModule1.SDSLMPS.Active:=True; Data.DataModule1.CDSLMPS.Active:=True; Data.DataModule1.CDSLMPS.Delete; Data.DataModule1.CDSLMPS.ApplyUpdates(-1); //<-hier kommt immer 'Datensatz nicht gefunden oder von anderem Benutzer geändert end else showmessage ('bei '+intToStr(satz)+'stimmt was nicht! Nur '+intToStr(Data.DataModule1.CDSLMPs.RecordCount)+' Datensätze'); end;
Delphi-Quellcode:
geschrieben um zu sehen ob es den Datensatz wirklich nicht gibt oder ob er geändert wurde.
procedure TDataModule1.CDSLMPSAfterScroll(DataSet: TDataSet);
begin if Data.DataModule1.CDSLMPS.UpdateStatus=usModified then Data.DataModule1.CDSLMPS.RefreshRecord; end; procedure TDataModule1.CDSLMPSBeforeScroll(DataSet: TDataSet); begin showmessage(Data.DataModule1.CDSLMPS.fieldbyname('ID').asstring); end; Er wurde soweit ich sehe nicht geändert. Kann mir jemand helfen? |
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
Ich denke es gibt zwei Möglichkeiten, weil ich noch nix bekommen hab.
Erste: Das Thema ist garkein Thema, keiner gibt sich damit ab, mir ne Lösung zu geben, weil es zu einfach ist. Zweite: Es weiß nieman eine Lösung. Ohje.... |
Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
Liebes Forum,
ich habe im Delphi-Treff die Lösung nun gefunden. Ich dachte ich sollte es hier mal kund tun. Im Datamodul habe ich ja den Konstrukt Datenbank -> TSQL -> Provider -> TClientdataset -> TDataSource. Nun wenn man im Provider in den Eigenschaften die UpdateMethode von der Standarteinstellung upWhereAll (Alle Spalten (Felder) werden in die Suche nach dem Datensatz einbezogen) auf upWhereKeyOnly umstellt (Es werden nur Schlüsselfelder in die Suche nach dem Datensatz einbezogen), sucht man nur nach dem Index-Feld, welches in meinem Falle ja die Spalte ID ist. So wird die richtige Zeile beim ApllyUpdates(-1) gefunden. Ich hoffe, dass vielleicht jemand anderes auch das Problem hatte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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