application.xbs - minova-afis/aero.minova.rcp GitHub Wiki
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.
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>
Es gibt einige Nodes, die für die Anwendung eine besondere Bedeutung haben.
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. |
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.
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>" />
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>
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>
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 Ordnersrc/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>
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:
Prinzipiell können beliebige Nodes in der XBS eingetragen werden.
Zum Auslesen der XBS (z.B. über einen Helper) siehe XBS Auslesen.