application.xbs - minova-afis/aero.minova.rcp GitHub Wiki

application.xbs

Die Datei application.xbs wird genutzt, um die Anwendung sowie einzelne Masken zu konfigurieren.

Leider ist es aktuell noch nicht möglich, eine .xbs automatisch aus app-Projekten zu generieren, die Datei muss per Hand geschrieben und unter src/main/app/files abgelegt werden, damit das CAS sie an die Anwendung ausliefern kann.

Die Anwendung ist auch ohne .xbs nutzbar.

Genereller Aufbau

Die .xbs ist eine XML-Datei. Ihr Schema ist in XMLSetup definiert.

Das oberste Element muss preferences sein, gefolgt von root. root enthält eine map mit beliebig vielen entry, sowie eine Liste von node. Jede node hat wiederum eine map, sowie beliebig viele Kind-node.

Beispielhafte xbs:

<?xml version="1.0" encoding="UTF-8"?>
<preferences>
    <root>
        <map/>
        <node name="Settings">
	    <map>
		<entry key="CustomerID" value="MIN" />
	        <entry key="ApplicationID" value="SIS" />
	    </map>
            <node name="ChildNode">
                <map />
            </node>
        </node>
    </root>
</preferences>

Spezielle Nodes

Es gibt einige Nodes, die für die Anwendung eine besondere Bedeutung haben.

Settings

Die Node "Settings" erscheint meist ganz oben in der xbs, als erste Node von root. In ihrer Map werden werden allgemeine Einstellungen für die Anwendung hinterlegt.

Beispiel:

<node name="Settings">
	<map>
		<entry key="CustomerID" value="MIN" />
		<entry key="ApplicationID" value="SIS" />
	</map>
</node>

Folgende Werte werden aktuell beachtet:

key  Bedeutung
CustomerID  ID des Kunden, wird für Übersetzungen verwendet
ApplicationID  ID der Anwendung (z.B. SIS, TTA, ...), wird für Übersetzungen verwendet
ShowDeleteDialog  Bei "true" wird per Default ein Warnungs-Dialog angezeigt, bevor ein Datensatz gelöscht wird. Kann in den Einstellungen überschrieben werden.

OptionPages

Damit OptionPages angezeigt werden müssen sie in der xbs angegeben werden. Es muss eine Node mit Namen der Eltern-Maske geben (inklusive .xml). Diese Node hat dann eine Kindnode mit Namen OptionPages, welche wiederum eine Kindnode mit Namen der zu nutzenden OptionPage hat (wieder inklusive .op.xml).

In der Map dieser Node können dann Felder der OptionPage mit Werten belegt werden. Aktuell ist eine Verknüpfung mit Feldern der Hauptmaske möglich oder das Eintragen fester/statischer Werte. Beides funktioniert sowohl für Grids als auch für OptionPages mit "normalen" Feldern.

Verknüpfen mit Feld aus Hauptmaske

Ein Feld einer OptionPage/ eine Zeile eines Grids kann mit einem Feld der Hauptmaske verbunden werden, sodass in beiden immer der gleiche Wert steht.

Für OptionPages muss immer mindestens einer dieser Einträge enthalten sein, damit der KeyLong der Hauptmaske übertragen wird.

Syntax:

<entry key="<Name des Felds in der Optionpage>" value="<Name des Felds in der Hauptmaske>" />

Statische Werte

Wenn ein statischer Wert eingetragen werden soll muss das value mit # beginnen, um einer Unterscheidung von der Verknüpfen mit Feld aus Hauptmaske zu ermöglichen. Außerdem muss es möglich sein, den String (ohne #) in den Datentyp des Feldes zu parsen.

  • String: ein belieber String. Wird übersetzt, wenn er mit @ beginnt
  • Boolean: true oder false
  • Integer: ein beliebiger Integer
  • Double/Bigdecimal: ein beliebiger Double, Trennzeichen . (z.B. 1.23)
  • Instant/ShortDate/ShortTime/DateTime: entweder der Instant komplett ausgeschrieben (z.B. 2022-08-16T00:00:00Z) oder eine der bekannten Abkürzungen (z.B. 0 in Datumsfeld für heute, 1212 in Datumsfeld für den 12.12. des aktuellen Jahres)
  • Quantity: genau wie in der Anwendung, eine beliebiger Double, mit Trannzeichen . (z.B. 1.23), oder Integer und durch ein Leerzeichen getrennt die Einheit. Dabei sind nur Einheiten zulässig, die auch hier definiert sind.

Syntax:

<entry key="<Name des Felds in der Optionpage>" value="#<Wert>" />

Beispiel:

<node name="ServiceObject.xml">
	<map />
	<node name="OptionPages">
		<map />
		<node name="LuServiceObjectService.op.xml">
			<map>
				<entry key="ServiceObjectKey" value="KeyLong" />   <!-- Verknüpfung mit KeyLong der Hauptmaske -->
				<entry key="Position" value="#0" />                <!-- Statischer Wert 0, heute für Datumsfeld -->
				<entry key="Description" value="#@Description" />  <!-- Statischer Wert, Übersetzung von Description -->
			</map>
		</node>
	</node>
</node>

Konfigurieren von Grid in Hauptmaske

Es ist auch möglich, ein Grid in der Hauptmaske über die xbs zu konfigurieren. Hierbei kann das Grid NICHT explizit angegeben werden, alle Einstellungen werden auf alle Grids der Hauptmaske angewendet. Wenn es also mehrere Grids geben soll ist es sinnvoll, diese in OPs auszulagern, um eine individuelle Konfiguration zu ermöglichen.

In der xbs muss wieder der Name der entsprechenden Maske angegeben sein, gefolgt von einer Map mit dem Namen OptionPageGrid. In dieser können die Felder dann wie in OptionPages beschrieben konfiguriert werden.

Ist für ein Grid KEINE Konfiguration in der xbs gegeben wird automatisch der erste primary-Key der Hauptmaske mit dem ersten primary-Key des Grids verbunden.

Beispiel:

<node name="JobResult.xml">
	<map />
	<node name="OptionPageGrid">
		<map>
			<entry key="JobResultKey" value="KeyLong" />
			<entry key="GridJobDestinationKey" value="JobDestinationKey" />
		</map>
	</node>
</node>

Forms / Detail-Druck

Damit der Button zum Drucken des Details angezeigt wird muss die xbs entsprechend konfiguriert werden. Es muss eine Node mit Namen der zu druckenden Maske geben (inklusive .xml). Diese Node hat dann eine Kindnode mit Namen Forms haben, welche wiederum eine Kindnode mit Namen DEFAULT hat. Die Map der ERSTEN Kindnode dieser Node (Name egal) wird dann ausgewertet.

Angedacht aber noch nicht umgesetzt:

  • Mehrere Formulare, siehe Issue #1318
  • Nicht nur DEFAULT, sondern auch Formulare je nach Eintrag im Detail, siehe Issue #1319

Folgende keys müssen in der Map enthalten sein

  • procedurename: Name der Prozedur die aufgerufen wird, um den Inhalt der zu Druckenden xml Datei zu erhalten
  • rootelement: Root-Element für die xml Datei
  • reportname: Name der Stylesheet-Datei mit deren Hilfe die xml-Datei zu einer pdf umgewandelt wird. Muss dem CAS im Ordner src/main/app/reports zur Verfügung gestellt worden sein, damit die Anwendung es herunterladen und nutzen kann

Beispiel:

<node name="ServiceContract.xml">
	<map />
	<node name="Forms">
		<map />
		<node name="DEFAULT">
			<map />
			<node name="Standard">
				<map>
					<entry key="procedurename" value="xpcorXMLServiceContractPrintDetail" />
					<entry key="rootelement" value="ServiceContractDetail" />
					<entry key="reportname" value="ServiceContractDetail.xsl" />
				</map>
			</node>
		</node>
	</node>
</node>

Statistik

In der xbs können Statistiken konfiguriert werden. Die Idee ist, dass eine Prozedur aufgerufen wird, welche einen xml String zurückgibt, der dann mithilfe der angegebenen xsl Datei als PDF-Datei asugegeben werden kann.

In der xbs ist dafür eine Node mit Namen Statistic nötig. Diese hat als Kind-Nodes einen Eintrag pro gewünschter Statistik.

Jede Statistik wird in der Map konfiguriert. Folgende Einträge werden benötigt:

key  Bedeutung
Der Text, der in Spalte "Name" im Index angezeigt wird (wird übersetzt)
Group Der Text, der in Spalte "Typ" im Index angezeigt wird (wird übersetzt)
Description  Der Text, der in Spalte "Beschreibung" im Index angezeigt wird (wird übersetzt)
ProcedureName  Die Prozedur, die beim Klick auf Drucken aufgerufen wird. Es werden alle definierten Felder übergeben. Rückgabewert muss ein String im xml Format sein
ReportName  Der Name der xsl Datei (inkl .xsl), die zum Umwandeln der xml in eine PDF genutzt werden soll. Muss im reports Ordner (vom CAS geladen) liegen.
Root  Der Name des Root Elements in der xml. Wird vorne und hinten an den String, der von der Prozedur zurückgegeben wird angehängt.

In den Kind-Nodes werden dann die Felder fürs Detail konfiguriert. Es müssen alle Pflichtfelder ausgefüllt sein, damit gedruckt werden kann. Der Name der Nodes muss Field + Nummer sein (Also z.B. Field0, Field12, ... ). Die eingegeben Werte werden dann in Reihenfolge der Nummern in die Prozedur gegeben.

key  Bedeutung
Der Text, der an dem Feld angezeigt werden soll (wird übersetzt)
DisplayFormat Der Datentyp des Feldes. Möglich sind aktuell Lookup, ShortDate, ShortTime und DateTime
FieldName  Der Name des Feldes, mit dem dieses an die Prozedur übergeben wird
nullable (optional) Bei Wert 1 handelt sich um kein Pflichtfeld. Bei allen anderen Werten (oder wenn der key gar nicht genutzt wird) wird das Feld zum Pflichtfeld
tablename (optional) Nur für Lookup-Felder benötig. Der Name der Tabelle/View, die die Werte liefert

Beispiel:

<node name="Statistic">
	<map/>
	<node name="NotAssignedJournalsStatistic">
		<map>
			<entry key="" value="@NotAssignedJournalsStatistic"/>
			<entry key="Group" value=""/>
			<entry key="Description" value="@NotAssignedJournalsStatistic.Description"/>
			<entry key="ProcedureName" value="xpcorXMLNotAssignedJournals"/>
			<entry key="ReportName" value="NotAssignedJournalsStatistic.xsl"/>
			<entry key="Root" value="NotAssignedJournalsStatistic"/>
		</map>
		<node name="Field0">
			<map>
				<entry key="" value="@DateFrom"/>
				<entry key="DisplayFormat" value="ShortDate"/>
				<entry key="FieldName" value="DateFrom"/>
				<entry key="nullable" value="0"/>
			</map>
		</node>
		<node name="Field1">
			<map>
				<entry key="" value="@DateUntil"/>
				<entry key="DisplayFormat" value="ShortDate"/>
				<entry key="FieldName" value="DateUntil"/>
				<entry key="nullable" value="1"/>
			</map>
		</node>
		<node name="Field2">
			<map>
				<entry key="" value="@Customer"/>
				<entry key="DisplayFormat" value="Lookup"/>
				<entry key="FieldName" value="Customer"/>
				<entry key="tablename" value="tCustomer"/>
			</map>
		</node>
	</node>
</node>

Damit die Statistik auch über die Anwendung aufgerufen werden kann ist außerdem ein entsprechender Eintrag in der mdi notwendig. Dieser sieht im Prinzip aus wie ein "normaler" Maskeneintrag. Der einzige Unterschied ist, dass in der action Definition action="Statistic" stehen muss (bei normalen Masken steht hier der Maskenname inkl. .xml). Es ist wichtig, dass id=statistic genutzt wird:

<?xml version="1.0" encoding="UTF-8"?>
<main icon="CAS" titel="CAS">
    <action action="Statistic" icon="Statistic" id="statistic" text="@Statistic"/>
	<action action="InvoiceOverview.xml" generic="true" icon="Invoice.ico" id="InvoiceOverview" text="@tInvoice.Overview"/>
	
    <menu id="main">
        <menu id="information" text="@Information" position="50.0" override="false">
            <entry id="statistic" position="10.0" override="false" type="action"/>
            <entry id="InvoiceOverview" position="20.0" override="false" type="action"/>
        </menu>
    </menu>
</main>

Beispielhaftes Aussehen in der Anwendung:

Eigene Werte definieren / Auslesen von Werten

Prinzipiell können beliebige Nodes in der XBS eingetragen werden.

Zum Auslesen der XBS (z.B. über einen Helper) siehe XBS Auslesen.

⚠️ **GitHub.com Fallback** ⚠️