Die Werte-Ermittlung von XmlInfo kann nicht nur Datenfelder des aktuellen Objektes liefern, sondern Relationen auflösen, Relationslisten verwenden, Referenz-Objekte und ReferenzObjekt-Listen einbeziehen, und nun auch mit benannten Objekten arbeiten.
Die Wertermittlung läuft dabei in mehreren Schritten ab.
Der Wertermittlungsstring ist dafür in Felder aufgeteilt, die jeweils durch einen "Punkt" voneinander getrennt sind.
Die einzelnen Wertermittlungsfelder werden nacheinander bearbeitet.
Zu Anfang wird als "Aktuelles Objekt der Wertermittlung" das aktuelle XmlInfo-Datenobjekt eingestellt.
Besteht ein Wertermittlungsstring aus mehreren Blöcken, können die ersten Blöcke verwendet werden, um ein anderes Datenobjekt als aktuelles Wertermittlungsobjekt einzustellen.
Der letzte Block sollte dann einen Datenwert aus dem zuletzt ermittelten Objekt abrufen.
Beispiele:
Da der String nur aus einem Block besteht, wird nur die Eigenschaft "konto" aus dem aktuellen Datenobjekt ermittelt.
Der String besteht aus 2 Blöcken. Der erste Block "#obj:AuftragsLeitsatz" stellt das benannte Objekt "AuftragsLeitsatz" als aktuelles Datenobjekt ein. Der zweite Block "m_konto" liefert die Eigenschaft "m_konto" aus diesem Auftragsleitsatz.
#obj:AuftragsLeitsatz.#refobj:person.m_match
Der String besteht aus 3 Blöcken. Der erste Block "#obj:AuftragsLeitsatz" liefert das benannte Objekt "AuftragsLeitsatz". Der zweite Block "#refobj:person" folgt von diesem Auftragsleitsatz der programmierten Relation "person" auf ein Kundenstamm Objekt. Der letzte Block "m_match" liefert das Datenfeld "m_match" aus dem Kundenstamm.
Jedem XmlInfo-Datenobjekt (RefObj oder RefObjList) wird automatisch ein Name zugewiesen. Der automatische Name eines Datenobjektes ergibt sich aus dem ersten Klassennamen der "Class" Anweisung in der Definition des RefObj oder RefObjList-Objektes. Alternativ kann dort mit dem Attribut "ObjName" auch ein eigener Objektname vereinbart werden.
Sollen konstante Werte übergeben werden, so müssen diese in einfache Anführungszeichen gefasst sein.
'KonstantwerWert'
Benannte Objekte und Funktionen
Bei dem Zugriff auf Datenwerte eines Objektes, kann mithilfe folgender Syntax auch auf benannte Objekte, und auf Objektfunktionen zugegriffen werden.
#obj:Objektname:Funktion(Parameter)
Ist kein Objektname angegeben, wird für das aktuelle Objekt "Funktion" aufgerufen.
Ist keine Funktion angegeben, wird nur das ermittelte Objekt geliefert.
Beispiel für einen Funktionsaufruf:
#obj::GetArtikelBezeichnungen(1,55206,'ger',0)
Von dem aktuellen Datenobjekt wird die Funktion "GetArtikelBezeichnungen aufgerufen.
Die Parameter der Funktion müssen durch Komma getrennt angegeben werden. Es können entweder Konstanen verwendet werden, oder Wertermittlungsausdrücke.
#obj::GetArtikelBezeichnungen(1,#obj:AuftragsLeitsatz.m_konto,'ger',0)
Gleiches Beispiel wie zuvor, aber an Stelle der konstanten Kontonummer "55206" wird der Wert "m_konto" des benannten Objektes "AuftragsLeitsatz" eingesetzt.
Sonderfunktion #index
#index:0
Mit einer "#index" Definition kann aus einer Liste von Objekten ein bestimmtes Element herausgeholt und weiterverarbeitet werden.
Sonderfunktion #env
#env:TBR
Mit einer "#env" Definition kann auf eine Umgebungsvariable zugegriffen werden.
Sonderfunktion #concat()
#concat(Wert1, ...)
Mit einer "#concat" Definition können Datenfelder oder Konstante zu einem String aneinander gehängt werden.
Sonderfunktion #format()
#format(Format,Werte, ...)
Mit einer "#format" Definition können Daten, wie in einer CSharp-Format-Anweisung zusammengefügt werden.
Beispiel:
<Feld NameExtern="mykey2" NameIntern="#format('{0:D2}{1}{2:D8}',m_firma,m_sa,m_konto)" />
Sonderfunktion #translate()
#translate(Werte,Sprache)
Mit einer "#translate" Definition können Texte in andere Sprachen übersetzt werden.
Beispiel:
<Feld NameIntern="#format('{0}/{1}',Schluessel,#translate(Bezeichnung,'eng'))" NameExtern="herkunft_kombination_eng" TypExtern="varchar(100)" Translate="eng"/>
Sonderfunktion #refpara:Start:Anzahl
#refpara:0:0
Mit einer "#refpara" Definition kann ein Objekt vom Typ SOGGetRefObjectListEventArgs angelegt werden, dass für den Zugriff auf Auflistungsfunktionen notwendig ist.
Dabei kann festgelegt werden, das nicht alle Datensätze gelesen werden sollen.
Der Parameter "Start" definiert die Nummer des ersten zu lesenden Satzes. (1.Satz = 1). 0 bedeutet: Vom ersten Datensatz an lesen.
Der Parameter "Anzahl" bestimmt die Anzahl der zu lesenden Sätze. 0 bedeutet: Alle Datensätze lesen.
Beispiel:
<SourceConfiguration Typ="Function" Name="dbs:ListLandOhneBuland(#refargs:0:0,#obj:TBR)" />
__cnt
Mit dem internen Feldnamen "__cnt" kann der Index eines Elements in einer Auflistung zurückgegeben werden.
Beispiel:
<RefObj Name="Positionen" >
<Class Name="GespraechsprotokollKopfsatz" />
<RefObjList Fkt="GespraechsprotokollPositionen" >
<Class Name="GespraechsprotokollPosition" />
<RefObj Name="Position" >
<Class Name="GespraechsprotokollPosition" />
<Feld NameIntern="__cnt" />
</RefObj>
</RefObjList>
</RefObj>
<RefObj Name="Leitsatz" Fkt="#obj:AuftragsLeitsatz">
Als RefObj wird das benannte Objekt "AuftragsLeitsatz" verwendet.
<Feld NameExtern="Konto" NameIntern="#obj:AuftragsLeitsatz.m_konto" />
Ausgabe des Datenfeldes "m_konto" des benannten Objektes "AuftragsLeitsatz".
<Feld NameExtern="BezGer" NameIntern="#obj::GetArtikelBezeichnungen(1,55206,'ger',0).#index:0.m_bez" />
Vom aktuellen Objekt wird die Funktion "GetArtikelBezeichnungen" mit den angegebenen Parametern aufgerufen. Die Funktion liefert eine Liste von Objekten. (Artikelbezeichnungen). Mittels "#index:0" wird das erste Element der Liste ausgewählt. Von diesem Element wird die Eigenschaft "m_bez" ermittelt.
<Feld NameExtern="BezGer" NameIntern="#obj::GetArtikelBezeichnungen(1,#obj:AuftragsLeitsatz.m_konto,'ger',0).#index:0.m_bez" />
Dies ist das gleiche Beispiel wie zuvor, aber es wird an Stelle der konstanten Kontonummer "55206" ein variabler Wert ermittelt und übergeben.
Wie in diesem Beispiel zu sehen ist, können Wertermittlungen auch ineinander geschachtelt werden. Hier wird als einer der Parameter an die Funktion "GetArtikelBezeichnungen" das benannte Objekt "AuftragsLeitsatz" gelesen, und von diesem die Eigenschaft "m_konto" ermittelt, und als Übergabe an die Funktion verwendet.
<Feld NameIntern="#refobj:person.m_match" NameExtern="Matchcode" />
In diesem Fall wird einem programmiert Referenzobjekt "person" gefolgt. Von dem "person"-Objekt wird die Eigenschaft "m_match" ermittelt.
<Feld NameIntern="#refobjlist:VorgangsPositionen.#index:0.m_art" NameExtern="ArtikelP1" />
Hier wird die programmierte Referenz-ObjektListe "VorgangsPositionen" verwendet, um aus dem ersten Element die Eigenschaft "m_art" zu ermitteln.
<Feld NameIntern="#rel:Person:#Kundenstamm.m_match" NameExtern="Matchcode" />
In diesem Beispiel wird vom aktuellen Objekt der 1:1 Relation "Person" auf ein Objekt vom Datentyp "Kundenstamm" gefolgt, und von diesem das Datenfeld "m_match" gelesen.
<Feld NameIntern="#rellist:Auftragspositionen:#AuftragsPosition.#index:0.m_art" NameExtern="ArtikelP1b" />
Hier wird einer 1:n Relation auf eine Liste von AuftragePosition-Objekten gefolgt. Dort wird das erste Element ermittelt, und von diesem die Eigenschaft "m_art genutzt.
Wird in der Defintion des Datenfelds der Parameter "ObjectExpression" auf "true" gesetzt, muss in "NameIntern" eine ObjectExpression angegeben werden. Damit wird es möglich, einfache Bedingungen, Berechnungen, Ausdrücke, Funktionen, etc. zu verwenden.
Beispiel:
<Feld NameIntern="IfElse( ${ZuAbschlagWeitere} > 0 ; ${ZuAbschlagWeitere} ; 0 )" NameExtern="werte_auftragspositionen_verkauf_zuabschlag_weitere_zu"
ObjectExpression="true" TypExtern="float" />
<Feld NameIntern="IfElse( ${ZuAbschlagWeitere} < 0 ; ${ZuAbschlagWeitere} ; 0 )" NameExtern="werte_auftragspositionen_verkauf_zuabschlag_weitere_ab"
ObjectExpression="true" TypExtern="float" />
In diesem Besipiel werden zwei Felder mit Werten aus einem Quellfeld bestückt. Ist der Wert im Quellfeld negativ, wird das Datenfeld "...ab" bestückt, ist er positiv, das Datenfeld "...zu".
Beispiel für den Zugriff aus einer ObjectExpression, auf ein benanntes Objekt:
<Feld NameExtern="" NameIntern="#refobjlist:Artikelbezeichnungen.#index:0.Text" ObjName="ArtBez"/>
<Feld NameIntern="SubStr(${ArtBez}; 0; 30)" NameExtern="Artikelbezeichnung" ObjectExpression="true" TypExtern="string" ObjectExpressionSrcField="ObjectRetriever"/>
In diesem Beispiel wird zuerst ein benanntes Objekt erzeugt, auf das dann mit Hilfe einer "SubStr" ObjectExpression zugegriffen wird.