Ein anderer Anwender hat... die xte

21. Oktober 2019 09:13

Hallo,
dieses Thema ist schon oft diskutiert worden, leider habe ich in den Forenbeiträgen keinen gefunden, der zu meinem aktuellen Problem passt. Zur Sache: Ein Kunde von uns hat ein spezielles Feld, welches für jede Zeile u.a. anhand des Gewichtes des VK-Beleges ermittelt wird. Dabei steht in jeder Zeile der selber Wert. Werden jetzt Zeilen gelöscht, ändert sich zwangsläufig auch das Gewicht, der Wert des speziellen Feldes muss also neu berechnet werden. Hierzu rufe ich im OnAfterGetRecord-Trigger der Subform 46 eine Codeunit auf, die ihrerseits eine Codeunit für die Preisberechnung aufruft, in der u.a. der Wert dieses speziellen Feldes errechnet wird. Dummerweise werden in dieser Codeunits auch MODIFYs auf die Verkaufszeile ausgeführt. Wenn ich nun mehrere Verkaufszeilen auf einmal lösche, erscheint der allseits bekannte und beliebte Fehler: "Ein anderer Anwender hat...".
Wohlgemerkt, dies passiert nur, wenn ich mehrere Zeilen markiere und diese in einem Schritt lösche. Wenn ich sie nacheinander mit F4 lösche, funktioniert es.
Ich habe in meiner Not hinter die Codeunit, welche die Codeunit für die Preisberechnung aufruft, noch ein COMMIT untergebracht (Ich hasse so etwas), ohne Erfolg.
Das grundsätzlich Problem wird sein, dass ich mich in der Subform befinde, und einen Aufruf starte, der die darunter liegenden Datensätze modifiziert. Die Preisberechnung kann auch aus der Form heraus aufgerufen werden, welche die Form 46 als Subform hat, dann gibt es das Problem nicht. Gibt es dafür einen Workaround? Ich habe schon etwas in der Art überlegt, die Form zu schließen und dann wieder zu öffnen, aber ich weiß nicht, wie. Hat hier jemand eventuell eine Idee?

Mit freundlichen Grüßen

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 12:50

Das Problem ist nicht ganz trivial, jedoch in meinen Augen ähnlich zur Rechnungsrabattberechnung (Invoice Discount). Das solltest du dir mal anschauen.

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 16:05

Hallo Michael,
erst einmal danke für die Info. Allerdings bin ich, ehrlich gesagt, noch nicht ganz dahinter gestiegen, welche Stelle das genau sein soll, und ist der Rabatt in den Zeilen oder im Kopf gemeint? Möglicherweise hat sich die Lösung, die ich betreue, auch schon zu weit vom Standard entfernt.

MfG
Frank

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 16:20

Hallo,

das ganze ist wie mein Vorredner schon sagte nicht ganz trivial und wahrscheinlich nur sauber auf spezielles Kommando zu lösen.

Gruß Fiddi

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 16:26

Hallo,
dass das ganze nicht trivial ist, würde ich blind unterschreiben, es beruhigt mich allerdings ein wenig, dass auch die Cracks es so sehen :wink: . Was ist denn jetzt aber mit speziellem Kommando gemeint?

MfG
Frank

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 17:16

FragenFrager hat geschrieben:...und ist der Rabatt in den Zeilen oder im Kopf gemeint? ...

Der Rechnungsrabatt (im Kopf) ist genau so realisiert. Es wird der Betrag pro Zeile gespeichert. Und dabei hat anscheinend schonmal jemand festgestellt, dass das nicht bei jeder Änderung berechnet werden kann.
Wenn du dich daran orientierst, muss das aus der Page raus und bei den beschriebenen Aktionen gemacht werden. Man könnte es auch beim Öffnen der Page oder im OnAfterGetRecord der Hauptpage machen

NAV Hilfe hat geschrieben:Rechnungsrabatte bei Verkäufen berechnen

Wenn alle Artikel in den Verkaufsauftragszeilen eingegeben wurden, kann der Rechnungsrabatt für den gesamten Verkaufsbeleg berechnet werden, indem Sie auf Aktionen und dann auf Rechnungsrabatt berechnen klicken.

Wenn das Feld Rechnungsrab. berechnen im Fenster Debitoren & Verkauf Einr. aktiviert ist, wird der Rechnungsrabatt automatisch berechnet. Weitere Informationen darüber, wann die automatische Berechnung erfolgt, finden Sie unter Rechnungsrab. berechnen.


NAV Hilfe hat geschrieben:Rechnungsrab. berechnen Feld

Zeigt an, ob der Rechnungsrabattbetrag automatisch mit Verkaufsbelegen berechnet wird.

Ist das Feld ausgewählt, wird der Rechnungsrabattbetrag automatisch berechnet, wenn Sie Folgendes in einem Verkaufsbeleg tun:
• Statistik anzeigen.
• Anzeigen eines Testberichts.
• Drucken
• Senden

Re: Ein anderer Anwender hat... die xte

21. Oktober 2019 17:38

Okay, danke schonmal. Ja, an der Statistik wollte ich mich auch schon mal entlanghangeln, bin allerdings davon abgekommen, oder geht nicht, egal, werde sie mir auf jeden Fall noch mal ansehen.

MfG
Frank

Re: Ein anderer Anwender hat... die xte

22. Oktober 2019 09:43

FragenFrager hat geschrieben:...Ja, an der Statistik wollte ich mich auch schon mal entlanghangeln...

Es kommt immer darauf an, wofür du es brauchst. Eventuell reicht es auch beim Schließen der Pager oder vor dem Buchen.

Re: Ein anderer Anwender hat... die xte

22. Oktober 2019 09:52

Hallo,
leider nein, der Wert soll in Echtzeit in den übrig gebliebenen Zeilen stehen, sobald eine oder mehrere Zeilen gelöscht wurden. B.t.w, in meinem Eingangsposting ist mir ein Fehler unterlaufen, es steht nicht immer der gleiche Wert in der Zeile, das war reiner Zufall. Sonst hätte man es ja auch über ein FlowField im Kopf realisieren können.

MfG
Frank

Re: Ein anderer Anwender hat... die xte

22. Oktober 2019 10:30

FragenFrager hat geschrieben:...leider nein, der Wert soll in Echtzeit in den übrig gebliebenen Zeilen stehen, sobald eine oder mehrere Zeilen gelöscht wurden....

Nur für mich: Wieso?

Hast du mal versucht das im OnAfterGetRecord der Hauptseite zu machen?

Re: Ein anderer Anwender hat... die xte

22. Oktober 2019 10:53

da muss ich jetzt etwas weiter ausholen: In dem Feld wird eine sog. Frachtzulage untergebracht (der Kunde stammt aus der Baustoffbranche). Was der Sinn dieser Frachtzulage ist, kann höchstens dieser selbst erklären. Diese Frachtzulage wird nun für jede Zeile anhand unterschiedlicher Parameter errechnet, u.a. dem Gesamtgewicht des Beleges.
Na, ja, und der Kunde besteht nun darauf, dass diese Frachtzulage automatisch neu berechnet und angezeigt wird, sobald sich einer der Parameter verändert. Sobald eine Zeile gelöscht wird, ändert sich ja nun aber mal auch das Gewicht. So ganz unrecht hat er damit ja leider auch nicht; wenn eine Zeile gelöscht und anschließend die Statistik aufgerufen wird, stehen ja auch sofort die aktualisierten Werte zur Verfügung. Dass in dem Moment eine separate Form aufgerufen wird, ist ihm schlicht nicht zu vermitteln.
Wird der OnAfterGetRecord-Trigger der Hauptform denn aufgerufen, sobald man eine Zeile löscht? Na,ja, gut, dass kann ich ausprobieren.

Re: Ein anderer Anwender hat... die xte

22. Oktober 2019 11:05

Hallo,

ich hatte mal die Anforderung Positionsnummern in Verkaufszeilen zu vergeben. Das hat auch nicht wirklich funktioniert, weil man sich nicht sicher sein kann ob immer die Validates und die Trigger richtig aufgerufen wurden. Insbesondere beim Einfügen oder Löschen aus der Mitte der Zeilen.

Eine Sache die mir da gerade einfällt, dass man aufpassen muss den aktuellen Record nicht durch einen Hintergrundprozess zu ändern. Also kein ModifyAll, sondern if Rec = AktRec then ActRec.Wert :=XX else Rec.Wert := XX.
Außerdem musst du darauf achten, das du Rec immer als VAR an eine Funktion übergibst. Und diese Funktion muss immer aufpassen, das sie Rec modifiziert und nicht eine lokale Variable von Rec. Das gilt auch für alle von dieser Funktion aufgerufenen Funktionen. Außerdem musst du natürlich dafür Sorgen, dass Rec immer in der gleichen Ziele bleibt.

Gruß Fiddi