MyTISM ist plattformunabhängiges, objektorientiertes, dezentrales, multiuserfähiges, individuell anpassbares und quelloffenes 3-Tier-Datenbank- und Anwendungs-Framework incl. GUI und Web-Application-Server, entwickelt und betreut von OAshi s.a r.l.
In diesem Handbuch finden Sie alle Informationen, die Sie für die Programmierung von und mit MyTISM benötigen.
Beachten Sie bitte, dass sich dieses Dokument noch im Aufbaustadium befindet und noch grosse Lücken aufweist, die wir natürlich nach und nach füllen werden. |
Dieser Teil der Dokumentation ist im Wesentlichen dem Entwickler bzw. dem (sehr) interessierten Anwender gewidmet, der Einblick in die Interna bzw. Aufbau des Systems gewinnen will. Das Vorwissen besteht mindestens aus guten bis sehr guten Kenntnissen in Java und NetRexx sowie Datenbank-Kenntnisse in relationalen oder objektorientierten Systemen. Eine mindestens halbwegs intensive Beschäftigung mit der Bedienung des Systems sollte der Lektüre vorangegangen sein…
Bei Fragen, Problemen oder Anregungen, sei es bzgl. MyTISM selber oder dieser Dokumentation, wenden Sie sich bitte an uns; Kontaktinfos finden Sie im WWW unter http://www.mytism.de/mytism/contact.
Schema
Schema-Definition
FIXME: Besteht aus Include
, Entity
und Generator
Einleitender Tag: <Schema BEFEHLE>
Schliessender Tag: </Schema>
Befehl | Beschreibung mit Beispiel |
---|---|
version |
Freitext, der den Platzhalter |
<Schema version="@ProjectName@ Schema built @BUILT@"> |
|
defaultPackage |
"Basis"-Package, welches bei der Entität im |
<Schema version="@ProjectName@ Schema built @BUILT@" defaultPackage="@BOPACK@"> |
|
defaultFolder |
Hier kann zwecks geordneter Erstellung der nachfolgend definierten Entitäten ein defaultFolder definiert werden. |
<Schema version="@ProjectName@ Schema built @BUILT@" defaultPackage="@BOPACK@" defaultFolder="Stammdaten/Konten"> |
Include
Der Include-Befehl bietet, analog zu dem aus manchen Programmiersprachen bekannten Konstrukten, die Möglichkeit an, eine existierende Schemadefinition aus einer weiteren Datei mit einzubinden.
So lassen sich z.B. in der Modellierung von Entities thematisch getrennte Elemente in verschiedenen Schemadefinitionsdateien ablegen, und über include
-Befehle in einer Datei zusammenfügen.
Tag: <Include BEFEHLE />
Befehl | Beschreibung | Beispiel |
---|---|---|
file |
Name der zu inkludierenden Datei |
<Include file="/de/ipcon/schema/schema-core.xml"> |
child |
FIXME |
<Include file="/de/ipcon/schema/schema-core.xml" child="true"> |
Folder
FIXME: Einleitende, erklärende Worte
Tag: <Folder Foldername />
Befehl | Beschreibung | Beispiel |
---|---|---|
path |
Name des Pfads |
<Folder path="Quertabellen"> |
Entity
FIXME: Einleitende, erklärende Worte: Definition einer Entität und ihrer Attribute
Einleitender Tag: <Entity BEFEHLE>
Schliessender Tag: </Entity>
Befehl | Beschreibung | Beispiel |
---|---|---|
name |
Name der Entität, quasi unbegrenzter Länge |
<Entity name="Lieferant"> |
plural |
Plural-Bezeichnung der Entität |
<Entity name="LIeferant" plural="Lieferanten"> |
extends |
Von welcher Klasse sich die Entität ableitet |
<Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto"> |
abstract |
Ob die Entität abstrakt sein soll (es können keine BOs von dieser Entität angelegt werden, da keine Formulare generiert werden - macht nur Sinn, wenn sich von dieser Entität weitere Entitäten ableiten; Default: false |
<Entity name="XBuchungsKonto" plural="XBuchungsKonten" extends="CBO" abstract="true"> |
noAbstractWarning |
In Verbindung mit dem 'abstract'-Attribut verwendbarer Befehl; unterdrückt die Warnung, dass die Entität abstrakt ist und erlaubt (eingeschränkt) , dass dennoch BOs von dieser Entität angelegt werden können: Dies ist dann sinnvoll, wenn es sich um nicht für den Endnutzer bestimmte technische BOs handelt, die zwar programmatisch angelegt werden sollen, jedoch nicht via MyTISM-Formular. Diese BOs können in MyTISM per Lesezeichen abgefragt und per Formular angesehen werden, es gibt aber keine Schablone zum Erzeugen eines neuen BOs. |
ignoreReverseRelations |
FIXME; Default: false |
<Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" ignoreReverseRelations="true"> |
discriminator |
FIXME Irgendwas bzgl. BOT/Typ |
<Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" discriminator="FIXME"> |
suid |
FIXME SerialVersionUID (Klassenversionskennung) |
<Entity name="Lieferant" plural="Lieferanten" extends="XBuchungsKonto" suid="FIXME"> |
package |
Unter-Element "ui" von Entity
FIXME: Einleitende, erklärende Worte
Befehl | Beschreibung | Beispiel |
---|---|---|
description |
Beschreibung der Entität; definiert Ausgabe der describe()-Methode einer jeden Entität, Definition im CBOFormat (siehe dort "Wo kann man das CBOFormat nun überhaupt einsetzen?" |
<ui description="Nachname(', 'Vorname)"/> |
loadImmediate |
Ob eine Übersicht (Liste) der BOs der Entität; direkt in einem geöffneten Lesezeichen (FTable) angezeigt werden soll (aus Performance-Gründen nur sinvoll bei Entitäten mit einer überschaubaren Anzahl von BOs); Default: false |
<ui loadImmediate="false"/> |
linkOnly |
Ob Objekte nicht im Kontext dieses BO angelegt, sondern sie lediglich mit diesem BO verknüpft werden können sollen; Default: false |
<ui linkOnly="false"/> |
tips |
FIXME |
<ui tips="FIXME"/> |
defaultSorting |
Tabellen, die Objekte diesen Typs anzeigen, werden standardmäßig nach diesen Vorschriften sortiert, sofern keine explizite Sortierung in der Tabelle definiert worden ist. Subentities "erben" dabei das defaultSorting, falls sie selbst kein eigenes definiert haben. Format der Definition: Spaltenname:Sortierrichtung. Dabei impliziert die Reihenfolge der Einträge den sortLevel. Die Mehrfachsortierung erfordert eine zusätzliche Lizenz. |
<ui defaultSorting="Name:ASC Beschreibung:DESC Position.ASC Eigenschaft:ASC Eigenschaft.Name:ASC"> |
autotrim |
Nur sinnvoll für Entity-Attribute vom Typ "String".
Whitespace am Anfang und Ende der Eingabe wird in der GUI automatisch entfernt.
Standard für String-Attribute ist "true", mit |
<ui autotrim="false"/> |
Unter-Element "lookup" von Entity
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
defaultProperty |
In welchem Attribut der BOs vom entsprechenden Typ bei Eingabe eines Suchstrings in einem Popup gesucht werden soll, damit nach Eingabe von Enter direkt das Objekt (falls nur eines gefunden wurde) an das BO angehängt bzw. eine Liste von BOs mit diesem Wert im angegebenen Attribut angezeigt werden kann. |
<lookup defaultProperty="Name"/> |
defaultSubstring |
Ob die Suche exakt sein soll oder ein Substring-Match in der defaultProperty schon ausreicht; Default: true |
<lookup defaultSubstring="true"/> |
defaultCaseSensitive |
Ob die Suche Groß-/Kleinschreibung beachten soll; Default: false |
<lookup defaultCaseSensitive="true"/> |
Unter-Element "code" von Entity
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
package |
Hier kann ein zum |
<code package="de.blues.bo"/> |
generateAs |
Unter welchem Namen die Basis-Klasse der Entität angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei "Person.nrx" angelegt werden, welche die Klasse "Person" implementiert und sich von der generierten Klasse "PersonBase" ableitet |
<code generateAs="PersonBase"/> |
custom |
Ob die Basis-Klasse der Entität mit Suffix "Base" angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei mit dem Entity-Namen und Suffix ".nrx" angelegt werden, welche die Klasse "Entity-Name" implementiert und sich von der generierten Klasse "Entity-NameBase" ableitet |
<code custom="true"/> |
generate |
Ob für die Entität Sourcecode generiert werden soll (eigentlich nur für "BO" mit "false" benutzt); Default: true |
<code generate="false"> |
dependents |
Welche Klassen von dieser Entität abhängen und die daher bei Änderung der Klasse der Entität ebenfalls neu gebaut werden müssen (z.B. damit die serialVersionUID aktuell ist). |
<code dependents="GeschaeftsVorfallSchemaAspects"/> |
Unter-Element "db" von Entity
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
persistent |
Ob die BOs der Entität persistiert (gespeichert) werden sollen, Default: true |
<db persistent="false"/> |
name |
Ein optionaler, abweichender, ggfs. kürzerer (Tabellen-)Name für diese Entität (case-insensitive). Wird hier keine Angabe gemacht, so wird als Default der Entitätsname in Kleinbuchstaben verwendet. Falls der Entitätsname länger als 63 Zeichen ist, sollte hier ein kürzerer Name angegeben werden, da aufgrund von Limits in der Datenbank für Tabellennamen in MyTISM max. 63 Zeichen erlaubt sind. Ferner sind auch keine Unterstriche in Tabellennamen erlaubt, da diese nur für interne junction tables für n-m-Relationen verwendet werden dürfen. |
<db name="MyShorterTableNameNoUnderscore"/> |
generateAs |
Unter welchem Namen die Basis-Klasse der Entität angelegt werden soll; es muss dann im "bo"-Verzeichnis von Hand eine Datei "Person.nrx" angelegt werden, welche die Klasse "Person" implementiert und sich von der generierten Klasse "PersonBase" ableitet |
<db generateAs="PersonBase"/> |
streamRessource |
Gibt einen Tipp, ob mit Instanzen dieses Typs normalerweise ein BLOB (BinaryLargeOBject) verknüpft sein kann (verhindert bei "false" allerdings nicht, dass man ein BLOB verknüpfen kann); wird aktuell im Sync von BOs ins Dateisystem abgefragt, um zu entscheiden, ob zusätzlich auch ein Datei-Export für das verknüpfte Objekt durchgeführt werden muss, z.B. für Bilder an einem Report-Objekt; Default: false |
<db streamRessource="true"/> |
noStreamResourceHistory |
Legt fest, ob Sicherheitskopien der BLOBs beim Ersetzen derselben im Dateisystem des Servers angelegt werden sollen ("false") oder nicht ("true"); Default: false |
<db noStreamResourceHistory="true"/> |
forbidDirectChanges |
Ob direkte Änderungen an BOs diesen Typs vorgenommen werden dürfen oder ob nur der Server diese Objekte modifizieren darf; Default: false; solche Objekte werden nicht zwischen verschiedenen MyTISM-Nodes synchronisiert/übertragen, sind also nur auf der erstellenden Instanz verfügbar |
<db forbidDirectChanges="true"/> |
Unter-Element "report" von Entity
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
title |
Titel für automatisch generierte Reports |
<report title="Analyse"/> |
orientation |
Orientierung für automatisch generierte Reports (Portrait oder Landscape) |
<report orientation="Portrait"/> |
fontSizeNormal |
Die Standard-Schriftgrüße für automatisch generierte Reports; Default: 9 |
<report fontSizeNormal="10"/> |
fontSizeBig |
Die große Schriftgrüße für automatisch generierte Reports; Default: 16 |
<report fontSizeBig="14"/> |
Unter-Element "export" von Entity
Durch Angabe dieses Elements können ein oder mehrere automatisch bereitgestellte Exports konfiguriert werden.
Diese Funktionalität ist noch in der Entwicklung und wird später den Struktur-Sync, den Initialdaten-Import beim Serverstart und ggfs. auch manuell gebaute Exports in Fremdsysteme ersetzen.
Weiterhin sind neue Features wie etwa das Kopieren von Objekten via Clipboard von einem MyTISM-System in ein gänzlich anderes angedacht, sofern die Entitäten der zu kopierenden Objekte in beiden System existieren (z.B. für Core-Entitäten wie etwa Strukturelemente, aber ggfs. auch für andere).
Befehl | Beschreibung | Beispiel |
---|---|---|
name |
Der Name des Exports. Pflichtangabe. |
<export name="Initialdaten"/> |
primaryKey |
Der primäre Schlüssel für den Export. Verwendet für Referenzen aus anderen Exports. Pflichtangabe. |
<export primaryKey="ISOCode"/> |
mode |
Der Modus für den Export, der bestimmt, ob pro Objekt eine Datei erzeugt wird oder alle Objekte in eine einzige Datei geschrieben werden; erlaubte Werte: SINGLE, LIST. Pflichtangabe. |
<export mode="SINGLE"/> |
Beispiel:
<Entity name="Person" extends="CBO" plural="Personen" folder="Kontakte"> <code custom="true"/> <ui description="Nachname(', 'Vorname)"/> </Entity>
Attribut
FIXME: Einleitende, erklärende Worte
Tag für Attribute: <attr BEFEHLE />
Tag für virtuelle Attribute: <vattr BEFEHLE />
Tag für nicht-persistente Attribute: <npattr BEFEHLE />
Befehl | Beschreibung | Beispiel |
---|---|---|
name |
der Attribut-Name |
name="Adressen" |
backName |
FIXME: Bei Relationen Name des Attributes "auf der anderen Seite". |
backName="FIXME" |
singular |
FIXME: Wird kein |
singular="Adresse" |
type |
Typ des Attributs; mögliche Werte: FIXME |
type="Kontakt" (eine Adresse ist eine bestimmte Art einer Kontakt-Möglichkeit |
displayFormat |
Standard-Display-Format des Attributs |
displayFormat="Name" |
relation |
Relation des Attributs zu einer anderen Entität; mögliche Werte: "n-1", "1-n", "n-m" |
relation="1-n" |
dependent |
Abhängigkeit: in unserem Beispiel werden beim Löschen der
Person auch die zugehörigen Adressen gelöscht; ansonsten wie
|
dependent="true" |
itemProperty |
Ermöglicht manuelle Sortierung per Pfeil-Buttons im Formular. Anzugeben ist das Attribut (der anhängenden Entität), nach dem sortiert werden soll. |
itemProperty="Position" |
shared |
Wird die Referenz innerhalb der Entität geshared; Default: false |
shared="true" |
default |
Für diverse Attribut-Typen lässt sich ein Default-Wert
vorgeben (z.B. für |
default="#,##0.00" |
ignoreBackRelation |
Es sollen keine Methoden für die Rückrelation generiert werden (z.B. n-1-Relation zu Core-Entität) |
ignoreBackRelation="true" |
readonly |
Gibt an, ob das Attribut-Feld im Formular gesperrt ist für irgendwelche Eingaben; Default: false |
readonly="true" |
lazy |
FIXME; Default: false |
lazy="true" |
omitOnCopy |
Gibt an, ob dieses Attribut beim Kopieren eines Objekts diesen Typs übersprungen werden soll. |
omitOnCopy="true" |
Unter-Element "ui" von Attribute
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
editMode |
Gibt an, wie das Attribut in der UI editierbar sein soll, Mögliche Werte: linkonly, viewonly, locked, writenew, all. |
<ui editMode="linkonly"> |
createInDetailView |
Gibt an, ob im Formular der Entität automatisch Eingabefelder für die Many-Relation gebaut werden sollen (normalerweise wird auf dem Formular-Reiter der Many-Relation nur eine FTable gebaut); Default: false |
<ui createInDetailView="true"> |
mandatory |
FIXME Definition als "Pflichtfeld". Z.Zt. nur partiell unterstützt, nicht z.B. von Solstice; Default: false |
<ui mandatory="true"> |
tips |
FIXME: mögliche Werte: |
<ui tips="FIXME"> |
visible |
Ob das Attribut im Formular gebaut werden soll; Default: true |
<ui visible="false"> |
expectedWidth |
FIXME: Die erwartete Breite des Attributs im Formular |
<ui expectedWidth="FIXME"> |
selectionFilter |
Hier kann direkt eine Filter-Clause (s. Bsp. 1) oder alternativ ein |
|
Unter-Element "lookup" von Attribute
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
property |
In welchem Attribut der BOs vom entsprechenden Typ bei Eingabe eines Suchstrings in einem Popup gesucht werden soll, damit nach Eingabe von Enter direkt das Objekt (falls nur eines gefunden wurde) an das BO angehängt bzw. eine Liste von BOs mit diesem Wert im angegebenen Attribut angezeigt werden kann. |
<lookup property="Name"> |
substring |
Ob die Suche exakt sein soll oder ein Substring-Match in der property schon ausreicht; Default: true |
<lookup substring="true"> |
caseSensitive |
Ob die Suche Groß-/Kleinschreibung beachten soll; Default: false |
<lookup caseSensitive="true"> |
Unter-Element "report" von Attribute
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
visible |
Ob das Attribut in den Automatik-Reports angedruckt werden soll; Default: true |
<report visible="false"> |
relativeWidth |
Die relative Breite des Felds für das Attribut in den Automatik-Reports; Default: 1 |
<report relativeWidth="2"> |
position |
Determiniert die Reihenfolge der Attribute in den Automatik-Reports. |
<report position="100"> |
sort |
Sollen die BOs im Automatik-Report nach diesem Attribut sortiert werden? Mögliche Werte: asc, desc |
<report sort="asc"> |
manySort |
Sollen die BOs im Automatik-Report nach diesen Attributen sortiert werden? Mögliche Werte: Komma-separierte Liste von Attribut-Namen der Entität mit Suffix :A oder :D. |
<report manySort="Tid:A, Nummer:D"> |
alias |
Ob im Automatik-Report für eine many-Relation eine Gruppe mit angegebenem Alias erzeugt und die Daten der many-Relation im Automatik-Report gedruckt werden sollen. |
<report alias="P"> |
Unter-Element "virtual" von Attribute
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
aggregate |
Ob der Wert des virtuellen Attributs durch eine Aggregats-Funktion bestimmt werden soll. |
<virtual aggregate="BO.Union:Gruppe.Benutzer"> |
cacheMode |
Ob das virtuelle Attribute versioniert sein soll. |
<virtual cacheMode="VERSIONED"> |
preCachingHook |
Der Name einer Methode, die auf einen im Cache zu speichernden, skalaren Wert appliziert werden soll, bevor dieser in den Cache befördert wird. Die Methode wird typischerweise an der Klasse der Entität, die das vattr definiert, implementiert (alternativ relativ weit "oben", wenn sie mehrmals verwendet werden soll im Schema, also z.B. an der TBO-Klasse). Die Methodensignatur dieser Methode muss zwei Parameter akzeptieren, als erstes den Attributnamen und als zweites den zu cachenden Wert im richtigen, schema-definierten Typ, und ebendiesen Typ zurück geben. |
<virtual
preCachingHook="compactBigDecimal"> sowie eine Methode |
Aggregats-Funktionen:
Aggregats-Funktionen dienen zum schnellen Definieren von virtuellen Attributen,
in Fällen, bei deinen Beispielsweise der Skalar eines komplexen Attributes zurückgegeben,
oder alle Elemente einer Relation summiert werden sollen.
Konkret kann die Angabe einer einer Funktion wie folgt aussehen:
aggregate="Object.firstNonNull:Person.Name, Person.Nachname"
Weitere verfügbare Funktionen sind, u.a.:
-
Für String:
String.sortJoinCommaList
,String.allNullOrEmpty
,String.anyNullOrEmpty
,String.allNotNullOrEmpty
,String.anyNotNullOrEmpty
-
Für BigDecimal:
BigDecimal.min
,BigDecimal.max
,BigDecimal.sum
,BigDecimal.diff
,BigDecimal.absDiff
,BigDecimal.prod
,BigDecimal.div
,BigDecimal.avg
,BigDecimal.avgWithNullValues
,BigDecimal.count
,BigDecimal.countWithNullValues
,BigDecimal.countTrueBools
,BigDecimal.countFalseBools
,BigDecimal.countNullOrFalseBools
-
Für Boolean:
Boolean.and
,Boolean.or
,Boolean.not
-
Für Date:
Date.min
,Date.max
-
Für BOs:
BO.union
,BO.firstNotDeleted
,BO.newest
,BO.oldest
,BO.uniqueOrNull
-
Für beliebige Listen:
Object.firstNonNull
,Object.allNull
,Object.anyNull
,Object.allNullOrEmptyRelations
,Object.anyNullOrEmptyRelations
,Object.allNotNullOrPopulatedRelations
,Object.anyNotNullOrPopulatedRelations
Unter-Element "np" von Attribute
Hier können weitere Optionen für nicht-persistente (npattr) Attribute einer Entität definiert werden.
Befehl | Beschreibung | Beispiel |
---|---|---|
calculationAuthority |
Wo der Wert des nicht-persistenten Attributs berechnet werden soll. Bei Berechnung auf dem Server erfolgt zusätzlich eine Übertragung an den Client sowie eine in-place Ersetzung des clientseitigen Werts durch den Wert vom Server. Der Default ist "client". |
<np calculationAuthority="server"/> |
Unter-Element "db" von Attribute
FIXME
Befehl | Beschreibung | Beispiel |
---|---|---|
indexed |
Gibt an, ob die Werte eines Attributs für die Datenbank-Volltextsuche indiziert werden sollen; Default: true |
<db indexed="false"> |
unique |
FIXME; Default: false |
<db unique="true"> |
Restliche Unter-Elemente von Attribute
Unter-Element | Beschreibung | Beispiel |
---|---|---|
backRelation |
Explizite Übersteuerung der automatisch generierten Rückrelation, um z.B. einen anderen Namen zu benutzen oder die Rückrelation mittels Unter-Elementen zu konfigurieren. |
<backRelation name="BezugnehmendePosten"/> |
comment |
Um einen Kommentar zu diesem Attribut im Schema zu hinterlegen. |
<comment>Dient zur Speicherung von XXX</comment> |
Beispiel:
<attr name="Adressen" singular="Adresse" type="Kontakt" relation="1-n" dependent="true" itemProperty="Position">
Die Entität Person
hat ein Attribut namens Adressen
.
Für das Attribut ist eine 1-n
-Relation definiert, d.h. eine Person
kann mehrere Adressen
haben.
Wird die Person gelöscht, werden auch die angehangenen BOs der Entität
Adresse
gelöscht.
Durch itemProperty
besteht die Möglichkeit die jeweilige Position der
Adressen innerhalb der Zuordnungsliste bequem mit Pfeil-rauf- und
Pfeil-runter-Knöpfen im Formular zu bestimmen.
Vordefinierte Datentypen für Attribute
FIXME Sehr unvollständig, viele Typen fehlen noch.
Timespan
Der Timespan-Typ wird verwendet, um eine feste Zeitspanne zu
speichern. Intern wird diese als Anzahl von Sekunden (FIXME Sollte
Millisekunden sein und wird ggf. irgendwann mal dahingehend umgebaut
werden) abgespeichert, d.h. wenn ein Attribut mit type="Timespan"
definiert wird, ist der Java-Typ ein Long
.
In den meisten Anwendungsfällen bei denen es um Zeitspannen geht wird Timespan der richtige Typ sein. Wenn z.B. die Dauer eines Vorgangs abgespeichert werden soll ist die genaue, feste Zeitspanne, die der Vorgang gedauert hat, bekannt und soll auch genau so festgehalten werden.
Duration
Im Gegensatz zu Timespan handelt es sich bei Duration um eine (in gewissen Grenzen) variable Zeitspanne. Eine Duration wird als Kombination einer Anzahl von Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden (inkl. Millisekunden) gespeichert. Abhängig von einem Referenzdatum kann daraus dann die genaue Zeitspanne ermittelt werden.
Intern wird der Wert als javax.xml.datatype.Duration
abgespeichert.
Beispiel: P1Y0M0DT0H0M0S
entspricht ausgehend vom 1.1.2015 365 Tagen;
ausgehend vom 1.1.2012 (Schaltjahr) entspricht sie aber 366 Tagen.
Beispiel: P0Y1M0DT0H0M0S
entspricht ausgehend vom 1.1.2015 31 Tagen;
ausgehend vom 1.2.2015 aber nur 28 Tagen.
Die Behandlung von Durations im Code ist an vielen Stellen noch unsauber (z.B. in L10nTimespanFormat.nrx, welches auch zum Formatieren von Durations benutzt wird; oder im DurationType.nrx selbst). Oft wird die Duration einfach in eine feste Zeitspanne umgewandelt, ausgehend vom Date(0)/Epoch-Datum ohne zu berücksichtigen, dass ggf. ein anderes Referenzdatum benutzt werden müsste. |
Schemapflege / Datenbankupdates
Einige Schemaänderungen können automatisch vom Schemagenerator verarbeitet werden. Ist das nicht der Fall, können die Änderungen per Datenbank Update-Script durchgeführt werden. FIXME TODO (Teile) der Schema-HowTo Datei hier einpflegen.
Liste der durch den UpdateHandler zur Verfügung gestellten Hilfsmethoden
Name | Parameter | Beschreibung | Beispielafuruf |
---|---|---|---|
checkTableExists |
Tabellenname |
Prüft, ob die Tabelle mit dem übergebenen Namen in der Datenbank existiert. Gibt einen boolschen Wert zurück. |
checkTableExists('beleg') |
checkColumnExists |
table: Tabellenname, column: Spaltenname |
Prüft, ob eine Spalte mit dem übergebenen Namen in der angegebenen Tabelle in der Datenbank existiert. Gibt einen boolschen Wert zurück. |
checkColumnExists(table: 'beleg', column: 'belegnr') |
Coredata-Generator
vgl. de/ipcon/schema/generators/CoreData.nrx und Klassen in de/ipcon/schema/generators/coredata |
Füllt die Datenbank mit grundlegenden, benötigten Daten/Objekten:
-
Füllt die BOT-Liste für alle Entities
-
Legt Admin-Benutzer und Admins-Gruppe an
-
Legt Sammelordner für Automatik-Objekte an (wobei diese im Normalfall direkt wieder gelöscht werden, da mittlerweile alle Entities explizit einen - anderen - Ordner angegeben haben sollten, und diese deshalb leer bleiben)
-
Legt Standard-Druckziele an
-
Erzeugt ein Standard-Formular für jede Entity
-
Erzeugt eine Standard-Schablone für jede nicht-abstrakte Entity
-
Erzeugt ein Standard-Lesezeichen für jede persistente Entity
-
Erzeugt Standard-Reports (Einzel und Liste) für jede Entity
-
Lädt und erzeugt zusätzliche, vorgebaute Strukturelemente
-
Löscht nicht mehr benutzte Automatik-Strukturelemente (also solche von mittlerweile wieder aus dem Schema entfernten Entities) und leere Ordner
Zusätzliche, vorgebaute Strukturelemente
Neben den automatisch erzeugten Strukturelementen können auch zusätzliche, vorgebaute Formulare, Schablonen und Lesezeichen automatisch in die Datenbank eingespielt werden. Diese müssen in Verzeichnis de/ipcon/db/core/resources abgelegt werden. Das Format und die Benamsung entspricht dem Format und der Benamsung der mittels Formularsynchronisation (siehe Nutzerdoku) exportierten Dateien, d.h. exportierte Dateien können direkt übernommen werden.
Beim Bauen von MyTISM-Kernel.jar werden die Dateien zusammengesucht und in eine Liste ("ResourceIndex") eingetragen und in das Jar aufgenommen. Beim Aufruf des Coredata-Generators wird diese Liste ausgelesen, die entsprechenden Dateien/Definitionen werden aus dem Jar geladen und die entsprechenden Objekte in der DB angelegt bzw. aktualisiert. Die Dateinamen sind übrigens frei wählbar, lediglich die Endung muss passend zum Typ der enthaltenen Daten sein (*.tpl.xml = Schablone, *.frm.xml = Formular, *.bkm.xml = Lesezeichen).
Folgende Angaben werden z.Zt. unterstützt:
- <Root-Element>
-
Der Name des Root-Elements gibt den Typ der Daten an, also "Formular", "Schablone" oder "Lesezeichen"
- Name
-
"Name"-Attribut des Root-Elements setzt den Namen des Objekts - an sich frei wählbar, Konvention aber "<Entityname> (Vorgebaut)" oder "<Entityname> (Vorgebaut; <Kommentar>)" wenn es mehrere Versionen gibt.
- ElterPfad
-
"ElterPfad"-Attribut des Root-Elements gibt den Ordner an, in dem das Objekt abgelegt werden soll; durch "/" getrennte Ordner-Namen, sollte einer der Ordner (noch) nicht existieren, wird er automatisch angelegt.
- Prioritaet
-
"Prioritaet"-Attribut des Root-Elements gibt die zuzuweisende Priorität an (je größer desto eher wird das Objekt benutzt); sollte im Allgemeinen aber nicht benutzt werden, es wird automatisch der Standard (-50, gegenüber -100 für Automatik-Strukturelemente) gesetzt.
- Tid
-
"Tid"-Attribut des Root-Elements gibt den zu benutzenden Tid-Code ("Klartext-Identifier") an; sollte im Allgemeinen aber nicht benutzt werden, es wird automatisch ein konsistenter Tid vergeben.
- Beschreibung
-
Eigenes Kind-Element des Root-Elementes; der Text wird als Beschreibung des Objektes benutzt.
- BOTyp
-
Eigenes Kind-Element des Root-Elements; sein "Name"-Attribut gibt an, Objekte welchen Typs mit diesem Strukturelement bearbeitet bzw. angezeigt werden sollen.
- Parameter
-
Eigenes Kind-Element des Root-Elements; sein Text wird als "Parameter"-Wert für das Strukturelement verwendet und enthält die weitergehende Definition, insb. für Formulare.
- Formular
-
(Nur für Schablonen) Eigenes Kind-Element des Root-Elements; sein "Name"-Attribut gibt an, welches Formular von der Schablone für die Bearbeitung des neuen Objekts benutzt werden soll.
- Gruppen, Polymorphic
-
Diese Elemente/Attribute werden z.Zt. noch nicht berücksichtigt. Alle Strukturelemente werden automatisch initial (nur) der Admins-Gruppe zugewiesen.
Beispiel für vorgebautes Formular (weitere finden sich im oben erwähnten Verzeichnis):
<Formular Name="$R{_Benutzer} (Vorgebaut)" ElterPfad="/Admins/MyTISM/Benutzerverwaltung"> <Beschreibung>Vorgebautes, aufgeräumteres Benutzer-Formular, mit Gruppierungen der Alarm- und Benachrichtigungsinfos und einfacherer, halbautomatischer Benachrichtigungskonfiguration.</Beschreibung> <Parameter> <TabbedView tabPlacement="TOP"> <!-- ... mehr Definition ... --> </TabbedView> </Parameter> <BOTyp Name="Benutzer"/> <Gruppen> <Gruppe Name="RG_Solstice_Login"/> </Gruppen> </Formular>
Für spezifische Projekte gibt es (ausser der manuellen Synchronisation) z.Zt. noch keinen entsprechenden Mechanismus, um projektspezifische Strukturelemente automatisch zu laden. Bei Bedarf ließe sich das aber entsprechend ergänzen.
Wenn ein vorgebautes Strukturelement geändert wurde oder neu hinzugekommen ist, muss vor dem Start des Servers die Datei .checked-initialdata gelöscht werden, damit die Änderungen wirksam werden (in Zukunft wird das wohl automatisch geschehen). |
Sprachunterstützung und Internationalisierung
Einführung
MyTISM bietet eine durchgehende Unterstützung für verschiedene Locales, sowohl für die Übersetzung von Texten und Namen als auch für Ein- und Ausgabe von Zahlen, Daten, etc.
Wo wird Mehrsprachigkeit unterstützt und wie benutze ich sie?
Neben der direkten Benutzung in Programmcode mittels der Methoden L10n.msg() bzw. L10n.applyL10n() gibt es weitere Stellen an denen die Mehrsprachigkeit unterstützt wird.
Im GUI-Client Solstice, an vom Benutzer bearbeitbaren Stellen:
-
In den Benutzer-Login-Scripten.
-
In den XML-Definitionen für Plugins in den Benutzer-Voreinstellungen.
-
In den XML-Definitionen für Defaults in Benutzer-Voreinstellungen.
-
In Report-Definitionen und in den Parametern von Formularen, Schablonen und Lesezeichen.
Im GUI-Client Solstice, interne Funktionalität:
-
Ausgabe von Name und ElterPfad von Benannts im Navigationsbaum bzw. in PolymorphicTemplateSelectionTreeModel.
In diesen "Texten" können Platzhalter $R{key}
eingefügt werden. Diese
werden dann automatisch vor der "Benutzung" durch zum aktuellen Locale
passende Texte ersetzt.
Wie wird die konkrete Zeichenkette für einen Schlüssel gefunden?
L10nPackProviderI (z.Zt. de/ipcon/tools/L10n und de/ipcon/db/AbstractClient) halten benannte L10nPacks bereit, welche die diversen Textbausteine in unterschiedlichen Sprachen enthalten, gruppiert mittels entsprechender Schlüssel für jeden Textbaustein.
Beim Auflösen von $R{key}
-Platzhaltern z.B. im Formularcode (und
ebenso beim direkten Aufruf der L10n.msg()-Methoden) wird eine - je nach
Aufrufart bzw. -ort unterschiedliche, und bei den im vorherigen
Abschnitt aufgeführten Stellen, automatisch zusammengestellte - Liste
der an dieser Stelle beteiligten bzw. relevanten Objekte übergeben (Z.B.
für Formulare das Formular-Objekt selbst).
Mittels dieser übergebenen Objekte wird nun eine Liste von relevanten L10nPacks erstellt, in denen mittels des Schlüssels "key" nach den angeforderten Textbausteinen gesucht wird. Wird ein zum Schlüssel passender Textbaustein gefunden, wird seine zur gewünschten Sprache passende Version zurückgeliefert.
Schlüsselnamen dürfen nur Buchstaben, Zahlen, '_', '-', '.', '~' und '/' enthalten. |
Welche L10nPacks gibt es und wie sind diese organisiert? Wie wird bestimmt, welche L10nPacks nach Texten durchsucht werden?
Die Benamsung bzw. Hierarchie der L10nPacks folgt in der Regel der Klassen- bzw. Paketstruktur der Java-Klassen. In den meisten Fällen bestimmen die Java-Klassen der beteiligten Objekte und die Java-Pakete denen diese angehören die zu durchsuchenden L10nPacks.
L10nPack-Namen dürfen nur Buchstaben, Zahlen, '_', '-' und '.' enthalten, wobei '.' das Trennzeichen zum Aufsplitten der Namen ist. |
Beispiel: Ein Objekt der Klasse "de.ipcon.form.FText" will den Textbaustein mit Schlüssel "eineNachricht" in der aktuellen Sprache ausgeben. In diesem Fall werden - sofern vorhanden - die L10nPacks "de.ipcon.form.FText", "de.ipcon.form.FPanel" (FText leitet sich von FPanel ab), "de.ipcon.form", "de.ipcon" und "de" in dieser Reihenfolge nach einer zum Schlüssel passenden Version des Textes durchsucht.
Web
Abweichend hiervon ist in Grails und Cauldron aktuell historisch bedingt noch eine andere Namensgebung üblich und es gibt kein eigentliches Mapping mit Automatismen für Klassen oder Entitäten.
In Grails gibt es oft nur ein einzelnes Bundle Grails
, das aber auch aufgeteilt werden kann.
Die Namensgebung lautet dann bspw. Grails.checkout
oder Grails.user.settings
.
In Cauldron besteht hier prinzipiell freie Namenswahl, neue Projekte sollten sich aber ebenfalls an das Paketnamensschema halten.
Welches sind die "beteiligten bzw. relevanten Objekte"?
Dies ist unterschiedlich und hängt davon ab, wo und wie die L10n-Funktionalität genutzt wird, z.B.:
-
Beim direkten Aufruf von L10n.msg() wird normalerweise automatisch die aufrufende Klasse ermittelt und als das (einzige) beteiligte Objekt übergeben.
-
Bei Benutzung von
$R{key}
-Platzhaltern im Parameter von Formularen, etc. wird die Klasse des im Formular, der Schablone oder im Lesezeichen dargestellten BOs sowie die Klasse des Strukturelements (Formular.class, etc.) selbst übergeben.
Im Normalfall wird die Liste der L10nPacks für eine Klasse einfach nach der im vorherigen Abschnitt beschriebenen Methode (Klassen + Pakete) erstellt. Ist für eine Klasse aber ein sog. L10nPathCompilerI beim L10n registriert, so bestimmt dieser, welche L10nPacks für die entsprechende Klasse in die Liste aufgenommen werden (siehe z.B. "FormularPathCompiler" in Formular.nrx).
Genauere Informationen finden sich bei den entsprechenden Aufrufen von L10n.applyL10n() bzw. L10n.msg() (bei letzterem nur selten, da dort fast nie ein expliziter "path" übergeben wird und fast immer die oben erwähnte Automatik benutzt wird) im Quellcode von MyTISM. L10n.compilePath() enthält weitere Informationen darüber, wie die Liste der zu durchsuchenden L10nPacks zusammengestellt wird.
Wo kommen die (Daten der) L10nPacks her?
Die Texte/Daten für die L10nPacks werden z.Zt. aus zwei Quellen gezogen. Die L10n-Klasse lädt ihre Daten aus Dateien …/resources/*.properties die in den Quellcode-Verzeichnissen liegen und beim Bauen ebenfalls in die JARs eingebunden werden. Daneben lädt der Server noch die in der Datenbank befindlichen L10nBundles in seinen L10nCache.
Die Texte der *.properties-Dateien werden alle "von Hand" angelegt und bearbeitet. Die L10nBundles, etc. werden teilweise automatisch generiert, können aber auch von Hand angelegt und bearbeitet werden.
Für jede im Schema definierte Entität, Beispiel "de.ipcon.db.core.Benannt", werden einige L10n-Daten automatisch angelegt und "gewartet". Diese sind im Beispiel zuerst das L10nBundle "de.ipcon.db.core" mit den L10nResourcen "_Benannt" sowie "_Benannt-s" (Name/Singular und Plural der Entität), L10nResources für die Ordner, also hier "Interna" (FIXME ggf. weitere) sowie L10nResources für jedes Attribut der Entität also hier "Name", "Beschreibung" usw.
Desweiteren wird für jede Entität noch ein eigenes Bundle, im Beispiel "de.ipcon.db.core.Benannt", angelegt und dort werden ebenfalls noch einmal wie oben für alle Attribute L10nResources angelegt.
Diese L10nBundles, bzw. deren L10nEntries und L10nResources, werden bei jedem Serverstart überprüft, ob Entitäten oder Attribute hinzugekommen sind - diese werden dann automatisch angelegt - bzw. weggefallen sind - dort werden dann für weggefallene Attribute automatisch entsprechende, ehemals gebrauchte L10nEntries und L10nResources entfernt.
In neueren Projekten werden Daten aus
nrx/[…Projektverzeichnis…]/resources/l10n/[…Projekt-Package…].bo_[ISO-Kürzel]
automatisch importiert. In diesen, von Hand angelegten Dateien, dürfen
(bzw. zumindest sollten) sich nur Schlüssel-Text-Paare für im Schema
definierte Entitäten und deren Attribute befinden. Ansonsten werden die
"überzähligen" Texte bei jedem Serverstart erst angelegt, und dann, da
es keine entsprechenden Entitäten bzw. Attribute (mehr) gibt, direkt
wieder gelöscht.
"Freie" Texte (z.B. solche für Titel/Texte in Formularen) sollten -
selbst wenn sie im Prinzip nur für eine Entität benutzt werden - in
einem eigenen Paket
nrx/[…Projektverzeichnis…]/resources/l10n/[…Projekt-Package…]_[ISO-Kürzel]
untergebracht werden.
Genauere Informationen finden sich in L10nBundle.initEnvironment() und den dort benutzten Methoden.
Wichtige Klassen
- de.ipcon.tools.L10n
-
Die zentrale Klasse. Enthält u.A. die msg()-Methoden die zu einem gegebenen Key die zum gewünschten/aktuellen Locale passende Version der entsprechenden Zeichenkette liefern. Enthält auch diverse Methoden um Format-Objekte zum formatieren von Zahlen, Daten, etc. zu erhalten.
- de.ipcon.db.core.L10nBundle
-
Sammlung von L10nResources.
- de.ipcon.db.core.L10nResource
-
Entspricht grob einer Zeichenkette welche in unterschiedlichen Sprachen ausgegeben werden können soll. Hat einen oder mehrere L10nEntries.
- de.ipcon.db.core.L10nEntry
-
Konkrete Version der Zeichenkette für ein bestimmtes Locale (grob: eine Sprache).
Eingabe von L10n-Daten
FIXME Stichworte
neues Bundle anlegen (de.venice) bzw. in einem bestehenden Bundle (de.venice.bo) was hinzufuegen ⇒ schauen, dass das Bundle auch Preloaded wird und auch die PfadPos setzen (0). Wenn trotzdem ein neuer Eintrag nicht direkt gefunden wird, dann kann es noetig sein den Server durchzustarten. Das kann der Fall sein, wenn das Bundle erstmalig auf Preload und/oder PfadPos gesetzt wird.
Einfaches Hochkomma muss "escaped" werden ⇒ doppelt schreiben
$R-Tags in Formularen, etc.: Suche nach title=", label=", text=".
Die Formularengine des Solstice Clients
de.ipcon.form
Nachfolgende Dokumentation behandelt den Aufbau eines sogenannten Formulars im de.ipcon.form Package des MyTISM Frameworks. Sie soll den Entwickler in die Lage versetzen, Wünsche des Anwenders an die grafische Oberfläche umzusetzen. Im Gegensatz zu Web-Oberflächen sind diese für den Anwender viel effektiver und schneller bedienbar als die etwas generischeren und graphisch meist viel ansprechenderen, aber dennoch umständlich zu bedienenden Web-Oberflächen. Allerdings ist das Abstraktionsniveau im grafischen Client etwas geringer, um schneller zum Ergebnis zu kommen - manchmal ist es besser, den ein oder anderen Wunsch eines Anwenders zugunsten einer saubereren oder aber auch für eingeschränkte Benutzer (sei es technisch (niedrige Farbe, langsamer Rechner) oder auch körperlich (Farbenblindheit, Kurzsichtigkeit)) bedienbaren Lösung abzulehnen.
Hintergrund
Das Formularframework bzw. die Engine, die die Formulare aufbaut, hat zwei Ziele: Flexible Formulare und eine flexible Verwaltung dieser Formulare. Das HTML-Format bzw. dessen Vorgänger SGML bzw. XML haben mit ihrem Markup-Konzept einen entscheidenden Denkanstoß zur Entwicklung der jetzigen Implementation geliefert. Angereichert mit einer Meta-Ebene, die aus dem Datenbank-Backend MyTISM kommt und somit einen schnellen und effizienten Zugriff auf die Formulare gestattet sowie die Synchronisation der Formulare realisiert. Im folgenden werden die Objekte einzeln ausführlich vorgestellt, ihre Eigenschaften und ihre Verwendung dokumentiert. Alle Objekte außer den Lesezeichen haben die Eigenschaft, in bestimmten Kontexten als Auswahl zur Verfügung zu stehen, sei es, um ein neues Objekt zu erzeugen oder ein bestehendes anzuzeigen. Das Verfahren, diese Auswahl zu generieren, wird ebenfalls beschrieben.
Das Formular-Objekt
Das Formular-Objekt hat die Aufgabe, eine Eingabemaske für ein Objekt einer bestimmten BO-Klasse zu beschreiben. Das de.ipcon.form Package enthält die notwendigen Methoden, um eine solche Eingabemaske bestehend aus Oberflächenelementen wie Textfelder, Popuplisten und ähnlichem zu erzeugen und verwalten. Es stellt eigentlich das wichtigste und gleichzeitig das komplizierteste Objekt des Formularframeworks dar.
Eigenschaften
Das Formular-Objekt hat im wesentlichen folgende Eigenschaften:
-
Name: Eine klar abgrenzende Bezeichnung, die auch im Kontextmenu des jeweiligen Objektes erscheint.
-
Beschreibung: Eine etwas ausführlichere Beschreibung, durchaus als Platz für Bemerkungen wie den Verweis auf spezielle Versionen oder Spezifika. Sie wird dem Benutzer nicht in der GUI präsentiert und ist ausschließlich den Entwicklern vorbehalten.
-
Elter: Ein Verweis auf die ID des Strukturelements (meist ein Ordner oder eine Gruppe), unter dessen Repräsentation im Menubaum dieses Element absortiert wird. Wird gesetzt beim Drag’n’Drop im NavigationTree in der GUI.
-
IstAutomatik: Ein Wahrheitswert, der anzeigt, ob das Formular direkt aus dem Formulargenerator stammt. Falls Sie ein Formular abändern, achten Sie bitte darauf, daß dieser Wert false ist, sonst wird beim nächsten Schema-Update das Formular neu erstellt; der NavigationTree setzt es beim 'Move' dieses Flag automatisch auf false, um eine Fehlbedienung zu vermeiden.
-
Parameter: Hier steckt der Source des eigentlichen Formulars. Im folgenden wird der Inhalt dieser Eigenschaft ausführlich beschrieben.
-
BOTyp: Ein Verweis auf den Typ des BO (selbst natürlich ebenfalls ein BO), welches mit diesem Formular angezeigt werden kann. [fixme: Polymorphie?]
-
Gruppen: Ein Mehrfach-Verweis auf die Gruppen, die dieses Formular benutzen sollen.
-
Schablonen: Ein Mehrfach-Verweis auf die Schablonen-Objekte, die direkten Gebrauch von diesem Formular machen.
-
Priorität: ein 32bit signed Integer, der die Priorität des Formulars im Falle einer mehrfachen Auswahl von Formularen für ein Objekt festlegt und damit die Präferenz in diesem Fall festlegt.
Auswahl
Die Auswahl eines Formulars wird aufgrund folgender Regeln getroffen:
-
Zunächst werden alle passenden (gleicher BOTyp [fixme: Polymorphie]) Formulare erfragt, deren Priorität gesetzt ist und einer der eigenen Gruppen zugeordnet ist. Beim Benutzer Admin werden als Ausnahme auch diejenigen Formulare mit einbezogen, die keine Priorität haben (diese Mechanismus wird in einer der nächsten Versionen ausgebaut und ist damit als obsolet deklariert!).
-
Diese passenden Formulare werden der Priorität nach absteigend geordnet und dem Benutzer ggfs. per Kontextmenu zur Verfügung gestellt. Ein Doppelklick oder adäquate Aktion öffnet das nach dieser Sortierung am höchsten priorisierte Element. Die momentane Implementation ersetzt Formulare gleicher Priorität ohne eine deterministische (oder vielmehr eine dokumentierte Deterministik) oder vorhersehbare Präferenz. Daher bitte ich unbedingt auf eine klare Priorisierung zu achten. Der Zahlenraum der Priorität bietet genügend Spielraum: ca. -2 bis 2 Milliarden.
Definition
Fehler und Ursachen
Einige Fehler denen ich bei der MyTISM-Entwicklung schon begegnet sind und deren Ursachen bzw. Lösungsmöglichkeiten:
Compiler-Meldung "Object cannot be null"
BOs brauchen einen Konstruktor (ohne Argumente); es wird nicht automatisch einer gebaut oder der der Superklasse benutzt. BO-Klassen duerfen nicht "abstract" sein
bi-Tabelle kann nicht erstellt werden (nachdem die Datenbank gedropped und recreated wurde)
".checked*"-Dateien im Projektverzeichnis löschen.
Compiler-Meldung "Object bla is null but shouldn’t" (sic)
Beispiel: "Zustellversuch" hängt an "Sendeauftrag". Neuer Zustellversuch wurde angelegt, in Transaction included und an Sendeauftrag angehängt. Dumm nur: Sendeauftrag war nicht in Transaction included! FIXME: Hmm … das war aber wohl doch nicht das Problem :-(
Synchronisation der Strukturelemente
Das Formular "DateiSystemSync"
Das Benutzerhandbuch enthält bereits einen Abschnitt zu diesem Thema; ggf. sollten diese zusammengeführt werden.
FIXME! (werde später noch ein bisschen was dazu schreiben - sw) - anhand was wird rein- bzw. rausgesynct - Konventionen Dateiname - wofuer Tid - …
Volltextsuche
Konfiguration im Schema
Berücksichtigte Daten
Standardmässig werden, mit wenigen Aussnahmen, die BOs aller Entitäten für die Volltextsuche aufbereitet. Von diesen BOs werden standardmässig die Inhalte alle Attribute, wiederum mit einigen Aussnahmen, in den Suchindex aufgenommen.
Berücksichtigte Entitäten
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.isEntityIgnored() |
Explizit immer ausgeschlossen werden die BOs nicht persistenter
Entitäten, sowie die BOs der Entiäten BT
, BP
und BX
.
Durch explizite Angabe von indexed="no"
im Schema ist es möglich,
weitere Entitäten von der Indexierung auszunehmen.
Beispiel:
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten"> <fulltext indexed="no"/> <attr name="KryptischerString"/> </Entity>
FIXME Infos zum "Cascading", (Nicht-)Indexierung von Unterklassen
Berücksichtigte Attribute
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.isAttributeIgnored() |
Standardmässig ausgeschlossen werden die Daten von
-
Relationen-Attributen (sowohl Single als auch Many)
-
Attributen mit (Java-)Typ
Boolean
,Date
oderNumber
-
virtuelle Attribute
Durch explizite Angabe im Schema ist es jedoch möglich, entsprechende Attribute von bestimmten Entitäten doch in den Index aufzunehmen. Andererseits können auch normalerweise indexierte Attribute explizit von der Indexierung ausgenommen werden.
Beispiel:
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten"> <attr name="Name"> <attr name="InteressantesDatum" type="DateTime"> <fulltext indexed="yes"/> </attr> <attr name="KryptischerString"> <fulltext indexed="no"/> </attr> </Entity>
Wird für Relationen-Attribute (sowohl Single- als auch Many-Relationen)
indexed="yes"
angegeben, ist das Resultat, dass Objekte der
"Elter"-Klasse (die, die das Relationen-Attribut enthält) auch als
Suchtreffer gefunden werden, wenn ein Suchbegriff "nur" auf eines der
"Kind"-Objekte (die in der Relation enthaltenen Objekte) zutrifft.
Beispiel:
<Entity name="Elter" extends="BO" plural="Eltern"> <attr name="Name"> <attr name="Kinder" type="Kind" relation="1-n"> <fulltext indexed="yes"/> </attr> </Entity> <Entity name="Kind" extends="BO" plural="Kinder"> <attr name="Name"> </Entity>
Es existiert ein Elter "Elter1" mit Kindern "Kind1" und "Kind2". Wird jetzt z.B. im "Eltern"-Lesezeichen nach "Kind1" gesucht, so wird das Objekt "Elter1" als Ergebnis geliefert, obwohl der Suchbegriff "Kind1" eigentlich nur in einem der "Kinder"-Objekte vorkommt.
Weitere Einstellungen im Schema
analyzed
vgl. de/ipcon/db/fulltext/compass/SchemaMappingBuilder.buildScalarConfig() sowie das entsprechende Kapitel in der Compass-Dokumentation |
Für einzelne Attribute kann im Schema definiert werden, ob die entsprechenden Inhalte bei der Indexierung "analysiert" werden sollen oder nicht.
Ein Text wie "Dies ist ein Attributwert" wird normalerweise nicht in dieser Form im Index abgelegt, sondern in seine einzelnen Bestandteile (normalerweise "Wörter", d.h. durch Whitespace abgetrennte Tokens) aufgeteilt. Auch werden einige sehr häufig vorkommende Wörter (sog. "Stopwords") entfernt.
Durch diese Behandlung ist es möglich, dass bei der Suche nach z.B. "Dies" das Objekt mit dem obigen Attributwert gefunden wird.
Wäre der Wert nicht "analysiert" worden, so wäre nur die gesamte Zeichenkette genau in dieser Form im Index abgelegt und das Objekt würde nur bei Eingabe genau von "Dies ist ein Attributwert" (oder ggf. noch bei Benutzung von Platzhaltern oder Ähnlichkeitssuche) gefunden, nicht aber nur bei Eingabe von "Dies".
Standardmässig werden alle Attribute mit (Java-)Typ String
"analysiert"; alle anderen Attribute (insb. z.B. Zahlen) nicht. Im
Normalfall ist diese Einstellung wohl sinnig; in Einzelfällen (z.B.
vielleicht wenn es sich um eine Bezeichnung handelt, die nur genau in
der eingegebenen Form gefunden werden soll) kann das Verhalten aber
durch eine explizite Angabe beim Attribut geändert werden.
Beispiel:
<Entity name="InterneEntitaet" extends="BO" plural="InterneEntitaeten"> <attr name="Name"> <attr name="Typenbezeichnung"> <fulltext analyzed="no"/> </attr> </Entity>
boost
Sowohl für Entitäten als auch für einzelne Attribute kann ein "Boost"-Wert im Schema angegeben werden. Dieser dient dazu, einen Treffer für die entsprechende Entität oder das entsprechende Attribut höher oder niedriger zu bewerten und damit im Ranking der Suchergebnisse weiter nach vorne oder hinten zu plazieren. Da jedoch z.Zt. in MyTISM kein Ranking von Suchergebnissen benutzt wird, ist die Angabe dieses Wertes z.Zt. weder erforderlich noch sinnvoll. :toc: left :toc-title: Inhaltsverzeichnis :toclevels: 2 :icons: font
Formularelemente
Action
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: z. B. |
|
|
siehe |
|
|
Boolean: true, false |
Während die Action ausgeführt wird, eine Ladeanimation über das Formular legen. |
|
String |
Funktionsname, der z. B. von Buttons gerufen werden kann. |
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
String: icon="20x20/New.gif" |
Pfad zum gewünschten icon. |
|
Boolean: true, false |
|
|
String |
|
|
Boolean: true, false |
|
|
||
|
String |
Name der Action. Optional - wenn nicht angegeben, gleich |
|
Boolean: true, false |
Action in neuem Thread ausführen. |
|
int: 0 |
|
|
int: 1000 |
|
|
Boolean: true, false |
|
|
Kurze Beschreibung. Wird als Tooltip angezeigt. |
|
|
Boolean: true, false |
Den Namen der Action unterhalb eines ggf. vorhandenen Icons anzeigen. |
|
||
|
Leerer String. Bsp.: toolBar="" |
Wird hinzugefügt, falls die Action in der Standard-ToolBar neben einer Table bzw. im Falle von topMdiOnly in der "obersten" Toolbar erscheinen soll. |
|
Boolean: true, false |
Bei |
availableOn
Liefert ein hier angegebenes Skript true
zurück, wird die Action angezeigt, bei false
nicht.
Die Bedingung für availableOn wird nur einmal und dann sehr früh evaluiert (bei der Entscheidung ob die Komponente überhaupt gebaut werden soll)
|
enabledOn
Die Action ist die ganze Zeit sichtbar und jenachdem ob ein hier angegebenes Skript true
oder false
zurückliefert, kann die Action angeklickt werden bzw. is ausgegraut.
enabledOn wird laufend, d.h. bei jedem Statuswechsel, evaluiert (nicht wie bei availableOn ).
|
longDescription
Wenn man mal mehr (formatierten) Text zur Erklärung der Action anzeigen möchte (auch HTML ist möglich):
<Action cmd="resetData" name="Daten resetten" shortDescription="Daten zuruecksetzen" toolBar="" accKey="control R">
<onAction language="groovy">rootBO.doMagic()</onAction>
<longDescription><![CDATA[<html>
Folgende Voraussetzungen müssen erfüllt sein, damit die Daten der selektierten Zeilen zurückgesetzt werden können:
<ul>
<li>Der Benutzer ist Mitglied der "Verwaltung" oder ein ADMIN</li>
<li>Es ist mindestens eine Zeile ausgewählt</li>
</ul>
</html>]]></longDescription>
</Action>
onAction
Hier wird das Script definiert, welches für die jeweilige Action
ablaufen soll.
BooleanInputComponent
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
||
|
siehe |
|
|
||
|
||
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
||
|
Boolean: true, false |
Wenn hier true gesetzt ist, kann das Element drei Zustände annehmen: true, false und null. Ansonsten nur true und false. |
|
Border
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
|
Abschrägung. |
|
|
|
|
||
|
||
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
Hervorhebung. Muss immer zusammen mit |
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
Schattierung. Muss immer zusammen mit |
|
String: |
Begrenzung als Vertiefung oder Erhöhung darstellen. |
|
Boolean: true, false |
|
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
||
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Boolean: true, false |
|
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: |
|
|
String: |
|
|
String |
Überschrift für die durch die Border abgegrenzten Inhalte. |
|
||
|
||
|
String: |
|
|
String: |
|
|
||
|
||
|
Button
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
Boolean: true, false |
|
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
|
|
||
|
String: icon="20x20/New.gif" |
Pfad zum gewünschten icon. |
|
Integer (750ms) |
Spezifiziert innerhalb welchen Zeitraums mehrfaches Klicken des Buttons als ein einfaches Klicken interpretiert wird |
|
String |
Beschriftung des Buttons. |
|
String: TOP, CENTER, BOTTOM, z. B. vAlign="TOP" |
Bestimmt die vertikale Ausrichtung des Textes innerhalb des Elements. Die Höhe des Elements muss größer sein als eine normale Zeilenhöhe, was z. B. durch Setzen des Attributs prefSize erreicht werden kann. |
Canvas
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String. |
Text, der angezeigt wird, wenn man den Mauszeiger über das Element hält. |
Chart
Komponente zur Darstellung von Diagrammen in Formularen. Die zugrundeliegende Bibliothek ist "JFreeChart".
Derzeit werden von unserer direkten Implementierung folgende Diagramme unterstützt:
-
timeSeriesChart
-
stackedXYAreaChart
-
scatterPlot
-
xYAreaChart
-
xYLineChart
-
xYStepAreaChart
-
xYStepChart
Darüber hinaus kennt JFreeChart noch einige andere Diagramme (z.B. Torten-Diagramme).
Über das Kontextmenü stehen weitere Funktionen wie Export als Bild, Drucken, Einstellungsmöglichkeiten, etc zur Verfügung.

Beispiel unter Verwendung unserer direkten Implementierung:
Das folgende Beispiel dient der Erklärung des Aufbaus. Es werden die ZeiterfassungsEinträge eines Mitarbeiters dargestellt, mit der jeweiligen Anwesenheitsdauer in y-Richtung.
Der JFreeChartBuilder wird als builder
an das buildScript übergeben. Über diesen können dann die verschiedenen Diagramme gezeichnet werden.
Innerhalb der Closure steht das anchor
-Objekt zur Verfügung, welches das im Formular geöffnete BO referenziert.

<Chart>
<buildScript><![CDATA[
builder.xYLineChart(title:'oneTitle', xAxisLabel:"EK", yAxisLabel:'VK') {
def zes = anchor.ZeiterfassungsEintraege
antiAlias=true
borderVisible=false
borderPaint='#c0c0c0'
plot {
tableXYDataset() {
rows = {
(0..zes.size()-1).each{ it }
}
x = {
it
}
series(name: anchor.kontakt.describe()) {
values = {
zes.values().getAt(it).Anwesenheitsdauer
}
stroke = 2
paint = '#4c1e67'
}
}
}
}
]]></buildScript>
</Chart>
Beispiel der generischen Verwendung (Prüfserie hat Einzelprüfungen mit deren Messwerten):
<Chart>
<buildScript><![CDATA[
import org.jfree.chart.ChartFactory
import org.jfree.chart.ChartPanel
import org.jfree.chart.JFreeChart
import org.jfree.chart.plot.PlotOrientation
import org.jfree.data.category.DefaultCategoryDataset
def pserie = builder.anchor
// dataset definieren
def dataset = new DefaultCategoryDataset()
pserie.getEinzelpruefungen().values().sort{ it.getPosition() }.each{
dataset.addValue(it.getFeinheitNm(), 'FeinheitNm', it.getPosition())
dataset.addValue(it.getElastizitaet(), 'Elastizitaet', it.getPosition())
dataset.addValue(it.getHeissluftschrumpfS130(), 'HLS130', it.getPosition())
}
// Chart generieren
JFreeChart chart = ChartFactory.createLineChart(
'Messwerte der Einzelpruefungen',
'Position','Skala',
dataset,
PlotOrientation.VERTICAL,
true, true, false)
return chart
]]></buildScript>
</Chart>
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
||
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
CheckBox
Die Checkbox kann benutzt werden, um Boolean-Werte zu beeinflussen.
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
||
|
||
|
siehe |
|
|
Boolean: true, false |
false verhindert das Editieren des Feldes. Das Feld WIRD NICHT ausgegraut. |
|
||
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
String |
Text, der zusätzlich hinter der Checkbox angezeigt wird. |
|
Boolean: true, false |
Wenn hier true gesetzt ist, kann das Element drei Zustände annehmen: true, false und null. Ansonsten nur true und false. Wenn false, kann Null nicht mehr ausgewählt werden. Kann durch eine Angabe im Schema bereits definiert werden. |
ComboBox
Die API-Dokumentation enthält ebenfalls weitere Informationen zu dieser Komponente. |
Wie in dem Bereich über Widgets bereits gezeigt, kann eine ComboBox direkt auf ein property zeigen, woraufhin alle möglichen BOs angezeigt werden.
Beispiel:
Will man programmatisch eigene Auswahlmöglichkeiten anbieten kann man das über das choiceSkript machen:
...
<ComboBox property="FilterZeitraum" e-label="$R{Zeitraum}" chooseOnly="true" nullable="false">
<choiceScript>
model.addEntry("2Tage", "letzten 2 Tage")
model.addEntry("7Tage", "letzten 7 Tage")
model.addEntry("30Tage", "letzten 30 Tage")
model.addEntry("60Tage", "letzten 60 Tage")
model.addEntry("100Tage", "letzten 100 Tage")
model.addEntry("HalbesJahr", "letztes halbes Jahr")
model.addEntry("LetztesJahr", "letztes Jahr")
model.addEntry("Alle", "Alle")
</choiceScript>
</ComboBox>
...
Attribute
Name |
Erlaubte Werte | Beschreibung |
---|---|---|
|
String: first/last/firstNonNull |
Gibt an welches Element als default ausgewählt werden soll. |
|
Boolean: true, false |
Wenn true, dürfen keine eigenen Werte in das Feld eingetragen werden. |
|
siehe |
|
|
siehe |
|
|
String (CBOFormat). |
Legt fest, wie das BO für die Anzeige im Dropdown-Menü und im Feld formatiert ist. Bsp: "Id': 'Name" |
|
Boolean: true, false |
Wenn false wird null nicht als mögliche Auswahl angeboten. |
|
String |
Wird angezeigt, wenn nichts ausgewählt wurde. Gilt sowohl für das Feld als auch für den Eintrag im Dropdown-Menü, der den leeren Wert repräsentiert. |
|
||
|
||
|
String |
Name der Entität, deren Objekte hier zur Auswahl angeboten werden sollen. |
|
String |
Name der Relation, aus der Objekte zur Auswahl angeboten werden sollen. |
|
String |
Name des Attributes, nach dem sortiert werden soll. |
|
String (OQL) |
Optionaler Filter für im Attribut |
|
Boolean: true, false |
Wenn true, wird die Id jedes (BO-)Elements in eckigen Klammern hinter dem Element angezeigt. |
|
Boolean: true, false |
Wenn true, werden für Comboboxen, die keine Relation anzeigen, Duplikate in der Auswahlliste verhindert, indem die Id jedes (BO-)Elements in eckigen Klammern hinter dem Element angezeigt wird, sofern Duplikate auftreten. |
DateChooser
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
||
|
||
|
||
|
siehe |
|
|
siehe |
|
|
Boolean: true, false |
false verhindert das Editieren des Feldes. Das Feld WIRD NICHT ausgegraut. |
|
Boolean: true, false |
|
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
String: |
Bestimmt die Formatierung des angezeigten Datums. Beispiele:
|
|
Boolean: true, false |
|
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können. |
|
Integer mit Einheit px, c, em oder dlu |
Die Angabe in Character "c" ist die zu favorisierende Bestimmt die Höhe des Fensters, in dem der Kalender zur Datumsauswahl angezeigt wird. |
|
Integer mit Einheit px, c, em oder dlu |
Die Angabe in Character "c" ist die zu favorisierende Bestimmt die Breite des Fensters, in dem der Kalender zur Datumsauswahl angezeigt wird. |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
Boolean: true, *false* |
Wenn das Form-Element den Fokus bekommt wird der gesamte Inhalt selektiert |
Editor
Der Editor kann für String-Attribute angezeigt werden. Durch die Angabe des Modus kann die Darstellungsart beeinflusst werden. Es werden dazu intern JEdit-Klassen benutzt.
Beispiel:
...
<Editor property="Bemerkung" mode="patch"/>
...
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
int: 60 |
Gibt an wieviele Spalten angezeigt werden sollen. |
|
int: 3 |
Wird der Cursor an eine bestimmte Stelle bewegt, wird sichergestellt, dass x Zeilen über & unter der Position angezeigt werden. |
|
Boolean: true, false |
Ist focusable false, kann das Textfeld nicht fokussiert werden… |
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
int: 500 |
Gibt die Anzahl der gespeicherten Schritte und damit der möglichen Undos an |
|
String: xml, groovy, log, patch |
Definiert die Formatierung des Editor-Fensters. |
|
int: 10 |
Gibt an wieviele Zeilen angezeigt werden sollen. |
|
String |
Füllt das Attribut automatisch mit dem eingegebenen Text |
Element
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
siehe |
|
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
Boolean: true, false |
Bei true wird das eingebettete GUI-Element nicht angezeigt, wenn das BO des angegebenen Attributs null ist, ansonsten ist es ausgegraut.
Das ist nützlich im Fall von Attributketten, z.Bsp. bei |
|
Double -1 |
Was soll mit dem restlichen Platz von rightFill geschehen, sofern != 0 (default: FView.defaultCellHAlign); Beispiel: siehe ipcon/db/core/Report.nrx Beschriftung, die vor dem Inhalt des Element Tags angezeigt wird. |
|
String |
Beschriftung, die vor dem Inhalt des Element Tags angezeigt wird. |
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Bestimmt die Hintergrundfarbe des Labels. |
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
Bestimmt die Schriftfarbe des Labes. |
|
String: |
|
|
Boolean: true, false |
|
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. Nähere Informationen hierzu im GUI-Kochbuch |
|
||
|
||
|
||
|
||
|
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: |
|
|
||
|
||
|
||
|
Boolean: true, false |
false verhindert das Editieren des Feldes. Das Feld WIRD ausgegraut. |
|
siehe |
|
|
siehe |
|
|
Boolean: true, false |
false verhindert das Editieren des Feldes. Das Feld WIRD NICHT ausgegraut. |
|
||
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
|
||
|
||
|
Boolean: true, false |
Bricht Text an der rechten Kante um, statt eine Scrollbar anzuzeigen. |
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
||
|
Boolean: true, false |
Passwortfeld statt normalem Text. |
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
Alias. Siehe |
|
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
||
|
int: 4 |
|
|
Boolean: true, *false* |
Wenn das Form-Element den Fokus bekommt wird der gesamte Inhalt selektiert |
|
||
|
||
|
int: 4 |
|
|
||
|
Boolean: true, false |
Wenn Text umgebrochen wird, dann möglichst an Whitespace-Grenzen. |
Image
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
Boolean: true, false |
Label
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false, null |
Explizit synchrones oder asynchrones Verhalten erzwingen. Synchrones Verhalten ist hilfreich, falls das Label variierenden Platzbedarf hat. (Üblicherweise bei mehrzeiliger HTML-Ausgabe.) |
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
||
|
||
|
siehe |
|
|
siehe |
|
|
||
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
String (CBOFormat). Bsp.: |
Ermöglicht dynamisches Erzeugen des Labeltextes durch CBOFormat. Voraussetzung, um, wie im Beispiel, auf einen Attributswert zugreifen zu können, ist es, dass die Property gesetzt ist (siehe |
|
Farbangabe. Bsp: |
Hinterlegt das Label mit einem Farbverlauf von links nach rechts. Kann zusammen
mit |
|
String: |
Verlegt den Anfang des Farbverlaufs. |
|
Farbangabe. Bsp: |
Hinterlegt das Label mit einem Farbverlauf von rechts nach links. Kann zusammen
mit |
|
String: |
Verlegt das Ende des Farbverlaufs. |
|
String: |
Horizontale Ausrichtung. |
|
String: |
|
|
Boolean: true, false |
Erlaubt es, im |
|
String: icon="20x20/New.gif" |
Pfad zum gewünschten icon. Das icon erscheint vor dem in |
|
Bsp: |
Angabe des Abstandes zwischen dem Icon und Text (als Ganzzahl) |
|
Vier positive ganze Zahlen, getrennt durch Komma oder Leerzeichen, die den jeweiligen Abstand in Pixeln zum oberen, linken, unteren und rechten Rand spezifizieren: |
Außenabstand in Pixeln. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
String |
Text des Labels. Kann HTML beinhalten, wenn |
|
||
|
String. |
Text, der angezeigt wird, wenn man den Mauszeiger über das Element hält. |
|
String: TOP, CENTER, BOTTOM, z. B. vAlign="TOP" |
Bestimmt die vertikale Ausrichtung des Textes innerhalb des Elements. Die Höhe des Elements muss größer sein als eine normale Zeilenhöhe, was z. B. durch Setzen des Attributs prefSize erreicht werden kann. |
|
String: |
FPanel (abstrakt)
Superklasse für viele Elemente. Bringt die unten stehenden Attribute und Sub-Elemente mit.
Skriptvariablen
In den Skripten sind diese Bindings verfügbar:
Variablenname | Klasse/Interface | Definition | Beschreibung |
---|---|---|---|
|
ClientContextI |
ftx.getCtx() |
Client-weiter Kontext, wird z.Bsp. zum Öffnen von Dialogen oder Formularen benutzt |
|
Benutzer |
ftx.getCtx().getCurrentUser() |
der im Client angemeldete Benutzer |
|
FormContextI |
ftx |
Kontext des Formulars, in dem das FPanel eingesetzt ist. Wird gebraucht, um andere Formularelemente anzusprechen. |
|
BO |
ftx.getBO() |
Das zugrundeliegende BO des FPanels. (Kann vom rootBO abweichen) |
|
Transaction |
ftx.getRoot().getTransaction() |
Die Transaction, mit der das rootBO geladen wurde, wenn |
|
FormElementI |
fe |
Das FPanel (als FormElementI) |
|
BOLoaderI |
ftx.getRoot().getBOLoader() |
Der Loader, mit dem die Daten des Strukturelements geladen wurde. |
|
BO |
ftx.getRoot().getBO() |
Das zugrundeliegende BO des Formulars. |
Subelemente
onAfterSelectValue
Ermöglicht es, ein Skript zu definieren, das nach dem Setzen eines Werts ausgeführt wird.
<Text property="Beschreibung">
<onAfterSelectValue language="groovy">ftx['v_lbl_beschreibung_fehlt'].ftx.refreshForms()</onAfterSelectValue>
</Text>
Attribute
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: groovy, beanshell |
Die zu verwendende Skriptsprache. |
editableIf
Ergebnis des Ausdrucks (hier bo.kannEditiertWerden
) bestimmt, ob das Elternelement
editiert werden kann.
<Text property="Beschreibung">
<editableIf language="groovy">bo.kannEditiertWerden</editableIf>
</Text>
Attribute
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: groovy, beanshell |
Die zu verwendende Skriptsprache. |
visibleIf
Ergebnis des Ausdrucks (hier bo.istSichtbar
) bestimmt, ob das Elternelement
angezeigt wird.
<Text property="Beschreibung">
<visibleIf language="groovy">bo.istSichtbar</visibleIf>
</Text>
Attribute
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: Entitätsname |
Die Entität, an der das |
|
String: groovy, beanshell |
Die zu verwendende Skriptsprache. |
|
DEPRECATED |
siehe |
|
Boolean: true, false |
Wenn true, wird das Elternelement niemals angezeigt. |
|
||
|
||
|
||
|
OnDrop
OnDrop ist ein Tag, dass benutzt werden kann um Dateien zu behandeln die auf das Element gedropt wurden:
Beispiel:
<onDrop language="groovy">
def result = Datei.importFileFromDnD(ftx, tx, files, rootBO)
ftx.toast("${result.size()} Dateien importiert.")
ftx.getRoot().refreshForms()
</onDrop>
Attribute: FIXME
onFocusGained
Eventhandler. Wird beim Setzen des Eingabe-Focus auf das Elternelement ausgeführt.
<Text property="Beschreibung">
<onFocusGained language="groovy">ftx.toast('Das Textfeld "Beschreibung" hat jetzt den Fokus.')</onFocusGained>
</Text>
onFocusLost
Eventhandler. Wird ausgeführt, wenn das Elternelement den Fokus verliert.
<Text property="Beschreibung">
<onFocusLost language="groovy">ftx.toast('Tschüss!')</onFocusLost>
</Text>
onRefresh
Eventhandler. Wird beim Übertragen von Model-Daten in die View aufgerufen.
<Text property="Beschreibung">
<onRefresh language="groovy">ftx.toast('Lade Beschreibung.')</onRefresh>
</Text>
onSync
Eventhandler. Wird beim Übertragen von View-Daten ins Model aufgerufen.
<Text property="Beschreibung">
<onSync language="groovy">ftx.toast('Speichere Beschreibung.')</onSync>
</Text>
FInputPanel (abstrakt)
Leitet sich von FPanel ab.
Alle Komponenten, die einen Input erwarten leiten sich daraufhin von FInputPanel ab.
Zentralisiert die Mandatory-Berechnung, sodass alle Subklassen ein gleiches Verhalten besitzen.
Außerdem wird noch ein neues Skript-Tag - alsoMandatoryIf
- hinzugefügt.
alsoMandatoryIf
Kann benutzt werden um ein Eingabeelement zum Pflichtfeld zu machen.
<alsoMandatoryIf language="groovy">
ctx.currentUser.istMitgliedVon("Pflichtgruppe")
</alsoMandatoryIf>
Per default ist das angegebene Skript gecached (wird also nur beim Öffnen des Formulars ausgewertet), da man von komplexerem Code ausgegangen ist.
Möchte man aber, dass bei einem Refresh das Skript erneut evaluiert wird, kann man das Caching mittels cached="false"
deaktivieren.
<alsoMandatoryIf cached="false" language="groovy">
!rootBO.KundeWillDatenNichtNennen
</alsoMandatoryIf>
Falls das Schema vorgibt, dass ein Element mandatory ist, kann dies NICHT über alsoMandatoryIf ausgehebelt werden.
|
PDFViewer
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH Standard: #000000 |
|
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH Standard: FF0000 |
|
|
String: Helvetica-18 |
|
|
Boolean: true, false |
false = ein volatiles Bild wird direkt in den Grafik(karten)-Speicher geladen, was je nach Treiber(/Karte/System) länger dauern kann. true = ein gepuffertes (aber speicher-intensiveres) Bild wird in den Grafik(karten)-Speicher geladen. Diese Vorgehensweise ist mitunter unter Windows etwas schneller |
|
Boolean: true, false |
Unterdrückt die Anzeige des zugehörigen Labels |
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
||
|
||
|
||
|
||
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
Boolean: true, false |
|
|
Boolean: true, false |
Alias für |
|
Double: 0.05 |
Popup
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: |
|
|
Boolean: true, false |
Attribute in der Detailview eines Popup Elements sind normalerweise schreibgeschützt, d.h. Wert 'false'.
Grund ist, dass ein Popup mit Detailview oft allgemeinere Informationen im Formular anzeigt, das BO des Popups jedoch nicht nur von dem aktuellen Soll der Benutzer die Attribute des BOs ändern dürfen, jedoch das eigentliche BO nicht sehen können, dann ist eine Umsetzung über eine Attributkette in der property-Definition bzw. ein Wrapper- |
|
||
|
||
|
siehe |
|
|
||
|
||
|
||
|
siehe |
|
|
||
|
Boolean: true, false |
|
|
||
|
||
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
String (CBOFormat). |
Legt fest, wie das BO für die Anzeige im Feld formatiert ist. Bsp: "Id': 'Name" |
|
||
|
||
|
Boolean: true, false |
Definiert ob die Eingabe mit oder ohne Berücksichtigung der Gross-/Kleinschreibung gesucht werden soll |
|
String |
Komma-separierte Liste von Attributen/Attribut-Ketten, die bei der "Schnelleingabe" durchsucht werden sollen; bei einem eindeutigen Ergebnis wird automatisch selektiert |
|
||
|
Boolean: true, false |
|
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
||
|
||
|
String |
Tid des Formulars, das benutzt werden soll, um Objekte aus diesem Popup zu öffnen. |
|
||
|
||
|
Integer mit Einheit px, c, em oder dlu. Bsp.: popupHeight="40c" |
Die Höhe des resultierenden Popups. Wird keine Einheit angegeben, wird von einem px-Wert ausgegangen. |
|
Komma-separierte Integer mit Einheit px, c, em oder dlu. Bsp.: popupSize="960, 20c" |
Kurzform für |
|
Integer mit Einheit px, c, em oder dlu. Bsp.: popupWidth="40c" |
Die Breite des resultierenden Popups. Wird keine Einheit angegeben, wird von einem px-Wert ausgegangen. |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
Boolean: true, false |
|
|
Boolean: true, false. Bsp.: |
Bestimmt, ob im Feld ein Icon (Blatt mit Stern) angezeigt wird, das beim Anklicken ein neues Fenster zum Erstellen eines neuen Objektes für die jeweilige Relation öffnet. |
|
Boolean: true, false. Bsp.: |
Bestimmt, ob im Feld ein Icon (Blatt Papier) angezeigt wird, das beim Anklicken eine Tabelle bereits existierender Objekte öffnet, die für die Relation ausgewählt werden können. |
|
||
|
||
|
Tab
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
||
|
Boolean: true, false |
Bei false kann innerhalb dieses Elements kein Feld mehr editiert werden. |
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
Boolean: true, false |
|
|
||
|
Boolean: true, false |
Daten dieses Tabs erst beim Öffnen des Tabs laden, nicht schon beim Öffnen des Formulars. |
|
||
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
Boolean: true, false; Oder Richtungsbeschränkung, z. B. scrollable="VERTICAL_ONLY" |
Scrollbar für dieses Element ein- oder ausschalten bzw. auf eine Richtung beschränken. |
|
String |
Wird als Titel des Tabs angezeigt. |
|
String. |
Text, der angezeigt wird, wenn man den Mauszeiger über das Element hält. |
Subelemente:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
||
|
||
|
||
|
||
|
||
|
Wird ausgeführt, sobald der Tab aktiviert (angezeigt) wird |
|
|
Wird ausgeführt, sobald der Tab deaktiviert (versteckt) wird |
|
|
||
|
TabbedView
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
|
|
String: 'IGNORE', 'ASK' |
Gibt an, wie Konflikte beim Speichern durch veraltete BOs behandelt werden sollen.
Nur in der äussersten TabbedView / View erlaubt. |
|
||
|
Boolean: true, false |
Bei false kann innerhalb dieses Elements kein Feld mehr editiert werden. |
|
Integer mit Einheit px, c, em oder dlu |
Initiale Höhe der View in Pixeln oder der angegebenen Einheit. |
|
Boolean: true, false |
Nur für Formular-Roots. Änderungen aus lokalen Speichervorgängen im Client in diesem Formular nicht nachziehen |
|
||
|
||
|
||
|
Tupel: (horizontal, vertikal). Beispiele: maxSize="4c, 5c"; maxSize="4c,"; maxSize=",5c" |
|
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
Boolean: true, false |
Gibt an, ob bei tabPlacement |
|
||
|
String: |
Die Reiter der TabbedView unten, oben, links oder rechts anzeigen. |
|
Boolean: true, false, z. B.: useMaximumHeight="true" |
|
|
Boolean: true, false, z. B.: useMaximumWidth="true" |
|
|
Integer mit Einheit px, c, em oder dlu |
Initiale Breite der View in Pixeln oder der angegebenen Einheit. |
Subelemente:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Table
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
|
|
Boolean: true, false |
Änderungen an Objekten des Typs, welche in der Tabelle angezeigt werden, führen zu einer Aktualisierung der Tabelle |
|
String |
komma-separierte Liste von Entitätsnamen; Änderungen an Objekten dieser Typen führen zusätzlich zum in der Tabelle angezeigten Typ zu einer Aktualisierung der Tabelle; funktioniert nur zusammen mit |
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
String |
Definition der Spalten einer Tabelle im Kurzformat. Bsp.: Einzelne Spaltendefintionen werden durch Spalten werden ausgeblendet, indem sie einfach nicht deklariert werden. Die Reihenfolge kann geändert werden. Bei polymorphem Tabelleninhalt kann es hilfreich sein, den Typ des jeweiligen Objektes mit |
|
Boolean: true, false |
False: Bei Mausklick (oder |
|
Boolean: true, false |
|
|
Boolean: true, false |
Die anzuzeigenden Elemente sind nicht eigenständig und leben nur in diesem View. |
|
||
|
siehe |
|
|
Boolean: true, false |
Selektion per Doppelklick |
|
Boolean: true, false |
Bewirkt, dass die DetailView der Tabelle das Bearbeiten der dort angezeigten Werte zulässt. Nützlich, wenn es sich bei diesen Werten bspw. um Attribute aus Subrelationen eines virtuellen Attributs handelt, die eigentlich gesperrt wären. |
|
Boolean: true, false |
|
|
String: Entitätsname |
Bestimmt die Entität, deren Objekte diese Tabelle darstellen soll. |
|
Boolean: true, false |
Die Daten im Lesezeichen werden erst vom Server geladen, wenn man das explizit mit F5 oder RETURN "anfordert". Man kann also erstmal alle nötigen Filter setzen und das Lesezeichen beginnt nicht bereits nach dem ersten gesetzten Filter mit dem Laden. Nützlich bei Entitäten mit sehr vielen Objekten, bei denen es angeraten ist erst mal ein bisschen vorzufiltern. |
|
String |
|
|
String: +X% |
Gibt an, um wieviel Prozent die Schrift vergrößert werden soll. |
|
Boolean: true, false |
|
|
Integer |
|
|
String: |
|
|
Boolean: true, false |
|
|
||
|
Integer |
Zusätzlicher freier Raum in Zellen horizontal. |
|
Integer |
Zusätzlicher freier Raum in Zellen vertikal. |
|
String |
Zeiger auf die Property, die in den Elementen die Postennummer darstellt. Posten-Modus. Fuehrt dazu, dass zwei Aktionen, naemlich Posten-rauf und Posten-runter gebaut werden, und die ITable standardmaessig die Postenspalte aufsteigend sortiert. |
|
Boolean: true, false |
Es können nur bestehende Objekte verknüpft werden und keine neue erstellt |
|
Boolean: true, false |
Bestimmt, ob die Objekte in der Tabelle sofort geladen werden sollen. Wenn
|
|
Integer |
|
|
Integer: 100000 |
Definiert die maximale Anzeige von Objekten (vergleichbar mit dem von SQL bekannten "LIMIT 100000") |
|
siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: maxSize="4c, 5c"; maxSize="4c,"; maxSize=",5c" |
|
|
siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
|
|
String: error, ignore, log |
Wie soll mit nicht existierenden oder falsch geschriebene Attributen in der Spaltendefinition umgegangen werden |
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
String |
Tid des Formulars, das benutzt werden soll, um Objekte aus dieser Tabelle zu öffnen. |
|
String |
Name der Property für welche beim Doppelklick das Standardformular geöffnet wird. |
|
||
|
String |
|
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
Integer: 5 |
Definiert die bevorzugte Anzahl angezeigter Zeilen |
|
String |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
True: Beim Öffnen von BOs via dieses Lesezeichen werden die BOs immer frisch vom Server neu geladen anstatt die Instanz aus dem Lesezeichen zu verwenden. |
|
String: |
Bestimmt das Verhalten der Spaltenbreite beim Vergrößern/Verkleinern der Tabelle. |
|
Boolean: true, false |
False: Bei Mausklick wird die komplette Spalte ausgewählt |
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
Boolean: true, false |
|
|
String: Kommaseparierte Liste von Entitätsnamen |
Subentitäten der in der Tabelle dargestellten Entität, die nicht angezeigt werden sollen. |
|
String |
|
|
Boolean: true, false, z. B.: useMaximumHeight="true" |
|
|
Boolean: true, false, z. B.: useMaximumWidth="true" |
|
|
Boolean: true, false |
|
|
String: |
|
|
Boolean: true, false |
Es darf nur geschaut werden, verlinken bestehender Objekte, etc ist nicht möglich |
|
Integer |
Column
Attribute:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
siehe |
|
|
String (CBOFormat). |
Legt fest, wie das BO aus der property für die Anzeige in der Zelle formatiert wird. Bsp: "Id': 'Name"; funktioniert nur, wenn das letzte Attribut in der property auf eine Relation verweist |
|
siehe |
|
|
String (CBOFormat). |
Legt fest, wie das BO der aktuellen Zeile als ToolTip für diese Spalte formatiert wird. Bsp: "Id': 'Name" |
|
String |
Überschrift für die Spalte. |
|
Integer mit Einheit px, c, em oder dlu |
Initiale Breite der Spalte in Pixeln oder der angegebenen Einheit. |
|
String: TOP, CENTER, BOTTOM, z. B. vAlign="TOP" |
Bestimmt die vertikale Ausrichtung des Textes innerhalb des Elements. Die Höhe des Elements muss größer sein als eine normale Zeilenhöhe, was z. B. durch Setzen des Attributs prefSize erreicht werden kann. |
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Bestimmt die Hintergrundfarbe der Spalte für ungerade Zeilennummern. |
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
Bestimmt die alternative Hintergrundfarbe der Spalte für gerade Zeilennummern. |
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
Bestimmt die Schriftfarbe der Spalte für ungerade Zeilennummern. |
|
Farbangabe. #rrggbbaa, r,g,b,a, r g b a. Alpha optional. Beispiele: #14f900, 255,255,0,0, 0.5 0.4 0.3 0.2, GREEN, YELLOWISH |
Bestimmt die Schriftfarbe der Spalte für gerade Zeilennummern. |
|
Boolean: true, false |
FIXME aktuell ohne Funktion? |
|
Boolean: true, false |
Aktiviert Info-Level Logging beim Rendern von Zellen. |
|
Boolean: true, false |
Aktiviert oder deaktiviert das Caching von angezeigten Werten. |
|
String: z. B. fontStyle="bold", fontStyle="italics" oder fontStyle="BOLD", fontStyle="italics" |
|
|
String: |
|
|
|
Gibt an, in welcher Richtung die Spalte sortiert werden soll. NONE verbietet das Sortieren. |
|
int: 0 |
Gibt die Sortier-Reihenfolge der Spalten an. |
|
String |
Hier kann der Name einer TableCellRenderer-Klasse angegeben werden, die statt des Default Renderers benutzt werden soll. |
headerRenderer und renderer
Hier können spezielle Renderer konfiguriert werden um z.B. die Farbe abhängig vom Inhalt der Zelle zu ändern. Sie müssen auf Spaltenebene definiert werden:
<Column property="Enabled">
<renderer>
import java.awt.Color
renderer.setHorizontalAlignment(javax.swing.SwingConstants.CENTER)
if (!value) { (1)
renderer.setBackground((row&1) == 0 ? new Color(234, 176, 176) : new Color(240, 200, 200)) (2)
renderer.setText('\u2717') (3)
} else {
renderer.setBackground((row&1) == 0 ? new Color(199, 234, 176) : new Color(207, 226, 186))
renderer.setText('\u2714')
}
</renderer>
</Column>
1 | value beinhaltet den Wert aus dem Property. In diesem Fall also Enabled als Boolean. |
2 | Falls der Wert von Enabled false/null ist wird der Hintergrund abhängig von der Zeilen-Nummer in einem unterschiedlichen Rot-Ton eingefärbt. |
3 | Der Inhalt wird auf das Unicode-Zeichen ✗ gesetzt. |
Wenn man am Background rumfuhrwerkt, muss man natürlich auch den "isSelected"-Status abfragen und den Background selbst entsprechend setzen (z.B. das gesetzte Rot bei markierten Zellen etwas bläulich einfärben). |
DetailView
Die DetailView wird als Subelement der Table verwendet, um Details zum jeweils gerade innerhalb der Tabelle angeklickten Objekt anzuzeigen bzw. um das Bearbeiten der Attribute des Objekts zu ermöglichen. Sind von den Änderungen innerhalb der DetailView Inhalte der Tabelle betroffen, werden diese automatisch aktualisiert.
Achtung: Falls die DetailView für eine Tabelle
in einem Lesezeichen verwendet wird, muss im <table>
Element das Attribut viewOnly="true"
gesetzt sein.
Attribute: FIXME
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
Falls Wert auf true, kann der Bereich der DetailView mit der Maus verschoben, sprich vergrößert/verkleinert werden. |
|
String: |
|
|
Float: 0.0 |
|
|
Boolean: true, false; Oder Richtungsbeschränkung, z. B. scrollable="VERTICAL_ONLY" |
Scrollbar für dieses Element ein- oder ausschalten bzw. auf eine Richtung beschränken. |
Sollen Attribute von Objekten aus Relationen des Tabellenobjekts geändert werden,
müssen für diese jedoch onAfterSetValue -Hooks implementiert werden, der die Version des
eigentlichen Objekts anstößt, um ein Aktualisieren der Tabelle zu erzwingen.
|
Beispiel mit onAfterSetValue
:
<Table property="Buecher" columns="Titel | Erscheinungsjahr | Autor.Familienname">
<DetailView name="autor">
<Border etched="true" title="Details zum Autor">
<View scrollable="true">
<Element label="Familienname">
<Text property="Autor.Familienname">
<onAfterSetValue language="groovy">ftx['autor'].getBO().bumpVersion()</onAfterSetValue>
</Text>
</Element>
</View>
</Border>
</DetailView>
</Table>
MultipleChoiceFilterGUI
Hierbei handelt es sich um einen Filter, der via <filter type="multipleChoice">
in eine FTable (Lesezeichen, Popup) eingebaut werden kann.
Für Hilfe beim Anlegen eines Filters die Solstice User-Dokumentation lesen.
Name | Erlaubte Werte | Beschreibung |
---|---|---|
preselectIdx |
int |
Gibt an, welcher Index in dem Dropdown standardmäßig ausgewählt ist. |
sort |
|
Gibt an, in welcher Reihenfolge die Queryergebnisse sortiert werden sollen |
Text
Attributes:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: |
|
|
Angabe der Klasse zur Textdarstellung, z.B. |
|
|
Boolean: true, false |
Das Feld wird ausgegraut und kann nicht editiert werden. |
|
siehe |
|
|
siehe |
|
|
||
|
Farbangabe. Bitte entweder als "#rrggbbaa" oder "r,g,b,a", "r g b a" oder eine Farbkonstante der java.awt.Color, z.B. YELLOW angeben. Farbnamen mit Postfix "ISH" werden in Richtung weiss verschoben (Mittelwert der einzelnen Farbwerte und 255). Der Alphawert ist optional. Die einzelnen Werte sind bei den beiden letzteren Varianten entweder Float-Werte von 0.0..1.0 (bei 1 bitte 1.0 angeben!) oder Integer-Werte von 0..255. bitte nur die eine Sorte Werte verwenden. Oder fuer Random-Farbe: random.' |
|
|
||
|
Boolean: true, false |
Bricht Text an der rechten Kante um, statt eine Scrollbar anzuzeigen. |
|
Boolean: true, false |
Passwortfeld statt normalem Text. |
|
||
|
int: 4 |
|
|
Boolean: true, *false* |
Wenn das Form-Element den Fokus bekommt wird der gesamte Inhalt selektiert |
|
||
|
||
|
int: 4 |
|
|
||
|
Boolean: true, false |
Wenn Text umgebrochen wird, dann möglichst an Whitespace-Grenzen. |
TimeSelector
Eingabe-/Bearbeitungsmöglichkeit für ein oder mehrere Zeitspannen innerhalb eines Zeitraums.
FIXME TT 2019-05-08: Wird praktisch nie benutzt. |
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
int: 0-23 |
Erste mögliche auszuwählende Stunde des Tages |
|
int: 1-n (24) |
Anzahl der von |
|
int: 5,10,15,20,30,60 |
Länge der Intervall-Aufteilung innerhalb einer Stunde |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
Element FIXME ??? |
FIXME ??? |
ToggleButton
Knopf der zwischen zwei Zuständen wechselt; Eingabe-/Bearbeitungsmöglichkeit für Boolean-Werte.
FIXME TT 2019-05-08: Wird praktisch nie benutzt. |
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String: ??? |
TT 2019-05-08: Scheint nicht genutzt/angezeigt zu werden. |
|
String |
Anzuzeigender Text wenn Attribute den Wert "true" hat |
|
String |
Anzuzeigender Text wenn Attribute den Wert "true" hat |
|
String |
Anzuzeigender Text wenn Attribute den Wert "null" hat |
|
siehe |
|
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
FIXME ??? |
FIXME ??? |
|
Boolean: true, false |
Ob der Button Null-Werte unterstützen/anzeigen soll. FIXME TT 2019-05-08: Scheint nicht zu funktionieren. |
|
Element FIXME ??? |
FIXME ??? |
Tree
Auswahl von Einträgen für eine Relation, deren mögliche Einträge hierarchisch in einer Baumstruktur angeordnet sind.
Attributes:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
String. Bsp.: |
Kinder-Attribut. Bei Subentitäten von Querbaum einfach "Kinder." |
|
||
|
siehe |
|
|
String: Entitätsname. Bsp.: |
Die Entität, deren Instanzen als Baum dargestellt werden sollen. Obligatorisch. |
|
ACHTUNG: Dieses Attribut wird im Moment noch nicht vom Tree unterstützt. |
|
|
String: Attributname, z. B. |
Das Attribut, das die Beschriftung der Knoten im Baum stellen soll. Default: |
|
Integer. Bsp.: |
|
|
String. Bsp.: |
Eltern Attribut. Bei Subentitäten von Querbaum einfach "Elter." |
|
String: Property accessor. Beispiele: property="Buch.Autor.Alter"; property="." |
Das Attribut der aktuell betrachteten Entität, das im Kontext dieses Elementes verwendet werden soll. Im zweiten Beispiel wird das BO des aktuellen Formkontexts als Property gesetzt. |
|
||
|
Boolean: true, false |
|
|
Integer. Bsp.: |
Uri
Attributes:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
View
Attributes:
Name | Erlaubte Werte | Beschreibung |
---|---|---|
|
Boolean: true, false |
|
|
||
|
Integer, z. B.: |
Teilt die Inhalte der View auf die angegebene Anzahl Spalten auf. |
|
String: 'IGNORE', 'ASK' |
Gibt an, wie Konflikte beim Speichern durch veraltete BOs behandelt werden sollen.
Nur in der äussersten TabbedView / View erlaubt.
IGNORE: Ignoriere Konflikte und übernehme/merge die Änderungen, |
|
||
|
Double: 1. Wert zwischen |
Verhindert Streckung von Feldern und benutzt |
|
Boolean: true, false |
Die View übernimmt die Anzeigeeinstellungen (z.B. Anzahl columns) der übergeordneten View. Dadurch kann z.B. einheiltiche Anzeige der Formularelemente in verscheidenen Views erreicht werden. |
|
Boolean: true, false |
Wenn false werden Kindelemente gesperrt, sodass diese nicht editiert werden können. |
|
Integer mit Einheit px, c, em oder dlu. Bsp.: |
Erzeugt links und rechts der View den angegebenen Abstand. |
|
Integer mit Einheit px, c, em oder dlu. Bsp.: |
Erzeugt über und unter der View den angegebenen Abstand. |
|
||
|
Boolean: true, false |
|
|
Boolean: true, false |
Nur für Formular-Roots. Änderungen aus lokalen Speichervorgängen im Client in diesem Formular nicht nachziehen |
|
||
|
Integer mit Einheit px, c, em oder dlu. Bsp.: |
Fügt den angegebenen Abstand zwischen Labels und Feldern ein. |
|
Integer mit Einheit px, c, em oder dlu. Bsp.: |
Fügt den angegebenen Abstand zwischen Zeilen ein. |
|
||
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: maxSize="4c, 5c"; maxSize="4c,"; maxSize=",5c" |
|
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: minSize="4c, 5c"; minSize="4c,"; minSize=",5c" |
Gibt die minimale Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
||
|
String |
Um das Form-Element innerhalb des Formulars referenzieren zu können |
|
Alias. Siehe |
|
|
Tupel: (horizontal, vertikal). Beispiele: prefSize="8c, 6c"; prefSize="8c,"; prefSize=",6c" |
Gibt die bevorzugte Größe des Elements mit horizontalem und vertikalem Wert an und ersetzt die ansonsten automatische Größenberechnung. Diese würde das Element auf das Minimum an Platz für dessen Inhalt setzen. Beide Werte sind jeweils optional. |
|
Boolean: true, false; Oder Richtungsbeschränkung, z. B. scrollable="VERTICAL_ONLY" |
Scrollbar für dieses Element ein- oder ausschalten bzw. auf eine Richtung beschränken. |
|
<Farbwert>[@<Intensität>], Intensität ist default 0.1; Beispiele: tint="#ff0000 @ 0.1"; tint="GREENISH" |
Färbt den Hintergrund des Views in der angegebenen Farbe ein |
|
Boolean: true, false, z. B.: useMaximumHeight="true" |
|
|
Boolean: true, false, z. B.: useMaximumWidth="true" |
|
|
Datenaustausch
Import
FIXME
Export
Excel
Für den Datenaustausch nach Excel bzw. kompatiblen Tabellenkalkulationsprogrammen kommt intern die Apache POI Bibliothek zum Einsatz (https://poi.apache.org).
Etwas schöner benutzen lässt sich das mit dem XlsHandler, der in dem ein oder anderen Projekt bereits zur Anwendung gekommen ist (einfach über das Repository
nach XlsHandler.nrx suchen).
Dort gibt es drei Methoden:
. Bauen von Header
. Befüllen des Sheets
. Den eigentlichen Export erstellen
Die Features, die man nutzen kann, findet man auf der Seite von Apache POI beschrieben. Grob gesagt geht "fast" alles:
-
mehrere Sheets
-
Styles
-
Formeln
-
Bilder
-
…
(Siehe die Tabelle unten hier: https://poi.apache.org/components/spreadsheet/index.html)
Bekannte Einschränkungen sind:
-
wenige Charts
-
keine Makros
-
kein Pivot
-
gewisse Größenbeschränkungen der Files
Für das, was normalerweise benötigt wird, sollte es aber hoffentlich ausreichend sein.
Ein Beispiel für den Export findet man im Repository, wenn man nach der Klasse AngebotsgruppeGas.nrx sucht (Methode "exportSummenlastgaenge").
Natürlich kann man das auch in einem Groovy-Skript direkt im Client / einem Lesezeichen / einem Formular machen.
Zu überlegen ist, ob bei entsprechend häufiger Verwendung (u.a. auch direkt durch den Kunden), wir die interne API möglichst benutzerfreundlich gestalten, damit die Skripte nicht zu kompliziert werden.
Lokale autoritative sowie synchronisierende Instanzen zum Entwickeln aufsetzen
Manchmal benötigt man beim Entwickeln bestimmter Features - meist bei Core-Arbeiten - eine Konstellation von autoritativem Server und synchronisierendem/n Servern.
Hier eine stichwortartige Anleitung wie man solche eine Konstellation auf seinem lokalen Entwickersystem aufsetzen kann. Ausgegangen wird davon, dass eine Instanz - die autoritative Instanz - bereits existiert. Außerdem wird davon ausgegangen, dass beide Instanzen immer denselben Codestand nutzen sollen - falls nicht muss für die synchronisierende Instanz ein eigenes "deploy"-Verzeichnis angelegt werden, statt das der autoritativen Instanz zu verlinken.
Im folgenden wurde überall der Zusatz "syncnode" für Namen von zur synchronisierende Instanz gehörigen Dingen gewählt. Dieser ist aber prinzipiell beliebig bzw. das Verzeichnis könnte generell theoretisch beliebig benannt werden. Der besseren Zuordnung halber sollte man allerdings die hier beschriebene Variante wählen.
Folgendes ist dann zum Aufsetzen der zugehörigen synchronisierende Instanz zu tun:
-
Verzeichnis
/.<projektkuerzel>-syncnode
anlegen (muss normalerweise als root/via sudo gemacht werden, um das /-Verzeichnis modifizieren zu dürfen) -
Besitzer korrekt setzen (wie vom Verzeichnis der autoritativen Instanz
/.<projektkuerzel>
) -
/.<projektkuerzel>/deploy
nach/.<projektkuerzel>-syncnode/deploy
verlinken -
/.<projektkuerzel>/filesRoot
nach/.<projektkuerzel>-syncnode/filesRoot
verlinken -
/.<projektkuerzel>/lib/mytism
nach/.<projektkuerzel>-syncnode/lib/mytism
verlinken -
Dateien
/.<projektkuerzel>mytism.ini
etc. nach/.<projektkuerzel>-syncnode
kopieren -
/.<projektkuerzel>-syncnode/mytism.ini
anpassen:-
nodeNumber
anpassen, falls Id der zugehörigen BN bekannt; oder Zeile komplett löschen, dann wird automatisch eine neue angelegt -
(DB-)
url
anpassen:<dbname>
→<dbname>-syncnode
-
filesRoot
anpassen →/.<projektkuerzel>-syncnode/filesRoot
-
authoritative=1
→authoritative=0
-
SyncService*-Einträge aktivieren:
[Sync] url=socket://localhost:4242?compress=zlib9 user=Admin pass=
Statt "Admin" und leerem Passwort bitte die korrekten Zugangsdaten aus der Datenbank eintragen.
-
port
undtlsPort
anpassen → z.B. statt 4242 und 4243 Ports 14242 und 14243 nutzen -
DeploySite
-Einstellungen anpassen oder neu eintragen, falls noch nicht vorhanden:[DeploySite] host=localhost port=18080 --tlsHost= --tlsPort= requireAuthentication=0 --reauthEveryXDays=90
-
-
Skript
mytism
anpassen:-
export PRJDIR="/.<projektkuerzel>-syncnode"
-
export DBNAME="<dbname>-syncnode"
-
Danach kann, wie in der Admin-Doku unter "Aufsetzen eines syncenden MyTISM-Servers aus einem Backup des autoritativen Servers" beschrieben, ein Datenbank-Backup der autoritativen Instanz eingespielt und die beiden Instanzen genutzt werden.