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
    • blue_bee
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo,

    ich würde gerne über einen Trigger eine Untertabelle mit allen Einträgen kopieren und an anderer Stelle einfügen. Ist das möglich?
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • blue_bee
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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.
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Ahrberg_GmbH
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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?
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Ahrberg_GmbH
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Leo,

    vielen Dank für die schnelle Antwort.
    So klappt es hervorragend.

    Grüße
    Ahrberg
    • telakis
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Leo,

    in einem Beispiel hier in Forum habe folgenden Code gefunden, (den ich leicht geändert habe: openRecord anstatt popupRecord)
    (Tabelle 'Kontakte' mit Feldern 'Name' und 'Vorname' sind vorhanden):

    let VN := Vorname;
    let NN := Nachname;
    let NT := (create Kontakte);
    NT.(Vorname := VN);
    NT.(Nachname := NN);
    let SP := number(NT.Nr);
    openRecord(record(Kontakte,SP))

    Was mich dabei -für meine Zwecke- stört ist, dass die Daten des vorherigen Datensatzes in den neuen Datensatz kopiert werden.

    Wie kann man das gleiche bewerkstelligen also
    - vorheriges Formular schliessen
    - in der gleichen Tabelle neuen Datensatz anlegen
    aber dabei ohne den vorherigen zu kopieren?

    Vielen Dank
    Gruß Georg_0815
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Georg_0815,
    ---
    let NT := (create Kontakte);
    let SP := number(NT.Nr);
    openRecord(record(Kontakte,SP))

    ---

    grüße
    Leo
    • telakis
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Danke !

    Gruss Georg08_0815
    • telakis
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Heißt die Übersetzung des Codes in "Sprachdeutsch":

    erstelle eine Variable mit dem Namen NT die, die Datenfelder der Tabelle 'Kontakte' aufnimmt,
    erstelle eine Variable mit dem Namen SP die, die Datensatznummer des neu zu erstellenden Datensatzes NT.Nr aufnimmt ,
    öffne überschreibbar den Datensatz der durch die "flüchtigen" Variablen NT und SP definiert/erstellt wurde?

    Oder liege ich meilenweit daneben?

    Ich versuche als Anfänger die Codes zu verstehen und nicht nur zu kopieren.

    Gruß Georg_0815
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Ich würde so vorschlagen:
    Erstell einen neuen Datensatz in der Tabelle Kontakte und lass alle Datenfelder in diesem Datensatz mit NT anfangen.
    Leg eine Konstante namens SP fest und gib dieser Konstante den Wert des Feldes "Nr" von den neuen Datensatz der Tabelle Kontakt (NT.Nr) als Zahl (die IDs werden bei Ninox nicht als Zahl angelegt).
    Schließe alle Tabellen und Formulare.
    Öffne die Tabelle Kontakte.
    Öffne den Datensatz der Tabelle Kontakte mit der ID, deren Zahlenanzeige gleich SP ist.

    grüße
    Leo
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Ahrberg_GmbH
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo,

    wenn ich mit first () den ersten Eintrag auswählen kann, wie wähle ich den zweiten bzw. dritten etc.?
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • telakis
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo zusammen,

    kann man in Trigger-/Formelzeilen Kommentare hinterlassen (zur Beschreibung was sie bewirken) ? Wen ja wie ?

    Gruß Georg_0815
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    z.B. so:
    –––
    let myComment := "Dies ist ein Kommentar."
    –––


    Birger - Ninox Support
    • telakis
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    "Müssen"... Aber ja, du verstehst es richtig. Bisher ist in der Scriptsprache noch keine Konvention vorhanden, Kommentare einzubinden :-(

    Birger - Ninox Support
    • AxelE
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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. ;)
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 193Antworten
  • 58006Ansichten