Ankündigung

Einklappen
Keine Ankündigung bisher.

Prozess: Datumswert mit X Monaten addieren

Einklappen
X

Prozess: Datumswert mit X Monaten addieren

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • Prozess: Datumswert mit X Monaten addieren

    Hallo zusammen,

    ich habe einen Prozess erstellt, bei dem ein Wert (Datumsfeld) in einer untergeordneten Datengruppe abgegriffen und in ein Datenfeld der übergeordneten Datengruppe schreibt.
    Kurz gesagt, wird das eine Feld in das andere kopiert.

    Nun möchte ich eine Bedingung (Filter) einfügen, dass dieses Datumsfeld um beispielsweise 3 Monate addiert wird, wenn im Datensatz zuvor eine bestimmte Auswahl getroffen wird. Den Filter zu erstellen stellt keine Problem dar. Allerdings finde ich keine Möglichkeit, das Datum um einen beliebigen Wert zu erhöhen.

    Ich befinde mich aktuell in einer "Datengruppen-Aktion" im Bereich "Feldzuordnung". Dort habe ich auf der linken Seite das Zieldatenfeld, welches bereits mit einem Wert gefüllt ist. Nun möchte ich aus der Quelle eigentlich einen Benutzerdefinierten Wert nehmen, der das Zieldatenfeld um 3 Monate erhöht. Allerdings kann ich dort nur einen statischen Wert wählen, der das "Heute-Datum" +3 Monate addieren kann. Dadurch habe ich natürlich einen ganz anderen Wert als den ich haben möchte.

    Welche Möglichkeit habe ich, bei diesem Prozess 3 Monate auf ein vorhandenes Datum zu addieren?

    Ich komme da gerade nicht weiter und hoffe, dass ihr mir Unterstützung geben könnt.

    Viele Grüße

    Johannes

  • #2
    Hallo,
    ich weiß nicht ob es die beste Lösung ist, aber ich würde den Wert in einer Groovy Aktion auslesen, dort addieren und dann in die DG schreiben.

    Wenn man möchte kann man den modifizierten Wert auch als SharedState Variable oder so setzen und dann bei der Feldzuordnung als Systemwert auswählen.

    Kommentar


    • #3
      Kannst du mich dabei unterstützen? Ich kenne mich leider mit Groovy (noch) gar nicht aus. Könntest du mir sagen, welche Werte du brauchst, um mir einen Code zu erstellen?

      Kommentar


      • #4
        Ich werde dir keine fertige Arbeit liefern.
        Aber ich kann dir gerne sagen was du machen musst, damit du es beim nächsten mal selber hinbekommst. An sich lernt man es recht schnell.

        Im Groovy Skript Editor gibt es rechts den tollen Reiter "Bibliotheken". Dort lässt sich vieles nachlesen und mit Doppelklick sogar in deinen eigenen Code einfügen.
        Meistens gibt es da ein (i) Zeichen über das sich eine Beschreibung öffnen lässt


        In einer Groovy Aktion gibt es nun ein "g_record" Objekt. Schau mal nach.
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Information.JPG Ansichten: 0 Größe: 25,9 KB ID: 9495

        Da steht: Zugriff auf aktuellen Datensatz.
        Also kommst du mit
        Code:
        g_record["DATENFELDGUID"].value
        an dein Attribut.

        Noch leichter geht es über einen Rechtsklick im Editor. Dort kannst du dann mit einem Doppelklick sofort den Zugriff generieren lassen.

        Den Wert speichert man dann zum Beispiel in einer Variable. Da Groovy nicht unbedingt einen festen Datentyp braucht, reicht ein einfaches def bei der Deklaration.
        Code:
        def currentDate= g_record["5C6037CBD0A7C348B1939696C019DBCB2DA9ED05"].value
        Das "Value" ist wichtig, um an den tatächlichen Wert des Valueholders zu kommen (Man kann es als Container für einen Wert betrachten. Wenn du ihn ausgibst erhälst du in etwa sowas @54616).

        Nun hast du dein Datumswert in einer Groovy Variable gespeichert. Um sicherzugehen dass der Wert auch wirklich da ist, machen wir jetzt eine Ausgabe im Log.
        Auch hier gilt wieder: Rechts in der Bibliothek nachschauen wie das Logging geht.
        Beim Logging gibt es nun das Portal Log und die einfache Logdatei(Eigentlich workflow Log).
        Hier wählst du am besten das normale Log weil wir das direkt im Reiter Prozess anschauen können über diese Schaltfläche.
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: findLog.JPG Ansichten: 0 Größe: 22,4 KB ID: 9496

        Der Unterschied zwischen Info, Warnung und Error ist eigentlich nur eine Kategorisierung des Logs.


        Hier wählen wir dann einfach mal die Warnung, damit wir die Logeinträge nach Warnungen Filtern können.
        Code:
        g_log.warn(currentDate)
        Dann startest du den Prozess und schaust was du im Log erhälst. Hoffentlich das Datum.

        Jetzt können wir weiter das Skript schreiben.
        Für das manipulierte Datum machen wir am besten noch eine Variable.
        Diese füllen erstellen wir erst leer, füllen diese dann mit dem alten Datumswert und manipulieren dann. (Das geht alles auch in einem aber so ist es übersichtlicher)
        Code:
        def newDate; //deklaration
        newDate = currentDate  + 90 // zuweisung + manipulation
        g_log.warn("Neues Datum: " + currentDate) //Ausgabe neues Datum
        Groovy macht es uns hier recht einfach und wir können auf ein Datum einfach eine Zahl addieren. diese wird dann als Tage angenommen. Ich meine sogar, dass die 30./31. mit berücksichtigt werden und auch die Februarabweichungen. Aber wenn es 100% richtig sein soll wurde ich nochmal nachrecherchieren empfehlen.

        Wieder ausführen und Log checken.

        Wenns funktioniert dann gehts weiter:
        Wir wollen den neuen Wert nun verfügbar für unsere Datengruppenaktion haben. Also Variable in globalem Scope abspeichern (ist korrekt gesagt eigentlich der SharedState des Workflow contextes). Dazu nutzen wir den sharedState. Wieder Bibliothek und anschauen was der g_sharedState ist und was er kann. Eigentlich sollte man es mit dieser Beschreibung hinbekommen aber ich füge dennoch ein Code Snippet ein.
        Code:
        g_sharedState.newDate = newDate // erzeugung einer Varible im sharedState
        g_log.warn(g_sharedState.newDate) // wieder eine Ueberpruefung im Log ob Variable richtig gesetzt
        (falls das nicht funktionieren sollte gibt es noch diese Funktion: g_sharedState.put("newDate", newDate) )

        Die Datengruppenaktion hast du ja schon wie du oben geschrieben hast. Nun fügst du da nicht einen Wert aus der Datengruppe hinzu, sondern einen Benutzerdefinierten Wert. Nämlich einen Systemwert.
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: zuordnung.JPG Ansichten: 0 Größe: 99,4 KB ID: 9497



        Complette Groovy Aktion sollte in etwa so aussehen(Ohne Logs und ohne Kommentare. Füg diese jedoch bitte bei dir ein):
        Code:
        def currentDate= g_record["GUID"].value
        
        def newDate
        newDate = currentDate  + 90
        g_log.warn("Neues Datum: " + currentDate)
        
        g_sharedState.newDate = newDate

        Sollte etwas nicht funktionieren bitte hier bescheid sagen und auch bitte die Logeinträge mitsenden. Ich habe das alles nicht getestet, weshalb es sein kann dass ich hier einen Fehler gemacht habe.

        Viel Erfolg!



        Kommentar


        • #5
          Fabian, das ist echt super von dir. So ist es mir auch lieber, weil ich dann ein bisschen experimentieren kann und auch in der Zukunft weiter komme. Vielen Dank!

          Ich bin deiner Anleitung gefolgt, komme allerdings bei der Berechnung nicht weiter.

          Aktuell sieht die Groovy-Aktion wie folgt aus:

          Code:
          g_record["0B32567DBF05BDBDC5D118926FDEC8EEB90E520C"].value //originales Feld mit Datum
          def currentDate= g_record["042EBF81344B8D4B5B0F7D37ABE60848264C3555"].value //temporäres Datumsfeld (leer)
          
          def newDate //deklaration
          def newDate = currentDate  + 90 // zuweisung + manipulation
          g_log.warn("Neues Datum: " + currentDate) //Ausgabe neues Datum
          Der erste Absatz ging ohne Probleme. Er hat mir auch das originale Datum im Log angezeigt.
          Wenn ich aber den zweiten Absatz hinzufüge, erhalte ich eine Fehlermeldung:

          Code:
          ERROR 2019-11-07 13:47:18,263 - de.uplanet.lucy.server.workflow.WorkflowEngine[WebConnectorWorker-localhost:8107-8]
                wfGuid=F4B4D53E4FC6A3F91566B11AB31FDA7A48D58544 wfTitle="Meine App" wfRun=F4B4D53E4FC6A3F91566B11AB31FDA7A48D58544-1573035282937 wfObjGuid=4F967D63EE61C40462121C6D2C9D3091165BA675 wfObjClass=de.uplanet.lucy.server.workflow.action.GroovyScriptWorkflowAction wfObjTitle="Groovy-Aktion" Error while processing workflow.
          de.uplanet.lucy.server.workflow.WorkflowException: Cannot compile script in de[email protected]454944e9(Groovy-Aktion, 4F967D63EE61C40462121C6D2C9D3091165BA675).
              at de.uplanet.lucy.server.workflow.action.GroovyScriptWorkflowAction.process(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine.a(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine.access$000(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine$3.runImpl(Unknown Source)
              at de.uplanet.lucy.server.portalserver.Impersonator$ProcessAction.run(Unknown Source)
              at java.security.AccessController.doPrivileged(Native Method)
              at javax.security.auth.Subject.doAsPrivileged(Subject.java:483)
              at de.uplanet.lucy.server.portalserver.LocalSystemImpersonator.run(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine.a(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine.processEvent(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEngine.dispatchEvent(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowSystemBean.dispatchEvent(Unknown Source)
              at de.uplanet.lucy.server.workflow.WorkflowEventDispatcher.dispatch(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.executeWorkflows(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.performUpdateAction(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.updateAction(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtdata.AbstractRtData.updateAction(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtappservices.AbstractRtApp.changeData(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.rtappservices.AbstractRtApp.processData(Unknown Source)
              at de.uplanet.lucy.server.businesslogic.RtAppLoader$ActionHandlerFacade.processData(Unknown Source)
              at de.uplanet.lucy.server.engine.http.ProcessActionsIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.RestoreViewIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.flashscope.FlashScopeIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.ValidateRequestIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.BindSessionIxFilter$1.run(Unknown Source)
              at java.security.AccessController.doPrivileged(Native Method)
              at javax.security.auth.Subject.doAsPrivileged(Subject.java:483)
              at de.uplanet.lucy.server.engine.http.BindSessionIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.SessionInfoIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.RequestPreparationFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.KerberosSupportIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.ThreadContextAndTransactionIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.ProtocolInformationIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.SetDefaultResponseCharsetIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.RequestCleanupFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.DebugIxFilter.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline$IIxFilterChainImpl.doFilter(Unknown Source)
              at de.uplanet.lucy.server.engine.http.HttpRequestProcessingPipeline.process(Unknown Source)
              at de.uplanet.lucy.server.connector.web.WebConnectorWorkerThread.run(Unknown Source)
          Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          C:\ProgramData\intrexx\XXXX\internal\workflow\F4B4D53E4FC6A3F91566B11AB31FDA7A48D58544\groovy\script4F967D63EE61C40462121C6D2C9D3091165BA675.groovy: 5: The current scope already contains a variable of the name newDate
           @ line 5, column 5.
             def newDate = currentDate  + 90 // zuweisung + manipulation
                 ^
          
          1 error
          
              at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
              at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:981)
              at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:626)
              at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:575)
              at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
              at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
              at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:279)
              at de.uplanet.lucy.server.scripting.groovy.IxGroovySystemBean.a(Unknown Source)
              at de.uplanet.lucy.server.scripting.groovy.IxGroovySystemBean.parseClass(Unknown Source)
              ... 51 more
          Habe ich evtl. etwas falsch verstanden?

          Kommentar


          • #6
            Eh nee da hab ich ein Fehler gemacht

            Korrekt ist es so
            Code:
            def currentDate= g_record["042EBF81344B8D4B5B0F7D37ABE60848264C3555"].value //ursprungsdatumsfeld
            
            def newDate //deklaration
            newDate = currentDate  + 90 // zuweisung + manipulation
            g_log.warn("Neues Datum: " + currentDate) //Ausgabe neues Datum
            Das def kommt nur bei der Deklaration vor. Also beim ersten erscheinen der Variable.
            Die Zeile darunter ist nur eine Zuweisung des Wertes. Deshalb muss da natürlich kein def hin

            Die oberste Zeile kann man sich auch sparen. Diese war lediglich ein Beispiel

            Kommentar


            • #7
              Ich habe es geschafft Ich freue mich

              Einen indirekten Fehler konnte ich noch finden. Ich hatte mich gewundert, dass beim Log kein neues Datum ausgegeben worden ist, sondern immer das Alte. Ich habe das "+ currentDate" durch "newDate" ersetzt, damit der berechnete Wert angezeigt wird.

              Vielen lieben Dank für deine Unterstützung.

              Momentan ist alles ein bisschen zu viel für mich, weil ich parallel in VBA, SQL und DAX arbeite. Dadurch komme ich inzwischen mit den ganzen Sprachen durcheinander

              Nochmals, vielen DANK!

              Kommentar


              • #8
                Kein Problem

                Wie gesagt habe ich das alles nicht getestet und auf die schnelle zusammengetragen.

                Momentan ist alles ein bisschen zu viel für mich, weil ich parallel in VBA, SQL und DAX arbeite. Dadurch komme ich inzwischen mit den ganzen Sprachen durcheinander
                Na das hört sich ja spannend an!

                Wurde mit Intrexx auch ins kalte Wasser geworfen. Allerdings ist es nicht allzu schwer. Manchmal ein wenig frustrierend da die Dokumentation hier und da etwas "bedürftig" ist.

                An sich kann ich nur die Bibliotheken empfehlen die es in jedem Editor gibt.
                Tipp für Velocity: Wenn du eine Programmierung im Statischen Text Programmierung machen willst, dann mach diese lieber vorher mit dem Kontrollelement VTL Include. Dann hast du da auch noch die Velocity Bibliothek.

                Und falls du die Möglichkeit hast natürlich die Intrexx Academy. Diese Unterlagen nutze ich immer wieder wenn ich mir nicht mehr ganz sicher bin.

                Kommentar


                • #9
                  Eine Möglichkeit ist auch CalendarUtil.modifyDate (http://docs.intrexx.com/intrexx/vers...util.TimeZone)) zu verwenden:

                  Code:
                  // http://docs.intrexx.com/intrexx/version/9200/api/groovy/jdk/de/uplanet/util/CalendarUtil.html
                  import de.uplanet.util.CalendarUtil
                  import java.text.SimpleDateFormat
                  
                  
                  // Die Zeitzone (z.B. des aktuellen Benutzers oder die Serverzeitzone)
                  // hier im Beispiel explizit Europe/Berlin
                  def tz = TimeZone.getTimeZone("Europe/Berlin")
                  
                  def dtNow = now()
                  
                  def dtLater = CalendarUtil.modifyDate(dtNow, ",+3,,,,,", tz) // + 3 Monate
                  
                  // berechneten Wert in derselben Zeitzone als String ausgeben
                  def fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                  fmt.setTimeZone(tz)
                  
                  println(fmt.format(dtLater))

                  Kommentar


                  • #10
                    Vielen Dank für eure Unterstützung und eure Tipps.

                    Nun habe ich einige Tage weiter daran gearbeitet und bin un am Testen.

                    Während des Testens habe ich leider festgestellt, dass der Prozess das Datum in "allen" Datensätzen überschreibt. Wenn ich also einen Datensatz anlege, berechnet er das neue Datum + X Tage richtig, schreibt dies aber in jeden Datensatz (die nichts miteinander zu tun haben).

                    Eigentlich möchte ich einen neuen Datensatz anlegen oder einen vorhanden bearbeiten und dort das Datum berechnen und abspeichern können.
                    Hinterher habe ich dann eine Ansichtstabelle mit den verschiedenen Datensätzen und ihrem neuen Datumsfeld. Aktuell wird das neu berechnete Datumsfeld leider immer vom letzten gespeicherten Datensatz übernommen.

                    Was habe ich falsch gemacht?

                    Kommentar


                    • #11
                      Ich habe den Fehler schon gefunden

                      Es lag an der Datengruppenaktion an der Manipulationsmenge. Dort habe ich leider "keinen Filter" ausgewählt. Durch den "einfachen Filter" funktioniert es jetzt.

                      Kommentar

                      Lädt...
                      X