0

Werte eines Monats -> Wochenweise darstellen = Auszahlungsliste

Hallo!

Für eine Auszahlungsliste muß ich ein ausgewähltes Monat in einzelne Wochenblöcke darstellen. Grundsätzlich funktioniert die Berechnung so, dass immer 7 Tage genommen werden und zum Schluss, die restlichen Tage des jew. Monats.  
Im ausgewählten Monat kommen dann zwischen 4 und 6 Wochenblöcke zusammen.

1. WochenBlock:
Zeige alle Datums mit start vom 1. des Monats bis inkl. 1.Sonntag im Monat (vom ausgewählten Monat). --kann je nach Monat auch nur 1 Tag in diesem Block sein

2. - letzter  WochenBlock:
Zeige die nächsten Datums dann beginnend mit Montag wieder bis einschließlich Sonntag.  Wenn beim letzten Wochenblock der letzte Sonntag bereits im nächsten Monat liegt, dann zeige nur noch die Tage bis zum letzten des ausgewählten Monats an.

Es gibt dann noch ein paar Abhängigkeiten, aber im Prinzip würde hier eine Lösung sehr helfen. Meine Lösung funktioniert leider nicht zu 100% -> aber vielleicht hilft es zum Verständnis meines Problems.

Vielen DANK

Für jeden Wochenblock habe ich je ein "StartWoche" sowie  "EndWoche" FX Feld erstellt:
"StartWoche:"
if weekday(Firstmonth) < 7 and Firstmonth > 'Anmeldung Land von MH' then
    Firstmonth
else
    date('Anmeldung Land von MH')
end
----

"EndWoche"
let kWweek := 'fx_week1_verwaltung start';
let endmonat := date(year('Auswahl Betrachtungsmonat'), month('Auswahl Betrachtungsmonat') + 1, 1) - 1;
let tagimmonat := day(kWweek);
let auswahl := if day(kWweek) > 0 then
        date(year(kWweek), month(kWweek) + 0, 0)
    end;

let nextSunday := kWweek + if weekday(kWweek) < 7 then 6 else 13 end - weekday(kWweek);
if weekday(Firstmonth) < 7 and kWweek > Firstmonth then
    if nextSunday > 'Abmeldung Land lt. Land-Abmeldung (Ist)' then
        'Abmeldung Land lt. Land-Abmeldung (Ist)'
    else
        if nextSunday > endmonat then
            endmonat
        else
            nextSundday
        end
    end
else
    Abrechnung.NSonntag
end

8 Antworten

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Bernhard. Was wäre im Idealfall Dein Wunsch für die Ausgabe des Scripts? Gruß Mirko

    • Ninox-Professional
    • planoxpro
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Bernhard, mir ist nicht klar, was mit den Tagesdaten der Wochenblöcke passieren soll. Deshalb hier einfach mal ein einfaches Beispiel, in dem die Daten wochenweise untereinander in ein Funktionsfeld geschrieben werden. Dabei bin ich davon ausgegangen, dass es zwei numerische Felder für 'Jahr' und 'Monat' gibt:

    let myDay := date(Jahr, Monat, 0);
    let myLast := date(Jahr, Monat + 1, 0);
    let myWeek := 1;
    let myList := "Woche 1" + "
    ";
    while myDay < myLast do
        myDay := myDay + 1;
        myList := myList + format(myDay, "ddd, DD.MM.YYYY") + "
    ";
        if weekday(myDay) = 6 then
            myWeek := myWeek + 1;
            myList := myList + "Woche " + text(myWeek) + "
    "
        end
    end;
    myList
    
      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro Sehr elegante Lösung.

      • Bernhard_F
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro 
      das ist schon super -> das Datum kommt von einem Datumsfeld und wird manuell ausgewählt.
      Aus diesem Datumsfeld, egal welcher Tag ausgewählt ist, rechnen sich dann diese Wochenblöcke wie du sie schon erstellt hast, super

      bin gerade am überlegen letztlich bräuchte ich die Wochen in einzelne Funktionsfelder
      Woche1 = Feld1, Woche2 = Feld2... ich müsste dann die vollen Tage noch zählen, also Montag - Sonntag wären 7 (nicht nur die Tage dazwischen) -> aber unglaublich wie schnell du sowas raus haust :=) - DANKE

    • Bernhard_F
    • vor 2 Jahren
    • Gemeldet - anzeigen

    vielen Dank für die rasche Antwort:

    Das Ergebnis soll als Ansicht einer bestehenden Tabelle angezeigt werden.
    Beginnend mit
    1. Block alle Tage bis Sonntag, dann
    2. Block alle Tage ab Montag
    3. Block alle Tage ab Montag
    4. Block alle Tage ab Montag
    5. Block alle Tage ab Montag
    6. Block restlichen Tage in dem Monat in der letzten Woche (manche Monate haben 6 Wochen wenn man vom 01. Sonntag im Monat ausgeht. 

    Anbei ein Anhang wie das aussehen sollte :)

      • Ninox-Professional
      • planoxpro
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Oh ... Das wären bei 6 Wochen mindestens 24 Funktionsfelder nebeneinander. Die immer wieder neu berechnet werden müssten. Und wenn man die Ansicht löscht, fängt man wieder von vorne an. 

      Ich will natürlich niemandem reinreden, aber das ergibt für mich(!) so keinen Sinn. Zumal die Daten bei einer Ansicht auch nur temporär erzeugt würden, also weder gedruckt noch gespeichert werden könnten.

      Um aber zumindest mal einen Ansatz zu zeigen, habe ich eine kleine DB gebaut, mit der sich die Wochen monatsweise generieren und in einer Extratabelle speichern lassen. Vielleicht hilft das bei den weiteren Überlegungen. Die DB-Datei kann hier heruntergeladen werden (über dann über "Archiv importieren" in das Team laden):

      https://www.dropbox.com/s/ssprl7yx1lm42lt/Monatswochen.ninox?dl=0

      Der Code des Buttons ist allerdings das Gegenteil von elegant. War mir aber jetzt egal. ;)
       

    • Bernhard_F
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo planlox. pro, 
    vielen herzlichen Dank für deine super Hilfe und Bemühungen.

    Das mit den vielen Funktionsfelder ist korrekt, ich konnte es bisher noch nicht anders lösen. Aus diesen vielen Felder habe ich derzeit eine View gebaut, die dann mit Hilfstabellen ausgedruckt werden kann.

    Ich muß keine neuen Werte in einer neuen Tabelle… generieren, es geht darum vorhandene Werte in den jeweilig beschriebenen Wochenzeitblöcken zusammenzufassen bzw. über eine View so in den einzelnen Blöcken Wochenweise darstellen. 

    Situation:
    Alle bereits vorhandenen Datensätze besitzen ein Datumsfeld. Ich muß jetzt „nur“ eine View bauen, die dann aus diesen Datensätzen, je nach BetrachtungsMonat der view - die vorhandenen Daten aus der Quelle in den einzelnen Wochenblöcken darstellen.
    In dieser Darstellung erfolgen dann innerhalb dieser Wochenblöcke - Berechnungen…

    Meine Lösung mit den vielen Funktionsfelder funktioniert denke ich mittlerweile, ist aber gar nicht elegant, deshalb sind deine Vorschläge natürlich auf einem ganz anderen Level :).

    Hier mein Code, so wie es jetzt läuft, mit dem Beispiel „Woche1 Start“ und Woche1 Stop“ usw. Das Ergebnis sieht dann so wie im Screenshot weiter oben aus. 

    Code:
    Woche1 Start:
    let x := if Abrechnung.Firstmonth >= 'Entlassung laut Bescheid' then
            true
        end;
    if weekday(Abrechnung.Firstmonth) < 7 and Abrechnung.Firstmonth > 'Anmeldung Land von MH' and x != true then
        Abrechnung.Firstmonth
    else
        if 'fx_Entlassung laut Bescheid minus eins' < Abrechnung.Firstmonth then
            date("")
        else
            date('Anmeldung Land von MH')
        end

    ——-

    endWoche1 Ende:
    let kWweek := 'fx_week1 verwaltung start';
    let anfangmonat := Abrechnung.Firstmonth;
    let endmonat := date(year(Abrechnung.'Auswahl Betrachtungsmonat'), month(Abrechnung.'Auswahl Betrachtungsmonat') + 1, 1) - 1;
    let nextSunday := kWweek + if weekday(kWweek) < 7 then 6 else 13 end - weekday(kWweek);
    let tagimmonat := day(kWweek);

    if weekday(anfangmonat) < 7 and kWweek > anfangmonat then
        if nextSunday > 'Entlassung laut Bescheid' - 1 and < endmonat then
            'fx_Entlassung laut Bescheid minus eins'
        else
            if nextSunday > endmonat then
                endmonat
            else
                if nextSunday > endmonat or nextSunday > 'fx_Entlassung laut Bescheid minus eins'
    then
                    'fx_Entlassung laut Bescheid minus eins'
                else
                    nextSunday
                end
            end
        end
    else
        let check := Asyl_Abrechnung.NSonntag;
        if kWweek = null then
            date("")
        else
            if Abrechnung.NSonntag < 'Entlassung laut Bescheid' then
                Abrechnung.NSonntag
            else
                if kWweek <= 'fx_Entlassung laut Bescheid minus eins' then
                    'fx_Entlassung laut Bescheid minus eins'
                else
                    nextSunday
                end
            end
        end
    end

    ——

    Woche2 Start:
    let kWweek := 'fx_week1 verwaltung ende';
    let endmonat := date(year(Abrechnung.'Auswahl Betrachtungsmonat'), month(Abrechnung.'Auswahl Betrachtungsmonat') + 1, 1) - 1;
    if weekday(kWweek) < 7 then
        if 'Entlassung laut Bescheid' <= kWweek + 1 then
            date("")
        else
            if kWweek + 1 <= endmonat then
                kWweek + 1
            end
        end
    else
        if 'fx_Entlassung laut Bescheid minus eins' < Abrechnung.Firstmonth then
            date("")
        else
            date('Anmeldung Land von MH')
        end
    end

     

    ——

    „Woche2 Ende“ = wie Woche1 nur mit „Woche2 Start“

    • Bernhard_F
    • vor 2 Jahren
    • Gemeldet - anzeigen

    So sieht der Druck aus