Einführung in App Builder - Anhang B: Die Business-Schicht in App Builder (Erweitert)
Dies ist der zweite Anhang der Einführung in App Builder-Tutorialserie. Diese Anhänge ergänzen die Lektionen der Serie und bieten tiefere Informationen zu den eingeführten Konzepten.
In dieser Lektion werden wir die Business-Schicht von App Builder weiter erkunden – den Bereich, in dem wir Business-Objekte oder Regeln erstellen.
Unions
Joins, die in Lektion 7 eingeführt wurden, werden verwendet, wenn wir mit Regeln arbeiten, 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 hinzu.
Unions funktionieren anders: Statt Spalten hinzuzufügen, stapeln sie Zeilen. Ein Union hängt die Ergebnisse einer Abfrage an eine andere an und erzeugt eine kombinierte Liste von Datensätzen aus mehr als einer Tabelle. Damit ein Union funktioniert, müssen beide Abfragen mindestens eine Spalte mit demselben Namen enthalten, da App Builder diese gemeinsame Spalte als Grundlage für das Stapeln der Ergebnisse verwendet. Deshalb können wir die Country-Spalten aus unseren Tabellen Customer und Supplier direkt kombinieren: beide Spalten haben denselben Namen.
Hinweis
Wenn Sie Spalten mit unterschiedlichen Namen kombinieren möchten, können Sie eine Unterabfrage mit einem Alias verwenden, um eine der Spalten umzubenennen, damit beide Namen übereinstimmen. Wenn die Datenformate zwischen den beiden Spalten unterschiedlich sind, können Sie sie in einen gemeinsamen Datentyp konvertieren, um sicherzustellen, dass das Union erfolgreich ist.
Um zu demonstrieren, wie ein Union funktioniert, erstellen wir manuell ein Union, das 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 kombinieren wir die Einträge aus beiden.
-
Klicken Sie in 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 wird die Zieltabelle hinzugefügt und ihr Primärschlüssel ausgewählt. In dieser Regel interessieren uns jedoch nur die in den Tabellen vorhandenen Länder. Deaktivieren Sie daher SupplierID, wählen Sie die Spalte Country aus und markieren 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 auf 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 anzeigt.
-
Klicken Sie auf die Registerkarte SQL, um die Syntax Ihres Union anzuzeigen:

-
Um Ihre Ergebnisse anzuzeigen, klicken Sie auf die Schaltfläche Results im Bereich Rule.
-
Beachten Sie, dass die Ergebnisse doppelte Länder enthalten. Dies ist zu erwarten: mehrere Kunden und Lieferanten sind in denselben Regionen ansässig, 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. Siehe Advanced options in App workbench Rules tab für eine vollständige Beschreibung aller verfügbaren Optionen.
-
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 Results. Die Regel gibt nun eine eindeutige Liste aller Länder zurück, die in den Tabellen Customer und Supplier vertreten sind.
Übungszeit: Verwenden Sie Ihre Union-Regel als Listensteuerelement
Jetzt setzen Sie Ihre neue Union-Regel in die Praxis um. Navigieren Sie zu den Popup-Seiten Customer und Supplier und ändern Sie den Steuerelementtyp des Felds Country in List. Wählen Sie auf der Registerkarte List Options das soeben erstellte Union-Geschäftsobjekt aus und setzen Sie sowohl Key als auch Title auf die Spalte Country.
CRUD-Regeln
Wir haben CRUD-Regeln in Lektion 7 eingeführt, aber schauen wir uns diese nun genauer an.
Das Akronym CRUD steht für „Create, Read, Update, Delete". Das bedeutet, dass App Builder-Entwickler mit CRUD-Regeln Datensätze aus den Tabellen der Datenquelle einfügen, abrufen, ändern oder löschen.
Zielschicht: Business vs. Daten
Beim Erstellen einer CRUD-Regel müssen Sie eine Zielschicht auswählen: entweder die Business- 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 Ihre CRUD-Regel die Business-Schicht anvisiert (z. B. das Geschäftsobjekt Order (Source)), verhält sie sich wie ein Benutzer, der mit der Anwendung interagiert. Sie löst alle intrinsischen Ereignisse (Save, Update usw.) aus, die mit diesem Geschäftsobjekt verknüpft sind. Das bedeutet, dass alle konfigurierten Validierungsregeln, benutzerdefinierten Aktionen und Audit-Lite-Nachverfolgungen automatisch ausgeführt werden. Dieser Ansatz gewährleistet Datenintegrität und Konsistenz mit der Logik Ihrer Anwendung. Er ermöglicht es Ihnen auch, Success-, Failure- und Rollback-Handler für das Ereignis zu verwenden.
Die Datenschicht als Ziel umgeht alle Geschäftslogik. Wenn Sie die Datenschicht anvisieren (z. B. die Tabelle Order), interagiert Ihre Regel direkt mit der Datenbank. Sie löst keine intrinsischen Ereignisse, Validierungen oder Audit-Nachverfolgungen aus, die für das Geschäftsobjekt konfiguriert sind. Dies ist ein „Hintertür"-Ansatz, der sich für leistungsstarke Massenoperationen eignet, bei denen Sie die Geschäftslogik absichtlich umgehen möchten.
Sie können diesen Unterschied visuell im visuellen Workflow sehen; eine Regel, die die Business-Schicht anvisiert, zeigt Unterprozesse für ihre Ereignislogik an, während eine, die die Datenschicht anvisiert, 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 durch die Business-Schicht ausgeführt, um sicherzustellen, dass alle Logik angewendet wird. Siehe CRUD (rule) für weitere Informationen.
CRUD-Update
Schauen wir uns zunächst an, wie man eine CRUD-Update-Regel erstellt. Das bedeutet, dass vorhandene Datensätze in einer Tabelle geändert werden. Zur Veranschaulichung erstellen wir eine Regel, die alle Mengen der bestellten Produkte erhöht.
-
Klicken Sie in App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name
OrderDetail (Quantity + 1)ein. -
Wählen Sie im Feld Purpose die Option CRUD aus.
-
Wählen Sie im Feld Action die Option Update aus.
-
Wählen Sie unter Target Layer die Option Data Layer aus. (Für dieses einfache Massen-Update umgehen wir die Geschäftslogik).
-
Wählen Sie im Feld Target die Option OrderDetail aus.
-
Klicken Sie auf Create. App Builder benötigt einige Sekunden, um die Regel zu erstellen.
-
Auf der Registerkarte Tables wird die Tabelle OrderDetail mit ihrem Primärschlüssel OrderDetailID angezeigt, der ausgewählt ist. Wählen Sie auch die Spalte Quantity aus, indem Sie das entsprechende Kontrollkästchen aktivieren.
-
Wir fügen eine neue Spalte mit einem Alias hinzu, um zu visualisieren, dass die Regel funktioniert. Gehen Sie zur Registerkarte Columns und klicken Sie auf + Column. Wenn das Dialogfeld Column - Add Column geöffnet wird, geben Sie die folgenden Informationen ein:
-
Geben Sie im Feld Column or Expression
OD.Quantity + 1ein. -
Geben Sie im Feld Alias einen aussagekräftigen Namen ein. Wir verwenden
QuantityPlus. -
Wählen Sie im Feld Target die Option Quantity aus. Dies teilt App Builder mit, dass das Ergebnis dieses Ausdrucks in die Spalte Quantity geschrieben werden soll.
-
-
Klicken Sie auf Speichern.
-
Im Tab Columns werden jetzt sowohl Quantity als auch QuantityPlus angezeigt. Die ursprüngliche Spalte OD.Quantity wird standardmäßig auch auf Quantity ausgerichtet. Man muss die Ausrichtung aufheben, um Mehrdeutigkeiten zu vermeiden:
-
Suchen Sie die Zeile OD.Quantity in der Liste Columns.
-
Klicken Sie auf das Dropdown-Menü Target. Daneben erscheint eine Schaltfläche mit einem X. Klicken Sie darauf, um die Ausrichtung der Spalte aufzuheben.
Dies stellt sicher, dass nur der Ausdruck QuantityPlus zum Aktualisieren der Spalte Quantity verwendet wird. Wenn beide ausgerichtet wären, würde derjenige mit dem höheren Index „gewinnen", was zu unvorhersehbarem Verhalten führt.
-
-
Die Regel ist bereit. Klicken Sie im Panel Rule auf das Panel Results, um sie in Aktion zu sehen. Beachten Sie, dass die zusätzliche Spalte, die Sie hinzugefügt haben, alle Mengen um eins erhöht:

Regel kopieren
Überlegen Sie, wie Sie eine CRUD-Aktualisierungsregel ähnlich der oben erstellten erstellen würden, aber mit dem gegenteiligen Effekt – 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 Sie die Funktion Copy Rule von App Builder, die eine vorhandene Regel dupliziert, damit Sie sie als Ausgangspunkt verwenden können. Dies spart Zeit beim Erstellen von Regeln, die ähnlich wie bereits erstellte Regeln sind.
-
Suchen Sie unter App Workbench > Rules die Regel
OrderDetail (Quantity + 1)und klicken Sie auf More > Copy Rule. -
Klicken Sie auf Copy.
-
App Builder erstellt die neue Regel und benennt sie
OrderDetail (Quantity + 1) (New). Sie werden direkt zum Bearbeitungsbildschirm weitergeleitet. Aktualisieren Sie im Panel Rule das Feld Name aufOrderDetail (Quantity - 1)und navigieren Sie zum Tab Columns. -
Suchen Sie den Ausdruck
OD.Quantity + 1und bearbeiten Sie ihn. Ändern Sie den Ausdruck inOD.Quantity - 1und aktualisieren Sie den Alias vonQuantityPluszuQuantityMinus. Klicken Sie auf Speichern. -
Überprüfen Sie, ob die Regel ordnungsgemäß funktioniert, indem Sie im Panel Rule auf Results klicken.
Übungszeit: Mengensteuerelemente hinzufügen
Jetzt, da Sie beide Mengenregeln haben, verbinden Sie sie mit dem Panel Order Details auf der Seite Orders.
-
Öffnen Sie das Geschäftsobjekt OrderDetail (Source) und erstellen Sie ein benutzerdefiniertes Ereignis für die Regel
OrderDetail (Quantity + 1). Geben Sie im Dialogfeld zur EreigniserstellungQuantity Plusim Feld Name ein und setzen Sie Refresh Scope auf Row. Dies stellt sicher, dass bei Auslösung des Ereignisses nur die betroffene Zeile aktualisiert wird, nicht das gesamte Panel. -
Wiederholen Sie Schritt 1, um ein zweites Ereignis namens
Quantity Minuszu erstellen, das die RegelOrderDetail (Quantity - 1)zuordnet und Refresh Scope ebenfalls auf Row setzt. -
Navigieren Sie zum Bearbeitungsbildschirm der Seite Orders. Fügen Sie im Panel Order Details zwei Steuerelemente vom Typ Button hinzu: eines, das das Ereignis
Quantity Plusausführt, und eines, das das EreignisQuantity Minusausführt. -
Besuchen Sie die Vorschau der Seite Orders und testen Sie die neuen Schaltflächen.
CRUD-Löschvorgang
CRUD-Löschregeln werden verwendet, um Datensätze aus Tabellen zu löschen. Da es jedoch einfach ist, UI-Elemente zum Löschen einzelner Datensätze zu verwenden, werden CRUD-Löschregeln normalerweise nur zum Löschen vieler Datensätze gleichzeitig verwendet. Zur Veranschaulichung erstellen wir eine CRUD-Löschregel, 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.
-
Klicken Sie unter App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name
OrderDetail (Delete OrderDetail for Order)ein. -
Wählen Sie im Feld Purpose die Option CRUD.
-
Wählen Sie im Feld Action die Option Delete.
-
Wählen Sie unter Target Layer die Option Data Layer.
-
Wählen Sie im Feld Target die Option OrderDetail.
-
Klicken Sie auf Create.
-
Im Tab Tables hat App Builder die Tabelle OrderDetail hinzugefügt und ihren Primärschlüssel OrderDetailID ausgewählt. Behalten Sie diese Auswahl bei, da die Ausrichtung des Primärschlüssels die effizienteste und sicherste Methode für einen Löschvorgang ist. Wählen Sie auch die Spalte OrderID aus; diese Spalte werden Sie 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. Ereignisse sind in Tabellen oder Business Objects integrierte Prozesse, die als Reaktion auf bestimmte Aktionen ausgeführt werden, z. B. beim Speichern eines Datensatzes. Alle Tabellen und Business Objects verfügen intrinsisch über vier Ereignisse: Speichern, Aktualisieren, Löschen und Einfügen, die ausgeführt werden, wenn Sie Datensätze im App Builder ändern.
Aktivieren wir die CRUD-Regeln, die wir erstellt haben. Dazu erstellen wir eigene benutzerdefinierte Ereignisse. Im Gegensatz zu intrinsischen 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 beim Löschen einer Bestellung auch die zugehörigen Bestelldetails gelöscht werden.
-
Suchen Sie unter App Workbench > Regeln die Regel Order (Source) und öffnen Sie sie.
-
Klicken Sie im Bereich Regel auf Ereignisse. Die Seite Alle Ereignisse (Order (Source)) wird geöffnet. Sie listet die vier intrinsischen Ereignisse auf, die der App Builder für jede Tabelle und jedes Business Object enthält: 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 vor der Ausführung des Ereignisses angezeigt 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 Bereich 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 betrifft, garantiert eine Transaktion, dass der App Builder alle Änderungen zurückrollt, wenn während der Ausführung ein Fehler auftritt. Dies verhindert ein Szenario, in dem einige Datensätze gelöscht werden, während andere erhalten bleiben, was zu inkonsistenten Daten führt. Eine vollständige Beschreibung aller Optionen in diesem Bereich finden Sie unter Ausführungseigenschaften.
-
Behalten Sie die anderen Felder mit ihren Standardeinstellungen bei und klicken Sie auf Speichern. Der App Builder erstellt das Ereignis.
Hinweis
Bei Szenarien mit gleichzeitigem Zugriff, bei denen die Datenintegrität beeinträchtigt werden könnte, bietet der App Builder auch Ereignissperrung, die eine serielle Ausführung erzwingt und auf einzelne Datensätze beschränkt werden kann. Lassen Sie diese Option für das aktuelle Ereignis deaktiviert, behalten Sie sie aber im Hinterkopf für Umgebungen mit hohem Datenverkehr oder komplexe Workflows, bei denen eine Synchronisierung auf Datensatzebene erforderlich ist.
-
-
Das Ereignis wurde erstellt, und der App Builder zeigt Ihnen seinen Konfigurationsbildschirm:

Sie befinden sich derzeit in der Rasteransicht (wie im obigen Screenshot gezeigt), die eine Übersicht aller Aktionen und Validierungen bietet, die für dieses Ereignis registriert sind. Eine alternative Ansicht des Ereignisses ist im Visual Workflow Editor verfügbar, der die Ausführungsreihenfolge und die Beziehung zwischen geerbten Ereignissen anzeigt. Um diese anzuzeigen, klicken Sie auf das Symbol im Bereich Ereignis. Um jederzeit zur Rasteransicht zurückzukehren, klicken Sie auf das Symbol , das es ersetzt.
Der Visual Workflow Editor wandelt Ihre Ereignisse in interaktive Flussdiagramme um, wodurch es einfacher wird, den Pfad Ihrer Daten zu visualisieren, während sie sich durch das System bewegen. Jedes Ereignis wird als Prozess mit eindeutigen Start- und Endpunkten abgebildet, und Unterprozesse, die mit einem Pluszeichen gekennzeichnet sind, können doppelt angeklickt werden, um tiefer in die Logikebenen einzudringen. Sie können die dedizierten Schaltflächen verwenden, um neue Aktionen oder Validierungen direkt in die Sequenz einzufügen, und jeden Knoten auswählen, um seine Details zu bearbeiten, ihn zu löschen oder ihn in der Logikkette neu zu ordnen. Eine vollständige Beschreibung der Funktionen finden Sie unter Visual Workflow Editor.
-
Das Ereignis hat noch keine Aktionen. Im Grid View ist das Panel Aktionen leer – klicken Sie auf die Schaltfläche Registrieren. Im Visual Workflow Editor klicken Sie auf die Schaltfläche + Aktion oben im Panel Ereignisdiagramm. Dadurch wird das Dialog 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.
-
Behalten Sie die anderen Felder mit ihren Standardeinstellungen bei. Dazu gehören Position-Einstellungen, die die Ausführungsreihenfolge und das Timing steuern. Weitere Informationen finden Sie unter Event action types. Klicken Sie auf Speichern. Das Dialog für die Aktion zeigt weitere Details:

-
Klicken Sie im Panel Bindungen auf + Bindung. Wählen Sie OrderID als Quellspalte und OrderID als Regelspalte aus.
Hinweis
Dieser Bindungsschritt ist entscheidend, da er die Ergebnisse der Regel nach dem Paneldatensatz filtert, für den Sie das Ereignis ausgelöst haben. Wenn die Bindung fehlt, würde die Löschregel alle Datensätze in der Tabelle OrderDetail beeinflussen. Durch die Bindung der Quellspalte (OrderID aus dem Paneldatensatz Order (Source)) an die Regelspalte (OrderID in unserer Löschregel) fügen wir einen impliziten Filter hinzu (z. B.
WHERE OrderID = 10248).Dies stellt sicher, dass nur die OrderDetail-Datensätze mit dieser spezifischen OrderID gelöscht werden. Wenn diese Bindung fehlt, würde das Auslösen des Ereignisses alle Datensätze aus der Tabelle OrderDetail löschen.
-
Klicken Sie auf Speichern.
-
-
Das benutzerdefinierte Ereignis ist nun einsatzbereit.
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. Das Registrieren von Ereignissen auf der Geschäftsebene ermöglicht eine unterschiedliche Logik pro Schnittstelle, während Ereignisse auf der Datenschicht 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.
Übungszeit: Steuerelement zum Löschen hinzufügen
Jetzt, da Ihre Löschregel und das Ereignis bereit sind, setzen Sie diese in der Benutzeroberfläche um. Fügen Sie dem Panel Bestellungen eine Schaltfläche OrderDetails löschen hinzu und verknüpfen Sie sie mit dem Ereignis OrderDetails löschen, das Sie gerade konfiguriert haben. Dies ermöglicht es Ihren Benutzern, alle Details einer Bestellung 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 übergeben werden. Im Gegensatz zu Standardregeln, die direkt mit einem Datensatz interagieren, schreiben Subqueries nicht in Tabellen zurück. Stattdessen führen sie eine bestimmte Operation durch, z. B. eine Aggregation, um einen Wert für die Verwendung an anderer Stelle in der Anwendung zu generieren.
Wir demonstrieren dies, indem wir eine Subquery-Regel erstellen. Sie wird verwendet, um die maximale OrderNumber der Tabelle Order zu finden und dann eins dazu zu addieren. Später erstellen wir eine CRUD-Regel mit dem Zweck, eine Bestellung zu kopieren, und sie wird von dieser Subquery abhängen.
-
Klicken Sie in App Workbench > Regeln auf + Regel.
-
Geben Sie im Feld Name den Text
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 wir benötigen ihn für diese Regel nicht. Deaktivieren Sie ihn auf der Registerkarte Tabellen.
Warum
OrderIDdeaktivieren?Bei Verwendung einer Aggregatfunktion wie hier 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 einbeziehen würden, 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 ist, was wir wollen.
Um die einzelne maximale OrderNumber über die gesamte Tabelle hinweg zu finden, dürfen wir keine anderen Spalten in unsere Abfrage einbeziehen. Deshalb verwenden wir eine Unterabfrage: um diese Aggregatberechnung zuerst durchzuführen, damit sie in einer anderen Regel verwendet werden kann.
-
Klicken Sie im Tab 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. Dann wird eins dazu addiert. -
Geben Sie im Feld Alias and Target einen passenden 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 ist, sondern eine natürliche Zahl.
-
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 Bestellnummer, die derzeit in der Tabelle Order vorhanden ist.
Jetzt erstellen wir eine CRUD-Regel, die eine Bestellung kopieren kann. Diese CRUD-Regel wird sich auf die Unterabfrage-Regel verlassen, die wir gerade erstellt haben.
-
Klicken Sie in App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name den Text
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 ihre Spalten und Ziele:
-
Im Tab Tables hat App Builder die Tabelle Order automatisch hinzugefügt, aber wir benötigen mehr. Klicken Sie auf + Tables.
-
Wählen Sie die Unterabfrage-Regel aus, die wir für diesen Zweck erstellt haben, Order (OrderNumber + 1). Klicken Sie auf Add.
-
Aktivieren Sie im Tab Tables das Kontrollkästchen neben der Suchleiste oben in der Spaltenliste. Dies wählt alle vorhandenen Spalten aus 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 alle neuen Spalten, die in Zukunft zur Tabelle Order hinzugefügt werden, automatisch in diese Regel einbezogen werden. Schließen Sie das Dialogfeld.
-
Wählen Sie aus der Unterabfrage-Tabelle Order (OrderNumber + 1) ihre einzige Spalte MaxOrderNumber aus.
-
Verfeinern Sie im Tab 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 abzielt und den neuen inkrementellen 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 sie aus dem Original zu duplizieren.
- AddedOn, AddedBy, ChangedOn, ChangedBy und IsActive: App Builder generiert diese Werte automatisch bei der Erstellung.
Weitere Informationen
Erfahren Sie mehr über dieses Konzept unter Target in business object rules.
-
Klicken Sie im Panel Rule auf Results, um zu überprüfen, ob die Regel ordnungsgemäß funktioniert.
Jetzt 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 nur erstellt werden, nachdem 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 die Option CRUD aus.
-
Wählen Sie im Feld Action die Option Insert aus.
-
Wählen Sie im Feld Target Layer die Option Logic Layer aus.
-
Wählen Sie im Feld Target die Option 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 auf
NewUUID(). Dies stellt sicher, dass jedes kopierte Zeilenelement eine eigene eindeutige Kennung erhält. - Entfernen Sie das Ziel für OrderID und setzen Sie seinen Alias auf
BindOrderID. 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 abzielt. Die FunktionGenerated()ruft einen Wert ab, der während der aktuellen Ereignisausführung erstellt wurde, und nimmt zwei Argumente an: 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. Lassen Sie uns die Regel Copy Order an ein benutzerdefiniertes Ereignis anhängen und die Regel Copy Order Lines so verdrahten, dass sie bei deren Erfolg automatisch ausgelöst wird.
-
Suchen Sie in App Workbench > Rules die Regel Order (Source) 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 die Option Panel Refresh aus. Dies stellt sicher, dass sich der Bereich unmittelbar nach Abschluss des Kopierens aktualisiert, sodass die neue Bestellung ohne manuelles Aktualisieren angezeigt wird.
-
Konfigurieren Sie unter Messages eine Bestätigungs-, Erfolgs- und Fehlermeldung mithilfe von dynamischer Substitution. Durch die Verwendung 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 Bereich Execution Properties das Kontrollkästchen Transaction, um die Datenintegrität zu gewährleisten, 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 die Option Rule aus.
- Wählen Sie im Feld Rule die Option 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 Sie.
-
Im Bereich Actions befindet sich 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 dies, um Logik zu verketten, z. B. das Kopieren unserer Bestelldetails, die davon abhängt, dass der übergeordnete Datensatz zuerst vorhanden ist.
- Failure Handler: Wird nur ausgelöst, wenn die übergeordnete Regel auf einen Fehler stößt. Verwenden Sie es, um Warnungen zu senden, Fehler zu protokollieren oder kompensierende Maßnahmen auszulösen.
- Rollback Handler: Wird bei der Arbeit mit Systemen verwendet, die keine standardmäßigen Datenbanktransaktionen unterstützen, z. B. eine REST-API eines Drittanbieters. Es 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. Das Dialogfeld Success Handlers wird geöffnet. Klicken Sie auf Create. Das Dialogfeld Action wird geöffnet:
- Wählen Sie im Feld Type die Option Rule aus.
- Wählen Sie im Feld Rule die Option OrderDetail (Insert) Copy Order Detail aus.
- Speichern Sie.
- Klicken Sie im Bereich Bindings auf + Binding und ordnen Sie Folgendes zu:
- Source Column: Wählen Sie OrderID (die eindeutige ID der Bestellung, die gerade kopiert wird).
- Rule Column: Wählen Sie BindOrderID (der Alias, den wir in der Regel erstellt haben, um den Quelldatensatz zu identifizieren).
-
Speichern Sie.
-
Schließen Sie die offenen Dialogfelder und navigieren Sie zum Visual Workflow Editor, indem Sie auf das Symbol klicken. Das Ereignisdiagramm ist nun komplexer als das Ereignis Delete Order Details, das wir zuvor überprüft haben. Beachten Sie Folgendes:
- Logic Layer: Sowohl die Regeln Copy Order als auch Copy Order Lines werden durch die Business Layer ausgeführt, 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: Sie können die Verzweigungspfade für Success und Failure sehen. Der Pfad Success zeigt die Regel Copy Order Lines, die ausgelöst wird, während der Pfad Failure keine nachfolgenden Ereignisse anzeigt, was bestätigt, dass der Prozess stoppt, wenn das primäre Kopieren fehlschlägt.
Übungszeit: Fügen Sie ein Kopier-Steuerelement hinzu
Jetzt, da Ihre Kopierregeln und das Ereignis bereit sind, setzen Sie sie in der Benutzeroberfläche um. Fügen Sie dem Bereich Orders eine Schaltfläche Copy hinzu und verknüpfen Sie sie mit dem Ereignis Copy Order, das Sie gerade erstellt haben. Nachdem die Schaltfläche hinzugefügt wurde, testen Sie sie: Sie sollten die Bestätigungsmeldung mit der dynamischen Bestellnummer sehen, und bei erfolgreicher Ausführung wird eine neue Bestellung mit der nächsten verfügbaren Bestellnummer angezeigt.
Validierungen
Validierungsregeln stellen sicher, dass die in App Builder eingegebenen Daten gültig sind, bevor sie gespeichert werden. In Lektion 7 haben wir eine einfache Validierung für erforderliche Felder behandelt. Jetzt werden wir ein komplexeres Validierungsszenario mit benutzerdefinierter Logik und dynamischen Fehlermeldungen erkunden.
Wie andere Regeln müssen auch Validierungsregeln an ein Ereignis angehängt werden, um verwendet zu werden. Die Wahl des Ereignisses hängt vom Anwendungsfall ab:
-
Intrinsic event: Verwenden Sie dies, wenn die Validierung automatisch während standardmäßiger Operationen ausgeführt werden soll (z. B. um ein Speichern zu verhindern, wenn Daten ungültig sind).
-
Custom event: Verwenden Sie dies, wenn Sie die Validierung bei Bedarf von einem bestimmten Steuerelement aus auslösen möchten (z. B. ein Schaltflächenklick).
Erstellen wir eine Validierungsregel, um sicherzustellen, dass ein Rabatt auf eine Bestellung niemals größer als 10 % ist. Wir möchten, dass dies jedes Mal ausgeführt wird, wenn ein OrderDetail-Datensatz gespeichert wird, daher werden wir ihn an das intrinsische Speicherereignis anhängen.
-
Klicken Sie in App Workbench > Rules auf + Rule.
-
Geben Sie im Feld Name
OrderDetail (Validate Discount)ein. -
Wählen Sie im Feld Purpose die Option Validation aus.
-
Wählen Sie im Feld Target die Option OrderDetail aus.
-
Klicken Sie auf Create.
-
Wählen Sie auf der Registerkarte Tables die Spalte Discount aus (Sie können OrderDetailID abwählen).
-
Klicken Sie auf der Registerkarte Where auf + Where Clause. Ein Dialogfeld wird geöffnet, in dem Sie
WHERE-Klauseln erstellen können:
-
Geben Sie im Feld Left Expression
OD.Discountein. -
Wählen Sie im Feld Operator die Option
>aus. -
Geben Sie im Feld Right Expression
0.1ein.
-
-
Klicken Sie auf Save.
Die Regel ist nun erstellt. Sie ist so konzipiert, dass sie „schlechte" Daten findet (Datensätze, bei denen der Rabatt über 10 % liegt).
Dynamischer Schwellenwert
Im letzten Schritt haben wir eine Grenze von 10 % hartcodiert. Jetzt machen wir sie konfigurierbar: Wir speichern den Schwellenwert als Anwendungsparameter, damit das Unternehmen ihn über die Benutzeroberfläche aktualisieren kann, ohne die Regel selbst zu ändern. Wenden Sie die folgenden Schritte mit Fähigkeiten aus vorherigen Lektionen an:
-
Fügen Sie eine Spalte
DiscountMaximumzur Tabelle Parameter hinzu. Legen Sie den Logical Data Type auf Percent fest 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
.3aus, 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
0.1durchP.DiscountMaximum.
Der auf der Seite Parameter festgelegte Wert steuert nun den Schwellenwert für diese Validierung.
Validierungsregel anfügen
Jetzt fügen wir die Validierungsregel an das intrinsische Speicherereignis für OrderDetail an.
-
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 angewendet wird, wenn diese spezifische Geschäftsregel verwendet wird, anstatt eine globale Einschränkung auf die gesamte Tabelle OrderDetail zu verhängen. Dies hält die App flexibel. Sie könnten beispielsweise später 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 Ereignis Save.
-
Klicken Sie im Bereich Validations auf Register. Das Dialogfeld Validation wird geöffnet:

-
Wählen Sie im Feld Type die Option 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 implizites Binding, weil 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 die Daten, die bereits in der Datenbank gespeichert sind.
Stellen Sie sich zur Veranschaulichung vor, ein Datensatz wurde mit einem ungültigen Rabatt von 50% gespeichert. Ein Benutzer öffnet diesen Datensatz, korrigiert das Feld Discount auf einen gültigen Wert wie 7% und sendet es ab. Wenn das Validierungsereignis explizites 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 implizites Binding verwendet, wird der Wert im Speicher (7%) überprüft, es wird festgestellt, dass er nicht größer als der Schwellenwert ist, und die Validierung wird bestanden, sodass der Speichervorgang zulässig ist.
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 Standardeinstellung, die wir verwenden, ist Fail on data returned. Dies bedeutet, dass die Validierungsregel so geschrieben ist, dass sie die ungültigen Daten findet (z. B. Discount ist größer als der Schwellenwert). Wenn die Regel Datensätze findet, die diese „ungültigen" Kriterien erfüllen, schlägt sie fehl und zeigt die Fehlermeldung an. Die Alternative ist Fail on no data returned, die verwendet wird, wenn eine Regel so geschrieben ist, dass sie gute Daten findet.
-
Wählen Sie im Feld Severity die Option Error aus.
Hinweis
Das Feld Severity bestimmt, wie nachdrücklich App Builder mit dem Benutzer interagiert, wenn eine Validierung ausgelöst wird:
- Error: Die kritischste Stufe. Zeigt ein großes Problem an und verhindert den Speichervorgang vollständig. Der Benutzer sieht eine rote Benachrichtigung und muss die Daten korrigieren, bevor er fortfahren kann.
- Warning: Eine sanfte Blockierung. Warnt den Benutzer mit einer gelben Benachrichtigung vor einem potenziellen Problem, gibt ihm aber die Wahl, es abzubrechen und zu beheben oder fortzufahren und den Datensatz trotzdem zu speichern.
- Information: Rein informativ. Bietet eine blaue Benachrichtigung nach der Ausführung des Ereignisses, um dem Benutzer hilfreichen Kontext zu geben, unterbricht aber niemals den Workflow.
-
Geben Sie im Feld Nachricht Folgendes ein:
Discount cannot be greater than {{ DiscountMaximum }}. Die Verwendung von dynamischer Substitution stellt sicher, dass die Fehlermeldung automatisch den aktuellen Schwellenwert widerspiegelt, der auf der Seite Parameter festgelegt ist. -
Klicken Sie auf Speichern, um das Dialogfeld zu schließen.
Die Validierung ist angehängt. Um sie zu testen, rufen Sie die Vorschau der Seite Orders auf, wählen Sie eine Bestellung aus und versuchen Sie, ein Element OrderDetail so zu bearbeiten, dass der Rabatt den festgelegten Schwellenwert überschreitet. Wenn Sie auf Speichern klicken, sollte die dynamische Fehlermeldung angezeigt werden.
Damit der Platzhalter {{ DiscountMaximum }} korrekt aufgelöst wird, muss die Spalte im Geschäftsobjekt OrderDetail (Source) verfügbar sein. Da sich DiscountMaximum in einer separaten Tabelle Parameter befindet, müssen Sie diese explizit hinzufügen:
-
Kehren Sie zu App Workbench > Rules zurück und öffnen Sie die Regel OrderDetail (Source).
-
Klicken Sie auf der Registerkarte Tables auf + Tables 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 in der Nachricht einen anderen Namen verwendet hätten (z. B. {{ MaxDiscount }}), müssten Sie die Spalte in der Regel so umbenennen, dass sie übereinstimmt.
Weitere Informationen
Weitere Techniken zur Gewährleistung der Datenintegrität finden Sie unter Validation rules.
Weitere Lernressourcen
Dies schließt diese tiefe Analyse der Details der Business-Schicht von App Builder ab. Siehe Appendix A für einen genaueren Blick auf die Datenschicht oder Appendix C für die UI-Schicht.