Einführung in App Builder - Anhang B: Die Business-Schicht in App Builder (Fortgeschritten)
Dies ist der zweite Anhang der Tutorial-Serie Einführung in App Builder. Diese Anhänge ergänzen die Lektionen der Serie und bieten detailliertere Informationen zu den eingeführten Konzepten.
In dieser Lektion werden wir die Business-Schicht von App Builder weiter erforschen – den Bereich, in dem wir Regeln erstellen.
Unions
Joins, die in Lektion 7 eingeführt wurden, werden verwendet, wenn man mit Regeln arbeitet, die Daten aus mehr als einer Tabelle in der Datenschicht abrufen. Sie kombinieren Daten horizontal und fügen Spalten aus einer zweiten Tabelle neben den Spalten der ersten Tabelle hinzu.
Unions funktionieren anders: Statt Spalten hinzuzufügen, stapeln sie Zeilen. Eine Union fügt die Ergebnisse einer Abfrage oben auf eine andere ein und erzeugt eine kombinierte Liste von Datensätzen aus mehr als einer Tabelle. Damit eine Union funktioniert, müssen beide Abfragen mindestens eine Spalte mit demselben Namen enthalten, da App Builder diese gemeinsame Spalte als Grundlage zum Stapeln der Ergebnisse verwendet. Deshalb können wir die Country-Spalten aus den Tabellen Customer und Supplier direkt kombinieren: beide Spalten haben denselben Namen.
Hinweis
Wenn man Spalten mit unterschiedlichen Namen kombinieren möchte, kann man eine Unterabfrage mit einem Alias verwenden, um eine der Spalten umzubenennen, sodass beide Namen übereinstimmen. Wenn die Datenformate zwischen den beiden Spalten unterschiedlich sind, kann man sie außerdem in einen gemeinsamen Datentyp umwandeln, um sicherzustellen, dass die Union erfolgreich ist.
Um zu demonstrieren, wie eine Union funktioniert, erstellen wir manuell eine Union, die alle Länder anzeigt, die in der Northwinds-Datenquelle vorhanden sind. Es gibt zwei Tabellen, Supplier und Customer, die eine Spalte namens Country enthalten, daher werden wir die Einträge aus beiden kombinieren.
-
Klicken Sie unter App Workbench > Rules auf + Rule.
-
Wenn der Bildschirm zur Regelerstellung angezeigt wird:
-
Geben Sie im Feld Name Supplier (Countries for Supplier and Customer) ein.
-
Wählen Sie im Feld Purpose die Option Business Object aus.
-
Stellen Sie sicher, dass Supplier im Feld Target ausgewählt ist.
-
Klicken Sie auf Create.
-
-
App Builder erstellt die Regel. Standardmäßig fügt es die Zieltabelle hinzu und wählt ihren Primärschlüssel aus. In dieser Regel interessieren uns jedoch nur die in den Tabellen vorhandenen Länder. Deaktivieren Sie daher SupplierID, wählen Sie die Spalte Country und kennzeichnen Sie sie als Primärschlüssel.
-
Wir müssen die andere Tabelle hinzufügen, die Länderinformationen enthält. Klicken Sie daher auf + Tables.
-
Suchen Sie die Tabelle Customer und klicken Sie auf Add. App Builder fügt die Tabelle Customer hinzu und Sie können sie in der Registerkarte Tables neben Supplier sehen.
-
Gehen Sie zur Registerkarte Joins.
-
App Builder hat einen Join erstellt, aber passen Sie ihn an den gewünschten Typ an. Stellen Sie sicher, dass Supplier im Feld Left ausgewählt ist und dass das Feld Type Union sagt.
-
Klicken Sie auf die Registerkarte SQL, um die Syntax Ihrer Union zu sehen:

-
Um die Ergebnisse anzuzeigen, klicken Sie auf die Schaltfläche Results im Bereich Rule.
-
Beachten Sie, dass die Ergebnisse doppelte Länder enthalten. Das ist zu erwarten: mehrere Kunden und Lieferanten haben ihren Sitz in denselben Regionen, daher erscheint jedes Land einmal für jeden Datensatz in jeder Tabelle. Um eine saubere, eindeutige Liste von Ländern zu erstellen, verwenden wir die Schaltfläche Select Distinct.
-
Navigieren Sie zurück zum Rule Builder.
-
Klicken Sie im Bereich Rule auf More > Edge Case. Das Dialogfeld Edge Case Settings wird geöffnet. Dieses Dialogfeld bietet erweiterte Kontrolle über Ihre Regel. Weitere Informationen finden Sie unter Advanced options in App workbench Rules tab.
-
Aktivieren Sie das Kontrollkästchen Select Distinct, um redundante Zeilen aus den Ergebnissen zu entfernen und sicherzustellen, dass jeder Datensatz in der Liste eindeutig ist. Klicken Sie auf Save.
-
Klicken Sie erneut auf die Schaltfläche Ergebnisse. Die Regel gibt nun eine distinct Liste aller Länder zurück, die in den Tabellen Kunde und Lieferant vertreten sind.
Übungszeit: Union-Regel als List-Steuerelement verwenden
Jetzt setzen wir die neue Union-Regel in die Praxis um. Navigieren Sie zu den Popup-Seiten Kunde und Lieferant und ändern Sie den Steuerelement-Typ des Felds Land in Liste. Wählen Sie in der Registerkarte List-Optionen das soeben erstellte Union-Business-Objekt aus und setzen Sie sowohl den Schlüssel als auch den Titel auf die Spalte Land.
CRUD-Regeln
CRUD-Regeln wurden in Lektion 7 vorgestellt, doch werfen wir nun einen genaueren Blick auf sie.
Das Akronym CRUD steht für „Create, Read, Update, Delete". Das bedeutet, dass Entwickler CRUD-Regeln verwenden, um Datensätze aus den Tabellen der Datenquelle einzufügen, abzurufen, zu ändern oder zu löschen.
Zielschicht: Business vs. Daten
Beim Erstellen einer CRUD-Regel müssen Sie eine Zielschicht auswählen: entweder die Business-Schicht oder die Datenschicht. Diese Wahl ist entscheidend und hat erhebliche Auswirkungen.
Die Business-Schicht als Ziel ist der empfohlene Ansatz für die meisten Operationen. Wenn eine CRUD-Regel auf die Business-Schicht abzielt (z. B. auf das Business-Objekt Bestellung (Quelle)), verhält sie sich wie ein Benutzer, der mit der Anwendung interagiert. Sie triggert alle intrinsischen Ereignisse (Speichern, Aktualisieren usw.), die mit diesem Business-Objekt verknüpft sind. Das bedeutet, dass alle konfigurierten Validierungsregeln, benutzerdefinierten Aktionen und Audit-lite-Verfolgung automatisch ausgeführt werden. Dieser Ansatz gewährleistet Datenintegrität und Konsistenz mit der Logik der Anwendung. Außerdem können Sie Success-, Failure- und Rollback-Handler für das Ereignis verwenden.
Die Datenschicht als Ziel umgeht alle Business-Logik. Wenn Sie auf die Datenschicht abzielen (z. B. auf die Tabelle Bestellung), interagiert die Regel direkt mit der Datenbank. Sie triggert keine intrinsischen Ereignisse, Validierungen oder auf dem Business-Objekt konfigurierte Audit-Verfolgung. Dies ist ein „Hintertür"-Ansatz, der für hochperformante Bulk-Operationen nützlich ist, bei denen Sie absichtlich Business-Logik umgehen möchten.
Diesen Unterschied können Sie visuell im Visual Workflow sehen: Eine Regel, die auf die Business-Schicht abzielt, zeigt Teilprozesse für ihre Event-Logik an, während eine Regel, die auf die Datenschicht abzielt, dies nicht tut.
Hinweis
App Builder unterstützt auch XP-CRUD-Regeln, bei denen es sich um spezialisierte Regeln zum Schreiben von Daten zwischen zwei verschiedenen Datenquellen handelt. Diese Regeln werden immer über die Business-Schicht ausgeführt, um sicherzustellen, dass die gesamte Logik angewendet wird. Weitere Informationen finden Sie unter CRUD (Regel).
CRUD-Update
Schauen wir uns zunächst an, wie eine CRUD-Update-Regel erstellt wird. Das bedeutet, bestehende Datensätze in einer Tabelle zu ändern. Zur Veranschaulichung erstellen wir eine Regel, die alle Mengen der bestellten Produkte erhöht.
-
Klicken Sie in App Workbench > Regeln auf + Regel.
-
Geben Sie im Feld Name
BestellDetail (Menge + 1)ein. -
Wählen Sie im Feld Zweck die Option CRUD aus.
-
Wählen Sie im Feld Aktion die Option Update aus.
-
Wählen Sie unter Zielschicht die Option Datenschicht aus. (Für dieses einfache Bulk-Update umgehen wir die Business-Logik).
-
Wählen Sie im Feld Ziel die Option BestellDetail aus.
-
Klicken Sie auf Erstellen. App Builder benötigt einige Sekunden, um die Regel zu erstellen.
-
In der Registerkarte Tabellen wird die Tabelle BestellDetail angezeigt, mit dem Primärschlüssel BestellDetailID ausgewählt. Wählen Sie auch die Spalte Menge durch Klicken auf das Kontrollkästchen aus.
-
Wir fügen eine neue Spalte mit einem Alias hinzu, um zu visualisieren, dass die Regel funktioniert. Gehen Sie zur Registerkarte Spalten und klicken Sie auf + Spalte. Geben Sie im Dialog Spalte - Spalte hinzufügen die folgenden Informationen ein:
-
Geben Sie im Feld Spalte oder Ausdruck
OD.Menge + 1ein. -
Geben Sie im Feld Alias einen aussagekräftigen Namen ein. Wir verwenden
MengePlus. -
Wählen Sie im Feld Ziel die Option Menge aus. Dies teilt App Builder mit, dass das Ergebnis dieses Ausdrucks in die Spalte Menge geschrieben werden soll.
-
-
Klicke auf Speichern.
-
Im Tab Columns sehen Sie jetzt sowohl Quantity als auch QuantityPlus. Die ursprüngliche Spalte OD.Quantity wird standardmäßig auch auf Quantity abgebildet. Sie müssen die Abbildung aufheben, um Mehrdeutigkeiten zu vermeiden:
-
Suche die Zeile OD.Quantity in der Liste Columns.
-
Klicke auf das Dropdown-Menü Target. Ein X-Button erscheint daneben. Klicke darauf, um die Abbildung der Spalte aufzuheben.
Dies stellt sicher, dass nur der Ausdruck QuantityPlus zum Aktualisieren der Spalte Quantity verwendet wird. Falls beide abgebildet wären, würde derjenige mit dem höheren Index „gewinnen", was zu unvorhersehbarem Verhalten führt.
-
-
Die Regel ist bereit. Im Panel Rule klicke auf das Panel Results, um sie in Aktion zu sehen. Beachte, dass die zusätzliche Spalte, die du hinzugefügt hast, alle Mengen um eins erhöht:

Regel kopieren
Überlege dir, wie du eine CRUD-Aktualisierungsregel ähnlich derjenigen erstellen würdest, die wir oben erstellt haben, aber mit umgekehrter Wirkung – also eine Regel, die alle Einträge in der Spalte Quantity der Tabelle OrderDetail um eins reduziert. Anstatt diese Regel von Grund auf zu erstellen, nutzen wir die Funktion Copy Rule von App Builder, die eine vorhandene Regel dupliziert, damit du sie als Ausgangspunkt verwendest und Zeit sparst, wenn du Regeln erstellst, die denen ähneln, die du bereits erstellt hast.
-
Suche in App Workbench > Rules die Regel
OrderDetail (Quantity + 1)und klicke auf More > Copy Rule. -
Klicke auf Copy.
-
App Builder erstellt die neue Regel und benennt sie
OrderDetail (Quantity + 1) (New). Du wirst direkt zum Bearbeitungsbildschirm geleitet. Im Panel Rule aktualisiere das Feld Name aufOrderDetail (Quantity - 1)und navigiere dann zum Tab Columns. -
Suche den Ausdruck
OD.Quantity + 1und bearbeite ihn. Ändere den Ausdruck inOD.Quantity - 1und aktualisiere den Alias vonQuantityPluszuQuantityMinus. Klicke auf Speichern. -
Überprüfe, ob die Regel korrekt funktioniert, indem du im Panel Rule auf Results klickst.
Übungszeit: Mengensteuerelemente hinzufügen
Jetzt, da du beide Mengenregeln hast, verbinde sie mit dem Panel Order Details auf der Seite Orders.
-
Öffne das Geschäftsobjekt OrderDetail (Source) und erstelle ein benutzerdefiniertes Ereignis für die Regel
OrderDetail (Quantity + 1). Gib im Dialog zur EreigniserstellungQuantity Plusin das Feld Name ein und setze Refresh Scope auf Row. Dies stellt sicher, dass beim Auslösen des Ereignisses nur die betroffene Zeile aktualisiert wird und nicht das gesamte Panel. -
Wiederhole Schritt 1, um ein zweites Ereignis mit dem Namen
Quantity Minuszu erstellen, das die RegelOrderDetail (Quantity - 1)anhängt und Refresh Scope ebenfalls auf Row setzt. -
Navigiere zum Bearbeitungsbildschirm der Seite Orders. Füge im Panel Order Details zwei Button-Steuerelemente hinzu: eines, das das Ereignis
Quantity Plusausführt, und eines, das das EreignisQuantity Minusausführt. -
Besuche die Vorschau der Seite Orders und teste die neuen Buttons.
CRUD-Löschung
CRUD-Löschungsregeln werden verwendet, um Datensätze aus Tabellen zu löschen. Da es jedoch einfach ist, Oberflächenelemente zum Löschen einzelner Datensätze zu verwenden, werden CRUD-Löschungsregeln normalerweise nur zum Löschen vieler Datensätze auf einmal verwendet. Um dies zu demonstrieren, erstellen wir eine CRUD-Löschungsregel, die alle Bestelldetails löscht, die mit einer einzelnen Bestellung verknüpft sind, um die Notwendigkeit zu beseitigen, alle Bestelldetails separat zu löschen, wenn eine Bestellung storniert wird.
-
Klicke in App Workbench > Rules auf + Rule.
-
Gib im Feld Name
OrderDetail (Delete OrderDetail for Order)ein. -
Wähle im Feld Purpose die Option CRUD.
-
Wähle im Feld Action die Option Delete.
-
Wähle unter Target Layer die Option Data Layer.
-
Wähle im Feld Target die Option OrderDetail.
-
Klicke auf Create.
-
Im Tab Tables hat App Builder die Tabelle OrderDetail hinzugefügt und ihren Primärschlüssel OrderDetailID ausgewählt. Behalte diese Auswahl bei, da die Abbildung des Primärschlüssels die effizienteste und sicherste Methode zum Durchführen einer Löschoperation ist. Wähle auch die Spalte OrderID; wir werden diese Spalte im nächsten Abschnitt verwenden, um die Regel an eine bestimmte Bestellung zu binden.
Ereignisse
CRUD-Regeln können nur verwendet werden, wenn sie an Ereignisse angehängt sind, die in Tabellen oder Geschäftsobjekten integrierte Prozesse darstellen und als Reaktion auf bestimmte Aktionen ausgeführt werden, beispielsweise beim Speichern eines Datensatzes. Alle Tabellen und Geschäftsobjekte verfügen inhärent über vier Ereignisse: Speichern, Aktualisieren, Löschen und Einfügen, die beim Ändern von Datensätzen im App Builder ausgeführt werden.
Aktivieren wir die CRUD-Regeln, die wir erstellt haben. Dazu erstellen wir eigene benutzerdefinierte Ereignisse. Im Gegensatz zu inhärenten Ereignissen müssen benutzerdefinierte Ereignisse an ein Steuerelement angehängt werden, um ausgeführt zu werden. Die CRUD-Regeln, die wir erstellen, erfordern benutzerdefinierte Ereignisse, um sie auszuführen, wenn wir es möchten.
Erstellen wir zunächst ein benutzerdefiniertes Ereignis, das mit unserer CRUD-Löschregel verknüpft wird, damit verwandte Bestelldetails gelöscht werden, wenn eine Bestellung gelöscht wird.
-
Suchen Sie unter App Workbench > Regeln die Regel Bestellung (Quelle) auf und öffnen Sie sie.
-
Klicken Sie im Bereich Regel auf Ereignisse. Die Seite Alle Ereignisse (Bestellung (Quelle)) wird geöffnet. Sie listet die vier inhärenten Ereignisse auf, die App Builder für jede Tabelle und jedes Geschäftsobjekt umfasst: Einfügen, Speichern, Aktualisieren und Löschen. Eine vollständige Beschreibung dieser Seite und ihrer Optionen finden Sie unter Ereignis konfigurieren.
-
Da wir ein benutzerdefiniertes Ereignis erstellen, klicken Sie auf + Regelereignis. Die Seite Ereignis wird geöffnet, auf der Sie die Details des neuen Ereignisses hinzufügen können (siehe Optionen für Ereignisdetails für eine vollständige Beschreibung aller Felder):
-
Geben Sie unter Ereignisinformationen im Feld Name
Bestelldetails löschenein. -
Geben Sie unter Meldungen im Feld Bestätigung eine Meldung ein, die Benutzern angezeigt wird, bevor das Ereignis ausgeführt wird, und sie auffordert, zu bestätigen, ob sie fortfahren möchten. Die Meldung sollte klar angeben, was passiert, wenn der Benutzer fortfährt, um versehentliche Aktionen zu verhindern. Weitere Informationen zu anderen Meldungstypen finden Sie unter Ereignis konfigurieren.

-
Aktivieren Sie im Abschnitt Ausführungseigenschaften das Kontrollkästchen Transaktion. Dies stellt sicher, dass das Ereignis eine Alles-oder-Nichts-Ausführung ist: Da unsere Löschregel mehrere Positionen beeinflusst, garantiert eine Transaktion, dass App Builder alle Änderungen zurückrollt, wenn ein Fehler in der Mitte auftritt. Dies verhindert ein Szenario, bei dem einige Datensätze gelöscht werden, während andere bestehen bleiben und die Daten in einem inkonsistenten Zustand hinterlassen. Eine vollständige Beschreibung aller Optionen in diesem Abschnitt finden Sie unter Ausführungseigenschaften.
-
Belassen Sie die anderen Felder mit ihren Standardeinstellungen und klicken Sie auf Speichern. App Builder erstellt das Ereignis.
Hinweis
Bei Szenarien mit gleichzeitigem Zugriff, bei denen die Datenintegrität gefährdet sein könnte, stellt App Builder auch Ereignissperrung bereit, die die serielle Ausführung erzwingt und auf einzelne Datensätze begrenzt werden kann. Lassen Sie dies für das aktuelle Ereignis deaktiviert, aber denken Sie daran für Umgebungen mit hohem Datenverkehr oder komplexe Workflows, bei denen die Synchronisierung auf Datensatzebene erforderlich ist.
-
-
Das Ereignis wurde erstellt und App Builder zeigt Ihnen seinen Konfigurationsbildschirm:

Sie befinden sich derzeit in der Gitteransicht (im obigen Screenshot dargestellt), die eine allgemeine Übersicht aller Aktionen und Validierungen enthält, die für dieses Ereignis registriert sind. Eine alternative Ansicht des Ereignisses kann im Visual Workflow Editor angezeigt werden, der die Ausführungsreihenfolge und die Beziehung zwischen vererbten Ereignissen zeigt. Um diesen anzuzeigen, klicken Sie auf das Symbol im Bereich Ereignis. Um jederzeit zur Gitteransicht zurückzukehren, klicken Sie auf das Symbol, das es ersetzt.
Der Visual Workflow Editor wandelt Ihre Ereignisse in interaktive Flussdiagramme um, um die Visualisierung des Pfads zu erleichtern, den Ihre Daten beim Durchlaufen des Systems nehmen. Jedes Ereignis wird als Prozess mit eindeutigen Start- und Endpunkten zugeordnet, und Teilprozesse, die mit einem Pluszeichen gekennzeichnet sind, können doppelt angeklickt werden, um in tiefere Logikebenen zu bohren. Sie können die dedizierten Schaltflächen verwenden, um neue Aktionen oder Validierungen direkt in die Sequenz einzufügen, und beliebige Knoten auswählen, um deren Details zu bearbeiten, zu löschen oder innerhalb der Logikkette neu zu ordnen. Eine vollständige Beschreibung der Funktionen finden Sie unter Visual Workflow Editor.
-
Das Ereignis hat noch keine Aktionen zugeordnet. Im Rasteransicht-Modus wird die Aktionen-Leiste leer angezeigt. Klicken Sie auf die Schaltfläche Registrieren. Im Visual Workflow Editor klicken Sie auf die Schaltfläche + Aktion am oberen Rand des Bereichs Ereignisdiagramm. Dadurch wird das Dialogfeld Aktion geöffnet:
-
Wählen Sie im Feld Typ die Option Regel aus.
-
Wählen Sie im Feld Regel die Option OrderDetail (Delete OrderDetail for Order) aus, die CRUD-Löschregel, die wir zuvor erstellt haben.
-
Lassen Sie die anderen Felder mit ihren Standardwerten. Dazu gehören Positions-Einstellungen, die die Ausführungsreihenfolge und das Timing steuern. Eine vollständige Beschreibung finden Sie unter Event action types. Klicken Sie auf Speichern. Das Dialogfeld für die Aktion zeigt weitere Details:

-
Klicken Sie im Bereich Bindungen auf + Bindung. Wählen Sie OrderID als Quellspalte und OrderID als Regelspalte aus.
Hinweis
Dieser Bindungsschritt ist entscheidend, da die Ergebnisse der Regel nach dem Panel-Datensatz gefiltert werden, gegen den das Ereignis ausgelöst wurde. Falls ungebunden, würde die Löschregel alle Datensätze in der Tabelle OrderDetail beeinflussen. Durch Bindung der Quellspalte (OrderID aus dem Order (Source)-Panel-Datensatz) an die Regelspalte (OrderID in unserer Löschregel) wird ein impliziter Filter hinzugefügt (z. B.
WHERE OrderID = 10248).Dies stellt sicher, dass nur die OrderDetail-Datensätze mit dieser spezifischen OrderID gelöscht werden. Falls diese Bindung weggelassen würde, würde das Ereignis auslösen alle Datensätze aus der Tabelle OrderDetail löschen.
-
Klicken Sie auf Speichern.
-
-
Das benutzerdefinierte Ereignis ist jetzt bereit zur Implementierung.
Weitere Informationen
Zusätzlich zu dem in diesem Beispiel gezeigten kann die Ereigniskonfiguration in App Builder auch Folgendes umfassen:
-
Wo Ereignisse konfiguriert werden: Ereignisse können auf der Geschäftsebene (Geschäftsobjekte) oder der Datenschicht (Tabellen) konfiguriert werden. Durch Registrierung von Ereignissen auf der Geschäftsebene können Sie eine unterschiedliche Logik pro Oberfläche ermöglichen, während Datenschicht-Ereignisse global sind. Weitere Informationen finden Sie unter Where events get configured.
-
Ereignisvererbung: Geschäftsobjekte können Ereignislogik von der zugrunde liegenden Tabelle oder anderen Quellen erben. Weitere Informationen finden Sie unter Event inheritance.
Jetzt sind Sie dran: Steuerelement zum Löschen hinzufügen
Jetzt, da die Löschregel und das Ereignis bereit sind, setzen wir sie in der Benutzeroberfläche um. Fügen Sie dem Bereich Bestellungen eine Schaltfläche Delete Order Details hinzu und verbinden Sie sie mit dem soeben konfigurierten Ereignis Delete Order Details. Dies ermöglicht es Ihren Benutzern, die gesamten Bestelldetails mit einem einzigen Klick zu löschen.
Subquery-Regeln
Eine Subquery-Regel fungiert als Logik-Vermittler und berechnet oder passt Daten an, bevor sie an ein anderes Objekt weitergeleitet werden. Im Gegensatz zu Standardregeln, die direkt mit einem Datensatz interagieren, schreiben Subquerys nicht in Tabellen zurück. Stattdessen führen sie eine bestimmte Operation (z. B. eine Aggregation) aus, um einen Wert für die Verwendung an anderer Stelle in Ihrer Anwendung zu generieren.
Wir werden dies demonstrieren, indem wir eine Subquery-Regel erstellen. Sie wird verwendet, um die maximale OrderNumber der Tabelle Order zu finden und dann eins dazuzuaddieren. Wir werden später eine CRUD-Regel erstellen, um eine Bestellung zu kopieren, und sie wird von dieser Subquery abhängen, um zu funktionieren.
-
Klicken Sie in App Workbench > Regeln auf + Regel.
-
Geben Sie im Feld Name die Bezeichnung
Order (OrderNumber + 1)ein. -
Wählen Sie im Feld Zweck die Option Subquery aus.
-
Wählen Sie im Feld Ziel die Option Order aus.
-
Klicken Sie auf Erstellen. App Builder erstellt die neue Regel.
-
App Builder wählt automatisch den Primärschlüssel der Tabelle Order aus, aber diese Regel benötigt ihn nicht. Heben Sie die Auswahl im Tab Tabellen auf.
Warum
OrderIDdeselektieren?Bei Verwendung einer Aggregatfunktion wie in unserem Fall führt das Hinzufügen einer anderen Spalte zur Abfrage (z. B. OrderID) dazu, dass die Datenbank eine
GROUP BY-Klausel für diese Spalte anwendet.
Wenn wir OrderID eingebunden hätten, würde der Ausdruck die maximale OrderNumber pro OrderID finden. Dies würde nur die OrderNumber für jede Bestellung zurückgeben, was nicht das gewünschte Ergebnis ist.
Um die einzelne maximale OrderNumber über die gesamte Tabelle hinweg zu finden, darf man keine anderen Spalten in die Abfrage einbeziehen. Deshalb verwenden wir eine Unterabfrage: um diese Aggregatberechnung zuerst durchzuführen, damit sie in einer anderen Regel verwendet werden kann.
-
Klicken Sie auf der Registerkarte Columns auf + Column. Das Dialogfeld Column - Add Column wird geöffnet.
-
Geben Sie im Feld Column or Expression den Ausdruck
Max(O.OrderNumber) + 1ein. Die SyntaxMax()ruft die Max()-Funktion auf, die den größten Wert in der SpalteO.OrderNumberfindet. Anschließend wird eins dazu addiert. -
Geben Sie im Feld Alias and Target einen geeigneten Alias für diese Spalte ein, z. B.
MaxOrderNumber. -
Wählen Sie im Feld Logical Data Type die Option Number, da OrderNumber kein UUID-Wert, sondern eine natürliche Zahl ist.
-
Klicken Sie auf Save.
-
Überprüfen Sie, ob die Regel ordnungsgemäß funktioniert, indem Sie auf die Schaltfläche Results klicken. Es sollte nur eine Zeile mit einer Bestellnummer vorhanden sein, die um eins höher sein sollte als die größte derzeit in der Tabelle Order vorhandene Bestellnummer.
Nun erstellen wir eine CRUD-Regel, die eine Bestellung kopieren kann. Diese CRUD-Regel basiert auf der soeben erstellten Unterabfrage-Regel.
-
Klicken Sie in App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name den Namen
Order (Copy Order)ein. -
Wählen Sie im Feld Purpose die Option CRUD.
-
Wählen Sie im Feld Action die Option Insert.
-
Wählen Sie im Feld Target Layer die Option Logic Layer.
-
Wählen Sie im Feld Target die Option Order.
-
Klicken Sie auf Create. App Builder erstellt die Regel.
Nach der Erstellung der Regel konfigurieren Sie deren Spalten und Ziele:
-
App Builder hat die Tabelle Order auf der Registerkarte Tables automatisch hinzugefügt, aber wir benötigen mehr. Klicken Sie auf + Tables.
-
Wählen Sie die Unterabfrage-Regel aus, die wir zu diesem Zweck erstellt haben, Order (OrderNumber + 1). Klicken Sie auf Add.
-
Aktivieren Sie auf der Registerkarte Tables das Kontrollkästchen neben der Suchleiste oben in der Spaltenliste. Dies wählt alle vorhandenen Spalten der Tabelle Order auf einmal aus.
-
Klicken Sie auf den Namen der Tabelle Order. Das Dialogfeld Table wird geöffnet. Aktivieren Sie unter Select all Columns das Kontrollkästchen. Dies stellt sicher, dass zukünftig hinzugefügte Spalten zur Tabelle Order automatisch in diese Regel eingebunden werden. Schließen Sie das Dialogfeld.
-
Wählen Sie aus der Unterabfrage-Tabelle Order (OrderNumber + 1) die einzige Spalte MaxOrderNumber aus.
-
Verfeinern Sie auf der Registerkarte Columns die Datenzuordnung der Regel wie folgt:
- Entfernen Sie das Ziel für OrderID. Da dies ein automatisch generierter Primärschlüssel ist, weist die Business Layer automatisch einen eindeutigen Wert zu, wenn die Regel ausgeführt wird.
- OrderNumber: Bestätigen Sie, dass die Zeile OON.MaxOrderNumber auf OrderNumber ausgerichtet ist und den neuen erhöhten Wert der richtigen Spalte zuordnet.
- OrderDate: Klicken Sie auf das Feld Column or Expression für diese Spalte und ersetzen Sie den aktuellen Wert durch
Now(), um das Datum der kopierten Bestellung auf heute zu setzen. - Nicht alle Spalten sind in dieser Regel erforderlich. Entfernen Sie die folgenden:
- RequiredDate, ShippedDate und Freight: Diese Details sollten für die neue Bestellung manuell eingegeben werden, anstatt vom Original dupliziert zu werden.
- AddedOn, AddedBy, ChangedOn, ChangedBy und IsActive: App Builder generiert diese Werte automatisch bei der Erstellung.
Weitere Informationen
Weitere Informationen zu diesem Konzept finden Sie unter Target in business object rules.
-
Klicken Sie im Panel Rule auf Results, um zu überprüfen, ob die Regel ordnungsgemäß funktioniert.
Nun erstellen wir eine zweite CRUD-Regel zum Kopieren der Positionen der Bestellung. Diese Regel wird als Success Handler für das Ereignis Copy Order registriert, um sicherzustellen, dass die Detailzeilen erst erstellt werden, wenn der neue Bestelldatensatz vorhanden ist.
-
Klicken Sie in App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name
OrderDetail (Insert) Copy Order Detailein. -
Wählen Sie im Feld Purpose CRUD aus.
-
Wählen Sie im Feld Action Insert aus.
-
Wählen Sie im Feld Target Layer Logic Layer aus.
-
Wählen Sie im Feld Target OrderDetail aus.
-
Klicken Sie auf Create.
-
Aktivieren Sie auf der Registerkarte Tables das Kontrollkästchen neben der Suchleiste, um alle vorhandenen Spalten auf einmal auszuwählen. Klicken Sie dann auf den Tabellennamen OrderDetail, aktivieren Sie Select all Columns im Dialog Table, und schließen Sie den Dialog.
-
Nehmen Sie auf der Registerkarte Columns die folgenden Änderungen vor:
- Löschen Sie die Audit-Lite- und benutzerwählbaren Spalten (AddedOn, AddedBy, ChangedOn, ChangedBy, IsActive). Diese werden bei der Erstellung automatisch ausgefüllt.
- Aktualisieren Sie den Ausdruck für OrderDetailID zu
NewUUID(). Dies stellt sicher, dass jedes kopierte Einzelelement einen eindeutigen Identifier erhält. - Entfernen Sie das Ziel für OrderID und legen Sie seinen Alias auf
BindOrderIDfest. Dieser Wert stellt die ID der ursprünglichen Bestellung dar, die wir während des Ereignisses zum Binden verwenden. - Fügen Sie einen neuen Ausdruck mit
Generated()hinzu, der auf OrderID ausgerichtet ist. Die FunktionGenerated()ruft einen Wert ab, der während der aktuellen Ereignisausführung erstellt wurde, und akzeptiert zwei Argumente: den Wert und den Datentyp. Geben SieGenerated('OrderID', 'UUID')als Ausdruck ein.
-
Klicken Sie auf Results, um die Regel zu überprüfen.
Wir haben nun beide Kopierregeln erstellt. Fügen wir die Regel Copy Order an ein benutzerdefiniertes Ereignis an und verbinden die Regel Copy Order Lines so, dass sie automatisch bei deren Erfolg ausgelöst wird.
-
Suchen Sie unter App Workbench > Rules die Regel Order (Source) auf und öffnen Sie sie.
-
Klicken Sie im Bereich Rule auf Events. Die Seite All Events (Order (Source)) wird geöffnet.
-
Klicken Sie auf + Rule Event. Die Seite Event wird geöffnet:
-
Geben Sie unter Event Information im Feld Name
Copy Orderein. -
Wählen Sie im Feld Refresh Scope Panel Refresh aus. Dies stellt sicher, dass sich der Bereich sofort nach Abschluss der Kopie aktualisiert, damit die neue Bestellung ohne manuelle Aktualisierung angezeigt wird.
-
Konfigurieren Sie unter Messages mit dynamischer Substitution eine Bestätigungs-, Erfolgs- und Fehlermeldung. Mithilfe von doppelten geschweiften Klammern können Sie Echtzeitdaten aus der zugrunde liegenden Regel abrufen und in den Text einfügen. Da dieses Ereignis in der Regel Order (Source) registriert ist, haben Sie Zugriff auf alle ihre Spalten. Beispiel:
- Confirmation:
Are you sure you want to duplicate order {{OrderNumber}}? - Success:
Order {{OrderNumber}} has been successfully copied! - Failure:
Error: Order {{OrderNumber}} failed to copy!
- Confirmation:
-
Aktivieren Sie im Abschnitt Execution Properties das Kontrollkästchen Transaction, um die Datenintegrität sicherzustellen, indem der gesamte Prozess zurückgerollt wird, wenn ein Teil der Duplizierung fehlschlägt.
-
Behalten Sie die anderen Felder mit ihren Standardauswahlen bei und klicken Sie auf Save.
Hinweis
Unter Event detail options finden Sie eine vollständige Beschreibung aller Felder.
-
-
Das Ereignis wurde erstellt. Klicken Sie im Bereich Actions auf Register. Der Dialog Action wird geöffnet:
- Wählen Sie im Feld Type Rule aus.
- Wählen Sie im Feld Rule Order (Copy Order) aus.
- Klicken Sie im Bereich Bindings auf + Binding. Wählen Sie OrderID als Source Column und OrderID als Rule Column aus. Die Verwendung von OrderID zum Binden ist zuverlässiger als OrderNumber, das möglicherweise nicht eindeutig ist.
- Speichern.
-
Im Bereich Actions gibt es ein Feld Handlers, das drei Schaltflächen anzeigt: Success, Failure und Rollback:
- Success Handler: Wird nur ausgelöst, wenn die übergeordnete Regel erfolgreich abgeschlossen wird. Verwenden Sie diese Option, um Logik zu verketten, beispielsweise das Kopieren unserer Bestelldetails, die davon abhängen, dass der übergeordnete Datensatz zuerst vorhanden ist.
- Failure Handler: Wird nur ausgelöst, wenn die übergeordnete Regel auf einen Fehler trifft. Verwenden Sie diese Option, um Benachrichtigungen zu senden, Fehler zu protokollieren oder kompensierende Aktionen auszulösen.
- Rollback Handler: Wird bei der Arbeit mit Systemen verwendet, die Standard-Datenbanktransaktionen nicht unterstützen, beispielsweise eine REST-API von Drittanbietern. Sie führt Aktionen in umgekehrter chronologischer Reihenfolge aus, um die Regelausführung bis zu diesem Punkt manuell rückgängig zu machen.
Klicken Sie auf Success (Erfolg). Das Dialogfeld Success Handlers (Erfolg-Handler) öffnet sich. Klicken Sie auf Create (Erstellen). Das Dialogfeld Action (Aktion) öffnet sich:
- Wählen Sie im Feld Type (Typ) die Option Rule (Regel).
- Wählen Sie im Feld Rule (Regel) die Option OrderDetail (Insert) Copy Order Detail (OrderDetail (Einfügen) Bestelldetail kopieren).
- Speichern.
- Klicken Sie im Bereich Bindings (Bindungen) auf + Binding (+ Bindung) und ordnen Sie folgende Elemente zu:
- Source Column (Quellspalte): Wählen Sie OrderID (die eindeutige ID der gerade kopierten Bestellung).
- Rule Column (Regelspalte): Wählen Sie BindOrderID (der Alias, den wir in der Regel erstellt haben, um den Quelldatensatz zu identifizieren).
-
Speichern.
-
Schließen Sie die offenen Dialogfelder und navigieren Sie zum Visual Workflow Editor (Visual-Workflow-Editor), indem Sie auf das Symbol klicken. Das Ereignisdiagramm ist nun komplexer als das Ereignis Delete Order Details (Bestelldetails löschen), das wir zuvor überprüft haben. Beachten Sie folgende Punkte:
- Logic Layer (Logikebene): Sowohl die Regeln Copy Order (Bestellung kopieren) als auch Copy Order Lines (Bestellpositionen kopieren) laufen durch die Geschäftsebene, weshalb beide Regelblöcke das +-Symbol anzeigen. Doppelklicken Sie auf einen beliebigen Block, um direkt zu den übergeordneten Ereignissen zu navigieren, die er auslöst.
- Conditional paths (Bedingte Pfade): Sie können die Verzweigungspfade für Success (Erfolg) und Failure (Fehler) sehen. Der Pfad Success (Erfolg) zeigt die ausgelöste Regel Copy Order Lines (Bestellpositionen kopieren), während der Pfad Failure (Fehler) keine nachfolgenden Ereignisse anzeigt. Dies bestätigt, dass der Prozess stoppt, wenn das primäre Kopieren fehlschlägt.
Übungszeit: Kopiersteuerung hinzufügen
Jetzt, da Ihre Kopierregeln und das Ereignis bereit sind, können Sie diese in Betrieb nehmen. Fügen Sie eine Schaltfläche Copy (Kopieren) zum Bereich Orders (Bestellungen) hinzu und verknüpfen Sie diese mit dem gerade erstellten Ereignis Copy Order (Bestellung kopieren). Nachdem die Schaltfläche hinzugefügt wurde, testen Sie diese: Sie sollten die Bestätigungsmeldung mit der dynamischen Bestellnummer sehen, und nach erfolgreicher Ausführung sollte eine neue Bestellung mit der nächsten verfügbaren Bestellnummer angezeigt werden.
Validierungen
Validierungsregeln werden verwendet, um sicherzustellen, dass in App Builder eingegebene Daten gültig sind, bevor sie gespeichert werden. In Lektion 7 haben wir eine einfache Validierung für erforderliche Felder behandelt. Jetzt werden wir uns ein komplexeres Validierungsszenario mit benutzerdefinierter Logik und dynamischen Fehlermeldungen ansehen.
Wie andere Regeln müssen Validierungsregeln an ein Ereignis angehängt werden, um verwendet zu werden. Die Wahl des Ereignisses hängt vom Anwendungsfall ab:
-
Intrinsic event (Intrinsisches Ereignis): Verwenden Sie dieses, wenn die Validierung automatisch während Standardvorgängen ausgeführt werden soll (z. B. das Verhindern eines Speichervorgangs bei ungültigen Daten).
-
Custom event (Benutzerdefiniertes Ereignis): Verwenden Sie dieses, wenn Sie die Validierung auf Anforderung von einem bestimmten Steuerelement aus auslösen möchten (z. B. durch Klicken auf eine Schaltfläche).
Erstellen wir eine Validierungsregel, um sicherzustellen, dass ein Rabatt auf eine Bestellung niemals größer als 10% ist. Wir möchten, dass diese jedes Mal ausgeführt wird, wenn ein OrderDetail-Datensatz gespeichert wird. Daher hängen wir sie an das intrinsische Speicherereignis an.
-
Klicken Sie im App Workbench > Rules auf + Rule (+ Regel).
-
Geben Sie im Feld Name (Name)
OrderDetail (Validate Discount)ein. -
Wählen Sie im Feld Purpose (Zweck) die Option Validation (Validierung).
-
Wählen Sie im Feld Target (Ziel) die Option OrderDetail.
-
Klicken Sie auf Create (Erstellen).
-
Wählen Sie auf der Registerkarte Tables (Tabellen) die Spalte Discount (Rabatt) aus (Sie können OrderDetailID abwählen).
-
Klicken Sie auf der Registerkarte Where (Wo) auf + Where Clause (+ Where-Klausel). Ein Dialogfeld öffnet sich, in dem Sie
WHERE-Klauseln erstellen können:
-
Geben Sie im Feld Left Expression (Linker Ausdruck)
OD.Discountein. -
Wählen Sie im Feld Operator (Operator) die Option
>aus. -
Geben Sie im Feld Right Expression (Rechter Ausdruck)
0.1ein.
-
-
Klicken Sie auf Save (Speichern).
Die Regel ist nun erstellt. Sie ist so ausgelegt, dass sie „fehlerhafte" Daten findet (Datensätze, bei denen der Rabatt über 10% liegt).
Dynamischer Schwellenwert
Im letzten Schritt haben wir ein Limit von 10% hart codiert. Jetzt machen wir es konfigurierbar: Wir speichern den Schwellenwert als Anwendungsparameter, damit das Unternehmen ihn über die Benutzeroberfläche aktualisieren kann, ohne die Regel selbst zu verändern. Führen Sie die folgenden Schritte mit Fähigkeiten aus früheren Lektionen durch:
-
Fügen Sie eine Spalte
DiscountMaximumzur Tabelle Parameter (Parameter) hinzu. Setzen Sie den Logical Data Type (Logischer Datentyp) auf Percent (Prozent) und die Skalierung auf 4, um präzise Werte wie 12,25% zu erfassen. -
Navigieren Sie zur Seite Parameter. Auf dem Tabellenbearbeitungsbildschirm bietet die Schaltfläche Pages eine Verknüpfung: Sie listet alle Seiten auf, die diese Tabelle derzeit verwenden, und ermöglicht es Ihnen, direkt zur richtigen Seite zu springen.
-
Fügen Sie DiscountMaximum als numerisches Steuerelement zur Seite hinzu und füllen Sie es mit einem Wert wie
.3auf, um Rabatte von bis zu 30 % zu ermöglichen. -
Kehren Sie zu App Workbench > Rules zurück und öffnen Sie die Regel
OrderDetail (Validate Discount). -
Klicken Sie auf der Registerkarte Tables auf + Tables und fügen Sie die Tabelle Parameter hinzu. Wählen Sie die Spalte DiscountMaximum aus.
-
Klicken Sie auf der Registerkarte Where auf das Stiftsymbol, um die WHERE-Klausel zu bearbeiten. Ersetzen Sie im Feld Right Expression den Wert
0.1durchP.DiscountMaximum.
Der Wert, der jetzt auf der Seite Parameter festgelegt wird, steuert den Schwellenwert für diese Validierung.
Validierungsregel zuordnen
Jetzt ordnen wir die Validierungsregel dem systeminternen Speicherereignis für OrderDetail zu.
-
Suchen Sie in App Workbench > Rules das Geschäftsobjekt OrderDetail (Source) und öffnen Sie es.
-
Klicken Sie im Bereich Rule auf Events. Die Seite All Events (OrderDetail (Source)) wird geöffnet.
-
Suchen Sie die Zeile Save. Beachten Sie, dass es zwei Designer-Schaltflächen gibt: Table Event Detail und Rule Event Detail. Wir möchten diese Validierung mit Rule Event Detail registrieren. Dies ist eine wichtige Unterscheidung: Sie stellt sicher, dass die Validierung nur dann gilt, wenn diese bestimmte Regel verwendet wird, anstatt eine globale Einschränkung auf die gesamte Tabelle OrderDetail zu verhängen. Dies hält die App flexibel. Sie könnten später beispielsweise eine Seite Manager Approval erstellen. Durch die Verwendung eines anderen Geschäftsobjekts dort könnte ein Supervisor höhere Rabatte genehmigen, ohne durch die Standard-Regel blockiert zu werden, die wir hier erstellen. Klicken Sie auf Rule Event Detail für das Save-Ereignis.
-
Klicken Sie im Bereich Validations auf Register. Das Dialogfeld Validation wird geöffnet:

-
Wählen Sie im Feld Type den Eintrag Rule aus.
-
Wählen Sie im Feld Rule die Validierungsregel OrderDetail (Validate Discount) aus, die wir gerade erstellt haben.
-
Wählen Sie im Feld Binding die Option Implicit aus.
Hinweis
Implicit Binding validiert gegen die Daten, die sich derzeit „im Speicher" auf dem Bildschirm des Benutzers befinden. Dies ist der Wert, den der Benutzer eingegeben hat, bevor er in der Datenbank gespeichert wurde. Wir verwenden hier Implicit Binding, da wir verhindern möchten, dass der Benutzer einen neuen Datensatz speichert, während der Wert Discount ungültig ist (d. h. größer als der konfigurierte Schwellenwert). Andererseits validiert Explicit Binding gegen Daten, die bereits in der Datenbank gespeichert sind.
Stellen Sie sich zur Veranschaulichung vor, dass ein Datensatz mit einem ungültigen Rabatt von 50 % gespeichert wurde. Ein Benutzer öffnet diesen Datensatz, korrigiert das Feld Discount auf einen gültigen Wert wie 7 % und sendet es ab. Wenn das Validierungsereignis Explicit Binding verwendet, wird die Datenbank überprüft, der ursprüngliche Wert von 50 % wird angezeigt und die Validierung schlägt fehl. Wenn das Validierungsereignis jedoch Implicit Binding verwendet, wird der im Speicher befindliche Wert (7 %) überprüft, festgestellt, dass er nicht größer als der Schwellenwert ist, und die Validierung erfolgreich bestanden, wodurch der Speicher ermöglicht wird.
Weitere Informationen finden Sie unter Implicit and explicit binding.
-
Wählen Sie im Feld Failure die Option Fail on data returned aus.
Hinweis
App Builder-Validierungen können auf zwei Arten konfiguriert werden. Die Standard-Option, die wir verwenden, ist Fail on data returned. Dies bedeutet, dass die Validierungsregel geschrieben wird, um die ungültigen Daten zu finden (beispielsweise ist Discount größer als der Schwellenwert). Wenn die Regel Datensätze findet, die diesem „ungültigen" Kriterium entsprechen, schlägt sie fehl und zeigt die Fehlermeldung an. Die Alternative ist Fail on no data returned, das verwendet wird, wenn eine Regel geschrieben wird, um gute Daten zu finden.
-
Wählen Sie im Feld Severity den Eintrag Error aus.
Hinweis
Das Feld Severity bestimmt, wie prägnant App Builder mit dem Benutzer interagiert, wenn eine Validierung ausgelöst wird:
- Error: Die kritischste Stufe. Gibt ein großes Problem an und verhindert die Speicherung vollständig. Der Benutzer sieht eine rote Benachrichtigung und muss die Daten korrigieren, bevor er fortfahren kann.
- Warning: Eine sanfte Blockade. Warnt den Benutzer vor einem potenziellen Problem mit einer gelben Benachrichtigung, gibt ihm jedoch die Möglichkeit, diese zu stornieren und zu beheben oder fortzufahren und den Datensatz trotzdem zu speichern.
- Information: Rein informativ. Stellt eine blaue Benachrichtigung bereit, nachdem das Ereignis ausgeführt wurde, um dem Benutzer hilfreichen Kontext zu geben, unterbricht den Workflow jedoch nie.
-
Geben Sie im Feld Nachricht ein:
Discount cannot be greater than {{ DiscountMaximum }}. Die Verwendung von dynamischer Ersetzung stellt sicher, dass die Fehlermeldung automatisch den aktuellen Schwellenwert widerspiegelt, der auf der Seite Parameter festgelegt ist. -
Klicken Sie auf Speichern, um den Dialog zu schließen.
Die Validierung ist angebracht. Zum Testen gehen Sie zur Vorschau der Seite Bestellungen, wählen eine Bestellung aus und versuchen, ein OrderDetail-Element so zu bearbeiten, dass der Rabatt größer als der festgelegte Schwellenwert ist. Wenn Sie zum Speichern klicken, sollte die dynamische Fehlermeldung angezeigt werden.
Damit der Platzhalter {{ DiscountMaximum }} korrekt aufgelöst wird, muss die Spalte im Business-Objekt OrderDetail (Quelle) verfügbar sein. Da DiscountMaximum sich in einer separaten Tabelle Parameter befindet, müssen Sie diese explizit hinzufügen:
-
Kehren Sie zu App Workbench > Regeln zurück und öffnen Sie die Regel OrderDetail (Quelle).
-
Klicken Sie auf der Registerkarte Tabellen auf + Tabellen und fügen Sie die Tabelle Parameter hinzu. Wählen Sie die Spalte DiscountMaximum aus.
Der Spaltenname in der Regel muss genau mit dem Platzhalter in Ihrer Validierungsmeldung übereinstimmen. Wenn Sie einen anderen Namen in der Nachricht verwendet hätten (z. B. {{ MaxDiscount }}), müssten Sie die Spalte in der Regel als Alias umbenennen.
Weitere Informationen
Weitere Techniken zum Sicherstellen der Datenintegrität finden Sie unter Validierungsregeln.
Weiteres Lernen
Dies beendet diese tiefe Analyse der Details der Business-Schicht von App Builder. Weitere Informationen zur Datenschicht finden Sie unter Anhang A, zur UI-Schicht unter Anhang C oder zur Sicherheitsschicht unter Anhang D.