OFFICIUM INSERVIO IT
Your reliable partner for your business software...
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.

