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.

180 Gedanken zu „Trigger

  1. Hallo,

    stehe irgendwie auf dem Schlauch.
    Habe zwei Tabellen über eine Verknüpfungstabelle miteinander verbunden, Tab_Strassen mit Tab_Touren über Tab_Strassen-Touren.
    In der Tab_Strassen gibt es das Feld Sortierung, dass in der Tab_Touren genutzt wird zum sortieren der Tabelle.
    Die Strassen werden über die Tab_Touren der Tour über eine Hilfstabelle mittels Feld zugeordnet(Leos Idee, funktioniert super!).
    Nun will ich die Tour über die das Feld Sortierung in die richtige Reihenfolge bringen.
    Dazu muss ich in der angezeigten Tabelle im Formular klicken auf den jeweiligen Datensatz und dann in der Verknüpfungstabelle noch mal auf die Verknüpfung zu den Strassen, um dann das Feld Sortierung zu beschreiben.
    Das soll nun schneller von statten gehen, in der Verknüpfungstabelle ein Feld Sortierung, das nach Eingabe der Nummer dann automatisch das Feld Sortierung in der Tab_Strassen füllt. So spart man sich einige Klicks.
    Ich habe schon mit ein paar Formel herum probiert, aber irgendwie habe ich immer die falsche zur Hand, entweder ändere ich bei allen Strassen die Nummern oder es passiert gar nichts?
    Hat da jemand eine Formel für mich?

    Grüße
    Mirko

    1. Hallo Mirko,
      wenn das Feld Sortierung in der Tab_Strassen liegt, bedeutet das, dass eine Straße nur bei einem Tour benutzt werden kann. Als Beispiel: die Hauptstraße soll in Tour Nr. 1 unter Nummer 2 stehen. Jetzt möchtest du in Tour Nr. 2 die Hauptstraße als Nummer 6 haben und änderst die Sortierung. In diesem Moment ist die Hauptstraße in allen anderen Touen auch unter Nummer 6. Ich würde das Feld Sortierung in die Tabelle Tab_Strassen_Touren verschieben.

      Grüße
      Leo

        1. Hallo Leo,

          hat mich dann aber auf mein nächstes Problem gebracht…in der Tab_Strassen gibt es ja die Untertabelle mit den zu erledigenden Arbeiten bei der jeweiligen Strasse. Nun ist es aber genau so, wenn ich die Strasse bei zwei verschiedenen Touren einordne, erledigt die eine Tour den einen Teil, die andere Tour einen anderen Teil.
          Zurzeit habe ich auch da dann einen Fehler bei der Addierung der Massen, es werden dann ja bei den Touren, die nur einen Teil einer Strasse machen trotzdem die ganzen Massen gerechnet.
          Ich muss aber zwingend in der Strasse den gesamten Arbeitsumfang erfasst haben. Denn zum Zeitpunkt der Eingabe steht die Verteilung auf die Touren nicht immer schon fest, oder sie ändert sich später noch mal.
          Wo gebe ich denn da am besten die Massen ein?

          Grüße
          Mirko

          1. Hallo Mirko,
            Eine Aufgabe gehört sowoh zu der Straße als auch zu der Tour. Am besten die Arbeiten zu den Datensätzen aus der Tabelle Tab_Strassen_Touren zuordnen. So kannst du auch leicht die Summen berechnen.
            Grüße
            Leo

      1. Hallo Birger,

        verstehe ich es richtig, dass Kommentare in einer Variablen gespeichert werden müssen? und nicht als “reiner” Text z.B. zwischen Sonderzeichen geschrieben werden können?

        Gruß Georg_0815

          1. Eine Möglichkeit zum Kommentieren (auch Auskommentieren von Codeteilen) würde das Scripten und die Fehlersuche zweifellos sehr erleichtern. Wollte ich bei der Gelegenheit einfach mal erwähnt haben. Aber das “noch” lässt ja hoffen. ;)

    1. Wählen Sie Datensätze aus und sortieren Sie diese nach dem Sortierkriterium:
      –––
      let myChoice := (select 'Tabellenname' order by 'Sortierkriterium')
      –––

      Anschließend können Sie das zweite Element raussuchen:
      –––
      let myElement := item(myChoice, 1)
      –––
      Achtung: Die Zählung beginnt mit 0

      Birger – Ninox Support

  2. Hallo,
    habe mit einer Formel ein Problem. Seit dem ich diese in meiner Datenbank einsetze, ist diese beim öffnen der Tabelle, in der sich die Formel befindet sehr langsam, besonders auf dem iPad macht sich das sehr bemerkbar, teilweise beim bearbeiten Wartezeiten bis zu 4-5 Sekunden, bis ich die nächste Aktion ausführen kann.
    Hier die Formel:

    let myPLZ := PLZ;
    first(select Postleitzahlen where PLZ = myPLZ).Ort

    Die Formel sucht mir aus einer Tabelle mit Postleitzahlen nach Eingabe der PLZ in ein Feld automatisch den dazugehörigen Ort heraus und trägt diesen in das Feld Ort ein.

    Nun bin ich am überlegen, ob nicht ein Trigger vielleicht Abhilfe schaffen kann, so dass eine Berechnung erst oder nur statt findet, wenn in das Feld PLZ etwas eingetragen wird?
    Ich weiß leider nicht, wie ich diesen Trigger formulieren sollte, wenn das überhaupt Sinn macht. Und in welchem Feld, bei der PLZ oder doch eher auf Tabellenebene?
    Hat da vielleicht einer einen Tip für mich?

    Grüße
    Mirko

    1. Ok,
      zu früh gefragt, habs grad selber heraus gefunden!
      Diesen Code jetzt auf Tabellenebene “nach Änderung ausführen” hinterlegt und es funktioniert.

      let myPLZ := PLZ;
      Ort := first(select Postleitzahlen where PLZ = myPLZ).Ort

      1. Hallo,
        aber nun doch noch ein Problem, wie bekomme ich die Werte aus dem berechneten Feld in das neue Textfeld Ort, über Massendatenänderung habe ich das nicht hinbekommen? Über 1000 Datensätze per Hand zu aktualisieren wäre echt hart.

        Grüße
        Mirko

        1. Hallo Mirko,
          wenn die Massendatenänderung nicht klappt (warum auch immer),
          kannst du in deiner Tabelle eine Befehlsschaltfläche einbauen.Die Formel:

          for ii in select DeineTabelle do
          let myPLZ := ii.PLZ;
          ii.Ort := first(select Postleitzahlen where PLZ = myPLZ).Ort
          end


          Grüße
          Leo

          1. Hallo Leo,

            vielen Dank mal wieder, hat super geklappt!

            Die Massendatenänderung hat wahrscheinlich deswegen nicht geklappt, weil ich einfach nicht die richtige Formel zur Hand hatte…die Sprache erschließt sich mir noch immer noch nicht so richtig, aber es wird langsam besser! :-)

            Grüße
            Mirko

  3. Hallo,

    Ich habe Tabelle A und Tabelle B.

    Wenn ein Eintrag in Tabelle A geändert wird, soll ein neuer Eintrag in B erzeugt werden und Daten aus dem geänderten Eintrag in den Neuen übernommen werden.

    Wie müsste dazu der Befehl aussehen?

    1. Hallo Ahrberg,
      wenn die Tabellen nicht miteinander verknüpft sind, würde ich als Trigger nach Änderung in dem Eintragsfeld so schreiben:

      let myEINTR:=EintragsfeldA;
      let newB:=create TabelleB;
      newB.EintragsfeldB:=myEINTR



      Die Felder EintragsfeldA und EintragsfeldB natürlich umbenennen.
      Grüße
      Leo

    1. Jawohl, dies is möglich.

      Mittels create 'Tabellenname' können Sie neue Datensätze erzeugen, mittels for i from 1 to 100 do ... end durch alle aktuellen Untertabelleneinträge iterieren und die Daten in die neuen Datensätze übetragen. abschließend können Sie mit delete() die nicht mehr benötigten Datensätze löschen.

      Birger – Ninox Support

      1. Danke für die Information, leider komme ich nicht weiter…

        Ich habe bei einem Kontakt eine Untertabelle namens “Anträge”

        Nun will ich bei einem Projekt welches diesen Kontakt betrifft, dass alle Einträge in der Untertabelle “Anträge” auch in einer Untertabelle im Projekt angezeigt wird.

        1. Ohne Datenbank ist es schwer. Wenn ein Kunde mehrere Projekte hat und jedes mahl die Anträge kopiert werden sollten, würde ich zur m:n Beziehung raten. Erstell eine Tabelle “Projektanträge”, dort fügst du die Tabellen “Projekte” und “Anträge” als Beziehung (Komposition).
          Jetzt kannst du in der Tabelle “Projekte” einen Trigger nach Änderung bei der Tabelle “Kontakt” schreiben:


          let myContact:=Kontakt;
          let myProject:=Projekt;
          for ii in Kontakt.'Anträge' do
          let newRec:=create 'Projektanträge';
          newRec.Projekte:=myProjekt;
          newRec.'Anträge':=ii.Nr
          end

          Natürlich muss du noch die Spalten formatieren, damit die Untertabelle in Projekten auch richtige Daten anzeigt.

          Grüße
          Leo

Hinterlasse eine Antwort