OFFICIUM INSERVIO
Your reliable partner for your business software...
Fehler String-Übergabe / Error string parameters
(alle Versionen/all versions)
Mittwoch, 11. November 2020
Verwendeter Quellcode / Zweck des Quellcodes
Wahrscheinliche Problemursache
Fehlerbehebung/Lösung mit neueren Sage QSP
Parsing-Fehler gibt es an vielen Stellen in der Sage 100
Situation
Wenn in in einem AppDesigner Makro mittels "AufrufenDLL" String-Felder an eine .NET DLL (Klasse "MacroProcessBase") übergeben werden, dann werden diese bei einer Mehrfachselektion (mehrere Zeilen selektiert) nicht richtig behandelt.
Laut Developer Kochbuch werden die Strings wie folgt übergeben:
Strings werden in Anführungszeichen eingeschlossen und darin enthaltene Anführungszeichen durch zwei Anführungszeichen maskiert
Wenn z.B. die selektierten Artikelnummern übergeben werden, dann sollte im "NamedParameter" also Folgendes ankommen (reiner Inhalt des Stings):
.Name: Artikelnummer
.Value: "60000000";"60002000"Tatsächlich aber kommt folgeder String an:
.Value: 60000000";"60002000Man achte auf die fehlenden Anführungszeichen.
Weiteres Problem-Beispiel
Schlimmer ist es, wenn in dem übergeben String ein Semikolon oder Anführungszeichen enthalten sind (dies ist ja auch z.B. theoretisch auch bei Artikelnummern möglich, wenngleich nicht viele eine solche Formatierung wählen).
Anführungszeichen werden nicht verdoppelt, so dass der String nicht sinnvoll geparsed werden kann.
Beispiel: Aus den FA Belegen BelID und Matchcode.
NamedParameter:
.Name: Matchcode
.Value: Tisch "Design 1000"; (Eigen;fertigung)";"Tischbein "Design 1000" (Eigenfertigung)Verwendeter Quellcode / Zweck des Quellcodes
Übergabe/Abfragen von Mehrfachselektionen aus dem AppDesigner UX/UI-Frontend an .net-Code.
Vorgeschaltetes AppDesigner-Makro mit "AufrufenDLL"-Funktion mit Übergabe einer Semikolon-getrennte Liste der Parameter als dritter Parameter für die "AufrufenDLL"-Funktion.
Anmerkung: Der Punkt . wurde als Workaround hinzugefügt (siehe weiter unten).
Im Normallfall würde man hier lediglich das Feld [Artikelnummer] einfügen.
Makro Einstellung - Mehrfachauswahl zulässig ist aktiviert, wie nachfolgender Screenshot zeigt.
Behandlung im Quellcode der Makro-DLL
using Sagede.Core.Tools;
public class Test : Sagede.OfficeLine.Shared.RealTimeData.MacroProcess.MacroProcessBase
{
protected override NamedParameters Execute(Sagede.Shared.RealTimeData.Common.NamedParameters parameters, ref bool cancel, ref string cancelMessage)
{
var artikelnummern = parameters.TryGetItem("Artikelnummer").Value.FormatUnQuoted();
}
}Wahrscheinliche Problemursache
Interner Parsing-Fehler bei Sage, da Sage diese Besonderheiten "nicht auf dem Radar" hat.
Workaround
Wenn man ein Hilfszeichen oder Text for den Feldnamen einbaut, dann geht Sage beim Parsing anders vor.
Dann sieht das Ergebnis Parameter-Übergabe von Sage anders aus und lässt sich mit Workarounds derart auswerten, dass die Inhalte erhalten bleiben.
Siehe nachfolgender Screenshot.
Fehlerbehebung/Lösung mit neueren Sage QSP
Das Problem wurde von Sage an LiveUpdate-Stand/QSP 8.1.2 - Build 2159 - 17.09.2019 adressiert (ID #26543).
Auszug aus Sage QSP-Text:
Zum leichteren Umgang mit solchen Wertelisten wurde der Typ „NamedParameter“ um eine „Values“ Eigenschaft erweitert. Diese bietet die Einzelwerte an.
Siehe https://www.officium-inservio.com/sage-100-breaking-changes/appdes7
Parsing-Fehler gibt es an vielen Stellen in der Sage 100
Leider ist das Thema mit Parsing-Fehlern/Parsing-Problemen in der Sage 100 kein Einzelfall!
Zur "Verteidigung" von Sage sollte man sich immer wieder vor Augen führen, wie komplex der Technologie-Stack der Sage 100 ist und dass dadurch Informationen teils durch mehrere, grundverschiedene Technologien weitergegeben werden müssen (u.a. teils COM-Interop).
Daten "wandern" vom AppDesigner-Client (.net-Technik), teils durch COM-Interop zurück nach .net, dann zum Sage Applikationsserver und dann wieder zurück usw.
Nachfolgender Beitrag zeigt ein weiteres Beispiel für ein Parsing-Problem:
https://www.officium-inservio.com/sage-100-appdesigner/edivkbelegerfassungcreatebelegkopf





