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.

113 Gedanken zu „Trigger

  1. Hallo zusammen,
    ich würde ganz gerne im Rechnungsmodul ein Mahnwesen einbauen. Ich hab ein Formelfeld gebaut Status 3 ist Bezahlt 1 Neu 2 Versendet

    if today() > ‘Zahlbar bis’ and Status < 3 then
    1
    else
    0;
    Er erhöt auch den Mahnstatus um 1. Zeitgleich soll er auch das Feld Zahlbar bis um weitere 7 Tage erhöhen. Dann soll wieder geprüft werden. Das ganze soll 3 mal durchlaufen bis zur Mahnstufe 3. Vielleicht hat auch jemand einen ganz anderen Lösungsweg bin für alles offen, weiß halt nur nicht wie ich es 3 mal durchlaufen lassen kann.

  2. Guten Morgen,
    Ich möchte, dass beim Erstellen neuen Datensatzes bestimmte Werte aus aktuellem Datensatz übernommen werden. Problem dabei ist, dass der aktuelle Datensatz nicht unbedingt der letzte sein kann. Der Trigger “bei neu” nimmt mit dem Befehl last (select….) die Werte aus dem Datensatz mit zweitgrößtem ID.
    Momentan habe ich das Problem mit der Schaltfläche und Funktion (let altWert:=Wert; let n:=create Tabelle; n.Wert:=altWert) gelöst. Das “+”-Zeichen bleibt aber sichtbar und wenn der Benutzer statt Schaltfläche das “+”-Zeichen benutzt, ist die ganze Programmierung hin. Ist das Problem mit Trigger lösbar?

    Grüße
    Leo

      1. Hallo Alex,
        Das ist genau mein Problem. Stell dir vor : eine Tabelle hat 5 Datensätze. In dem Datensatz gibt es ein Textfeld namens “Farbe”. In dem letzten Datensatz Nr. 5 ist die Farbe “grün”. Ich befinde mich im Datensatz Nr 3 mit der Farbe schwarz und möchte jetzt einen neuen Datensatz mit schwarz erzeugen, aber ohne Schaltflächen. Trigger auf Tabellenebene bei neu:
        let myNr:=last (select Tabelle.Nr);
        Farbe:=select Tabelle wehre Nr=myNr.Farbe
        Ich klicke jetzt auf + und in dem Datensatz Nr 6 erscheint die Farbe grün aus Nr 5 statt schwarz aus Nr 3. ist auch verständlich: für den Nr 6 ist der letzte Datensatz -Nr 5.
        wie kann ich in diesem Trigger die aktuelle Id ansprechen?
        Grüße
        Leo

    1. Hallo Leo,
      bei Klick auf das “+”-Zeichen ist die ID des aktuellen Datensatz’ – “aus dem heraus geklickt wurde” – nicht verfügbar. Eine Lösung weiß ich hier also derzeit nicht.

      Gruß
      Birger – Ninox Support

  3. Guten Tag,
    ich habe folgendes Problem:
    Bei einem Feld A in der Tabelle 1 (Verknüpfung zu einer Tabelle2) habe ich einen Trigger nach Änderung. Dieser Trigger bewirkt, dass in einer anderen Tabellen 3 neue Datensätze erzeugt werden.
    Funktioniert alles prima. Jetzt habe ich noch eine Befehlsschaltfläche in der Tabelle 1 welche einen neuen Datensatz in der Tabelle 1 einfügt und dabei einen bestimmten Wert dem Feld A gibt. Eigentlich dachte ich, dass der Trigger bei dem Feld A automatisch anspringt sobald der Wert von dem anderen Trigger geändert wird. Es passiert aber nichts.
    Gibt es hier Einschränkungen?

    Grüße
    Leo

    1. Hallo Leo,

      kaskadierende Trigger, die den nächsten Trigger auslösen, gibt es nicht mehr, da man damit Endlosschleifen bilden kann. Wenn ich Dich richtig verstehe.

      VG, Alex

  4. Hallo,

    habe eine Frage und bin absoluter Neuling.
    ich möchte mir ein Texfeld erst anzeigen lassen wenn in einem anderen Auswahlfeld nur eine Option ausgwählt wird.
    Wie stelle ich das an.

    Mein Fall:
    (Auswahlfeld)
    Zustand Lampe
    i.Ordnung ( dann passiert nichts)
    Mängel ( dann soll ein weiters Textfeld angezeigt werden )

    Vielen Dank!
    grüße Olaf

    1. Hallo Olaf,
      die Positionen im Auswahlfeld haben eigene IDs. Diese sind beim Eingabe der Felder rechts zu sehen.
      Angenommen “i.Ordnung” hat ID 1 und “Mängel” -2.
      Dann kannst du in den erweiterten Eigenschaften deines Textfeldes im Register “Feld nur anzeigen wenn” folgende Formel schreiben

      ‘Zustand Lampe’=2

      Bitte die Formel nicht kopieren/einfügen, sondern selbst schreiben. WordPress ändert hier die Anführungszeichen und du bekommst sonst Fehlermeldung.

      Grüße
      Leo

  5. Hallo, habe eine Frage:

    Ich bin neu hier, habe mir die Datenbank kürzlich heruntergeladen und bin daher noch nicht so versiert darin.

    Ich möchte die Felder einer Tabellen-Spalte automatisch farblich hervorheben lassen (in Grün/Gelb/Rot) von deren Spalte ich einen Durchschnittswert in der Fusszeile angezeigt bekomme.

    D.h., sobald die Felder diesen Durchschnittswert überschreiten, sollen sie in “Grün” markiert werden, unterschreiten sie diesen, in “Rot”.

    Frage: Falls das geht, wie stelle ich das an, und wo gebe ich die entsprechende Formel ein?

    Vielen Dank!

    1. Hallo Roland,
      Farben können in Auswahlfeldern und in Farbfeldern hinterlegt werden.
      Die Farbe und Auswahlfelder können per Trigger angesprochen werden, der z.B. bei Ändern eines Datensatzes ausgelöst wird.
      In Formel Feldern können noch keine Farben zurückgegeben werden. Das Feature haben wir bereits auf der Anforderungsliste. Könne aber noch nicht genau sagen wann es implementiert wird.
      VG, Alex

  6. Hallo :-) Ist es möglich mehre Zellen durch einen einziges Trigger update zu befüllen? Ich möchte mehrere Zellen automatisch ausfüllen lassen wenn nur ein Wert erneuert wird. Ich habe versucht dies über die logische Funktion “and” hinzubekommen aber es wird immer nur die Zelle ausgefüllt die in der Funtion an erster Stelle steht.

  7. Guten Tag,
    ich haben in der Tabelle1 bei einem Auswahlfeld einen Trigger nach Änderung:
    Text:=if Auswahl=1 then “A” else “B”
    Wenn ich jetzt aus der Tabelle2 in der Tabelle1 einen neuen Datensatz per Trigger erstelle

    let X:=create Tabelle1
    X:=Auswahl:=1

    Mein Textfeld “Text” sollte hier eigentlich “A” sein, bleibt aber leer.
    Funktionieren die Trigger nur bei manuellen Änderungen?

    Gruß Leo

          1. Hallo Christoph,
            Ich habe inzwischen festgestellt, dass wenn man den Skript als Funktion einer Befehlsschaltfläche schreibt, funktionieren alle trigger auch nach dem Create ().

            https://www.dropbox.com/s/o6eagau9zd26g1h/TEST_CREATE.ninox?dl=0

            Hier in der Tabelle 1 bei Auswahl Trigger

            Text := if Auswahl = 1 then
            “Äpfel”
            else
            “Möhren”

            in der Tabelle 2 Trigger nach update

            let A := Auswahl;
            let F := Farbe;
            let X := (create Tabelle1);
            X.(Auswahl := A);
            X.(Farbe := F)

            Und das gleiche bei der Befehlsschaltfläche

            wenn du in der Tabelle 2 den Auswahlfeld änderst, schreibt ninox in die Tabelle 1 einen neuen Datensatz, aber das Feld “Text” bleibt leer. Wenn du jetzt auf die Befehlsschaltfläche klickst, wird in der Tabelle 1 wieder neuen Datensatz geschrieben, allerdings mit gefülltem Textfeld.

            Den Trigger in der Tabelle 2 kann man dann so umschreiben:

            let A := Auswahl;
            let F := Farbe;
            let X := (create Tabelle1);
            X.(Auswahl := A);
            X.(Farbe := F);
            X.(Text := if X.Auswahl = 1 then
            “Äpfel”
            else
            “Möhren”)

            So übernimmt der Trigger aus Tabelle 2 die Befehle vom Trigger vom Tabelle1.Auswahlfeld.

            Gruß Leo

  8. Hallo liebes Team :-)

    kann man mit Triggern kurzzeitige Daueraufträge (Rechnungen, die
    automatisch mal für ein halbes Jahr gestellt werden)
    durchführen, oder gibt es da einen besseren Weg?

  9. Hallo,

    Einträge in einer Tabelle werden von Ninox automatisch fortlaufend Nummeriert.
    Wenn ich mit dem Trigger last(Tabelle.Zelle) den letzten Wert einer Tabelle hole,
    dann wird der Wert aus dem letzten Eintrag genommen,
    was der mit der höchsten Nummer ist, egal wie ich sortiert habe.
    Gibt es auch die Möglichkeit an den letzten Wert einer Tabelle anhant der Sortierung zu kommen ?
    oder den Wert einer bestimmten Zeile,
    so in etwa: if last(Tabelle.Zelle) <0 then Wert else Wert eine zeile vorher

    1. Hallo Gregor,
      der maximale Wert lässt sich mit max(Tabelle.Zelle1) erfragen. Was aber zur Zeit nicht geht ist, einen anderen Wert abzufragen, bei dem Zelle1 maximal ist. Höchstens ein Workaround:

      let m := max(Tabelle.Zelle1);
      first(Tabelle[Zelle1 = m].Zelle2)

      Grüße
      Frank

  10. Hallo Leo,
    da muss ich wohl einen neuen Thread aufmachen.
    Das ist mit meiner Triggerberechnung nicht so spektakulär, es geht bloss um eine Bestandsverwaltung, keine 50 Formeln. Ich schalte die Eingabefelder schrittweise über “nur sichtbar wenn”-Bedingungen frei und hänge mich für die Berechnungs- und Kopierschritte an die Feldtrigger. Wird dir also nicht viel helfen.
    Schöne Grüße,
    Christian

Hinterlasse eine Antwort