Dynamisches Menü

Dieses Thema im Forum ".NET (sagede.* DLLs)" wurde erstellt von mgosx, 5. Mai 2020.

  1. mgosx

    mgosx Mitglied

    Hallo zusammen,

    ich bin gerade dabei ein dynamisches Menü umzusetzen. Habe mich an das Rezeptes 18 gehalten.
    Die Erzeugung des Menüeintrages klappt, es wird entsprechend angezeigt. Beim Aufruf kommt dann jedoch ein Fehler.
    Hier die Tracelog-Meldung:
    System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
    Parametername: index
    bei System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    bei Sagede.Shared.RealTimeData.Common.Utilities.SeparatedListParser.ParseNameMacroExpressionList(String text)
    bei Sagede.Shared.ControlCenter.Controller.PartControls.DataEdit.View.DataEditPartViewModel.DataServiceExecute(Object sender, Function func, NamedParameters parameters, ServiceStackItem childStackItem)
    bei Sagede.Shared.ControlCenter.Controller.Shared.Controls.DataFieldMultiEdit.DataFieldMultiEditViewModel.DataServiceExecute(Object sender, Function func, NamedParameters parameters, ServiceStackItem childStackItem)
    bei Sagede.Shared.ControlCenter.Controller.Shared.Controls.DataFieldMultiEdit.DataFieldMultiEditViewModel.ExecuteFunction(Object sender, Function func, NamedParameters parameters, Boolean isUserCalled, String& cancelMessage, Exception& returnException)
    => ExecuteFunction in DataFieldMultiEditViewModel.vb(line 3035)

    Beim Ausführen der Funktion 'Charge 0041 | 5' ist ein Fehler aufgetreten.
    (Name: Charge_0041)
    SOURCE: OnShowException at offset 97 in file:line:column <filename unknown>:0:0

    Sagede.Shared.RealTimeData.Common.Exceptions.UserFriendlyClientException: Beim Ausführen der Funktion 'Charge 0041 | 5' ist ein Fehler aufgetreten.
    (Name: Charge_0041) ---> System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
    Parametername: index
    bei System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    bei Sagede.Shared.RealTimeData.Common.Utilities.SeparatedListParser.ParseNameMacroExpressionList(String text)
    bei Sagede.Shared.ControlCenter.Controller.PartControls.DataEdit.View.DataEditPartViewModel.DataServiceExecute(Object sender, Function func, NamedParameters parameters, ServiceStackItem childStackItem)
    bei Sagede.Shared.ControlCenter.Controller.Shared.Controls.DataFieldMultiEdit.DataFieldMultiEditViewModel.DataServiceExecute(Object sender, Function func, NamedParameters parameters, ServiceStackItem childStackItem)
    bei Sagede.Shared.ControlCenter.Controller.Shared.Controls.DataFieldMultiEdit.DataFieldMultiEditViewModel.ExecuteFunction(Object sender, Function func, NamedParameters parameters, Boolean isUserCalled, String& cancelMessage, Exception& returnException)
    --- Ende der internen Ausnahmestapelüberwachung ---
    => ShowException in DataEditPartViewModel.vb(line 3632)


    Hier ist die Definition in C#:

    returnParameter = new Function();
    returnParameter.Name = "Charge_" + reader.GetString("Charge");
    returnParameter.Title = "Charge " + reader.GetString("Charge") + " | " + reader.GetDecimal("Menge").ToString("#,##0");
    returnParameter.TitleShort = "Charge " + reader.GetString("Charge") + " | " + reader.GetDecimal("Menge").ToString("#,##0");
    returnParameter.Parent = "0";
    returnParameter.OrderPosition = 1;
    returnParameter.ButtonPosition = 0;
    returnParameter.Icon = "";
    returnParameter.BeginGroup = false;
    returnParameter.IsPrimaryButton = false;
    returnParameter.Type = Enumerations.FunctionBehavior.Regular;
    returnParameter.UseForRewe = false;
    returnParameter.UseForWawi = true;
    returnParameter.FunctionCall = new FunctionCall() { Type = Enumerations.FunctionCallType.DataServiceExecute };
    returnParameter.DataClassUsage = Enumerations.DataClassUsageEnum.UseAlways;
    returnParameter.FunctionCallPackageId = "Lager";
    returnParameter.FunctionCallPartnerId = "142188732";
    returnParameter.Country = Enumerations.Country.All;
    returnParameter.FunctionCallParameter1 = "\"ChargeDirekt\"";
    returnParameter.FunctionCallParameter2 = "\"Vollstaendig : Ersetzen\"";
    returnParameter.FunctionCallParameter3 = "\"\"";
    returnParameter.FunctionCallParameter4 = "\"\"";
    returnParameter.FunctionCallParameter5 = "\"\"";
    returnParameter.FunctionCallParameter6 = "\"\"";
    returnParameters.Functions.Add(returnParameter);

    ich gehe davon aus, dass ich ein benötigtes Feld nicht besetzt habe, leider finde ich nicht welches dies sein sollte.
    Kann mir jemand einen Hinweis geben?
    Gruss Mark
     
  2. ALangmaack-Sage

    ALangmaack-Sage Aktives Mitglied Mitglieder

    Eventuell haben Sie auch zuviel zugewiesen. Setzen Sie Parent bitte mal auf Leerstring. Die Parameter 3-6 brauchen Sie nicht zu setzen.
     
  3. mgosx

    mgosx Mitglied

    Vielen Dank für den Tipp, es lag an Parameter 3, wenn dieser leer ist, läuft der Code nun bis zum Aufruf von

    public override DataServiceExecuteResponse Execute(DataServiceExecuteRequest request)
    BelegItem bo = new BelegItem();
    FillBo(bo, request.Data);

    Dort hängt er sich bei FillBo(bo.request.Data); auf mit der Fehlermeldung:
    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    "dto" war "null".

    Aus einem statischen Kontextmenü klappt der entsprechende Aufruf DataServiceExecute ohne die Angabe weiterer Schlüsselfelder o.ä. Warum muss man nun bei einem dynamischen Kontextmenü dies angeben und wo ist denn sowas dokumentiert?


    Mit freundlichen Grüßen

    Mark Göbl
     
  4. ALangmaack-Sage

    ALangmaack-Sage Aktives Mitglied Mitglieder

    Wenn Sie ein Kontextmenüeintrag mit Funktionsaufruf DataServiceExecute erstellen lassen Sie (vermutlich) den dritten Parameter leer. Im Code übergeben Sie aber Leerstring. Und das der dritte Parameter eine Rolle spielt, bzw. ausgewertet wird, ist in der Hilfe bei diesen Funktionsaufruf beschrieben.

    Die Metadaten werden vor dem Senden zum Client zusammengefasst. Also neben den angehängten (Anhängen an...) Metadaten auch die durch Code erzeugten Metadaten. Der Client weiß nicht, wie der Kontextmenüeintrag erzeugt wurde. Insofern gibt es keinen Unterschied zwischen "statisch" und "codierten" Kontextmenüeintrag.

    Dokumentation, die ein irgendeiner Form die Programmierung betreffen gehen bzw. kommen von unserer Seite aus immer über das Developer Programm. Zu den Metadaten gibt es zwei Stellen. Zum einen das Kochbuch vom Developer Programm oder die Beispiele aus dem Wiki (kommen von den Entwicklern der Sage 100), wobei auch hier gilt, dass man auf Codebeispiele nur Zugriff hat, wenn man Developer Partner ist.
     
  5. mgosx

    mgosx Mitglied

    ich bin Developer Partner, leider ist die Dokumention nur sehr unübersichtlich und teilweise sehr kurz.
    Ich habe heute das Problem gelöst.

    Es lag an der Zeile
    returnParameter.FunctionCallParameter2 = "\"Vollstaendig : Ersetzen \"";

    Richtig ist:
    returnParameter.FunctionCallParameter2 = "Vollstaendig : Ersetzen";

    Ich hatte hier analog zu Rezept 18 die Parameter gesetzt (dort wurde auch das \" mit angegeben).
    Wenn ich es weglasse klappt nun alles.
     
  6. ALangmaack-Sage

    ALangmaack-Sage Aktives Mitglied Mitglieder

    Ich hab mir das Rezept 18 angeschaut und weiß nun auch wo das Missverständnis her kommt. Also zuerst: das Rezept 18 funktioniert mit \". Und das liegt daran, dass in diesem Rezept der Funktionsaufruf "VBA-Aufruf" hinterlegt wird, der die Maskierung mit "" benötigt. Die unterschiedliche Behandlung ist schon blöd. Das ist so ein Fall entweder man kommt sofort drauf, oder man sucht und sucht. Wir sollten sehen, dass wir die Access-Aufrufe eliminieren und zwar im Kochbuch (hab die Kollegen drauf schon angesprochen) und auch in den Beispielen des Wikis.
     
    mgosx gefällt das.

Diese Seite empfehlen