wiki-spaces-s1-pages-412090467-datenstrukturen.md
By Andreas Langmaack (Unlicensed)
Apr 24, 2024
15 min
Add a reaction
Datenstrukturen definieren nicht Datenbank-gebundene Datenstrukturen, z.B. für Selektions-Elemente und für Daten-Edit-Elemente und Multi-Daten-Edit-Elemente, wobei die Datenstrukturen dann als Datencontainer fungieren und die CRUD-Methoden via Geschäftsprozess behandelt werden. Datenstrukturen können den folgenden Metadatenobjekten zugeordnet werden:
Selektionselemente
Daten-Edit-Elemente
Multi-Daten-Edit-Elemente
|
Bereich
|
Eigenschaft
|
Wert
| | --- | --- | --- |
|
Bereich
|
Eigenschaft
|
Wert
| | --- | --- | --- | |
Allgemeines
|
Name
(Name)
|
Name der Datenstruktur
| |
|
Titel
(Title)
|
Titel der Datenstruktur
| |
|
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
(UserDefinedFieldsSource)
|
Verweis 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.
| |
|
Anhängen an Datenstruktur der Partner-Kennung
(AppendToPartnerId, AppendToPackageId)
|
Partner- und Lösungs-Kennung (bei Sage „Sage“) der gleichnamigen Datenstruktur, an den diese Definition angehängt werden soll;
Einsatzzwecke:
Makro-Funktionen an Ereignisse der Datenstruktur bzw. deren Felder anhängen
Felder an die Datenstruktur anhängen
"Detail-Datenstrukturen“ an die Datenstruktur anhängen
Hinweis: Anhängen ist immer einstufig, Verkettungen sind nicht möglich
| |
|
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.
| |
Daten
Ab Version (9.0.4)
|
Primärschlüsselfeld 1 bis 9
(PrimaryKeyField 1 bis 9)
|
Feldname des ersten bis neunten Primärschlüsselfeldes
Falls hier NICHT definiert, müssen die Primärschlüsselfelder in der "PrepareMetaData"-Methode des Datenservice gesetzt werden
| |
|
Ab Version (9.0.4)
Primärschlüsseltyp 1 bis 9
(PrimaryKeyType 1 bis 9
|
Primärschlüsselfeld 1 ist
0 = variabel
6 = Fremdschlüssel
Hinweise für die verschiedenen Einsatzfälle:
Schlüssel des Typs 0 muss der Anwender eingeben
Schlüssel des Typs 6 muss der Anwender eingeben, wobei er auf die vorhandenen Werte der jeweiligen Datenklasse eingeschränkt und nur für Datenklassen-Felder erlaubt.
| |
Beziehungen
|
Detail-Datensätze
(DetailDataStructureReferences)
|
Liste von Verweisen auf abhängige Datenstrukturen (1:N-Beziehung) (logischer Feldname (zur Referenzierung aus dem Daten-Edit-Element), Partner-Kennung, Lösungs-Kennung, Schlüssel)
Ist maximal vierstufig erlaubt.
| |
Daten-Service
|
Daten-Service-Dll-Name
(DataServiceAssemblyName)
|
Bei Datenstrukturen, die in Edit- oder Multi-Data-Edit-Formularen genutzt werden, muss ein Dienst hinterlegt werden, der die AppServer-seitig benötigten Methoden enthält.
Hier wird der Name der aufzurufenden DLL (ohne Verzeichnisname, aber mit Dateinamenerweiterung „.dll“) angegeben
Die DLL wird immer im OL-Shared-Verzeichnis gesucht.
| |
|
Daten-Service-Klassenname
(DataServiceClassName)
|
Name der aufzurufenden Klasse, die von DataServiceBase ableiten muss.
| |
|
Geschäftslogik-Dll-Name
(BusinessAssemblyName)
|
Name der DLL, aus der im AppDesigner die Datenstruktur erzeugt wurde (schreibgeschützt)
| |
|
Geschäftslogik-Klassenname
(BusinessClassName)
|
Vollqualifizierter Name der Klasse, aus der im AppDesigner die Datenstruktur erzeugt wurde (schreibgeschützt)
| |
Ereignisse (Makros)
|
Beim Laden
(OnLoad)
|
Makros, die nach dem Laden der Metadaten aufgerufen werden.
Das Ereignis wird nur auf Server-Seite ausgelöst.
| |
|
Vor Änderung
(BeforeUpdate)
|
Makros, die vor dem Einfügen oder vor Änderungen einer Datenstruktur aufgerufen werden (Rückgabe eines Cancel-Flags und einer Cancel-Meldung)
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 Unter-Datenstrukturen (in Multi-Data-Edit-Elementen) gilt Folgendes:
Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.
Es erfolgt keine Server-seitige Ausführung.
Hinweis: Auf die Schlüsselfelder kann mit dem Ausdruck "GetKeyFieldValue()" zugegriffen werden.
| |
|
Vor Löschung
(BeforeDelete)
|
Makros, die vor der Löschung einer Datenstruktur aufgerufen werden
Hinweis: Auf die Schlüsselfelder kann mit dem Ausdruck "GetKeyFieldValue()" zugegriffen werden.
In diesem Ereignis aufgerufenen Geschäftsprozessen (siehe Makro-Befehl "AufrufenDll") werden automatisch die zu löschenden Daten zur Verfügung gestellt
Rückgabe eines Cancel-Flags und einer Cancel-Meldung
Server-seitige Ausführung innerhalb der Transaktion
Beim Löschen von Teil-Datenstrukturen (nur in Multi-Data-Edit-Elementen):
Es erfolgt zunächst die Client-seitige Ausführung und beim Speichern der kompletten Datenstruktur die Server-seitige Ausführung.
Auch wenn mehrere Zeilen gelöscht werden, wird dieses Makro für alle Zeilen nur einmal zusammen ausgeführt.
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 Unter-Datenstrukturen (in Multi-Data-Edit-Elementen) gilt Folgendes:
Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.
Es erfolgt keine Server-seitige Ausführung.
| |
|
Nach Einfügung
(AfterInsert)
|
Makros, die nach dem Einfügen einer neuen Datenstruktur 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 Unter-Datenstrukturen (in Multi-Data-Edit-Elementen) gilt Folgendes:
Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.
Es erfolgt keine Server-seitige Ausführung.
| |
|
Nach Änderung
(AfterUpdate)
|
Makros, die nach dem Ändern einer Datenstruktur 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 Unter-Datenstrukturen (in Multi-Data-Edit-Elementen) gilt Folgendes:
Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.
Es erfolgt keine Server-seitige Ausführung.
| |
|
Nach Löschung
(AfterDelete)
|
Makros, die nach dem Löschen einer Datenstruktur aufgerufen werden (Server-seitige Ausführung innerhalb der Transaktion)
Beim Löschen von Teil-Datenstrukturen (nur in Multi-Data-Edit-Elementen):
Es erfolgt zunächst die Client-seitige Ausführung und beim Speichern der kompletten Datenstruktur die Server-seitige Ausführung.
Auch wenn mehrere Zeilen gelöscht werden, wird dieses Makro für alle Zeilen nur einmal zusammen ausgeführt.
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 Unter-Datenstrukturen (in Multi-Data-Edit-Elementen) gilt Folgendes:
Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.
Es erfolgt keine Server-seitige Ausführung.
Hinweis: Auf die Schlüsselfelder kann mit dem Ausdruck "GetKeyFieldValue()" zugegriffen werden.
| |
|
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.
Die Funktion "IsRecordInsert" gibt im Makro an, ob es sich um einen neuen Datensatz handelt.
In in diesem Ereignis aufgerufenen Geschäftsprozessen (siehe Makro-Befehl "AufrufenDll") werden automatisch die neuen und alten Daten zur Verfügung gestellt.
Rückgabe eines Cancel-Flags und einer Cancel-Meldung.
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)
|
|
Bereich
|
Eigenschaft
|
Wert
|
| | --- | --- | --- | --- |
|
Bereich
|
Eigenschaft
|
Wert
|
| | --- | --- | --- | --- | |
Allgemeines
|
Feldname
(Name)
|
Eindeutiger Feldname (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 der in "Anhängen an..." referenzierten Datenstruktur angehängt werden?
Einsatzzweck:
Makro-Funktionen an Ereignisse des Feldes anhängen
Datenreferenz-Filter, Datenreferenz-Parameter und Datenklassen-Filter erweitern/anhängen
Festlegen/Überschreiben von Eigenschaften von Standard und benutzerdefinierten Feldern (siehe Anhängen an…)
|
| |
Datentyp
|
Datentyp
(DataType)
|
Datentyp:
1 = Boolean
2 = Int32
3 = Decimal
4 = Date
5 = String
6 = DateTime
7 = Time
8 = Duration
15 = indexed String
16 = indexed Image
23 = Currency
100 = Schlüssel 1 einer Datenklasse (zusätzlich sind ggf. Felder der Typen 101, 110, 111, 120 und 121 erforderlich; wird intern als Datentyp „String“ behandelt (z.B. in Makros), unabhängig vom konkreten Datentyp des Schlüssels in der Datenklassen-Definition bzw. der Datenbank)
101 = Matchcode für Schlüssel 1 einer Datenklasse
110 = Schlüssel 2 einer Datenklasse (zusätzlich ist ggf. ein Feld des Typs 111 erforderlich; wird intern als Datentyp „String“ behandelt (z.B. in Makros), unabhängig vom konkreten Datentyp des Schlüssels in der Datenklassen-Definition bzw. der Datenbank)
111 = Matchcode für Schlüssel 2 einer Datenklasse
120 = Schlüssel 3 einer Datenklasse (zusätzlich ist ggf. ein Feld des Typs 121 erforderlich; wird intern als Datentyp „String“ behandelt (z.B. in Makros), unabhängig vom konkreten Datentyp des Schlüssels in der Datenklassen-Definition bzw. der Datenbank)
121 = Matchcode für Schlüssel 3 einer Datenklasse
200 = Land/PLZ/Ort: Land
201 = Land/PLZ/Ort: PLZ
202 = Land/PLZ/Ort: Ort
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.
Wenn die Eigenschaften "Datenreferenz-Filter", "Datenreferenz-Service-Dll-Name" und "Datenreferenz-Service-Klassenname" nicht verwendet werden, handelt es sich um eine sogenannte "statische" Datenreferenz. In diesem Fall werden die Daten beim Öffnen des jeweiligen Elementes einmalig eingelesen. Zum manuellen Aktualisieren steht der Makro-Befehl "DatenReferenzAktualisieren" zur Verfügung. Anderenfalls wird sie zur "dynamischen" Datenreferenz. Der Client liest dann jeweils beim Aufklappen der Liste die Daten automatisch neu ein.
Eine detaillierte Beschreibung der Datenrefernztypen finden Sie in Datenreferenzen.
Zulässig nur für Datentypen 1 (Boolean), 2 (Int32) und 5 (String)
|
| |
|
Datenreferenz-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.
Wird aktuell in Selektionselementen nicht unterstützt.
|
| |
|
Datenreferenz-Parameter
(DataReferenceServiceParameters)
|
Übergabe von Werten an die
Geschäftsprozesse:
An die in Eigenschaft DataReferenceServiceAssemblyName / DataReferenceServiceClassName angegebene Klasse
(Basisklasse DataReferenceProcessBase, NamedParameters).
An den Geschäftsprozess der Datenreferenz, soweit vorhanden
(Basisklasse BusinessProcessBase, ServiceParameters).
Semikolon-separierte Liste von Name-/Ausdruck-Paaren. Konstante Texte müssen in Anführungszeichen eingefasst werden, innen liegende Anführungszeichen sind zu verdoppeln.
Format:
Name:=Ausdruck[;...]
Beispiel:
Art:=1;Typ:=[Typ];Kahn:="Kahn ""Der Titan"""
Datenreferenz muss definiert sein;
nur für dynamisch-gefilterte und dynamische Datenreferenz zulässig;
für Standardfelder:
für benutzerdefinierte Felder:
|
| |
|
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:
Dokument "Zusatzdokumentation zum Wiki für Developer Partner", DataReferenceProcessBase
|
| |
|
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:
Semikolon-separierte Liste von Name-/Ausdruck-Paaren
Konstante Texte müssen in Anführungszeichen eingefasst werden, innenliegende Anführungszeichen sind zu verdoppeln
Syntax:
Beispiel:
Hinweis:
|
| |
|
Automatische Datenklassen-Validierung
(DataClassAutoValidation)
|
Definiert, ob die Datenklassen-Werte automatisch validiert werden. Wird keine automatische Validierung eingestellt, so muss ein unmittelbar nachfolgender Geschäftsprozess die Validierung durchführen. Der Normalfall ist daher immer "Ja".
Das Attribut dient zur Performance-Optimierung, wenn ein nachfolgender Geschäftsprozess ohnehin den Datenklassen-Wert validiert.
Ohne Validierung kann die Eingabehistorie des Feldes mangels Daten nicht automatisch erzeugt werden. Dies muss dann mit dem Makro "EintragenEingabeHistorie" im "Nach Änderung"-Makro des Feldes manuell erfolgen.
|
| |
|
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.
Wird das Feld im User Interface als Hilfetext verwendet (für Assistenten-Dialoge), muss der Text, damit er übersetzbar ist, aus den String-Ressourcen gelesen werden (siehe Platzhalter "GetString()").
Ist "Von-Bis-Feld?" gesetzt, werden Von- und Bis-Wert mit diesem Standardwert belegt.
|
| |
|
Formatierter Text?
(IsFormattedText)
|
Handelt es sich um einen formatierten Text?
0 = Nein
1 = Ja, RTF-formatierter Text
|
Collapse action bar
View all comments
Open Details Panel
Create page
Open Rovo Chat
Add a comment
Add a reaction