Datensätze
Datensätze definieren die "Datenbeschaffung" für schreibende UI-Elemente. Datensätze können den folgenden Metadatenobjekten zugeordnet werden:
- Daten-Edit-Element
- Multi-Daten-Edit-Element
Eigenschaften der Datensätze
Bereich | Eigenschaft | Wert |
---|---|---|
Allgemeines | Name (Name) | Name des Datensatzes |
Anhängen an Datensatz der Partner-Kennung (AppendToPartnerId, AppendToPackageId) | Partner- und Lösungs-Kennung (bei Sage „Sage“) des gleichnamigen Datensatzes, an den diese Definition angehängt werden soll. Einsatzzwecke:
Hinweis: Anhängen ist immer einstufig, Verkettungen sind nicht möglich | |
Titel (Title) | Titel des Datensatzes | |
Nur vorhandene Datensätze editieren? (EditOnlyExistingData) | Sollen nur vorhandene Datensätze editiert werden? In diesem Fall können keine neuen Datensätze angelegt werden und die entsprechenden Funktionen im UI werden nicht zur Verfügung gestellt. | |
Verweis auf benutzerdefinierte Felder (UserDefinedFieldsSources) | Verweisliste auf benutzerdefinierte Felder (Definition in Tabelle „USysSetup“ , Einträge "Tree"="UserFields"; z.B. "Adresse" oder "Artikel"), die dem Anwender beim Editieren zur Verfügung stehen sollen (Achtung: Die hierdurch ermittelten Feldnamen müssen mit dem nachfolgenden „Table1“-Attribut harmonieren; die entsprechende Tabelle muss also die erste sein); jeder Verweis besteht aus „Link“ (Verweis auf „USysSetup“) und „OtherTable“ (muss aktuell leer bleiben) weitere Verweise auf benutzerdefinierte Felder können bei angehängten Datensätzen (siehe „AppendToPartnerId“ und „AppendToPackageId“) definiert werden | |
Klassen-Schlüssel für Historie 1 (ClassNameForHistoryTable1) | Hier kann ein Klassen-Schlüssel (z.B. "Adresse") angegeben werden, um beim Speichern des Datensatzes durch einen UI-Aufruf einen Eintrag in die Tabelle "USysClassHistory" zu schreiben (dort Feld "Class"). Diese Tabelle ist die Basis der "Meine letzten..."-Elemente. Bleibt der Eintrag leer, wird kein Eintrag in der Tabelle gemacht. Client-seitig erfolgt beim Speichern eine automatische Benachrichtigung an alle geöffneten Elemente, die im Attribut "Aktualisierungsbenachrichtigungen" diesen Schlüssel eingetragen haben. Gilt für SQL-Tabelle 1. | |
Klassen-Schlüssel für Historie 2 (ClassNameForHistoryTable2) | Hier kann ein Klassen-Schlüssel (z.B. "Kontokorrent") angegeben werden, um beim Speichern des Datensatzes durch einen UI-Aufruf einen Eintrag in die Tabelle "USysClassHistory" zu schreiben (dort Feld "Class"). Diese Tabelle ist die Basis der "Meine letzten..."-Elemente. Bleibt der Eintrag leer, wird kein Eintrag in der Tabelle gemacht. Client-seitig erfolgt beim Speichern eine automatische Benachrichtigung an alle geöffneten Elemente, die im Attribut "Aktualisierungsbenachrichtigungen" diesen Schlüssel eingetragen haben. Gilt für SQL-Tabelle 2. | |
Feldnamen für Historie 1 (ClassKeysForHistoryTable1) | Enthält eine Semikolon-separierte Liste mit Feldnamen der Felder des Datensatzes, aus denen der Schlüssel ("Key") für die Historien-Tabelle "USysClassHistory" gebildet wird, um beim Speichern des Datensatzes durch einen UI-Aufruf einen Eintrag in die Tabelle "USysClassHistory" zu schreiben. Diese Tabelle ist die Basis der "Meine letzten..."-Elemente. Gilt für SQL-Tabelle 1. | |
Feldnamen für Historie 2 (ClassKeysForHistoryTable2) | Enthält eine Semikolon-separierte Liste mit Feldnamen der Felder des Datensatzes, aus denen der Schlüssel ("Key") für die Historien-Tabelle "USysClassHistory" gebildet wird, um beim Speichern des Datensatzes durch einen UI-Aufruf einen Eintrag in die Tabelle "USysClassHistory" zu schreiben. Diese Tabelle ist die Basis der "Meine letzten..."-Elemente. Gilt für SQL-Tabelle 2. | |
"Hook"-Name (Ab Version 9.0.4) (HookName) | Definition eines Sage-internen Namens zum Anhängen ("hooken") von hart codierten Erweiterungen. | |
Kommentar (Comment) | Beliebiger Kommentar zur Dokumentation. Der Kommentar wird nicht zum Client übertragen und dient nur zur Dokumentation von Besonderheiten, Hinweisen, etc. Bei Auslieferung/Weitergabe der Lösung wird der Kommentar eingeschlossen, so dass der Empfänger ihn im AppDesigner sieht. | |
SQL | SQL-Tabelle 1 (Table1) | Datentabelle |
SQL-Tabelle 2 (Table2) | Optionaler zweite Datentabelle | |
globale Datenbank verwenden? (UseGlobalDatabase) | Soll die globale Datenbank (anstelle der Mandanten-Datenbank) verwendet werden? | |
Tabelle 1 u. 2 mit Left Join verknüpfen? (DoLeftJoin) | Die Datensätze in Tabelle 1 und Tabelle 2 werden mit einem LEFT JOIN verknüpft, d.h. in Tabelle 2 werden nur Datensätze geschrieben, die Daten enthalten. Werden die Daten auf der Seite von Tabelle 2 geleert bzw. bei Zahlen auf 0 gesetzt, wird ein ggf. in Tabelle 2 existierender Datensatz gelöscht. | |
Löschmethode (RecordDeleteMethod) | Bei zwei Datentabellen ist hier die Löschmethode zu definieren:
| |
Mandantenfeld Tabelle 1 (MandantFieldTable1) | Feldname des Mandaten-Feldes der ersten Tabelle (die Primärfelder und die Mandanten-Felder bilden automatisch die Where-Clause) | |
Mandantenfeld Tabelle 2 (MandantFieldTable2) | Feldname des Mandaten-Feldes der zweiten Tabelle (die Primärfelder und Mandanten-Felder bilden automatisch die Where-Clause) | |
Primärschlüsselfeld 1 (PrimaryKeyField1) | Feldname des ersten Primärschlüsselfeldes (die Primärfelder und Mandanten-Felder bilden automatisch die Where-Clause) | |
Primärschlüsselfeld 2 (PrimaryKeyField2) | Feldname des optionalen zweiten Primärschlüsselfeldes (die Primärfelder und Mandanten-Felder bilden automatisch die Where-Clause) | |
Primärschlüsselfeld 3 (PrimaryKeyField3) | Feldname des optionalen dritten Primärschlüsselfeldes (die Primärfelder und Mandanten-Felder bilden automatisch die Where-Clause) | |
Primärschlüsselfeld 4-9 (PrimaryKeyField4-9) (Ab Versoion 9.0) | Feldname des optionalen vierten bis neunten Primärschlüsselfeldes (die Primärfelder und Mandanten-Felder bilden automatisch die Where-Clause) | |
Primärschlüsseltyp 1 (PrimaryKeyType1) | Primärschlüsselfeld 1 ist
Hinweise für die verschiedenen Einsatzfälle:
| |
Primärschlüsseltyp 2 (PrimaryKeyType2) | analog "Primärschlüsseltyp 1" | |
Primärschlüsseltyp 3 (PrimaryKeyType3) | analog "Primärschlüsseltyp 1" | |
Primärschlüsseltyp 4-9 (PrimaryKeyType4-9) (ab Version 9.0) | analog "Primärschlüsseltyp 1" | |
Primärschlüsselwert 1 (PrimaryKeyValue1) | Fester Wert für Primärschlüsselfeld 1 | |
Primärschlüsselwert 2 (PrimaryKeyValue2) | analog "Primärschlüsselfeld 1" | |
Primärschlüsselwert 3 (PrimaryKeyValue3) | analog "Primärschlüsselfeld 1" | |
Primärschlüsselwert 4-9 (PrimaryKeyValue4-9) (ab Version 9.0) | analog "Primärschlüsselfeld 1" | |
RowVersion-Feld Tabelle 1 (RowVersionFieldTable1) | Feldname des RowVersion-Feldes der ersten Tabelle | |
RowVersion-Feld Tabelle 2 (RowVersionFieldTable2) | Feldname des RowVersion-Feldes der zweiten Tabelle | |
Sortierung | Sortierung (Order) | Sortieranweisung in Form einer Liste:
Achtung: Da der SQL-Datentyp Text nicht sortiert werden kann, muss der Inhalt eines solchen Feldes bei Bedarf mit „CONVERT(varchar(max), feldname)“ explizit konvertiert werden, was allerdings Performance-relevant ist |
Beziehungen | Detail-Datensätze (DetailDataRecordReferences) | Liste von Verweisen auf abhängige Datensätze (1:n-Beziehung):
|
Detail-Datenstrukturen(Ab Version 9.0.2) (DetailDataStructureReferences) | Liste von Verweisen auf abhängige Datenstrukturen (1:n-Beziehung):
| |
Löschmethode für Detail-Datensätze (DoRecordDeleteMethod) | Löschmethode für Detail-Datensätze:
| |
Abfragen für Datensatzkopie (DataCopyOptions) | Liste der Abfragen, die dem Anwender beim Datensatz kopieren gestellt werden (die Ja-/Nein-Antworten werden zusammen mit den numerischen Schlüsseln an den ausführenden Dienst übergeben. Eine leere Liste bedeutet, dass das Kopieren ohne Anwender-Options-Anfragen ausgeführt wird). Aufbau:
Anmerkung: Die Funktionalität zum Kopieren von Datensätzen setzt voraus, dass der Datensatz auf einer Datenklasse basiert, die der Primärschlüssel ist. Weitere Optionen können bei angehängten Datensätzen (siehe „AppendToPartnerId“ und „AppendToPackageId“) definiert werden | |
Vorlagenfunktion gesteuert über Feld (SupportTemplateFlaggedBy) | Durch Angabe eines Feldnamens steht für Neu-Anlagen die Vorlagen-Funktion zur Verfügung. Vorlagen müssen im genannten Feld mit -1 (True) markiert sein. Zur Realisierung wird die gleiche Funktionalität wie für Datensatz kopieren verwendet. Die entsprechenden Felder müssen also korrekt definiert werden. | |
Ereignisse (Makros) | Vor Änderung (BeforeUpdate) | Makros, die vor Änderungen eines Datensatzes (d.h. direkt vor dem Speichern) aufgerufen werden
Die Ereignisse werden auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden). Bei einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:
|
Vor Löschung (BeforeDelete) | Makros, die vor der Löschung eines Datensatzes aufgerufen werden
Beim Löschen von Teil-Datensätzen (nur in Multi-Data-Edit-Elementen):
Die Ereignisse werden auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden). Bei einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:
| |
Nach Einfügung (AfterInsert) | Makros, die nach dem Einfügen eines neuen Datensatzes aufgerufen werden Bei Server-seitiger Ausführunmg: Ausführung innerhalb der Transaktion. Die Ereignisse werden auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden). Bei einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:
| |
Nach Änderung (AfterUpdate) | Makros, die nach dem Ändern eines Datensatzes aufgerufen werden (Server-seitige Ausführung innerhalb der Transaktion). Die Ereignisse werden auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden). Bei einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:
| |
Nach Löschung (AfterDelete) | Makros, die nach dem Löschen eines Datensatzes aufgerufen werden (Server-seitige Ausführung innerhalb der Transaktion) Beim Löschen von Teil-Datensätzen (nur in Multi-Data-Edit-Elementen):
Die Ereignisse werden auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden). Bei einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:
| |
Vor Änderung einer Hierarchie (BeforeUpdateChildren) (ab Version 9.0) | Makros, die ausgeführt werden, wenn dieser Datensatz in einer hierarchischen Struktur liegt (1:n-Beziehung). Es wird vor den Update-Ereignissen der Child-Datensätze aufgerufen, aber nur wenn solche Child-Datensätze geschrieben werden. Die Makros dienen zur Validierung von Abhängigkeiten zwischen den Datensätzen. Bei einem Update werden nur geänderte Datensätze neu geschrieben. Dieses Ereignis kann für eine Gesamtsicht auf alle Child-Datensätze verwendet werden. (Anwendungsbeispiel: Artikelstamm/Stücklistenartikel (Element "recArtikelstammStueckliste.Sage.Wawi").
| |
Vor Änderung durch API (BeforeUpdateByApi) (ab Version 9.0.4) | Makros, die vor Änderung und Neuanlage eines Datensatzes nach dem Setzen der Standard-Werte und vor der Feldvalidierung aufgerufen werden. Der Zweck des Ereignisses ist es, Werte von Feldern zu setzen, die als Pflichtfelder definiert sind oder Daten-abhängig befüllt werden müssen, im zugehörigen API-Endpunkt jedoch nicht zur Verfügung gestellt werden.
Beispiel: Der API-Endpunkt für Kunden enthält zwar die Felder "Name" und "LieferOrt", zur Speicherung wird allerdings auch das Pflichtfeld "Matchcode" benötigt. Dieses kann im Makro gebildet werden. Das Ereignis wird nicht auf Client- sondern nur Server-Seite ausgelöst, wenn das Speichern durch einen API-Aufruf initiiert wurde. | |
Lizenzierung | Lizenz-Kürzel (LicenseTokens) | Applikationskürzel der zu prüfenden Lizenz (nur in Nicht-Sage-Lösungen verwendbar und änderbar) |
Lizenz-Kürzel für Sage (SageLicenseTokens) | Applikationskürzel der zu prüfenden Lizenz (nur in Sage-Lösungen verwendbar und änderbar) |
Eigenschaften der Datensatzfelder
Bereich | Eigenschaft | Wert | |
---|---|---|---|
Allgemeines | Feldname (Name) | Eindeutiger Feldname (muss eine korrekte SQL-Feldbezeichnung sein, da der Wert direkt für den Alias-Namen der SQL-Abfrage benutzt wird, für Anwender nicht sichtbar) | |
Feldtitel (Title) | Titel des Feldes (für Anwender sichtbar) | ||
Feld-Attribute anhängen? (DoAppendTo) | Sollen Eigenschaften an das gleichnamige Feld des in "Anhängen an..." referenzierten Datensatzes angehängt werden? Einsatzzweck:
| ||
SQL | SQL-Abfrage Tabelle 1 (SqlQueryTable1) | SQL-Abfrage für Feld aus der Datentabelle.
Die Update-Fähigkeit muss gewährleistet sein, d.h. bei allen nicht beschreibbaren Feldern muss die „Schreibschutz?“-Eigenschaft gesetzt werden. | |
SQL-Abfrage Tabelle 2 (SqlQueryTable2) | SQL-Abfrage für Feld aus der zweiten optionalen Datentabelle.
Die Update-Fähigkeit muss gewährleistet sein, d.h. bei allen nicht beschreibbaren Feldern muss die „Schreibschutz?“-Eigenschaft gesetzt werden. | ||
SQL-Abfrage für HTML-Inhalt Tabelle 1 (SqlQueryHtmlTable1) | SQL-Abfrage für Feld aus der Datentabelle – Variante für HTML-Formatierung bei formatiertem Textfeld (im einfachsten Fall Feldname der Tabelle; bei Abfragen mehrerer Tabellen muss der Tabellenname vorangestellt werden; rein lesende Unterabfragen sind möglich; Alias darf hier nicht angegeben werden, da dieser hier aus „Name“ automatisch gebildet wird); | ||
SQL-Abfrage für HTML-Inhalt Tabelle 2 (SqlQueryHtmlTable2) | SQL-Abfrage für Feld aus der zweiten optionalen Datentabelle – Variante für HTML-Formatierung bei formatiertem Textfeld (im einfachsten Fall Feldname der Tabelle; bei Abfragen mehrerer Tabellen muss der Tabellenname vorangestellt werden; Unterabfragen sind möglich; Alias darf hier nicht angegeben werden, da dieser hier aus „Name“ automatisch gebildet wird); Update-Fähigkeit analog zu „SqlQueryTable1“ | ||
SQL-Abfrage für RTF-Inhalt Tabelle 1 (SqlQueryRtfTable1) | SQL-Abfrage für Feld aus der Datentabelle – Variante für RTF-Formatierung bei formatiertem Textfeld (im einfachsten Fall Feldname der Tabelle; bei Abfragen mehrerer Tabellen muss der Tabellenname vorangestellt werden; rein lesende Unterabfragen sind möglich; Alias darf hier nicht angegeben werden, da dieser hier aus „Name“ automatisch gebildet wird); Update-Fähigkeit analog zu „SqlQueryTable1“ | ||
SQL-Abfrage für RTF-Inhalt Tabelle 2 (SqlQueryRtfTable2) | SQL-Abfrage für Feld aus der zweiten optionalen Datentabelle – Variante für RTF-Formatierung bei formatiertem Textfeld (im einfachsten Fall Feldname der Tabelle; bei Abfragen mehrerer Tabellen muss der Tabellenname vorangestellt werden; Unterabfragen sind möglich; Alias darf hier nicht angegeben werden, da dieser hier aus „Name“ automatisch gebildet wird); | ||
Datentyp | Datentyp (DataType) | Datentyp:
Datentypen 101, 110 und 120 erfordern, dass ein Feld des Datentyps 100 vorhanden ist, das die gleiche Klasse referenziert oder ein Datenreferenzfeld vorhanden ist, für das "LoadBehaviour" ungleich "Immer laden" (d.h. Wert <>0) eingestellt ist und die gleiche Klasse referenziert. Datentypen 111 erfordert, dass ein Feld des Datentyps 110 vorhanden ist, das die gleiche Klasse referenziert. Datentypen 121 erfordert, dass ein Feld des Datentyps 120 vorhanden ist, das die gleiche Klasse referenziert. Die Datentypen 200, 201 und 202 müssen immer zusammen vorkommen, wobei die Felder mit den Datentypen 201 und 202 in der Eigenschaft "Datenklassen-Schlüsselfeld“ auf das Feld mit dem Datentyp 200 verweisen müssen. In der UI-Definition (Daten-Edit-Element) müssen alle drei Felder referenziert werden, wobei die Platzierung anhand des Land-Feldes erfolgt. | |
Datentyp-Ergänzung (DataTypeIndexedInfos) | Liste mit Key sowie mit "PackageId", "PartnerId", "Name" und "Id" zur Referenzierung eines Strings aus "StringResources.xml"; bei Datentyp 16 (indexed Image) zusätzlich:
Anzeigereihenfolge gemäß der Liste Tipp:
| ||
Datenreferenz (DataReferencePartnerId, DataReferencePackageId, DataReferenceName) | Partner-Kennung, Lösungs-Kennung und Name für die Datenreferenz, die als Grundlage für ein Auswahllisten-Eingabefeld dient. Eine detaillierte Beschreibung der Datenrefernztypen finden Sie in Datenreferenzen. | ||
Datenreferenze-Filter (DataReferenceFilter) | Zusätzliche Bedingungen, welche die WHERE-Bedingung der SQL-Abfrage zur Laufzeit erweitern. Der Client liest jeweils beim Aufklappen der Liste die Datenreferenz neu ein. Format:
Platzhalter:
Beispiel: MyUnion.Periode=[Periode] AND MyUnion.Benutzer=[Benutzer] | ||
Datenreferenz-Info-Felder (DataReferenceInfoFields) | In einem Datenreferenz-Feld werden im UI neben dem eigentlichen Schlüssel (optional) auch alle anderen in der Datenreferenz referenzierten Felder angezeigt. Bei einem zusätzlichen Filter ("Datenreferenz-Filter") oder wenn eine DLL/Klasse und "Datenreferenz-Parameter“ hinterlegt sind wird die Datenreferenz erst beim Anzeigen der Auswahlliste komplett geladen. Für die Anzeige im Datenreferenz-Feld sind in der Datenstruktur die dort verwendeten Felder anzulegen und über die Liste "Datenreferenz-Info-Felder" in der gleichen Reihenfolge zu referenzieren. | ||
Datenreferenz-Parameter (DataReferenceServiceParameters) | Übergabe von Werten an die aufzurufende Klasse, um die Daten zu filtern. Der angeschlossene Suchdialog bekommt die Platzhalter ebenfalls. Semikolon-separierte Liste von Name-/Ausdruck-Paaren. Konstante Texte müssen in Anführungszeichen eingefasst werden, innen liegende Anführungszeichen sind zu verdoppeln.
| ||
Datenreferenz-Service-Dll-Name (DataReferenceServiceAssemblyName) | Definition einer DLL, über die die Datenreferenz dynamisch gefiltert wird. Der Geschäftsprozess liefert aus der Gesamtmenge der Daten nur die gültigen Schlüssel zurück. Der Client liest jeweils beim Aufklappen der Liste die Datenreferenz neu ein. Achtung: Die Daten werden zuerst komplett eingelesen und an den Client übertragen, der dann die Filterung initiiert. Bei großen Datenbeständen kann dies zu Performance-Problemen führen. Hier wird der Name der aufzurufenden DLL (ohne Verzeichnisname, aber mit Dateinamenerweiterung „.dll“) angegeben. Die DLL wird immer im OL-Shared-Verzeichnis gesucht | ||
Datenreferenz-Service-Dll-Klassenname (DataReferenceServiceClassName) | Name der aufzurufenden Klasse. Als Basisklasse ist "DataReferenceProcessBase" zu verwenden. Hinweis für Developer Partner WDB-Eintrag 203334: | ||
Datenklasse (DataClassPartnerId, DataClassPackageId, DataClassName) | Partner- und Lösungs-Kennung und Name der Datenklasse. | ||
Datenklassen-Schlüsselfeld (DataClassKeyField) | Verweis auf Schlüsselfeld der Datenklasse (zugehöriges Feld mit Datentyp 100 (Schlüssel 1 einer Data Class)) bzw. bei "Verbund Land/PLZ/Ort" Verweis auf Landes-Feld (zugehöriges Feld mit Datentyp 200 (Land)) bzw. auf Datenreferenz-Feld mit "LoadBehaviour" ungleich "Darstellung als Datenreferenz" (d.h. Wert <> 0) | ||
Suchfilter (FilterParameters) | Übergabe von Werten an die Datenklasse und an den angeschlossenen Suchdialog, um die Daten zu filtern. Dort können sie als Platzhalter für SQL verwendet werden (z.B. "$[Parameter(name)]") bzw. werden direkt an das dem Such-/Filterfeld zugeordnete Such-Element übergeben. Außerdem Übergabe von Werten zur Verwendung in den Makros des Kontextmenüs der Datenklasse. Die Namen werden automatisch um einen führenden Unterstrich ergänzt und stehen damit in den Makros als lokale Variablen zur Verfügung. Format:
Syntax:
Beispiel:
| ||
Standard-Wert (DefaultValue) | Standardwert für die Eingabe. Die Angabe eines Ausdrucks (muss mit „=“ beginnen) ist zulässig, wobei dort kein Zugriff auf andere Felder erlaubt ist. Gilt auch bei Datenreferenzen, wobei dort geprüft wird, ob der Wert in der Liste vorhanden ist, ansonsten dort keine Vorbelegung. Datumswerte müssen im ISO-Format („yyyy-mm-dd“ bzw. „yyyy-mm-ddThh:mm:ss“) angegeben werden. Zahlen mit Nachkommastellen müssen Kultur-invariant angegeben werden, d.h. mit Punkt und nicht mit Komma. | ||
Formatierter Text? (IsFormattedText) | Handelt es sich um einen formatierten Text?
| ||
Textformatierung abschaltbar? (IsTextFormattingSwitchable) | Soll der Anwender zwischen formatiertem und unformatiertem Text umschalten können? | ||
Feld unformatierter Text (PlainTextFieldName) | Feldname des Feldes, welches den unformatierten Text enthält. | ||
Schreibschutz? (IsReadOnly) | Markierung für Nur-Lese-Felder "Schreibschutz?" wird für folgende Fälle aktiviert:
Wird "Schreibschutz?" aktiviert, hat dies folgende Auswirkungen:
Wird "Schreibschutz?" nicht aktiviert, kann zur Laufzeit Client-seitig mit dem Makro-Befehl "FestlegenNurLesen" die Einstellung auf "True" gesetzt werden.
Ein Anwendungsbeispiel ist z.B. in der Belegerfassung zu finden:
Rechteverwaltung:
| ||
Nachkommastellen (DecimalPlaces) | Anzahl Nachkommastellen oder variable Anzahl (d.h. Nachkomma-Nullen ausblenden) für mehr als 4 Nachkommastellen ist der Datentyp "FLOAT" in der SQL-Datenbank erforderlich; | ||
Nachkommastellen-Definition in übergeordnetem Element? (IsDecimalPlacesDefinitionInParent) | Erfolgt die Definition der Anzahl der Nachkommastellen über ein Feld des jeweils übergeordneten Elementes (bzw. deren jeweiligen Datenquelle)? | ||
Nachkommastellen gemäß Feld (DecimalPlacesDefinedByField) | Name des Feldes, das zur Laufzeit die Anzahl der Nachkommastellen enthält. Das Attribut hat Vorrang vor dem Attribut "Nachkommastellen" Das referenzierte Feld muss Int16, Int32 oder Indexed String als Datentyp haben.; nur für benutzerdefinierte Felder:
| ||
Behandlung bei Datensatz kopieren (DataCopyMode) | Sonderbehandlung bei Datensatz kopieren:
| ||
Lade-/Darstellungsverhalten (LoadBehaviour) Ab Version 9.0.3 | Lade-/Darstellungsverhalten einer Datenreferenz:
Das Lade-/Darstellungsverhalten einer Datenreferenz kann angepasst werden, so dass (auch einstellbar) anstelle der Datenreferenz ein Datenklassenfeld mit Suchlupe angezeigt wird. Für große Datenbestände ist die Datenklassen-Variante deutlich performanter und erlaubt auch die dann die notwendige Suchfunktionalität. | ||
Null-Sonderbehandlung für Datenklasse? (DoNullConversionOnDataClassKey) | Automatische Konvertierung des Schlüsselwerts der Datenklasse von NULL in 0 (beim Speichern) bzw. von 0 in NULL (beim Laden). Bei einem einstellbaren Lade-/Darstellungsverhalten einer Datenreferenz (obige Werte 1 oder 2) kann es vorkommen, dass der Integer-Schlüssel der Datenklasse auch den Wert NULL annehmen kann, aber das zugehörige Datenbankfeld nur Integer ohne NULL-Werte zulässt. In diesem Fall kann hiermit eine automatische Konvertierung durchgeführt werden. | ||
Partner-Kennung Such-Element (SearchPartPartnerId) Lösungs-Kennung Such-Element (SearchPartPackageId) Name Such-Element (SearchPartName) Ab Version 9.0.3 | Such-Element zur Eingabe von "Nicht-Datenklassen", insb. hierarchischen Daten wie z.B. Artikelgruppen und Lagerplätzen, in Selektions-Elementen und Daten-Edit-Elementen Es wird automatisch Mehrfachauswahl unterstützt. Das Feld wird im UI automatisch schreibgeschützt, was nicht umgeschaltet werden kann. Es wird nicht der Wert im Feld dargestellt, sondern die Anzahl der gewählten Datensätze. Der Feldwert enthält die ausgewählten Schlüssel als Semikolon-separierte Liste. Schlüsselsegmente werden durch Kommata getrennt. Texte werden in Anführungszeichen eingefasst, innenliegende Anführungszeichen werden verdoppelt. Über das "BeforeSearch"-Makro des UI-Elementes können mit dem Makro-Befehl "FestlegenAdhocFilterSuche" Filter gesetzt werden. Abgrenzung zur Suche per Datenklasse:
Abgrenzung zur Verwendung eines Funktionsaufrufes am Feld mit dem Makrobefehl "DatensatzSuchen":
nur für für Datentyp 5 (String) mit NumberOfLines = 1 erlaubt (keine Memo-Darstellung mit Suchen Schaltfläche); für Datenreferenzen, Datenklassen und Hilfetexte nicht erlaubt | ||
Validierung | Pflichtfeld? (IsMandatory) | Markierung für Pflichtfeld (ab Version 9.0) Bei nummerischen Nicht-Pflicht-Feldern werden leere Felder und der Wert '0' unterschiedlich behandelt:
Beispiel-Szenario ist die erfasste Menge in der Inventur, bei der zwischen "noch nicht eingegeben" (NULL) und dem Lagerbestand '0' unterschieden werden muss. Bei Datentyp 1 (Boolean) werden in Nicht-Pflicht-Feldern leere Felder über einen dritten Status "unbestimmt" visualisiert (NULL in der Datenbank). Im UI wird bei Pflicht-Feldern keine Pflichtfeldmarkierung angezeigt, weil aus Anwendersicht sowohl der Wert "False" als auch "True" zulässige Eingaben sind. Felder der Datentypen 15 und 16 (indexed String und indexed Image) werden immer als Pflichtfeld behandelt, aber im UI nicht markiert, da sie generell immer eine Vorbelegung haben). | |
Minimalwert (MinValue) | Minimalwert für Validierung; bei nicht Pflicht-Feldern kann das Feld zusätzlich leer bleiben. | ||
Maximalwert (MaxValue) | Maximalwert für Validierung; bei nicht Pflicht-Feldern kann das Feld zusätzlich leer bleiben. | ||
Liste zulässiger Werte (ValueList) | Werteliste für Validierung (Auswertung nach Min/Max, falls definiert); bei nicht Pflicht-Feldern kann das Feld zusätzlich leer bleiben. | ||
Validierungs-Ausdruck (ValidationExpression) | Validierungs-Ausdruck mit Boolean-Rückgabewert (bei nicht Pflicht-Feldern kann das Feld zusätzlich leer bleiben):
(Auswertung nach Min/Max und Werteliste, falls definiert) Hinweis: Dieser Ausdruck ist nicht geeignet, um Abhängigkeiten zwischen mehreren Feldern zu validieren, weil es keinen mehrfachen Feldbezug gibt (wie beispielsweise beim Makro-Befehl „FehlerMelden“). | ||
Validierungs-Ausdruck-Fehlermeldung (ValidationExpressionMessage) | Fehlermeldung, falls ein Validierungsfehler auftritt | ||
Ereignisse (Makros) | Validierung nach Änderung (ValidationAfterChange) | Makros zur Validierung, die sowohl Client- als auch Server-seitig ausgeführt werden, damit aus Komfortgründen die Validierung schon Client-seitig erfolgen kann. Client-seitig wird das Ereignis bei Änderungen wie folgt aufgerufen:
Das Ereignis tritt beim Erzeugen der Defaultwerte für einen neuen bzw. beim Laden eines vorhandenen Datensatzes nicht auf. Server-seitig wird das Ereignis vor dem Speichern ausgelöst. Eine fehlgeschlagene Validierung führt dort zur Ablehnung der Operation. Die Ausführung erfolgt innerhalb der Transaktion. Hinweise für den Einsatz:
Das Ereignis wird auf Client- und Server-Seite ausgelöst (sinnvollerweise im Makro die Funktion „IsRunningOnServer“ verwenden, um nur auf dem Server auszuführen und Roundtrips zu vermeiden)
|
QL-Abfrage für Feld aus der Datentabelle – Variante für RTF-Formatierung bei formatiertem Textfeld (im einfachsten Fall Feldname der Tabelle; bei Abfragen mehrerer Tabellen muss der Tabellenname vorangestellt werden; rein lesende Unterabfragen sind möglich; Alias darf hier nicht angegeben werden, da dieser hier aus „Name“ automatisch gebildet wird);Update-Fähigkeit analog zu „SqlQueryTable1“