Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 2. POST innerhalb des selben Datensatzes bringt Fehlermeld. (https://www.delphipraxis.net/35827-2-post-innerhalb-des-selben-datensatzes-bringt-fehlermeld.html)

BrinkschulteManfred 12. Dez 2004 11:58


2. POST innerhalb des selben Datensatzes bringt Fehlermeld.
 
Hallo zusammen,

mit DELPHI 7 Ent. greife ich per ADO auf SQL 2000 zu. Alles funktioniert prima. Nun habe ich eine BeforePost-Prozedur eingebaut, die vor dem Speichern eines Datensatzes das Änderungsdatum und den Namen des Bearbeitenden innerhalb der Tabelle ablegen soll. Beim ersten POST funktioniert auch alles gut, wenn ich aber dann eine zweie Änderung in diesem Datensatz in dem Datensatz vornehmen möchte, ohne vorher zu einem anderen Datensatz gegangen zu sein (obwohl, eventuell kommt dann der Fehler auch??) dekomme ich den Fehler:
SQL-Code:
Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf. geändert!
Im Moment weiss ich nicht, wo ich suchen soll ....

Gruß
Manfred

urs.liska 12. Dez 2004 16:51

Re: 2. POST innerhalb des selben Datensatzes bringt Fehlerme
 
Ich kenne mich mit Deiner Konstellation nicht aus, aber bei SQL Servern gibt es oft "Komplikationen" mit dem Refresh von Datenmengen.
Das könnte mit verschiedenen Faktoren zusammenhängen.
Z.B. könnte es sein, dass Du nach dem ersten Post die Transaktion committen musst, damit der Server die Änderungen auch kennt.
Oder Du musst nach dem Post die Datenmenge schließen und wieder neu einlesen.
Oder Du musst Refresh aufrufen (da gibts aber auch wieder Verschiedenes zu beachten).


Ich würde mal bei "Refresh" zu suchen beginnen.

Hoffe, das hilft
Urs

P.S. Das ist schon ein Schuss ins Trübe, ich bin mir gar nicht sicher...

BrinkschulteManfred 13. Dez 2004 09:26

Re: 2. POST innerhalb des selben Datensatzes bringt Fehlerme
 
Hallo Urs,

ein abschließendes Refresh hat nur einen Stack-Fehler gebracht. Ich habe aber noch eine Weile probiert und habe bisher noch folgende weitere Erkenntnisse sammeln können.
In der Tabelle, die ich aktualisieren möchte, gibt es u.a. die Felder 'Aenderer' als varchar25 und das 'Aenderungsdatum' als SmallDateTime.

Diese möchte ich mit
Delphi-Quellcode:
procedure TFormTeile.ADOQueryTeileBeforePost(DataSet: TDataSet);
begin
  //Aenderer und Aenderungsdatum setzen
  ADOQueryTeile.FieldValues['Aenderungsdatum'] := Now();
  ADOQueryTeile.FieldValues['Aenderer'] := GetCurrentUserName;
end;
ändern. Mein Wunsch funktioniert, wenn ich nur den Aenderer aktualisieren lasse. Wenn das Aenderungsdatum (DateTime) gesetzt werden soll, funktioniert dies nur bei dem jeweiliog ersten Aufruf innerhalb eines Datensatzes. Beim Datensatzwechsel ist das kein Problem, ich kann wiederum einmal ein Post ausführen. Auch ein Wechsel der beiden Zeilen brachte keine Besserung.

:dancer: :dancer2: :dancer: :dancer2:
Aaaah, Erfolg!!!
Ein Requery im AfterPost bringt das ersehnte Erlebnis !!!
Aber wieso, warum ist dies nötig?
Zumindest läuft es....
:dancer2: :dancer: :dancer2: :dancer:

Aber noch eine Frage: Sollte man abschließend Requery oder Refresh aufrufen? Was ist Resourcenschonender?
Gruß
Manfred

urs.liska 13. Dez 2004 10:48

Re: 2. POST innerhalb des selben Datensatzes bringt Fehlerme
 
Hallo Manfred,

genau kann ich es nicht erklären, aber es hat auf jeden Fall damit zu tun, dass Dir ein SQL-Server im Gegensatz zu einer Desktop-DB (wie Paradox, dBase, Access...) keine echten, also physischen Tabellen liefert, sondern eine Ergebnismenge.
Selbst wenn Du eine Komponente hättest, die sich wie eine Tabelle benimmt, ruft diese intern die DAten doch über eine SELECT-Abfrage ab.
Der SErver stellt nun auf Deine Anfrage hin eine Ergebnismenge zusammen und hält die so lange vor, wie die Transaktion aktiv ist.
Wenn Du nun etwas an den Daten änderst, wird das in den Tabellen in der DB eingetragen; die Ergebnismenge weiß aber noch nichts davon. Deshalb müssen die Daten neu eingelesen werden. Ich glaube, es gibt ausgefeilte Komponenten, die tatsächlich nur den geänderten Datensatz neu einlesen, was natürlich wesentlich schneller ist als eine komplette DAtenmenge mit Tausenden Datensätzen neu einzulesen..
Ihc denke, Dein Requery entspricht meinem Vorschlag, die Query zu schließen und wieder zu öffnen (wie gesagt, ich kenne mich mit ADO nicht aus).


Eine Alternative wäre evtl. mit CachedUpdates zu arbeiten. Dann werden alle Änderungen in einer lokalen Kopie beim Client gemacht und am Schluss auf einmal in die DB geschrieben.

MfG
Urs

shmia 13. Dez 2004 12:21

Re: 2. POST innerhalb des selben Datensatzes bringt Fehlerme
 
Zitat:

Zitat von BrinkschulteManfred
In der Tabelle, die ich aktualisieren möchte, gibt es u.a. die Felder 'Aenderer' als varchar25 und das 'Aenderungsdatum' als SmallDateTime.

Der Datentyp SmallDateTime ist problematisch, weil er nicht die Genauigkeit hat, die SysUtils.Now() besitzt.
Du könntest stattdessen den Datentyp Datetime verwenden.
Nach einem Requery hat das Feld ADOQueryTeile.FieldValues['Aenderungsdatum'] höchst wahrscheinlich
einen anderen Wert als das Feld davor hatte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 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