Verarbeiten von Collections mit Extended Binding


Szenario

Wir wollen für einen Benutzer einen Auszug aller seiner Einkäufe der letzten zwei Monate in einem Dokument darstellen. Die dafür benötigten Daten werden aus einer Fachapplikation bereits als valide Connect-Datei geliefert:

<OneOffixxConnectBatch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schema.oneoffixx.com/OneOffixxConnectBatch/1"> <Settings> <Add key="CreateConnectorResult">true</Add> </Settings> <Entries> <OneOffixxConnect> <Arguments> <LanguageLcid>1031</LanguageLcid> <TemplateId>2e221a62-c9ec-4f4d-89d5-b0919c249867</TemplateId> </Arguments> <Function name="CustomInterfaceConnector" id="70E94788-CE84-4460-9698-5663878A295B"> <Arguments> <Interface Name="PurchaseInterface"> <Customer> <CustomerNumber>974853</CustomerNumber> <Name>Buyer</Name> <FirstName>Brian</FirstName> </Customer> <Purchases> <Purchase> <Id>927859198.123</Id> <Date>10.12.2019</Date> <Payment>Bezahlt</Payment> <Delivery>Geliefert</Delivery> <Amount>120.10</Amount> </Purchase> <Purchase> <Id>1234539198.527</Id> <Date>15.01.2020</Date> <Payment>Bezahlt</Payment> <Delivery>Geliefert</Delivery> <Amount>230.55</Amount> </Purchase> <Purchase> <Id>456454198.527</Id> <Date>15.01.2020</Date> <Payment>Bezahlt</Payment> <Delivery>Geliefert</Delivery> <Amount>15.55</Amount> </Purchase> <Purchase> <Id>877906786.527</Id> <Date>18.01.2020</Date> <Payment>Ausstehend</Payment> <Delivery>Geliefert</Delivery> <Amount>145.80</Amount> </Purchase> <Purchase> <Id>9678567.527</Id> <Date>09.02.2020</Date> <Payment>Ausstehend</Payment> <Delivery>Ausstehend</Delivery> <Amount>20.90</Amount> </Purchase> </Purchases> </Interface> </Arguments> </Function> </OneOffixxConnect> </Entries> </OneOffixxConnectBatch>

Da wir nicht wissen, wie viele Einträge im Dokument abgebildet werden müssen, ist es nicht möglich, die Vorlage statisch aufzubauen. Wir brauchen dazu ein Extended Binding und eine Collection.


Definition der Collection in der Interface-Definition

Als Erstes muss die Connect-Schnittstellendefinition erstellt werden:

<InterfaceDescription Name="PurchaseInterface"> <!-- Auswertung der Daten für <Customer></Customer> --> <Node Id="PurchaseInterface.Customer.Name" XPath="./Customer/Name">[Customer Name]</Node> <Node Id="PurchaseInterface.Customer.FirstName" XPath="./Customer/FirstName">[Customer Firstname]</Node> <Node Id="PurchaseInterface.Customer.CustomerNumber" XPath="./Customer/CustomerNumber">[Customer Number]</Node> <!-- Auswertung der Daten für <Purchases></Purchases> --> <NodeCollection Id="PurchaseInterface.Purchases" XPath="./Purchases/Purchase"> <Node Id="PurchaseInterface.Purchase.Id" XPath="./Id">[Puchase Id]</Node> <Node Id="PurchaseInterface.Purchase.Date" XPath="./Date">[Puchase Date]</Node> <Node Id="PurchaseInterface.Purchase.Payment" XPath="./Payment">[Pending]</Node> <Node Id="PurchaseInterface.Purchase.Delivery" XPath="./Delivery">[Pending]</Node> <Node Id="PurchaseInterface.Purchase.Amount" XPath="./Amount">[Amount]</Node> </NodeCollection> </InterfaceDescription>

Ein Ausführen der Connect-Datei führt nun zu folgenden Daten im CustomXML-Part:

<Interfaces windowwidth="0" windowheight="0" minwindowwidth="0" maxwindowwidth="0" minwindowheight="0" maxwindowheight="0"> <NodeGroup id="PurchaseInterface" row="0" column="0" columnspan="0" label="PurchaseInterface" visible="True"> <Text id="PurchaseInterface.Customer.Name" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Customer.Name" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Buyer]]></Text> <Text id="PurchaseInterface.Customer.FirstName" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Customer.FirstName" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Brian]]></Text> <Text id="PurchaseInterface.Customer.CustomerNumber" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Customer.CustomerNumber" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[974853]]></Text> <Collection id="PurchaseInterface.Purchases"> <Element> <Text id="PurchaseInterface.Purchase.Id" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Id" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[927859198.123]]></Text> <Text id="PurchaseInterface.Purchase.Date" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Date" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[10.12.2019]]></Text> <Text id="PurchaseInterface.Purchase.Payment" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Payment" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Bezahlt]]></Text> <Text id="PurchaseInterface.Purchase.Delivery" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Delivery" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Geliefert]]></Text> <Text id="PurchaseInterface.Purchase.Amount" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Amount" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[120.10]]></Text> </Element> <Element> <Text id="PurchaseInterface.Purchase.Id" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Id" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[1234539198.527]]></Text> <Text id="PurchaseInterface.Purchase.Date" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Date" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[15.01.2020]]></Text> <Text id="PurchaseInterface.Purchase.Payment" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Payment" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Bezahlt]]></Text> <Text id="PurchaseInterface.Purchase.Delivery" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Delivery" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Geliefert]]></Text> <Text id="PurchaseInterface.Purchase.Amount" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Amount" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[230.55]]></Text> </Element> <Element> <Text id="PurchaseInterface.Purchase.Id" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Id" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[1234539198.527]]></Text> <Text id="PurchaseInterface.Purchase.Date" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Date" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[15.01.2020]]></Text> <Text id="PurchaseInterface.Purchase.Payment" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Payment" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Bezahlt]]></Text> <Text id="PurchaseInterface.Purchase.Delivery" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Delivery" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Geliefert]]></Text> <Text id="PurchaseInterface.Purchase.Amount" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Amount" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[15.55]]></Text> </Element> <Element> <Text id="PurchaseInterface.Purchase.Id" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Id" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[1234539198.527]]></Text> <Text id="PurchaseInterface.Purchase.Date" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Date" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[18.01.2020]]></Text> <Text id="PurchaseInterface.Purchase.Payment" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Payment" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Ausstehend]]></Text> <Text id="PurchaseInterface.Purchase.Delivery" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Delivery" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Geliefert]]></Text> <Text id="PurchaseInterface.Purchase.Amount" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Amount" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[145.80]]></Text> </Element> <Element> <Text id="PurchaseInterface.Purchase.Id" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Id" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[1234539198.527]]></Text> <Text id="PurchaseInterface.Purchase.Date" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Date" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[09.02.2020]]></Text> <Text id="PurchaseInterface.Purchase.Payment" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Payment" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Ausstehend]]></Text> <Text id="PurchaseInterface.Purchase.Delivery" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Delivery" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[Ausstehend]]></Text> <Text id="PurchaseInterface.Purchase.Amount" row="0" column="0" columnspan="0" multiline="False" multilinerows="3" locked="False" label="PurchaseInterface.Purchase.Amount" readonly="False" visible="True" required="False" regex="" validationmessage="" tooltip="" tracked="False"><![CDATA[20.90]]></Text> </Element> </Collection> </NodeGroup> </Interfaces>

Der nächste Schritt besteht nun darin, den Inhalt der NodeGroup in das Dokument zu bringen. Für Name, FirstName und CustomerNumber kann das normal über den Editor erledigt werden. Aus dem folgenden Screenshot ist auch ersichtlich, dass die Nodes der Collection ebenfalls verfügbar sind.

 

Aber: Da wir für eine NodeId fünf mögliche Werte haben, können diese nicht einfach so eingefügt werden. Werden diese Nodes direkt im Dokument eingefügt, dann würde das resultierende Dokument so aussehen:


Das Extended Binding

Es fehlen alle Einträge bis auf den Ersten. Das kann nur mit einem Extended Binding gelöst werden:

 

Mit diesem Extended Binding sieht das Dokument nach der Generierung folgendermassen aus:

 

PrimeSoft AG, Bahnhofstrasse 4, 8360 Eschlikon, Switzerland