Trigger

Trigger sind ein sehr mächtiges Werkzeug für erfahrenere Benutzer. Sie sollten Trigger nur einsetzen, wenn Sie sich sicher sind, dass das gewünschte Ergebnis mit einer einfachen Formel nicht erreichbar ist.

Ein Trigger ist eine Funktion, die bei bestimmten Ereignissen ausgeführt wird. Ninox unterstützt zur Zeit Trigger nach Änderung eines Feldwertes.

Definiert wird ein Trigger in dem Feld, dessen Änderung Sie beobachten wollen. Unter erweiterete Optionen besteht die Möglichkeit, “Nach Änderung folgendes Skript ausführen” einzustellen. Dies öffnet den Fomeleditor.

Gegenüber dem normalen Formeleditor ist nun ein zusätzlicher Karteireiter “Befehle” verfügbar. Dieser listet Wertzuweisungs-Operatoren auf. Mit einer Wertzuweisung können Sie einem Feld einen neuen, berechneten Wert zuweisen.

Ein Beispiel

Ein gutes Beispiel für den sinnvollen Triggereinsatz ist das Kopieren eines Datenfeldes aus einer verknüpften Tabelle:

In einer Tabelle “Artikel” werden Verkaufsartikel erfasst. Eine weitere Tabelle “Rechnungsposition” erfasst die Verkaufsvorgänge, sie verweist auf den Artikel. Mit einer normalen Formel könnten Sie nun den Verkaufspreis aus der Artikeltabelle in die Rechnungsposition übernehmen. Dies birgt aber Nachteile:

  • Wenn der Verkaufspreis später angepasst wird, würde sich auch die Rechnung ändern.
  • Sie können den Verakusfpreis nicht für eine einzelne Rechnung (z.B. Rabatt / Kulanz) korrigieren.

Die bessere Lösung ist, in der Tabelle rechnungsposition ein eigenes Datenfeld für den Verkaufspreis zu definieren. Das ist aber wiederum unpraktisch, da Sie bei jeder Position manuell den Preis eintragen müssten.

Hier hilft ein Trigger weiter: Im Verknüpfungsfeld “Artikel” der Rechnungsposition wird unter “Nach Änderung folgendes Skript ausführen” ein Trigger definiert, der aktiv wird, sobald ein Artikel zugewiesen ist. Der Trigger übernimmt den Verkaufspreis des Artikels in die Rechnungsposition.

Preis := Artikel.Verkaufspreis

Auf diese Weise können später Preisanpassungen bei den Artikeln durchgeführt werden, ohne die Rechnungen zu verändern. Außerdem kann der vom Trigger kopierte Wert nachträglich korrigiert werden. Denn der Trigger wird nur im Moment der Artikelzuweisung aktiv.

130 Gedanken zu „Trigger

  1. Hallo, Ich hätte wieder einmal eine Frage:

    Ich habe einen schönen Trigger für Beleg Nummern geschrieben.
    BelegNr := max((select TrBelege).BelegNr) + 1
    Der funktioniert auch gut.

    Wenn ich aber eine ganze Reihe Datensätze importiere, wird er nicht getriggert. Was muss ich machen, damit er auch bei diesen Datensätzen funktioniert?

    Vielen Dank im voraus!

      1. Hallo,
        Danke für die Antwort. Das habe ich gemerkt, dass er nicht ausgeführt wurde. Nur was ist jetzt die Alternative, dass die importierten Datensätze eine fortlaufende Nummer kriegen?
        Danke!

        1. Dies geht mit “Massendatenänderung” (Zahnrad-Menü).
          Geben Sie für das Feld “BelegNr” folgende Formel ein:
          –––
          let lastRecord := last(select TrBelege where BelegNr);
          let lastBelegNr := lastRecord.BelegNr;
          let lastRecordBelegNrID := number(lastRecord.Id);
          let differenz := lastRecordBelegNrID – lastBelegNr;
          let myBelegNr := BelegNr;
          if BelegNr then
          myBelegNr
          else
          number(this.Id) – differenz
          –––

          Birger – Ninox Support

  2. Hallo,
    Bei mir funktioniert das nicht. Was mach ich falsch?

    ich habe in der Tabelle TrRDetails den Trigger
    “TrRDText := Transaktionen.TrText”
    als Skript bei einem neuen Datensatz eingegeben.
    Wenn ich dann im Formular Transaktionen im Unterformular auf + klicke, entsteht zwar ein neuer Datensatz in TrRDetails aber der Text wird nicht rüber kopiert.

    Oder habe ich die Anleitung falsch verstanden?
    Danke für eure Hilfe!

    1. Ich komm gerade mal nicht weiter:

      wie muss diese Formel aussehen, wenn ich das Resultat manchmal händisch abändern will?

      zB ich übertrage mit Hilfe der Formel Text+Soll+Haben in das Unterformular (das funktioniert bereits), aber manchmal will ich im Unterformular etwas anderes stehen haben, z.B. wenn ich beim Text noch was dazu schreiben will.

      Mit der jetzigen Formel überschreibt er mir die Änderungen.

        1. Nun habe ich das in einem anderen Kontext versucht anzuwenden, aber bekomme in dem Fall eine Fehlermeldung. Keine Ahnung warum!

          Der von mir fabriziert Trigger lautet:
          BelegNr := if BelegNr = null then
          BelegNr := max((select TrBelege).BelegNr) + 1
          else
          BelegNr;

          Die Fehlermeldung sagt:
          dann und sonst liefern unterschiedliche Datentypen

          Was heisst das? Und was much ich an dem Trigger verändern?

  3. Hallo, bin noch nicht so erfahren mit Ninox. Finde auch keine Lösung hier.
    Ich möchte beim anlegen eines neuen Datensatzes ein Datenfeld(Datenwert) vom vorherigen Datensatz automatisch übernehmen? Können Sie mir helfen.

    Noch eine Frage. Wie kann ich Trigger-Befehle lernen?

    Vielen Dank

    1. Hallo prienoptik,
      dazu kannst du Operator “last” verwenden.
      beim Trigger auf Tabellenebene folgende Formel:

      let myDatenfeld:=last(select Tabellenname.Datenfeld);
      Datenfeld:=my Datenfeld

      Ninox übernimmt den Wert des Datenfelds aus dem Datensatz mit der letzten (zweitgrößten) ID in die Variable “myDatenfeld” und übergibt dann den Wert an Datenfeld in dem neuen Datensatz.

      Grüße
      Leo

Hinterlasse eine Antwort