0

"do as server" vs. Änderungstrigger - merkwürdiges Verhalten

In einem Button steht bspw.:

do as server
    A := 1;
    B := 2;
    C := 3
end

Im Änderungstrigger von B steht:

C := 5;

Das erwartete Ergebnis wäre 1/2/3, es ist aber 1/2/5.

Kann mir das bitte jemand erklären?

Vielen Dank vorab.

10 Antworten

null
    • Icarus_Ralf_Becker
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ergänzung: auch das Einbauen eines x-beliebig langen sleep() vor dem letzten Befehl ändert nichts am Verhalten.

    Inzwischen bin ich davon überzeugt, dass es ein Bug ist, weil man das Spiel auf weitertreiben kann. Bei deinem Skript mit 20 Anweisungen innerhalb des "do as server" und dabei bspw. 5 ausgelösten Triggern, werden alle 5 Trigger-Skripte erst nach der 20. Anweisung geschlossen ausgeführt.

    • Marwin
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Aber wenn im Änderungstrigger vom B steht C := 5; dann ist das Ergebnis 1/2/5 doch korrekt ?

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Marwin aber der letzte Befehl ist C:=3 in der Schaltfläche. Meinerseits gab es 2 mögliche Erwartung: (1) wegen dem "do as Server" wird der Änderungstrigger gar nicht ausgelöst. (2) Das C:=5 aus dem Trigger wird durch die letzte Anweisung wieder überschrieben. Beides passiert aber nicht.

      • Marwin
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Icarus - Ralf Becker Naja klar, weil die Funktion (in dem Fall dann do as server) erstmal komplett ausgeführt wird und danach erst der änderungstrigger greift.. das ist meines Wissens nach aber normal und kein bug, auch nicht bei „do as server“

       

      Bin mir nicht sicher aber evtl. Geht es so ?

      do as server
          A := 1;
          B := 2;
      end;
      do as server
          C := 3
      end
      
      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Marwin so klar ist mir das ehrlich gesagt nicht, weil eben dieses Verhalten bei "do as transaction" zu erwarten gewesen wäre. Das "do as server" ebenfalls alle Änderungstrigger an das Ende stellt, war mir nicht bekannt und steht auch nirgends so. Deine Vorschlag funktioniert aber. Vielen Dank.

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Icarus - Ralf Becker Zumindest funktioniert deine Lösung im kleinen, verursacht aber Wahnsinns Aufwand im Großen. Denn mit jeder "Unterbrechung" des "do as server" kennt das System zuvor erzeugte Variablen nicht mehr. 😣

    • Leonid_Semik.2
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Ralf,
    die erste Frage ist hier natürlich ob deine Geschäftslogik hier richtig ist. Wenn nach der Änderung von B der Wert von C als 5 erwartet wird, warum Ist im Code dann C:=3?
    Generell ist es aber so: die Trigger nach Änderung erwarten eine Änderung auf client-Seite (entweder Direkteingabe oder Änderung auch einen Button).
    Wenn die Daten als do as server, do as transaction, Massendatenänderung, Datenimport oder API geändert werden, bleibt der Trigger nach Änderung unberührt.
    Leo
     

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Leonid Semik Hallo Leo, ja die Geschäftslogik ist hier richtig. Dazu mal ein Anwendungsbeispiel. Man nehme eine Tabelle mit Rechnungen. Die Datensätze haben eine Verknüpfung zu einer Kundendatenbank. In den Kundendatensätzen ist eine Standard-Zahlungsart (bar, EC, Lastschrift, Überweisung etc.) definiert. Per Änderungstrigger in der Kundenverknüpfung in der Rechnung soll diese Standard-Zahlungsart in die Rechnung übertragen werden. Jetzt kommt aber der Anwendungsfall, dass in der gleichen Datenbank es auch möglich sein soll, gesammelt und in einem Rutsch Beitragsrechnungen zu erstellen. Bspw. ca. 400 Stück. Daher ist "do as server" erforderlich, so wartet man Stunden. Diese Beitragsrechnungen sollen alle pauschal per Überweisung bezahlt werden. 

      Und jetzt kommt das Problem:

      Leonid Semik said:
      Wenn die Daten als do as server, do as transaction, Massendatenänderung, Datenimport oder API geändert werden, bleibt der Trigger nach Änderung unberührt.

       Für "do as server" scheint das nicht (mehr) zu stimmen. Das Anlegen von 400 Rechnungen (Bull-Skript) mit "do as server" löst den Änderungstrigger in der Kundenverknüpfung in den Rechnungsdatensätzen aus. Dieser wird aber nicht sequentiell abgearbeitet, sondern ganz am Ende. D. h., das Bull-Skript setzt bspw. in der 2. Zeile die Kundenverknüpfung, löst damit den Änderungstrigger aus, in der 10. Zeile wird dann der Zahlungsweg "Überweisung" pauschal gesetzt, und wenn das Bulk-Skript komplett abgearbeitet ist, wird das Skript aus dem Änderungstrigger (ausgelöst in der 2. Zeile) abgearbeitet und überschreibt alle Zahlungswege. Dieses Verhalten kann auch mehrfach innerhalb eines "do as server" passieren. 

      Das dürfte so aus meiner Sicht nicht sein. Oder?

      Ich demonstriere dir dieses Verhalten gern mal in einem Video, wenn erforderlich.

    • Leonid_Semik.2
    • vor 1 Jahr
    • Gemeldet - anzeigen

    In diesem Fall würde ich den Script nach Änderung abändern z.B.
     

    if Kunde then
        if not Zahlung then
            Zahlung := Kunde.Zahlung
        end
    else
        Zahlung := null
    end
    

    Und bei dem Script zuerst die Zahlungsmethode in der Rechnung ändern und erst dann den Kunden verknüpfen.

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Leonid Semik Hallo Leo, so einfach funktioniert das eben leider nicht. Ich habe gerade eine recht umfangreiche Mail an Nhi mit 2 Videolinks geschickt. Wenn du mir eine Mailadresse als PN zukommen lässt, leite ich dir diese Mail auch gerne weiter. Ich glaube leider nicht mehr, dass das ein NX-Coding-Thema ist, sondern vielleicht ein geändertes Plattform-Verhalten bei "do as server". Sonst wäre das schon viel eher aufgefallen. Viele Grüße. Ralf

Content aside

  • vor 1 JahrZuletzt aktiv
  • 10Antworten
  • 93Ansichten
  • 3 Folge bereits