Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   "MySql:CDS: Die Änderungen müssen vor der Aktualisierung (https://www.delphipraxis.net/117385-mysql-cds-die-aenderungen-muessen-vor-der-aktualisierung.html)

hirsch 17. Jul 2008 07:58

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:
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;
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).
Vielen Dank für Ihre Hilfe.

alzaimar 17. Jul 2008 08:15

Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
 
Normalerweise sollte das '.Edit' vor dem '.Delete' überflüssig bzw. falsch sein.

hirsch 17. Jul 2008 08:56

Re: "MySql:CDS: Die Änderungen müssen vor der Aktualisi
 
Hm, den .edit hab ich raus gescmissen.
Das Verhalten ist immer noch das gleiche.

hirsch 18. Jul 2008 15:34

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:
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;
Vielleicht gibt es ja einen anderen Wort, wo ich meinen SQL-Befehl von der MySQL-Datenbank direkt ausführen kann.
Hat jemand eine Idee?

hirsch 23. Jul 2008 12:24

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:
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;
hab dann in die
Delphi-Quellcode:
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;
geschrieben um zu sehen ob es den Datensatz wirklich nicht gibt oder ob er geändert wurde.
Er wurde soweit ich sehe nicht geändert.
Kann mir jemand helfen?

hirsch 24. Jul 2008 14:48

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....

hirsch 27. Feb 2009 08:00

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 07:26 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