0

Trigger

Hallo,
erstmal vielen Dank für das tolle Produkt. Nun habe ich eine Frage: Ich hab es zwar hinbekommen einen Trigger für ein Feld einzurichten aber kann ich einen Trigger so einrichten, dass er sich auf mehr als ein Feld auswirkt?

Z. B.: wenn Feld A »Ja« dann Felder B UND C ändern

Vielen Dank im Voraus!

193 Antworten

null
    • CGR
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Guten Tag,

    ich bin neu dabei und gerade über eine Verschärfung dieses Problems gestolpert : der Trigger bei Anlage eines neuen Datensatzes ist bei Composit-Tabellen nicht gut zu gebrauchen, da der neue Datensatz beim Auslösen des Triggers noch komplett blank ist und keine Verweis auf das verlinkte Element aus der übergeordneten Struktur enthält. Nehmen wir mal an, die Tabelle Child ist eingebettet und verwaltet Salden zu unterschiedlichen Datensätzen aus einer Parent-Tabelle:

    Parent --(1:n)--> Child

    Dann findet eine Abfrage mit Child.Restsaldo wie oben beschrieben den letzten Saldo von _irgendeinem_ Artikel aus Parent, aber nicht von dem um den es geht. Man müsste die Abfrage erweitern:

    let p := Child.Parent;
    Restsaldo := last(select Child.Restsaldo where Parent = p) - Saldo

    Das klappt aber nicht, weil Child.Parent beim Aufruf des Triggers noch nicht definiert ist.
    Das scheint mir ein Fehler zu sein?

    Schöne Grüße
    Christian
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christian,
    das stimmt, der Trigger "Bei neuem Datensatz" löst aus, bevor er zu seinem Hauptdatensatz zugeordnet wird. Die Reihenfolge:
    1. Neuer Datensatz wird erzeugt
    2. Standardwerte werden gesetzt
    3. Trigger "Neuer Datensatz" löst aus
    4. Zurodnung zum Hauptdatesatz erfolgt
    5. Trigger "Bei Änderung" des Referenzfeldes löst aus
    6. Trigger "Bei Änderung" des gesamten Datensatzes löst aus
    Man könnte das Problem also lösen, indem man die Logik bei 5 oder 6 implementiert.
    Viele Grüße
    Frank
    • CGR
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank,

    vielen Dank für die schnelle Antwort.
    An den Trigger am Referenzfeld habe ich gar nicht gedacht, das ist ein eleganter Kniff. Die Reihenfolge der Schritte 3 und 4 hätte ich intuitiv anders herum erwartet - wenn man aber drüber nachdenkt passt es irgendwie schon, weil sonst der Einzeltrigger vom Referenzfeld vor dem Trigger des Gesamtdatensatzes auslösen würde. Es wäre aber nett, wenn das in der Trigger-Doku erwähnt würde.

    Noch was anderes: ich hatte eigentlich erwartet, dass der Datensatzänderungstrigger erst beim Schliessen des Datensatzes auslöst. Soweit ich das sehe, tut er es aber sofort bei jeder einzelnen Feldänderung. Gibt es eine Chance, dieses Verhalten zu ändern? In meinem Projekt kopiere ich Grunddaten aus dem Referenzobjekt in den eingebetteten Datensatz, rechne damit herum und will sie dann AM ENDE wieder ins Referenzobjekt zurückschreiben.

    Viele Grüße
    Christian
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christian,

    wie wäre eine Befehlsschaltfläche in dem Fall? Die findet man unter Gestaltungselemente im Tabellen Editor. Damit kann man Skripte auf Knopfdruck ausführen.
    VG, Alex
    • CGR
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Alex,
    sicher, das nutze ich ja auch an anderer Stelle. Hier möchte ich aber eine Vollautomatik einbauen, und für sowas sind Trigger doch eigentlich gemacht. Na egal, ich hab jetzt eine andere Lösung gefunden.
    Ich habe halt den Eindruck, dass sich die Trigger nicht so verhalten, wie man es erwartet. Oder wenigstens wie ich es erwartet habe ...
    Aber insgesamt eine beeindruckende Datenbank-App. Toll gemacht! Bin gespannt auf die weitere Entwicklung.

    Schöne Grüße, Christian
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christian,
    wie sieht deine andere Lösung aus? In meinem Projekt habe ich auch mehrere (über 50) Berechnungen und wenn ich diese mit Trigger löse, rechnet Ninox mir bei jeder Feldanderung alles neu und braucht dafür um die 30 sekunden. Momentan bin ich dabei die manuellen Schaltflächen einzubauen. Ist aber alles andere als schön.
    Gruß
    Leo.
    • CGR
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christian,
    ist tatsächlich keine große Hilfe. Ich mache erst mit Schaltflächen weiter.

    gruß
    Leo
    • Gregor.2
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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
    • Gregor.2
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank

    max() funktioniert, danke :)

    Das mit den Workaround habe ich noch nicht verstanden, aber ich versuche mich weiter daran ;)

    thx
    Gregor
    • jonnydarko
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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?
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo jsk,
    theoretisch könnte man das realisieren. Bitte kontaktiere uns per Mail an support@ninoxdb.de mit Details zum Datenmodell. Dann können wir konkrete Hinweise geben.
    Viele Grüße, Frank
    • blue_cap
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank, gibt es mittlerweile eine Lösung für den beschriebenen Fall? Bin auch auf der Suche nach der Verknüpfung von Angebot - Auftrag - Lieferschein - Rechnung. Die Positionen sollen jeweils übernommen und evtl. Änderungen eingefügt werden. Eine Beispiel-Vorlage wäre sehr hilfreich.
    Beste Grüße, Florian
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    es soll heißen
    let X:=create Tabelle1
    X.Auswahl:=1
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo,
    create() löst keine Trigger aus. Man kann überlegen die Logik aus dem Trigger nach dem create() einzubauen.
    Viele Grüße, Alex
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Alex,
    danke, so funktioniert.

    Gruß
    Leo
    • Chris_CH
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Leo,

    wärest Du so nett, Deine Lösung zu zeigen, ich habe versucht, das nach zu bauen und bin gescheitert.

    Christoph
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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
    • Chris_CH
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Klasse!! danke Leo
    • dennisg
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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.
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo dennsg,
    dafür muss du Semikolon benutzen.
    1. Im Formeleditor oben auf "Text" klicken
    2. Formel eingeben z.B.
    Vorname:="Leo";
    Nachname:="Semik"

    Gruß
    Leo
    • rkornek
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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!
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    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