0

Formelproblem scheinbar nach Versionsupdate

Hallo liebe Community,

Ich muss mich nach sehr langer Zeit nochmal mit einem Problem melden. Habe vor einem Jahr eine App zur Massenrechnungserstellung im Vermietungsgewerbe erstellt. Es werden ca. alle 4 Kalenderwochen ein Rechnungslauf gestartet. Leider ist jetzt beim aktuellen Rechnungslauf ein Fehler aufgetreten uns zwar in der Berechnung einer Mindestabnahme (z.B eine Miettoilette muss mindestens für 4 Wochen bezahlt werden wenn sie auch nur kürzer gemietet wird).

Diese Mindestabnahme hat jetzt problemlos ein Jahr lang funktioniert aber in dieser Formel wird nun plötzlich immer die Mindestabnahme berechnet. Die Formel wirkt sehr kompliziert es kommt aber eigentlich nur auf die letzte IF Bedingung an. Hier wird nun immer die Mindestabnahme durchgeführt obwohl das entsprechende Feld (Auftragesende bzw. let Abholung := Auftragsende) leer ist. 

Hier der entsprechende Ausschnitt:

if Abholung != null then
    Mindestabnahmepruefung
else
    cnt(unique(for i in range(0, anzahl_normal + 1) do
                week(date(year(RG_Anfang), month(RG_Anfang), day(RG_Anfang) + i))
            end))
end

 

Hier die gesamte Formel:

let RG_Anfang := if week('RG abgerechnet bis') = null then
        Lieferdatum
    else
        if weekday('RG abgerechnet bis') = 0 then
            'RG abgerechnet bis' + 8
        else
            'RG abgerechnet bis' + 7
        end
    end;
let RG_Ende := if 'RG Abzurechnen bis' < RG_Anfang then
        RG_Anfang
    else
        if weekday('RG Abzurechnen bis') = 0 then
            'RG Abzurechnen bis' + 1
        else
            'RG Abzurechnen bis'
        end
    end;
let Abholung := Auftragsende;
let Lieferung := Lieferdatum;
let anzahl_normal := days(RG_Anfang, RG_Ende);
let gesamtanzahl_mindestabnahme := days(Lieferung, Abholung);
let RG_Anfang_mindestabnahme := if week('RG abgerechnet bis') = null then
        Lieferdatum
    else
        'RG abgerechnet bis'
    end;
let anzahlabgerechnet_mindestabnahme := days(Lieferung, RG_Anfang_mindestabnahme);
let Mindestabnahmepruefung := if cnt(unique(for i in range(0, gesamtanzahl_mindestabnahme + 1) do
                        week(date(year(Lieferung), month(Lieferung), day(Lieferung) + i))
                    end)) < 4 then
        if week('RG abgerechnet bis') = null then
            5 - cnt(unique(for i in range(0, anzahlabgerechnet_mindestabnahme + 1) do
                        week(date(year(Lieferung), month(Lieferung), day(Lieferung) + i))
                    end))
        else
            4 - cnt(unique(for i in range(0, anzahlabgerechnet_mindestabnahme + 1) do
                        week(date(year(Lieferung), month(Lieferung), day(Lieferung) + i))
                    end))
        end
    else
        cnt(unique(for i in range(0, anzahl_normal + 1) do
                    week(date(year(RG_Anfang), month(RG_Anfang), day(RG_Anfang) + i))
                end))
    end;
if Abholung != null then
    Mindestabnahmepruefung
else
    cnt(unique(for i in range(0, anzahl_normal + 1) do
                week(date(year(RG_Anfang), month(RG_Anfang), day(RG_Anfang) + i))
            end))
end

7 Antworten

null
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Robby. Ich würde mal nachforschen, ob das Feld "Abholung" wirklich leer ist. Gib doch mal am Ende vom Script folgendes ein. Mirko

    Abholung = null
    
    • CENTaros Finanzen GmbH
    • Robby_Kurze
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Mirko,

     

    dann gibt er mir Ja im Feld aus was für mich bedeutet das Feld ist leer, oder?

      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Robby Kurze anders als Uwe würde ich jetzt den else-Teil überprüfen, da dieser ja ausgeführt wird und immer das Ergebnis bringt, welches der Mindestabnahmeprüfung entspricht. Also wieder am Ende vom Script die Variable 'anzahl_normal', RG_Anfang und dann den ganzen else-Teil eingeben. Sind es die Ergebnisse, die Du erwartest? 

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Es sieht so aus, als ob das Ergebnis der Berechnung für die Variable 'Mindestabnahmepruefung' immer dem errechneten Wert der 'else-Bedingung' :


    cnt(unique(for i in range(0, anzahl_normal + 1) do
                    week(date(year(RG_Anfang), month(RG_Anfang), day(RG_Anfang) + i))
                end))

    entspricht, und es deshalb so scheint, als ob immer die Mindestabnahme berechnet wird.
    Ich würde mal überprüfen, ob der richtige Wert für die Variable 'Mindestabnahmepruefung' berechnet wird.

    • + Maßanzug statt Massenware +
    • RonaldP
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hi Robby Kurze ,

    Ich verstehe das Problem/Ursache so: wieso auch immer ist deine Variable "Abholung" eben nicht NULL, auch wenn Du das eigentlich erwartest.
    => Es ist ein Unterschied ein Feld auf NULL (wurde noch nie beschrieben) abzufragen
    oder auf != "" (leer) abzufragen.
    Generell kannst du statt "if Abholung != null" auch kürzer "if Abholung" schreiben.

    Prüfe doch mal ob es richtig berechnet wird, wenn Du es so schreibst:

    if Abholung or Abholung != "" then
        Mindestabnahmepruefung
    else
        cnt(unique(for i in range(0, anzahl_normal + 1) do
                    week(date(year(RG_Anfang), month(RG_Anfang), day(RG_Anfang) + i))
                end))
    end
    

     

    Viel Erfolg
    Ronald

    • CENTaros Finanzen GmbH
    • Robby_Kurze
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe,

    hallo Ronald,

    danke für die Antworten.

    Das Hauptproblem war tatsächlich in einem anderen Script zu suchen. Die Berechnung dieses Script war richtig nur auf Grund der Änderung an einem Vorschritt und der größe des Scripts wirkte es für mich falsch.

    Jedoch muss das Problem beim Versionsupdate (Cloudversion) entstanden sein. Ich habe eine uralte Backup-Version von Rechnungen mit dem damaligen Ausdruck verglichen. Diese hatten deutliche Abweichungen genau in den Punkten die mir nun aufgefallen sind. Ist denn bei den Neuerungen am Scripting-Editor irgendetwas geändert worden was eventuell Teile von Scripts verändert? Ich denke, dass die Antwort natürlich nein sein wird. Darf ja eigentlich nicht aber ich kann es mir nicht anders erklären, da ich seit Monaten keine Veränderungen mehr durchgeführt habe und nun nach meinem letzten Rechnungslauf sind enorme Veränderungen entstanden. Leider sind die Backups ja immer nur mit der "neuer Technik" anzuschauen, sonst hätte ich die Veränderungen in den "Problemscripts" ja schnell im Vergleich rausgefunden.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Robby Kurze Die alten Ninox Versionen haben oftmals Script-Code richtige interpretiert, der eigentlich falsch geschrieben war. Mit jedem Update kann es passieren, das der Code-Interpreter darüber nicht mehr ohne weiteres hinwegsieht.