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!
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
-
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 -
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 -
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 -
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 -
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 -
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. -
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 -
Hallo Christian,
ist tatsächlich keine große Hilfe. Ich mache erst mit Schaltflächen weiter.
gruß
Leo -
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 -
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 -
Hallo Frank
max() funktioniert, danke :)
Das mit den Workaround habe ich noch nicht verstanden, aber ich versuche mich weiter daran ;)
thx
Gregor -
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? -
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 -
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 -
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 -
es soll heißen
let X:=create Tabelle1
X.Auswahl:=1 -
Hallo,
create() löst keine Trigger aus. Man kann überlegen die Logik aus dem Trigger nach dem create() einzubauen.
Viele Grüße, Alex -
Hallo Alex,
danke, so funktioniert.
Gruß
Leo -
Hallo Leo,
wärest Du so nett, Deine Lösung zu zeigen, ich habe versucht, das nach zu bauen und bin gescheitert.
Christoph -
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 -
Klasse!! danke Leo
-
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.
-
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 -
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! -
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
Content aside
- vor 6 JahrenZuletzt aktiv
- 193Antworten
- 58181Ansichten