Discussion:
Schreibkonflikt
(zu alt für eine Antwort)
Michael Reetz
2007-02-28 14:20:58 UTC
Permalink
Hallo NG,

wenn ich in einem Access-Formular, das seine Daten über ein SQL-Statement
vom SQL Server bezieht, Änderungen vornehme, dann den Datensatz verlasse und
anschließend zurückkehre, um eine weitere Änderung vorzunehmen, kommt die
beliebte Schreibkonflikt-Meldung. Da ein timestamp-Attribut vorhanden ist,
kommen Datentypenunterschiede als Ursache nicht in Frage (einmal etwas Ändern
funktioniert ja auch), andere Nutzer scheiden auch aus.

Hat jemand eine Idee, wie man die zweite Änderung ermöglichen kann?

Vielen Dank!

Michael
Michael Reetz
2007-02-28 14:23:36 UTC
Permalink
Habe die Lösung schon selbst gefunden.

Ein requery im AfterUpdate-Ereignis beseitigt das Problem.

Trotzdem danke!

Michael
Post by Michael Reetz
Hallo NG,
wenn ich in einem Access-Formular, das seine Daten über ein SQL-Statement
vom SQL Server bezieht, Änderungen vornehme, dann den Datensatz verlasse und
anschließend zurückkehre, um eine weitere Änderung vorzunehmen, kommt die
beliebte Schreibkonflikt-Meldung. Da ein timestamp-Attribut vorhanden ist,
kommen Datentypenunterschiede als Ursache nicht in Frage (einmal etwas Ändern
funktioniert ja auch), andere Nutzer scheiden auch aus.
Hat jemand eine Idee, wie man die zweite Änderung ermöglichen kann?
Vielen Dank!
Michael
Stefan Hoffmann
2007-02-28 14:49:08 UTC
Permalink
tach Michael,
Post by Michael Reetz
wenn ich in einem Access-Formular, das seine Daten über ein SQL-Statement
vom SQL Server bezieht, Änderungen vornehme, dann den Datensatz verlasse und
anschließend zurückkehre, um eine weitere Änderung vorzunehmen, kommt die
beliebte Schreibkonflikt-Meldung. Da ein timestamp-Attribut vorhanden ist,
kommen Datentypenunterschiede als Ursache nicht in Frage (einmal etwas Ändern
funktioniert ja auch), andere Nutzer scheiden auch aus.
Du hast einen Primärschlüssel und ein Feld vom Typ TIMESTAMP? Läuft ein
Trigger?



mfG
--> stefan <--
Michael Reetz
2007-03-02 13:55:34 UTC
Permalink
Hallo Stefan,

ich konnte nicht früher antworten, weil kurz nach dem letzten Beitrag der IE
an meinem Arbeitsplatz meinte, die Seite enthielte Fehler, und JScript nicht
mehr ausführte. Hat sich trotz aller guten Ratschläge auch noch nichts dran
geändert. Deshalb das Ganze jetzt vom Heim-PC. Aber das ist ein anderes
Thema.

PK und Timestamp sind vorhanden, ein Trigger nicht. Ich vermute, dass Access
einfach nicht mit mitbekommt, dass der Datensatz innerhalb derselben Sitzung
geändert wurde. Vielleicht liegt das an der Kommunikation zwischen Client und
Server. Ich werde da noch mal nachforschen.

Ich habe als Workaround ein Refresh in das AfterUpdate-Ereignis des
Formulars eingebaut. Das beseitigt das Problem, hat aber den Nachteil, das
die Navigation nicht mehr funktioniert. Das habe ich z. T. aber auch schon
gelöst.

Ich werde aber weiter versuchen, die Ursachen des Problems zu ergründen, um
das drumherum gebastel wieder los zu werden.

Bis dann!

Michael
Post by Stefan Hoffmann
tach Michael,
Post by Michael Reetz
wenn ich in einem Access-Formular, das seine Daten über ein SQL-Statement
vom SQL Server bezieht, Änderungen vornehme, dann den Datensatz verlasse und
anschließend zurückkehre, um eine weitere Änderung vorzunehmen, kommt die
beliebte Schreibkonflikt-Meldung. Da ein timestamp-Attribut vorhanden ist,
kommen Datentypenunterschiede als Ursache nicht in Frage (einmal etwas Ändern
funktioniert ja auch), andere Nutzer scheiden auch aus.
Du hast einen Primärschlüssel und ein Feld vom Typ TIMESTAMP? Läuft ein
Trigger?
mfG
--> stefan <--
Henry Habermacher [MVP Access]
2007-03-05 10:32:11 UTC
Permalink
Hallo Michael
Post by Michael Reetz
PK und Timestamp sind vorhanden, ein Trigger nicht. Ich vermute, dass
Access einfach nicht mit mitbekommt, dass der Datensatz innerhalb
derselben Sitzung geändert wurde. Vielleicht liegt das an der
Kommunikation zwischen Client und Server. Ich werde da noch mal
nachforschen.
Access kann das gar nicht mit bekommen, wenn es den Update selber macht.
Machst Du evt. noch irgendwelche Updates nach dem Form_BeforeUpdate
Ereignis? Evt. durch Direktes Ausführen von SQL Statements?

Was ich auch schon gesehen habe, sind DateTime Felder, welche nicht immer
den gleichen Wert drin haben, wie wenn diese weggeschrieben werden. Es geht
dabei allerdings um Sekundenbruchteile, mit denen Access eigentlich nichts
anfangen kann, der SQL Server aber schon. Hier ist die Wahl der richtigen
DAtentypen in Access entscheidend (Double geht in der Regel problemlos)

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Michael Reetz
2007-03-06 10:36:12 UTC
Permalink
Hallo Henry,
Post by Henry Habermacher [MVP Access]
Access kann das gar nicht mit bekommen, wenn es den Update selber macht.
Machst Du evt. noch irgendwelche Updates nach dem Form_BeforeUpdate
Ereignis? Evt. durch Direktes Ausführen von SQL Statements?
Nein, es wird nichts dergleichen ausgeführt.
Post by Henry Habermacher [MVP Access]
Was ich auch schon gesehen habe, sind DateTime Felder, welche nicht immer
den gleichen Wert drin haben, wie wenn diese weggeschrieben werden. Es geht
dabei allerdings um Sekundenbruchteile, mit denen Access eigentlich nichts
anfangen kann, der SQL Server aber schon. Hier ist die Wahl der richtigen
DAtentypen in Access entscheidend (Double geht in der Regel problemlos)
Das geänderte Feld enthält tatsächlich ein Datum. Ich habe den Typ in der
Servertabelle mal auf smalldatetime geändert, aber auch das hilft nicht. Dann
habe ich das Formular so geändert, dass auch ein Integerfeld geändert werden
kann (eigentlich soll nur das Datum manuell geändert werden können). Auch
hier tritt das Problem auf, so dass das Datumsformat als Fehler ausscheidet.

Das Formular bietet Möglichkeiten, die Daten auch über Befehlsschaltflächen
zu ändern. Dabei werden die Daten in den Server-Tabellen in VBA über
ADO-Recordsets verändert. Während der laufenden Sitzung können dann auch nach
dem Wechsel zu anderen Datensätzen diese Änderungen per VBA wieder rückgängig
gemacht (also mit den alten Daten überschrieben) werden. Funktioniert alles,
da die Formulardaten jeweils mit requery neu abgefragt werden, nur ändern von
Hand im Formular geht nur einmal, da Access in diesem Fall die Daten wohl
nicht neu abruft.

Da hilft dann wohl nur die Aktualisierung im AfterUpdate-Ereignis.

Viele Grüße
Michael
Stefan Hoffmann
2007-03-06 11:05:39 UTC
Permalink
Post by Michael Reetz
Das geänderte Feld enthält tatsächlich ein Datum. Ich habe den Typ in der
Servertabelle mal auf smalldatetime geändert, aber auch das hilft nicht.
Poste mal das Erstellungsskript für diese Tabelle.


mfG
--> stefan <--
--
Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm
Michael Reetz
2007-03-06 13:34:35 UTC
Permalink
Hallo Stefan,

die Lösung des Problems lag ganz woanders (s. Posting zu Henrys letztem
Beitrag)

Dir auch noch mal vielen Dank für die Hilfe.

Michael
Post by Stefan Hoffmann
Post by Michael Reetz
Das geänderte Feld enthält tatsächlich ein Datum. Ich habe den Typ in der
Servertabelle mal auf smalldatetime geändert, aber auch das hilft nicht.
Poste mal das Erstellungsskript für diese Tabelle.
mfG
--> stefan <--
--
Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm
Henry Habermacher [MVP Access]
2007-03-06 12:28:23 UTC
Permalink
Hallo Michael
Post by Michael Reetz
Das geänderte Feld enthält tatsächlich ein Datum. Ich habe den Typ in
der Servertabelle mal auf smalldatetime geändert, aber auch das hilft
nicht. Dann habe ich das Formular so geändert, dass auch ein
Integerfeld geändert werden kann (eigentlich soll nur das Datum
manuell geändert werden können). Auch hier tritt das Problem auf, so
dass das Datumsformat als Fehler ausscheidet.
SmallDateTime ist in Access nicht unbedingt zu empfehlen. Ich würde eher auf
DateTime bleiben und die Variable in Access als Double oder Date definieren
(welches identisch ist), um allfällige Fehler in diesem Bereich
auszuschliessen.
Post by Michael Reetz
Das Formular bietet Möglichkeiten, die Daten auch über
Befehlsschaltflächen zu ändern. Dabei werden die Daten in den
Server-Tabellen in VBA über ADO-Recordsets verändert. Während der
laufenden Sitzung können dann auch nach dem Wechsel zu anderen
Datensätzen diese Änderungen per VBA wieder rückgängig gemacht (also
mit den alten Daten überschrieben) werden. Funktioniert alles, da die
Verstehe ich richtig: Du hast Dir sowas wie eine Kopie des Recordsets
angelegt, welche Du dann wieder brauchst, wenn Du die Daten wieder
zurücksetzen willst. Wie ist dieses Recordset definiert. Ist es ein Snapshot
oder ein Dynaset? Falls es ein Dynaset ist, dann könnte das durchaus
dazwischenfunken. Das kann man aber nur sagen, wenn man das genau vor sich
hat und untersucht.
Post by Michael Reetz
Formulardaten jeweils mit requery neu abgefragt werden, nur ändern
von Hand im Formular geht nur einmal, da Access in diesem Fall die
Daten wohl nicht neu abruft.
Da hilft dann wohl nur die Aktualisierung im AfterUpdate-Ereignis.
Das ist sicher nicht die schlechteste Methode, wenn irgendwo irgendwelche
Daten verändert werden oder Access meint, diese seien verändert worden, um
Access vom Gegenteil zu überzeugen. Wie machst Du das dann später, wenn der
Datensatz, der ja gespeichert wurde, wieder zurückgesetzt werden soll? Liest
Du beim Requery nicht auch gleichsam den Datensatz neu in die - nennen wir
sie mal Schattenkopie - ein?

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Michael Reetz
2007-03-06 13:30:05 UTC
Permalink
Hallo Henry,
Post by Henry Habermacher [MVP Access]
Hallo Michael
Verstehe ich richtig: Du hast Dir sowas wie eine Kopie des Recordsets
angelegt, welche Du dann wieder brauchst, wenn Du die Daten wieder
zurücksetzen willst. Wie ist dieses Recordset definiert. Ist es ein Snapshot
oder ein Dynaset? Falls es ein Dynaset ist, dann könnte das durchaus
dazwischenfunken. Das kann man aber nur sagen, wenn man das genau vor sich
hat und untersucht.
Ich erstelle keine Kopie des des Recordsets, sondern im Klickereignis der
jeweiligen Buttons ein neues mit einem SQL-Statement als Quelle, in dem die
Werte des angezeigten Datensatzes in der WHERE-Klausel enthalten sind. Die
Datensätze der geänderten Tabelle werden über ein Attribut als geändert
gekennzeichnet, so dass die Buttons für das Verwerfen verschiedener
Änderungen im Current-Ereignis bei Bedarf aktiviert werden. Am Ende der
jeweiligen Prozedur wird dann mit requery die Datenbasis aktualisiert.
Post by Henry Habermacher [MVP Access]
Wie machst Du das dann später, wenn der
Datensatz, der ja gespeichert wurde, wieder zurückgesetzt werden soll? Liest
Du beim Requery nicht auch gleichsam den Datensatz neu in die - nennen wir
sie mal Schattenkopie - ein?
Die Tabelle enthält Daten zu Analysemethoden, die für einen bestimmten
Zeitraum verwendet wurden. Anhand des Probenahmedatums kann beim Datenimport
und der manuellen Dateneingabe ermittelt werden, welche Methode den Daten
zuzuordnen ist. Ändert sich die Methode, muss dass in dieser Tabelle mit dem
Datum festgehalten werden. Die Änderungen sind daher auf wenige Möglichkeiten
beschränkt, z.B. Datensatz für neue Methode mit Anfangsdatum einfügen und
Enddatum der bisherigen Methode einfügen. Über die o. g. Datensatzmarkierung
und den sonstigen Daten der Tabelle kann der alte Zustand wieder hergestellt
werden.

In anderen Fällen habe ich aber auch mit ungebundenen Recordsets gearbeitet,
in die die Daten beim Laden eingelesen werden. Über die Schlüssel lassen sich
die Datensätze dann zuordnen und die Daten wieder zurückschreiben.

Aber nun zur Lösung des Problems. Die Datenquelle des Formulars ist nicht
die zu ändernde Tabelle, sondern ein SQL-Statement. Dieses enthält ein ORDER
BY mit dem Primary Key. Da das Formular aus der Zeit vor der Migration auf
den SQL Server stammt, fehlte natürlich die TOP-Angabe. Das hindert Access
aber nicht daran, die Daten wie gewünscht anzuzeigen, sondern führt nur zu
dem besagten Verhalten bei der Datenänderung. Nach der Korrektur des
SQL-Statements läuft alles wie gewünscht.

Vielen Dank noch mal.

Michael
Henry Habermacher [MVP Access]
2007-03-05 10:28:44 UTC
Permalink
Hallo Michael
Post by Michael Reetz
wenn ich in einem Access-Formular, das seine Daten über ein
SQL-Statement vom SQL Server bezieht, Änderungen vornehme, dann den
Datensatz verlasse und anschließend zurückkehre, um eine weitere
Änderung vorzunehmen, kommt die beliebte Schreibkonflikt-Meldung. Da
ein timestamp-Attribut vorhanden ist, kommen Datentypenunterschiede
als Ursache nicht in Frage (einmal etwas Ändern funktioniert ja
auch), andere Nutzer scheiden auch aus.
Hat jemand eine Idee, wie man die zweite Änderung ermöglichen kann?
Wird da auf dem SQL Server ein Trigger ausgeführt? Falls ja, müsstest Du im
After_Update den Datensatz neu einlesen, weil sich da auch der TimeStamp
verändert hat.

Me.Requery beim AfterUpdate sollte ausreichen.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Loading...