Zusatzfelder einrichten
Produktlinie
Standard
|Expert
Betriebsart
CLOUD ABO
|ON-PREMISES
Module
Leistung & CRM
Budget & Teilprojekt
Fremdkosten
Ressourcenplanung
Business Intelligence
Die Liste der vorhandenen Felder in Vertec wird durch das Modell vorgegeben und kann nicht geändert werden. Da es jedoch vorkommt, dass Sie auf Daten noch zusätzliche Informationen ablegen wollen (z.B. Auftragswahrscheinlichkeit auf Projekt), gibt es Zusatzfelder.
Zusatzfelder werden unter Einstellungen > Customizing > Zusatzfelder verwaltet. Jedes Zusatzfeld basiert auf einer Zusatzfeldklasse. Wenn Sie ein neues Zusatzfeld erzeugen müssen, klicken Sie via Neu-Menü oder Rechtsklick auf den Ordner und wählen Sie Zusatzfeld
.
Name |
Über diesen Namen kann auf das Zusatzfeld zugegriffen werden. Siehe dazu den Abschnitt Zugriff auf Zusatzfelder weiter unten. Der Name darf keine Umlaute enthalten, da sonst das Berechtigungssystem fehlschlagen kann, und er darf nicht mit einer Zahl beginnen. Aufgrund einer Umstellung mit Version 6.5.0.21 dürfen keine Namen mehr für Zusatzfelder benutzt werden, welche einer eingebauten Python Methode entsprechen. Es handelt sich um folgende Begriffe:
Zusatzfelder, welche einen solchen Namen haben, werden als ungültig angezeigt und müssen bereinigt werden, um den Betrieb zu gewährleisten. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bezeichnung |
Geben Sie hier an, unter welcher Bezeichnung das Zusatzfeld auf der Oberfläche erscheinen soll. Wenn Sie hier nichts angeben, wird auf der Oberfläche der Name angezeigt. Bei der Bezeichnung handelt es sich um ein MLString -Feld, das heisst, sie ist sprachspezifisch. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Feldtyp, Auswahltyp, Expression
|
Zusatzfelder können typisierte Werte mit entsprechenden Auswahlmöglichkeiten und Eingabekontrollen enthalten. Neben den Feldtypen können ein Auswahltyp und eine optionale Expression angegeben werden. Die folgende Tabelle beschreibt die verfügbaren Feldtypen mit den passenden Auswahltypen (& Expressions).
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Reihenfolge |
Hier können Sie angeben, in welcher Reihenfolge die Zusatzfelder auf der Oberfläche erscheinen sollen. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Klassen |
Gibt an, wo und für welchen Datentyp das Zusatzfeld erscheinen soll. Wählen Sie den entsprechenden Typen aus dem Dialog aus, indem Sie auf die drei Punkte klicken. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sichtbarkeit |
Zusatzfelder, welche intern für Berechnungen verwendet werden, können auf der Oberfläche ausgeblendet werden. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bedingung |
Die Sichtbarkeit kann durch eine OCL Expression gesteuert werden. Das Resultat dieser OCL Expression muss ein Wahr/Falsch-Wert (Boolean) sein. Ist das Resultat wahr, wird das Zusatzfeld angezeigt. |
Die Zusatzfelder erscheinen in der Einzelansicht der entsprechenden Einträge auf der Seite Weitere Info:
Ausserdem können sie auch via Customizing an einem anderen Ort platziert werden.
Ab Vertec 6.5.0.15 werden die Strings in Auswahlzusatzfeldern übersetzt, wenn die Zusatzfeld-Definition (ZusatzfeldKlasse) über eine Eintrag Id verfügt.
zusatzfeldint(<name>)
cmbZusatzfeld
rndZusatzfeld
Falls Sie Auswahlzusatzfelder definiert haben und diese übersetzen möchten, setzen Sie auf der entsprechenden Zusatzfeld-Definition eine Eintrag Id. Wie das geht, finden Sie im Artikel Sprachen/Begrifflichkeit im Abschnitt mit den Übersetzungen ab Version 6.4.0.9 .
Sie können diese Zusatzfelder auch in Listen anzeigen, in Scripts und Berichten verwenden oder in einem Expression-Ordner danach filtern, indem Sie via OCL darauf zugreifen. Auch die Abfrage via SQL-Ordner ist möglich.
Wichtig ist dabei, zu beachten, dass die Zusatzfelder auf schon bestehenden Vertec-Objekten erst erzeugt werden, wenn darauf entsprechend zugegriffen wird. Vorher sind sie in der Datenbank nicht vorhanden, was beim Zugriff via SQL aber essenziell ist.
Wird ein neues Objekt erzeugt, werden alle zugehörigen Zusatzfelder angelegt.
Bei bereits bestehenden Objekten werden die Zusatzfelder bei folgenden Vorgängen angelegt:
projekt.jahr = 2022
(Beispiel: Ganzzahl-Zusatzfeld jahr
auf Projekt). Es kann auch einfach entsprechend initialisiert
werden: projekt.jahr = 0
myyear = projekt.jahr
) legt das Feld nicht an, aber der Lesezugriff via OCL schon: myyear = projekt.evalocl("zusatzfeldint('jahr')")
zusatzfeldasstring(...)
beispielsweise geht nicht, da dies ein reiner Lesezugriff ist; zusatzfeldint(...)
hingegen legt das Feld an, da über diese Expression auch geschrieben werden kann. (Hinweis: Diese Einschränkung gilt nur bei Listeneinstellungen. Beim Lesezugriff via OCL in Scripts, wie in Punkt 3 beschrieben, gilt das nicht, dort wird das Feld auch beim reinen Lesezugriff angelegt)Der Grund für das etwas komplexe Verhalten bei Variante 3 und 4 ist die Optimierung, welches bei einem nicht vorhandenen Zusatzfeld den Standardwert zurückgibt, da ein Schreibzugriff nur aufgrund einer Anzeige möglichst verhindert werden, aber keine Fehlermeldung erscheinen soll.
Via SQL (z.B. via SQL-Ordner) ist das Feld erst zugänglich, wenn es angelegt wurde. Deshalb sollten die Zusatzfelder auf Klassen, von denen bereits Objekte bestehen, immer direkt angelegt werden.
Nach Anlegen eines Zusatzfeldes kann man ein Script laufen lassen , welches das Feld auf allen bereits bestehenden Objekten anlegt, in der Art:
projekte = vtcapp.evalocl("projekt")
for projekt in projekte:
projekt.jahr = 0
vtcapp.updatedatabase()
Wie die verschiedenen Zusatzfeldtypen initialisiert werden, finden Sie im Abschnitt Python weiter unten.
Über OCL kann auf die verschiedenen Zusatzfelder folgendermassen zugegriffen werden:
Zusatzfeldtyp | Operator | Default Rückgabewert (wenn noch nichts explizit gesetzt wurde) |
---|---|---|
Zeichen | zusatzfeld |
Leerstring |
Wahr, Falsch | zusatzfeldbool |
Falsch |
Ganzzahl | zusatzfeldint |
0 |
Minuten | zusatzfeldint |
0 |
Festkommazahl | zusatzfeldcurr |
0.00 |
Datum | zusatzfelddate |
NULL |
Bild | zusatzfeldblob |
NULL |
Objekt | zusatzfeldobj (siehe Tipps weiter unten) |
NULL |
Auswahl | zusatzfeldint (gibt Position der Auswahl zurück)zusatzfeldasstring (gibt den Auswahltext zurück) |
0 Erster Wert der Liste |
Text | zusatzfeld |
NULL |
ANSI Text (Legacy) | zusatzfeldblob |
NULL |
Beispiel: Alle Adressen, die als ABC-Adressen gekennzeichnet sind (Wahr,Falsch-Zusatzfeld "ABC-Adresse" auf Adresseintrag):
adresseintrag->select(zusatzfeldbool('ABC-Adresse'))
Der Zugriff auf Zusatzfelder erfolgt in Python ganz einfach über den Zusatzfeldnamen, also z.B. projekt.jahr
.
Der reine Lesezugriff ( myyear = projekt.jahr
) legt das Feld nicht an (siehe Abschnitt Wann werden Zusatzfelder angelegt
weiter oben), der Schreibzugriff hingegen schon ( projekt.jahr = 2022
). Möchte man das Feld anlegen, ohne einen Wert zu setzen, kann es wie folgt initialisiert werden:
Zusatzfeldtyp | Initialisierung |
---|---|
Zeichen | = "" (Leerstring) |
Wahr, Falsch | = 0 (False) |
Ganzzahl | = 0 |
Minuten | = 0 |
Festkommazahl | = 0 |
Datum | = None |
ANSI Text | = None |
Bild | = None |
Objekt | = None |
Auswahl | = 0 |
Text | = None |
Über SQL kann auf die verschiedenen Zusatzfelder folgendermassen zugegriffen werden:
Zusatzfeldtyp | Ausdruck SQL (Datenbankfeld) | Where-Ausdruck |
---|---|---|
Zeichen |
Wert | Wert like "Aha%" |
Wahr, Falsch |
WertBoolean |
|
Ganzzahl |
WertInteger | WertInteger >= 1000 |
Minuten |
WertInteger | WertInteger >= 1000 |
Festkommazahl |
WertCurrency | WertCurrency = 1350 |
Datum |
WertDatum | WertDatum = "15.03.2017" |
ANSI Text |
WertBlob | WertBlob containing 'Newsletter' (Firebird)WertBlob like "%Newsletter%" (MS SQL) |
Bild |
WertBlob | WertBlob <> "" (für: es ist ein Bild zugeordnet) |
Objekt |
WertObject |
|
Auswahl |
WertInteger |
|
Text | WertText | WertText like "%Newsletter%" |
Detaillierte Beschreibung und Beispiele finden Sie im Artikel SQL-Expressions für SQL-Ordner.
Zusatzfelder können via Customizing auch in Listen und in den Seiten platziert werden. Dabei gilt folgende Matrix zur Auswahl des Steuerelementes:
Feldtyp | Auswahl-Typ | Steuerelement | Beispiel |
---|---|---|---|
Zeichen | Adresse | AddressReferenceBox |
<AddressReferenceBox Label="Adresse" ValueExpression="zusatzfeldobj('ZeichenAdresse')" /> |
Zeichen | File | PathBox |
<PathBox Label="File" ValueExpression="zusatzfeld('File')" SelectType="FileOpen" /> Um das File direkt öffnen zu können, muss zusätzlich ein Navigationsbutton eingefügt werden: <PathBox Label="File" ValueExpression="zusatzfeld('File')" ShowNavLinkButton="True" SelectType="FileOpen" /> |
Zeichen | Pfad | PathBox |
<PathBox Label="Pfad" ValueExpression="zusatzfeld('Pfad')" SelectType="Folder" /> Um den Pfad direkt öffnen zu können, muss zusätzlich ein Navigationsbutton eingefügt werden. <PathBox Label="Pfad" ValueExpression="zusatzfeld('Pfad')" ShowNavLinkButton="True" SelectType="Folder" /> |
Zeichen | TextBox |
<TextBox Label="Zeichen" ValueExpression="zusatzfeld('Zeichen')" /> |
|
Wahr, Falsch | CheckBox |
<CheckBox Label="Wahr, Falsch" ValueExpression="zusatzfeldbool('WahrFalsch')" /> |
|
Ganzzahl | TextBox |
<TextBox Label="Ganzzahl" ValueExpression="zusatzfeldint('Ganzzahl')" /> |
|
Minuten | TextBox |
<TextBox Label="Minuten" ValueExpression="zusatzfeldint('Minuten')" Converter="Minutes" /> |
|
Festkommazahl | TextBox |
<TextBox Label="Festkommazahl" ValueExpression="zusatzfeldcurr('Festkommazahl')" /> |
|
Datum | DatePicker |
<DatePicker Label="Datum" ValueExpression="zusatzfelddate('Datum')" /> |
|
ANSI Text | TextArea |
<TextArea Label="Text" ValueExpression="zusatzfeldblob('Text')" Lines="4" /> |
|
Bild | Image |
<Image Label="Bild" ValueExpression="zusatzfeldblob('Bild')" Height="150" /> |
|
Objekt | Adresse | AddressReferenceBox |
<AddressReferenceBox Label="Adresse" ValueExpression="zusatzfeldobj('ObjektAdresse')" /> |
Objekt | Vertec Ordner | TreeReferenceBox |
<TreeReferenceBox Label="Ordner" ValueExpression="zusatzfeldobj('ObjektOrdner')" BrowseClass="Container" SelectFilter="AbstractOrdner" /> |
Objekt | AdditionalFieldComboBox |
<AdditionalFieldComboBox Label="Objekt" ValueExpression="zusatzfeldobj('Objekt')" /> |
|
Auswahl | AdditionalFieldComboBox |
<AdditionalFieldComboBox Label="Auswahl" ValueExpression="zusatzfeldint('Auswahl')" /> |
|
Text | TextArea |
<TextArea Label="Text" ValueExpression="zusatzfeld('Text')" Lines="4" /> |
In den meisten Fällen kommt das auf der Oberfläche auf dasselbe heraus, da schlussendlich meist ein String dargestellt wird.
Unterschied gibt vor allem bei Auswahl-Zusatzfeldern. Diese sind intern als Integer Zusatzfelder implementiert. Das bedeutet, dass die Expression zusatzfeldint(name)
eine Zahl liefert. Wenn der Text der Auswahl angezeigt werden soll, dann sollte die expression zusatzfeldasstring(name)
verwendet werden.
Ebenso liefern die typspezifischen OCL Operatoren NULL Werte, falls das Zusatzfeld den Wert NULL hat. Dies stellt aber in den meisten Fällen kein Problem dar, da NULL Werte als Leerstrings dargestellt werden. Falls ein NULL Wert Probleme macht, kann dies durch Verwendung von zusatzfeldAsString
vermieden werden.
Der Operator zusatzfeldObj zum Abfragen von Objekt-Zusatzfeldern kann zu Fehlern führen, wenn er in einer OCL Expression auf einer Liste von Objekten angewendet wird. Die Fehlermeldung lautet:
TBoldObjectList.AddElement: Element not a TBoldObject
Beispiel: Objektzusatzfeld 'Niederlassung' auf Projektbearbeiter. Zeigt z.B. auf eine Adresse.
offeneLeistungen.bearbeiter.zusatzfeldobj('Niederlassung')->asset->size
sollte die Anzahl verschiedener Niederlassungen in einer Leistungliste angeben. Gibt aber den obigen Fehler.
Lösung
offeneLeistungen.bearbeiter->collect(zusatzfeldObj('Niederlassung')->oclasType(UserEintrag))->asset->size
Erklärung
Die Anwendung von zusatzfeldObj
auf eine Liste entspricht einer impliziten "collect" Operation. Diese schlägt fehl, weil zusatzfeldObj
nicht direkt das verknüpfte Objekt, sondern das Verknüpfungsfeld liefert.
Eine Typumwandlung auf einen kompatiblen Objekttyp (den eigentlichen Typ des Objekts oder UserEintrag) behebt das Problem. Damit die Typumwandlung stattfinden kann, muss die collect
Operation explizit formuliert werden.