Geschäftsregel schreiben
Ziel
Ein Formular auf das reagieren lassen, was die ausfüllende Person gerade tut: das Feld Manager nur bei Ausgaben über 100 £ anzeigen, Abschlussdatum deaktivieren, bis der Deal gewonnen ist, Währung aus dem Account vorbelegen.
Voraussetzungen
- Sie sind als Ersteller angemeldet, und die Lösung der Tabelle ist geöffnet.
- Die Tabelle enthält die Felder, um die es in der Regel geht, und – wenn Sie die Regel an ein Formular binden möchten – dieses Formular ist vorhanden.
Was eine Geschäftsregel ist – und was nicht
Eine Geschäftsregel läuft im Browser, auf dem Formular, und ändert, wie sich das Formular verhält. Sie kennt vier Tätigkeiten: ein Feld ein- oder ausblenden, es aktivieren oder deaktivieren, es zur Pflicht machen oder nicht, und einen Wert setzen.
Sie entscheidet nicht, was gespeichert werden darf. Jemand kann eine Regel abschalten, einen anderen Bildschirm verwenden oder die API direkt aufrufen, und der Datensatz wird trotzdem gespeichert. Alles, was für die Daten gelten muss, gehört in einen Server-Plug-in-Schritt, der unabhängig davon läuft, was der Browser getan hat. Verwenden Sie eine Geschäftsregel, um ein Formular angenehm zu machen; verwenden Sie einen Plug-in-Schritt, um eine Regel verbindlich zu machen. Es ist normal, beides zu wollen, und beide werden absichtlich getrennt geschrieben.
Schritte
-
Öffnen Sie das Formular, für das die Regel gilt – die Tabelle, dann Formulare, dann das Formular –, und wählen Sie in seiner Symbolleiste Ereignisse. Die Liste zeigt jede Regel, die auf diesem Formular läuft, auch solche, die an jedes Formular der Tabelle gebunden sind.
-
Wählen Sie Neu. Der Regel-Designer öffnet sich.
-
Geben Sie einen Anzeigenamen ein. Der logische Name füllt sich selbst aus, mit dem Präfix Ihres Herausgebers, und ist nach dem Speichern der Regel festgelegt.
-
Prüfen Sie das Formular. Es ist bereits das Formular, von dem Sie kommen, und das ist fast immer richtig – eine Regel spricht über Felder, und die Felder, über die sie spricht, sind die, die Sie vor sich haben. Stellen Sie es auf Jedes Formular für etwas, das überall gelten soll, wo die Tabelle angezeigt wird, etwa „dies ausblenden, außer der Status ist Genehmigt“. Eine an jedes Formular gebundene Regel erscheint trotzdem in der Ereignisliste jedes Formulars, entsprechend gekennzeichnet.
-
Wählen Sie, wann sie läuft – ein Ereignis pro Regel:
- Beim Öffnen des Formulars wendet die Regel an, während der Datensatz angezeigt wird.
- Bei Änderung eines Felds zeigt eine Feldauswahl. Wählen Sie ein Feld, und es erscheint als Element; fügen Sie so viele hinzu, wie die Regel braucht, und entfernen Sie eines mit dem ✕ an seinem Element.
- Beim Speichern des Formulars führt die Regel zwischen dem Drücken und dem Schreiben aus,
sodass sie etwas ausfüllen – oder das Speichern mit
cancelSave(siehe unten) stoppen kann.
Eine Regel ohne Auslöser läuft nie; daher bleibt Speichern deaktiviert, bis eine Feldänderungsregel mindestens ein Feld hat.
Ein Ereignis pro Regel ist Absicht. Wenn dasselbe zu zwei Zeitpunkten geschehen muss – der übliche Fall, „dies anzeigen, wenn der Status abgelehnt ist“, was beim Öffnen des Formulars und bei jeder Statusänderung stimmen muss –, schreiben Sie zwei Regeln, die ein Lösungsskript importieren, jede zwei Zeilen lang. Die Logik wird einmal geschrieben; wo sich die beiden Zeitpunkte tatsächlich unterscheiden, fragt das Skript
eventType()ab und entscheidet selbst. Mehrere Auslöser an einer Regel würden diese Entscheidung nirgends verorten: Nichts auf dem Bildschirm würde sagen, welche Hälfte des Skripts zu welchem Ereignis gehört. -
Schreiben Sie das Skript im Editor. Er unterstreicht Fehler während der Eingabe, vervollständigt die Funktionen der Plattform und zeigt beim Eintippen der öffnenden Klammer die Argumente jeder Funktion. Das Auge in der oberen Ecke des Editors öffnet Was ein Skript aufrufen kann über dem Code.
-
Lassen Sie Aktiviert angehakt, oder deaktivieren Sie es, um die Regel zu behalten, ohne sie auszuführen.
-
Wählen Sie Speichern.
Was ein Skript aufrufen kann
| Aufruf | Was er tut |
|---|---|
getValue(field) | Der aktuelle Wert des Felds auf dem Formular. |
setValue(field, value) | Setzt ein Feld auf dem Formular. |
setVisible(field, visible) | Blendet ein Feld ein oder aus. |
setDisabled(field, disabled) | Macht ein Feld schreibgeschützt oder nicht. |
setRequired(field, required) | Macht ein Feld erforderlich oder nicht. |
eventType() | "OnLoad", "OnChange" oder "OnSave" – welches Ereignis gerade läuft. |
changedField() | Das Feld, dessen Änderung ein OnChange ausgelöst hat, sonst "". |
isNewRecord() | true, bis der Datensatz einmal gespeichert wurde. Verwenden Sie es, um ein Feld zu sperren, das einmal gewählt wird und dann so bleibt, etwa den Typ einer Aktivität. |
cancelSave(message) | Nur beim Speichern: stoppt das Speichern dieses Formulars und zeigt die Meldung an. |
isEmpty(value) | Ob ein Wert nicht ausgefüllt ist. Leerer Text und gar nichts sind leer; 0 und false sind Werte, die jemand gewählt hat. |
Ein Feld wird über seinen logischen Namen (par_amount) benannt, nicht über seinen
Anzeigenamen.
Ein Feld ohne Inhalt liest sich als leerer Text, daher ist getValue("par_currency") == "" die
Prüfung auf „noch nicht ausgefüllt“ – so funktioniert das Währungsbeispiel unten. Bei einer Zahl,
einem Datum oder einem Nachschlagefeld gibt es keinen leeren Text zum Vergleichen; fragen Sie
stattdessen isEmpty(getValue("par_due")) ab. Es verwendet dieselbe Definition von „leer“ wie die
eigene Pflichtprüfung des Formulars – deshalb kann eine Regel kein Feld vorbelegen, das das Formular
gerade als ausgefüllt akzeptiert hat.
getValue und setValue werden genauso geschrieben und verhalten sich genauso wie in einem
Server-Plug-in-Schritt, sodass die Logik, die Sie einmal ausarbeiten, auf beiden Seiten gleich
aussieht.
Ein Zahlenfeld liest sich als Zahl – 1200.5, nicht "1200.5" –, auch während es eingetippt wird,
und ein nicht ausgefülltes liest sich weiterhin als leer. Das wird wichtig, sobald Sie eine eigene
Funktion schreiben: func needsApproval(amount: number) akzeptiert keinen Text, und der Fehler
lautet Function overload for needsApproval not found. statt irgendetwas über Typen. Deklarieren
Sie einen Betrag also als number, nicht als int – eine Dezimalspalte enthält 1200.50, und ein
ganzzahliger Parameter lehnt das ab –, und setzen Sie für ein leeres Feld eine Null ein, bevor Sie
damit rechnen:
func claimAmount(): number {
var raw = getValue("par_amount");
if (isEmpty(raw)) { return 0; }
return raw;
}
… und alles, was ein Lösungsskript exportiert. Wenn dieselben paar Zeilen in mehreren Regeln
auftauchen, verschieben Sie sie in ein Lösungsskript und importieren
Sie es, indem Sie import 'par_expense_helpers'; an den Anfang der Regel schreiben – der Editor
vervollständigt den Namen und weiß von da an, was das Modul exportiert.
Auswahlwerte – und einen Abschnitt für einen davon anzeigen
Ein Auswahlwert liest sich als seine Zahl, der Wert, den die Option erhalten hat (110000001),
egal ob das Formular gerade geöffnet wurde oder jemand ihn gerade ausgewählt hat. Vergleichen Sie
ihn also mit einer Zahl, nicht mit Text:
if (getValue("pw_type") == 110000001) { setVisible("pw_to", true); }
Früher las sich ein gerade ausgewählter Auswahlwert als Text ("110000001"), und der obige
Vergleich funktionierte nach der ersten Auswahl stillschweigend nicht mehr. Bei einer Regel, die
mit Text in Anführungszeichen verglichen hat, müssen die Anführungszeichen entfernt werden.
Um einen Abschnitt nur für einen Auswahlwert anzuzeigen, blenden Sie die Felder darin aus. Ein Abschnitt, dessen Felder alle ausgeblendet sind, verschwindet samt Titel und kommt zurück, wenn eine Regel eines davon wieder einblendet. So zeigt das Sales-Aktivitätsformular einen Abschnitt „Email“ für eine E-Mail und einen Abschnitt „Phone call“ für einen Anruf.
Um ein Feld nur einmal wählbar zu machen, deaktivieren Sie es, wenn der Datensatz nicht neu ist:
setDisabled("pw_type", !isNewRecord());
Wird ein neuer Datensatz gespeichert, laufen die Regeln, die beim Laden laufen, erneut, sodass das Feld sofort gesperrt wird. Wie jede Regel hält das nur das Formular auf. Damit auch die API oder ein Import das Feld nicht ändern kann, schreiben Sie zusätzlich einen Server-Plug-in-Schritt.
Ein Speichern stoppen
Eine Regel, die beim Speichern des Formulars läuft, kann das Speichern ablehnen:
if (getValue("par_status") == "rejected" && getValue("par_reason") == "") {
cancelSave("Give a reason before rejecting this claim.");
}
Das Speichern stoppt, Ihre Meldung erscheint oben im Formular, und nichts geht verloren – das Formular bleibt mit allem Eingegebenen geöffnet.
Auch das ist keine Durchsetzung. Es stoppt dieses Formular in diesem Browser: Die API, ein Import, eine benutzerdefinierte App und jedes andere Formular ohne die Regel speichern den Datensatz trotzdem. Es gibt diese Möglichkeit, weil „lass mich das nicht halb ausgefüllt absenden“ auf dem Formular gesagt werden sollte – muss es aber für die Daten gelten, schreiben Sie zusätzlich einen Server-Plug-in-Schritt.
Ein Beispiel
Das Feld „Manager“ anzeigen und zur Pflicht machen, nur bei Ausgaben über 100 – beim Laden und immer, wenn sich der Betrag ändert:
var over = getValue("par_amount") > 100;
setVisible("par_manager", over);
setRequired("par_manager", over);
Beachten Sie, dass die Regel in beide Richtungen sagt, was gelten soll. Eine Regel, die ein Feld immer nur einblendet, lässt es auf dem Bildschirm, nachdem der Betrag wieder gesunken ist, weil niemand verlangt hat, es wieder auszublenden.
Zwei Regeln auf einem Formular
Jede aktivierte Regel, die zu Formular und Ereignis passt, läuft – in der Reihenfolge der logischen Namen, jede mit eigenen Variablen. Sie teilen sich die Werte auf dem Formular, sodass eine Regel, die ein Feld setzt, von den nachfolgenden Regeln gesehen wird. Äußern sich zwei Regeln zum selben Feld, gewinnt die letzte – das ist stabil, aber ein Zufall und kein Entwurf; bevorzugen Sie daher eine Regel pro Feld.
Eine Regel kann nicht ewig laufen
Jede Regel läuft mit einem Budget, und eine Regel, die es überschreitet, wird gestoppt und unter ihrem eigenen Namen gemeldet. Es gibt drei Grenzen, und jede fängt einen anderen Fehler ab:
| Sie stoppt | Wenn |
|---|---|
| eine Schleife, die nie endet | while (true) oder eine Bedingung, die nie ganz erfüllt wird |
| eine Regel, die schlicht zu viel tut | sie nach einer halben Sekunde noch läuft |
| eine Funktion, die sich endlos selbst aufruft | sie hundert Aufrufe tief ist, ohne ein Ende in Sicht |
Das Formular funktioniert weiter, die Person behält, was sie gerade eingegeben hat, und die Meldung
nennt die Regel und die Zeile. Die Schleife in ein try zu packen hilft nicht – das Budget ist
nichts, was ein Skript abfangen kann.
Zufällig begegnet Ihnen das nicht: Die größte Regel in allen Beispielen verbraucht weit weniger als
ein Hundertstel des Kontingents. Begegnet es Ihnen doch, hat die Regel einen Fehler – meist ein
while, dessen Bedingung der Schleifenrumpf nie ändert.
Ein Hinweis zum Vergleichen von Werten. == vergleicht innerhalb einer Art: zwei Zahlen, zwei
Texte, zwei Wahrheitswerte. Zwei verschiedene Arten sind nie gleich – 1 == "1" ist falsch –, und
nichts ist gleich nichts; ein nicht gesetztes Feld ist also nicht gleich "". Deshalb liest sich ein
Feld ohne Wert als leerer Text, und deshalb gibt es isEmpty() für Zahlen und Datumswerte.
Fehlerbehebung
- Eine Regel scheint nie zu laufen. Prüfen Sie, ob sie aktiviert ist, ob ihre Formularbindung zu dem Formular passt, das Sie gerade ansehen, und ob ihr Auslöser das Feld enthält, das Sie ändern.
- „BS Lang script is invalid: …“ beim Speichern – Das Skript lässt sich nicht parsen. Der Editor unterstreicht denselben Fehler; die Meldung nennt die Zeile.
- „Form '…' was not found on '…'.“ – Die Regel ist an ein Formular gebunden, das die Tabelle nicht hat. Wählen Sie eines aus der Liste, oder binden Sie sie an jedes Formular.
- Eine rote Meldung oben auf einem Formular in der App, die eine Regel nennt. Die Regel hat während der Ausführung einen Fehler ausgelöst. Das Formular funktioniert weiter; die Regel hat an der Fehlerstelle aufgehört.
- Unterstreichungen unter
getValue– Der Editor meldet die eigenen Funktionen der Plattform nicht mehr als undefiniert. Sehen Sie das, ruft das Skript etwas auf, das nicht in der obigen Liste steht.
Verwandte Szenarien
- Formular erstellen.
- Feld auf einem Formular als erforderlich oder schreibgeschützt festlegen – die feste Variante derselben Idee, wenn die Antwort nie vom Datensatz abhängt.