8. Oktober 2008 15:22
Hallo zusammen,
ich habe folgendes Problem:
wir haben die Logik beim Drucken von Belegen(z.B. bei der Einkaufsbestellung) so erweitert, dass ein PDF davon erzeugt wird und archiviert wird.
Microsoft erzeugt bei diesem Vorgang einen Eintrag im Aktivitätenprotokoll. Wir greifen beim Archiveren nochmal in diesen Datensatz
und updaten einige Felder, bezüglich des Archivierungsvorgangs.
Wenn nun mehrere Benutzer gleichzeitig drucken, kommt sehr häufig folgende Fehlermeldungen:
-----------------------------------------------------------------------------------------------------------------------------------------------
Ihre Aktivität wurde durch die Änderung der Tabelle Aktivitätenprotokollposten durch einen anderen Anwender blockiert.
Bitte beginnen Sie die Aktivität noch einmal
---------------------------------------------------------------------------------------------------------------------------------------------
wird in CU 5051 SegManagement in Funktion "LogInteraction" geworfen. Reiner MS Code. Hier wird der Posten erzeugt.
An dieser Stelle haben wir nichts geändert
--------------------------------------------------------------------------------------------------------------------------------------------------
Die Aktivitätenprotokollposten-Tabelle kann nicht geändert werden, weil sie von einem anderen Benutzer gesperrt ist.
Warten Sie, bis der Benutzer seine Arbeit abgeschlossen hat, und versuchen Sie es dann erneut.
------------------------------------------------------------------------------------------------------------------------------------------------
wird an der Stelle geworfen, wenn wir das Update der Daten vornehmen
Ich habe nun schon alle möglichen Sachen probiert: LOCKTABLE in MS Code entfernen, LOCKTABLE nur vor INSERT setzen,
LOCKTABLE auch in unseren Code aufnehmen. Es hat alles nichts funktioniert.
Deswegen wäre mir folgendes eingefallen:
Bei einem kritischen UPDATE oder INSERT wird abgefragt, ob es geklappt hat (Rückgabewert) und wenn nicht
eine Schleife mit SLEEP Befehl gestartet, solange bis die Tabelle wieder frei ist.
- Code:
geklappt := InteractLogEntry.MODIFY;
IF (geklappt = FALSE) THEN BEGIN
REPEAT
SLEEP(25);
b := b + 1;
UNTIL (InteractLogEntry.MODIFY = TRUE) OR (b >= 25);
END;
Im Debugger bekommt die Variable geklappt noch FALSE, dann wird aber sofort wieder mit dem Fehler abgebrochen
Weiß irgendjemand einen Lösungsansatz.
Ich habe auch schon mal eine Beitrag hier verfolgt, wo es um Multiuserfähigkeit geht,
doch einen Eingriff in die Schlüssel sammt den SIFT Eingenschaften, würde ich nur ungern machen
Zuletzt geändert von Gollum83 am 27. Oktober 2008 09:14, insgesamt 1-mal geändert.