selectline-software / selectline-api

Apache License 2.0
26 stars 5 forks source link

API versucht neuen Beleg mit vorhandener Belegnummer anzulegen #395

Open ptc-thomas opened 5 months ago

ptc-thomas commented 5 months ago

Details

Nach dem Anlegen eines Belegs erhalten wir die Fehlermeldung, dass die Belegnummer bereits vergeben sei. Der Beleg mit der genannten Belegnummer wurde jedoch durch die API angelegt. Nachfolgende Versuche, einen neuen Beleg anzulegen scheitern mit der selben Fehlermeldung – die API versucht offenbar einen weiteren Beleg mit der bereits vergebenen Belegnummer anzulegen. Dieser Fehler tritt sporadisch auf, vermehrt dann, wenn die API mehrere Stunden lang nicht genutzt wurde.

`HTTP/1.1 400 cache-control: no-cache pragma: no-cache content-type: application/json; charset=utf-8 expires: -1 date: Wed, 05 Jun 2024 13:00:59 GMT content-length: 844

{ "StatusCode": "BadRequest", "ResponseCode": "42-065", "ResponseId": 65, "ResponseIdDescription": "KeyExistsException", "Message": "Der gewählte Schlüssel existiert bereits", "Details": { "Details": "Die Anweisung wurde beendet.\r\nEine Zeile mit doppeltem Schlüssel kann in das dbo.BELEG-Objekt mit dem eindeutigen PRIMARY-Index nicht eingefügt werden. Der doppelte Schlüsselwert ist (F, 24204149).\r\n\r\nExceptionklasse: EMSError\r\nSQL Server Fehlernummer: 2601\r\nOle Fehlernummer: -2147217873\r\nData Access Fehlernummer: 2601\r\nServername: SQLSERVER\r\nLetzter Fehler: Eine Zeile mit doppeltem Schlüssel kann in das dbo.BELEG-Objekt mit dem eindeutigen PRIMARY-Index nicht eingefügt werden. Der doppelte Schlüsselwert ist (F, 24204149).\r\nProzedur: \r\nZeile: 1", "Titel": "", "Fehler": "" } }`

Steps to replicate the behavior:

MatthiasGuse commented 5 months ago

Hallo,

das klingt erstmal nach einem ähnlichen Verhalten, wie in #377 beschrieben. Wenn eine zeitliche Abhängigkeit besteht und die API die Beleganlage nicht schnell genug zurückgemeldet bekommt, klingt das auch nach Performanceproblemen. Sind SQL Server und die API auf verschiedenen Systemen installiert? Express Server?

Grüße

ptc-thomas commented 5 months ago

Besten Dank für die schnelle Antwort!

Sind SQL Server und die API auf verschiedenen Systemen installiert? Express Server?

API und SQL Server sind auf zwei verschiedenen Systemen installiert. Bei dem SQL Server handelt es sich nicht um eine Express Variante.

die API die Beleganlage nicht schnell genug zurückgemeldet bekommt

Lässt sich hier ein Timeout ändern?

Mir ist ein Beispiel aufgefallen, in dem die API zunächst mit ein ResponseCode 02-003 (AuthenticationException) geantwortet hat. Mit dem selben Request erhielten wir 5 Sekunden später die Credentials. Bei den anschließenden drei Versuchen (innerhalb von 4 Minuten), einen Beleg anzulegen (siehe mein erster Post), erhielten wir jeweils einen ResponseCode 42-000 (Client.Send failed. See InnerException).

Als wir es gut 5 Minuten später nochmal mit dem selben Request versuchten, erhielten wir bei den ersten vier Versuchen über einen Zeitraum von 3 Minuten den eingangs erwähnten ResponseCode 42-065 (Der gewählte Schlüssel existiert bereits). Beim fünften Versuch weitere 5 Minuten später wurde der Beleg dann mit einer neuen Belegnummer angelegt.

Interessant dabei: Kurz vor dem erfolgreichen Versuch wurde ein neuer Beleg direkt im SelectLine Client angelegt. Kann es sein, dass die nächste anzulegende Belegnummer in SelectLine vorgehalten wird und dieser Wert nach dem Anlegen des Belegs durch die API nicht erhöht wurde? Und dass dieser Wert durch den im SelectLine Client angelegten Beleg aktualisiert wurde und der anschließende Aufruf durch die API wieder funktionierte?

Viele Grüße Thomas

MatthiasGuse commented 5 months ago

Hallo,

Timeout-Einstellungen finden Sie in der API Installationsanleitung unter Punkt 6.3 und 6.4. Ich denke aber, dass das nicht zielführend ist. Ich denke es liegt entweder an der Datenbank selbst oder an der Verbindung der zum SQL Server. In #321 hat es bspw. geholfen die Statistiken neu aufzubauen. (Je nach DB-Größe nimmt das einiges an Zeit in Anspruch.)

Viele Grüße