0

Summe funktioniert nicht

Guten Morgen alle zusammen.

Ich möchte gerne die Summe aller Leistungsstunden für einen Tag ermitteln. Die Anzahl der einzelnen Stunden werden mit dem Text 'Stunden oder Stunde' in der Tabelle gespeichert.

 

let currentDate := this.Datum;
let a := sum((select Zeiterfassung)[Datum = currentDate].number(substr(text(Leistungsstunden), 0, index(text(Leistungsstunden), " "))));

 

Wenn ich die Funktion ohne 'sum' benutzen werden mir die Stunden durch ein Komma getrennt aufgelistet. Wenn ich aber die Funktion mit 'sum' benutze, bekomme ich das Ergebnis '0'.

 

Ich danke euch schon mal.

 

VG

Yves

10 Antworten

null
    • titanium_bird
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Sorry, das 'number' muss weg. Hatte ich noch vom testen drin. Jetzt stimmt meine Aussage.

     

    VG Yves

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Yves, ich denke mal, dass die Erfassung der Stunden in einem Textfeld stattfindet, welches du durch substr auf die Zahl reduzieren willst und dein Code in einer anderen Tabelle läuft. Dann könnte es mit

    let currentDate:=this.Datum;

    sum((select Zeiterfassung)[Datum=currentDate].number(substr(Leistungsstunden, 0, 2)))

    funktionieren, da ich annehme, dass niemand mehr als 24h am Tag arbeitet, reicht die substr auf 2.

    Mirko

    • titanium_bird
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Monk.

     

    Erstmal danke, aber so einfach mach ich es nicht.   :)

     

    Ja, niemand arbeitet mehr als 24 Stundne.

     

    Die Leistungsstunden werden in einem Funktionsfeld in der Tabelle Zeiterfassung berechnet und gerundet.

     

    let performanceHour := round(number(Arbeitsende - Arbeitsbeginn - Pause) / 1000 / 60 / 60 * 4, 0) / 4;
    if performanceHour = 1 then
    performanceHour + " Stunde"
    else
    performanceHour + " Stunden"
    end

    Es gibt für die Mitarbeiter mehrere Arbeitsaufträge am Tag zu unterschiedlichen Projekten. Damit die Mitarbeiter einen Überblick bekommen, wieviele Stunden Sie am Tag schon gemacht haben, möchte ich die Leistungsstunden für den Tag summieren.

     

    Wenn ich jetzt deine Lösung nutze, bekomme ich ein Ergebnis. Es werden aber bei der Berechnung die Nachkommastellen nicht mit berechnet.

     

    Hast du vllt. noch einen Lösungsansatz für mich.

     

    Danke und VG

    Yves

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Eine pragmatische Lösung wäre.

    1. lege ein weiteres Funktionsfeld an, nenne es XY (oder so) und berechne

    performanceHour := round(number(Arbeitsende - Arbeitsbeginn - Pause) / 1000 / 60 / 60 * 4, 0) / 4

    2. verstecke es durch einen Eintrag bei "Feld nur anzeigen, wenn:" false

    3. benutze dieses Feld für die Berechnung, weil damit die Tilgung deiner "Einheiten" Stunde und Stunden entfällt.

    let currentDate:=this.Datum;

    sum((select Zeiterfassung)[Datum=currentDate].XY)

    4. Du könntest auch das originale Funktionsfeld belassen, nennst es um in "Zeit in h" und tilgst die Einheit, die du durch den if-code vergibst.

    5. in ruhiger Minute denke ich nochmal über eine Variante mit substr. nach

    Mirko

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

     

    ich hätte keine konkrete Lösung - denke aber, dass hier vielleicht das "Rechnen mit Text" die Sache unnötig verkompliziert. Wie wäre es denn, wenn man für die Leistungsstunden zwei Funktionsfelder benutzt? Eines könnte der Kalkulation an sich dienen und versteckt sein (z.B. 'LeistungsStundeKalk') mit folgendem Code:

     

    let performanceHour := round(number(Arbeitsende - Arbeitsbeginn - Pause) / 1000 / 60 / 60 * 4, 0) / 4

     

    Das zweite, angezeigte Feld 'Leistungsstunden' könnte dann mit

     

    LeistungStundeKalk + if LeistungsStundeKalk = 1 then
       " Stunde"
    else
       " Stunden"
    end

     

    wunschgemäß anwenderfreundlich angezeigt werden - und mit 'LeistungsStundeKalk' könnte man nach wie vor rechnen...

     

    lg, Torsten

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Örgs Mirko,

     

    zwei ... ein Gedanke :-)

     

    lg ,Torsten

    • titanium_bird
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen alle zusammen.

     

    Die Idee, mit dem Berechnungsfeld, hatte ich auch schon. Bekomme ich da aber nicht ,bei einer umfangreichen Anwendung, Performance Probleme?

     

    Hab es jetzt erstmal so umgesetzt. 

    Vielen Dank für eure Hilfe.

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Yves,

     

    kann ich mir kaum vorstellen - Du berechnest so ja nicht mehr, sondern teilst den Code nur auf zwei Berechnungsfelder. Im Gegenzug sparst Du Code auf der Auswertungsseite.

     

    lg, Torsten

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Falls noch Interesse besteht, dann müßte es so gehen:

    let currentDate:=this.Datum;
    let Q := sum((select Zeiterfassung).round(number(Arbeitsende - Arbeitsbeginn - Pause) / 1000 / 60 / 60 * 4 / 4));
    if = "1" then Q + " Stunde" else Q + " Stunden" end

    Mirko

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    let currentDate:=this.Datum;
    let Q := sum((select Zeiterfassung)[Datum=currentDate].round(number(Arbeitsende - Arbeitsbeginn - Pause) / 1000 / 60 / 60 * 4 / 4));
    if = "1" then Q + " Stunde" else Q + " Stunden" end

    Datum fehlte.