top of page

9.0.x - Makrofehler Collection Key bei Variablen-Übergaben / macro error collection key if passing variables

(alle Versionen/all versions)

Freitag, 13. März 2026

Deutsch


Situation/Fehler

Es wird in einem AppDesigner-Makro eine Variablen-Liste definiert und an Folge-Prozesse übergeben , z.B. an eine Client-DLL.

Beim Ausführen des Makros erhält man im Sage TraceLog einen äußerst kryptischen Fehler.

Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroException: Fehler beim Ausführen des Makros 'x.OnExecute' in Zeile 21, Makrobefehl 'AufrufenDllClient | Tests.Sage.OL.x.RealTimeData.dll | Tests.Sage.OL.x.RealTimeData.ClientCode.y | [_Mode];[_UserId];[_Geschaeftsjahr];[_ImportType];[_SourceFolder];[_SourceFileEncodingType];[_ReturnLocalTempFileNameForBlobStorageUpload];[_ReturnText];[_ReturnMustCancel]'. ---> System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at Sagede.OfficeLine.ControlCenter.Host.ControlCenterHostBase.NamedParametersToTransferParameters(NamedParameters parameters, Dictionary2& transferParameters) at Sagede.OfficeLine.ControlCenter.Host.ControlCenterHostBase.CallClientDLL(String libraryFile, String className, NamedParameters parameters, NamedParameters result) at Sagede.Shared.ControlCenter.Controller.PartControls.PartViewModelBase.ExecuteMacroFunction(CallDllOnClientParameters parameters) at Sagede.Shared.ControlCenter.Controller.PartControls.PartViewModelBase.OnMacroCallbackFromField(MacroCallbackArgs args, String activeMacroFieldname) at Sagede.Shared.ControlCenter.Controller.PartControls.Selection.View.SelectionPartViewModel.OnMacroCallbackFromField(MacroCallbackArgs args, String activeMacroFieldname) at Sagede.Shared.ControlCenter.Controller.Shared.DialogDataFields.OnMacroCallback(MacroCallbackArgs args) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.Commands.CallDllOnClientMacroCommand.Execute(IMacroCommandsParent parent, IndexedList parameters, IndexedList debugParameters) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.Commands.MacroCommands.ExecuteMacroCommand(IMacroCommandsParent parent, Macro macro, Macro debugInfo, Boolean& handled, Boolean isRunningOnServer) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroInterpreter.ExecuteMacroCommand(Macro macro, Macro debugInfo) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroInterpreter.Run(Macro macro, Int32 lineNumber) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroInterpreter.RunMacros(Macros macros) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroHandler.InterpreterExecuteMacros(Macros macros, Boolean& cancel, Boolean& closeDialog) at Sagede.Shared.RealTimeData.Common.MacroInterpreter.MacroHandler.ExecuteMacros(MacroContext macroContext, Macros macros, Boolean resetInterpreter, Boolean& cancel, Boolean& closeDialog)

Ursache/Lösung

Schaut man sich die Parameter-Liste an , so fällt sofort auf , dass es gar keinen doppelten Schlüssel gibt.

Die Meldung von Sage ist komplett irreführend (wie so oft!).


Die tatsächliche Ursache ist der leider sehr schlechte Makro-Parser von Sage , in Kombination mit dem internen Definieren und Serialisieren der Collections mit den Parametern , insbesondere bei Boolean-Werten.

Sage hat ein massives Problem mit Boolean-Zuordnungen wie "SetVariable ..." / "VariableFestlegen ..." , wenn der Wert z.B. mit "False" vorbelegt wird.


Der einfachste Workaround ist , statt eine Variable mit "False" zu definieren , einfach einen Integerwert 0 vorzubelegen.

Beispielansicht: Wurde "False" anstatt 0 eingetragen , um Sage zum generischen Typ "Boolean" zu bewegen , erscheint eine "abstruse" Key-Verletzungsmeldung. Die Vorbelegung als Integer Typ lässt die Meldung sofort verschwinden!
Beispielansicht: Wurde "False" anstatt 0 eingetragen , um Sage zum generischen Typ "Boolean" zu bewegen , erscheint eine "abstruse" Key-Verletzungsmeldung. Die Vorbelegung als Integer Typ lässt die Meldung sofort verschwinden!




bottom of page