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

BereichEigenschaftWert
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:

  • Makro-Funktionen an Ereignisse des Datensatzes bzw. dessen Felder anhängen
  • Felder an den Datensatz anhängen
  • Benutzerdefinierte Felder an den Datensatz anhängen
  • "Detail Datensätze“ an den Datensatz anhängen

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:

  • 0 = In Tabelle 1 zuerst löschen
  • 1 = In Tabelle 2 zuerst löschen
  • 2 = Nur in Tabelle 1 löschen (Löschweitergabe)

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

  • 0 = variabel
  • 1 = TAN-basierend auf Tabelle 1
  • 2 = TAN-basierend auf Tabelle 2
  • 3 = fester Wert (Konstante)
  • 4 = fester von Parent übergebener Wert
  • 5 = Automatisch hochgezählt
  • 6 = Fremdschlüssel (nur für Datenklassenfelder erlaubt)

Hinweise für die verschiedenen Einsatzfälle:

  • Schlüssel des Typs 0 muss der Anwender eingeben
  • Schlüssel der Typen 1, 2 und 5 werden automatisch neu gebildet
    • Eine TAN ist eine automatisch erzeugte, eindeutige, Mandanten-spezifische Transaktionsnummer, die automatisch über den API-Aufruf "Sagede.OfficeLine.Engine.Mandant.GetTan" erzeugt wird.
  • Schlüssel des Typs 4 werden vom Parent übernommen (für 1:N-Beziehungen)
  • Schlüssel des Typs 5 werden in der zugrunde liegenden Tabelle automatisch gebildet (Identity-Spalten)
  • Schlüssel des Typs 6 muss der Anwender eingeben, wobei er auf die vorhandenen Werte der jeweiligen Datenklasse eingeschränkt wird

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:

  • angegeben werden jeweils Feldname des Datensatzes (d.h. ein Feld-Verweis; „Name“) und „ASC“ bzw. „DESC“ für aufsteigende bzw. absteigende Sortierung (nachfolgende Felder definieren jeweils Untersortierungen)
  • im Beispiel „f1;ASC;f2;DESC“ wird zunächst nach Feld „f1“, danach nach Feld „f2“ sortiert
  • soll ein Feld, das für die Sortierung benötigt wird, ausschließlich hierfür benutzt werden und nicht angezeigt werden, ist es im UI auszublenden
  • wenn die Eigenschaft leer ist, ist keine Sortierung möglich

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):

  • Name der Beziehung (wenn der Detail-Datensatz zur Laufzeit in einem Multi-Daten-Edit-Element dargestellt werden soll, muss es sich um den logischen Feldnamen des Multi-Daten-Edit-Elementes im zugehörigen Daten-Edit-Element handeln)
  • Partner-Kennung
  • Lösungs-Kennung
  • Name
  • Beziehungen (Liste der Key-Felder der beiden Datensätze (jeweils Master-Key - Detail-Key)

Detail-Datenstrukturen(Ab Version 9.0.2)

(DetailDataStructureReferences)

Liste von Verweisen auf abhängige Datenstrukturen (1:n-Beziehung):

  • Name der Beziehung (wenn die Detail-Datenstruktur zur Laufzeit in einem Multi-Daten-Edit-Element dargestellt werden soll, muss es sich um den logischen Feldnamen des Multi-Daten-Edit-Elementes im zugehörigen Daten-Edit-Element handeln)
  • Partner-Kennung
  • Lösungs-Kennung
  • Name

Löschmethode für Detail-Datensätze

(DoRecordDeleteMethod)

Löschmethode für Detail-Datensätze:

  • 0 = Löschweitergabe über SQL-Trigger
  • 1 = Löschweitergabe auf Basis der Metadaten anhand der Abhängigkeits-Definition (siehe Attribut „DetailDataRecordReferences“)
  • 2 = Code-seitige Löschung (Serverseitiger Code über eine entsprechende DLL-Common-Method; nur für Partner-Lösungen)
  • 3 = Code-seitige Löschung (Server-seitiger Code über eine hart codierte Anpassung im Standard-Code; nur für Sage-Lösungen)

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:

  • Index der Option
  • Abfragetext für die jeweilige Option
  • Semikolon-separierte Liste der Options-Indizes, die bei Aktivierung auch automatisch aktiviert werden (dient zur Definition von Abhängigkeiten).
    • Möchte man einen Options-Index des eigenen Datensatzes referenzieren, hinterlegt man den numerischen Index der Option.
    • Möchte man aus einer Lösung heraus den Options-Index einer anderen Lösung referenzieren, hinterlegt man den Index der Option inkl. Partner-Kennung und Lösungs-Kennung, z.B. „3.Sage.Wawi“.
  • Name des betroffenen Datensatzes
  • Berechtigung verwenden?
    • Die Berechtigungen werden zusammen mit den Berechtigungen der entsprechenden Daten-Edit-Elemente erzeugt.

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

  • Mit der Funktion "IsRecordInsert" kann im Makro geprüft werden, ob es sich um einen neuen Datensatz handelt
  • Rückgabe eines Cancel-Flags und einer Cancel-Meldung
  • Bei Server-seitiger Ausführung:
    • Der Datensatz enthält nur die geänderten Daten
    • In Geschäftsprozessen (siehe Makro-Befehl "AufrufenDll") steht automatisch auch der alte Datensatz zur Verfügung.
  • 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:

  • Server-seitig: Nach dem Schreiben jedes (Teil-)Datensatzes werden die zugehörigen Makros direkt ausgeführt.
  • Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.

Vor Löschung

(BeforeDelete)

Makros, die vor der Löschung eines Datensatzes aufgerufen werden

  • In in diesem Ereignis aufgerufenen Geschäftsprozessen (siehe Makro-Befehl "AufrufenDll") werden automatisch die zu löschenden Daten zur Verfügung gestellt.
  • Bei Server-seitiger Ausführung:
    • In Geschäftsprozessen (siehe Makro-Befehl "AufrufenDll") steht automatisch der zu löschende Datensatz zur Verfügung.
    • Ausführung innerhalb der Transaktion

Beim Löschen von Teil-Datensätzen (nur in Multi-Data-Edit-Elementen):

  • Es erfolgt zunächst die Client-seitige Ausführung und beim Speichern des kompletten Datensatzes die Server-seitige Ausführung.
  • Wenn mehrere Zeilen gelöscht werden, wird dieses Makro für jede Zeile einzeln 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 einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:

  • Server-seitig: Nach dem Schreiben jedes (Teil-)Datensatzes werden die zugehörigen Makros direkt ausgeführt.
  • Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.

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:

  • Server-seitig: Nach dem Schreiben jedes (Teil-)Datensatzes werden die zugehörigen Makros direkt ausgeführt.
  • Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.

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:

  • Server-seitig: Nach dem Schreiben jedes (Teil-)Datensatzes werden die zugehörigen Makros direkt ausgeführt.
  • Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.

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):

  • Es erfolgt zunächst die Client-seitige Ausführung und beim Speichern des kompletten Datensatzes die Server-seitige Ausführung.
  • Wenn mehrere Zeilen gelöscht werden, wird dieses Makro für jede Zeile einzeln 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 einer hierarchischen Struktur von Datensätzen werden die Ereignisse wie folgt ausgelöst:

  • Server-seitig: Nach dem Schreiben jedes (Teil-)Datensatzes werden die zugehörigen Makros direkt ausgeführt.
  • Client-seitig: Vor- bzw. nach der CRUD-Methode wird nur das Makro des obersten (Haupt-)Datensatzes ausgeführt.

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").

  • 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 nur die neuen Daten zur Verfügung gestellt. Die alten Daten müssen bei Bedarf nachgelesen werden.
  • Rückgabe eines Cancel-Flags und einer Cancel-Meldung
  • Server-seitige Ausführung innerhalb der Transaktion

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)

Eigenschaften der Datensatzfelder

BereichEigenschaftWert
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:

  • 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…)

SQL

SQL-Abfrage Tabelle 1

(SqlQueryTable1)

SQL-Abfrage für Feld aus der Datentabelle.

  • 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 hier „Name“ verwendet wird.

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.

  • 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 hier „Name“ verwendet wird.

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);
Update-Fähigkeit analog zu „SqlQueryTable1“



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);
Update-Fähigkeit analog zu „SqlQueryTable1“


Datentyp

Datentyp

(DataType)

Datentyp:

  • 1 = Boolean
  • 2 = Int32
  • 3 = Decimal
  • 4 = Date
  • 5 = String
  • 6 = DateTime
  • 7 = Time
  • 8 = Duration
  • 15 = Indizierter String
  • 16 = Indiziertes Bild
  • 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:

  • "Value" als Verweis auf ein Bild in "Shared\Bitmaps\UI" (bei Datentyp 15 (indexed String) leer; "empty" = leere Anzeige, d.h. kein Icon; Dateinamen ohne Erweiterung, Standard ist automatisch hier ".png")

Anzeigereihenfolge gemäß der Liste

Tipp:

  • Soll eine Liste fester Texte (analog Werteliste im Aufgabencenter) verwendet werden, kann stattdessen eine Datenreferenz mit "FROM (VALUES ..." erstellt werden.


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:

  • Aus Sicherheitsgründen kann auf dem Client nicht direkt in SQL formuliert werden. Stattdessen wird die "SData Query Language" (siehe http://sage.github.io/SData-2.0/pages/core/0212/) verwendet, welche einem vereinfachten SQL entspricht.
  • Ergänzend wird die Maskierung mit doppelten Anführungsstrichen ( " ) automatisch in einzelne Anführungsstriche ( ' ) umgewandelt. Die Operatoren "=", "<>", ">", ">=", "<", "<=", "*", "/", "Not", "And" und "Or" werden ebenfalls in die entsprechenden SData-Operatoren umgewandelt.

     Einschränkungen:
    • Eine Negierung mit "not" muss sich immer auf einen booleschen Ausdruck beziehen.
      Richtig: not (UserName like '%Sage%')
      Falsch: UserName not like '%Sage%'

Platzhalter:

  • Im Filter können Platzhalter verwendet werden, um die Daten des aktuell geladenen Datensatzes im Filter zu verwenden. Das Format entspricht den üblichen Makro-Ausdrücken/Feldreferenzen.

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.

  • Format:
    Name:=Ausdruck[;...]

  • Beispiel:
    Art:=1;Typ:=[Typ];Kahn:="Kahn ""Der Titan"""



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:

  • <name>:=Makroausdruck[;...]

Beispiel:

  • Art:=1;Typ:=[Typ];Kahn:="Kahn ""Der Titan"""


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?

  • 0 = Nein
  • 1 = Ja, RTF-formatierter Text
  • 2 = Ja, HTML-formatierter 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:

  • nicht Update-fähige Felder, z.B. Aggregate oder Sub-Queries
  • Felder, die für interne, rein Client-seitige Steuerungen verwendet werden
    (und die nicht im Datenbankschema enthalten sind)

Wird "Schreibschutz?" aktiviert, hat dies folgende Auswirkungen:

  • Die Einstellung kann zur Laufzeit nicht mehr umgeschaltet werden (auch nicht mit dem Makro-Befehl "FestlegenNurLesen").
  • Wird der Feldinhalt geändert (dies kann für interne oder auch temporäre Zwecke sinnvoll sein), führt dies nicht dazu, dass die Daten dirty werden.

Wird "Schreibschutz?" nicht aktiviert, kann zur Laufzeit Client-seitig mit dem Makro-Befehl "FestlegenNurLesen" die Einstellung auf "True" gesetzt werden.

  • Hierbei entsteht ein im UI schreibgeschütztes Feld, welches aber auf Datenebene beschreibbar bleibt.
  • Im UI wird dadurch eine direkte Änderung im Eingabefeld durch den Benutzer verhindert. Das Eingabefeld kann aber weiterhin fokussiert werden, z.B. um den Inhalt kopieren zu können und um am Feld hängende Funktionen ausführen zu können.
  • Programmatische Änderungen des Feldinhaltes (Client- und Server-seitig) werden nicht eingeschränkt. Das Dirty-Flag wird bei Änderungen gesetzt.
  • Das Dirty-Flag wird bei Änderungen nur dann gesetzt, wenn das Feld auch tatsächlich Update-fähig ist. Zum Abfragen dieses Zustandes steht in den Metadaten des Clients das ermittelte Flag "IsUpdateable" zur Verfügung (True, wenn die zugeordnete SQL-Anweisung gefüllt ist, bzw. bei Datenstrukturen immer, da es dort kein zugeordnetes SQL gibt).

Ein Anwendungsbeispiel ist z.B. in der Belegerfassung zu finden:

  • Bei Artikeln mit Dimensionen wird das Mengenfeld gesperrt. Der Inhalt kann aber per Funktions-Schaltfläche über einen Zusatzdialog, in dem Länge/Breite/Höhe eingegeben werden, geändert werden.

Rechteverwaltung:

  • Hat der Benutzer keine Schreib-Berechtigung für das Feld, wird diese Eigenschaft vom System beim Lesen der Metadaten automatisch auf True gesetzt.


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:

  • bei angehängten Feldern (siehe „DoAppendTo“) wird der Wert verwendet, da das benutzerdefinierte Feld keine Festlegung enthält (beim Anhängen aus mehreren Lösungen heraus aber nur für die Lösung mit der niedrigsten Partner-/Lösungs-ID);
    nicht für Kombinationsfelder




Behandlung bei Datensatz kopieren

(DataCopyMode)

Sonderbehandlung bei Datensatz kopieren:

  • 0 = keine
  • 1 = Wert auf NULL setzen
  • 2 = Wert auf 0 setzen
  • 3 = Feld ausschließen


Lade-/Darstellungsverhalten

(LoadBehaviour)

Ab Version 9.0.3

Lade-/Darstellungsverhalten einer Datenreferenz:

  • 0 = Darstellung als Datenreferenz
  • 1 = Einstellbar, im Standard Darstellung als Datenreferenz
  • 2 = Einstellbar, im Standard Darstellung als Datenklasse
  • 3 = Darstellung als Datenklasse

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:

  • Dort kann keine hierarchische Suche durchgeführt werden.

Abgrenzung zur Verwendung eines Funktionsaufrufes am Feld mit dem Makrobefehl "DatensatzSuchen":

  • Dort würde die Semikolon-separierte Schlüsselliste im Feld sichtbar.

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:

  • Leeres Feld: Wird als NULL in der Datenbank gespeichert, falls die SQL-Spalte Nullable ist.
  • Feldinhalt '0': Wird als '0' in der Datenbank gespeichert.

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 Validierungbei 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):

  • True = Validierung in Ordnung
  • False = Validierungsfehler

(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:

  • in Eingabefeldern für Texte, Zahlen, etc. beim Fokusverlust
  • bei Kombinationsfeldern und Checkboxen sofort
  • bei programmgesteuerten Änderungen, beispielsweise nach dem Makro-Befehl „FestlegenFeldwert“

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:

  • Segmentierten Schlüsseln (z.B. Artikel/Variante) werden als Einheit gesehen. Bei Änderungen an beiden Segmenten wird aus Performance-Gründen jeweils das "Nach Aktualisierung"-Ereignis des ersten Segmentes aufgerufen. Das "Nach Aktualisierung"-Ereignis des zweiten Segmentes sollte daher nicht genutzt werden.
  • Server-seitig werden beim Speichern
    • zuerst für alle Felder die generischen Validierungen durchgeführt (Pflichtfeld-Prüfungen, Min-/MaxValue, etc.),
    • dann für alle Felder die hier im "Nach Aktualisierung"-Ereignis definierten Validierungen durchgeführt und
    • dann die ggf. im nachfolgenden Datensatz-"Vor Änderung"-Ereignis definierten Validierungen durchgeführt.
  • Treten bei den Feld-Validierungen Fehler auf, werden die Meldungen gesammelt und die Verarbeitung wird nach Vollendung des jeweiligen Schrittes abgebrochen.

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)

  • Das Ereignis kann bei angehängten Feldern (siehe „DoAppendTo“) definiert werden, um zusätzliche Makros ausführen zu lassen. Die Ausführung der Makros erfolgt jeweils nach aufsteigenden Partner- und Lösungs-Ids mit Sage beginnend.
  • Falls ein Feld in einem "ValidationAfterChange"-Makro eines anderen Feldes als Feldbezug in Parameter 3 des Makrobefehls "FehlerMelden" genannt wird, wird auch das "ValidationAfterChange"- Makro des anderen Feldes ausgeführt.

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“​