0

Abwesenheiten im Formelfeld anzeigen

Moinsen,

ich möchte gerne die Abwesenheiten der Mitarbeiter bei unserer Kolonnenplanung in einem Formelfeld darstellen.

let datum := Datum;
let output := "";
for m in select Mitarbeiter do
    for a in m.Abwesenheitsplaner do
        if datum >= a.'Erster Tag' and datum <= a.'Letzter Tag' then
            output := output + m.Vorname + " " + m.Name + ": " + text(a.Art) + ", "
        end
    end
end;
output

Mit dem Code werden die Mitarbeiter schon richtig angezeigt. Jetzt möchte ich gerne die Abwesenheiten aber gruppiert angezeigt bekommen je nach Abwesenheitsart. Da bekomme ich irgendwie keinen Namen rein:

let datum := Datum;
let mitarbeiter := (select Mitarbeiter);
let artenListe := unique((select Abwesenheitsplaner).Art);
let output := "";
for art in artenListe do
    let namen := [];
    for m in mitarbeiter do
        let abw := m.Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag' and Art = art];
        if cnt(abw) > 0 then
            namen := namen + "- " + m.Vorname + " " + m.Name
        end
    end;
    if cnt(namen) > 0 then
        output := output + art +
            ":
" +
            join(namen, "
")
    end
end;
output

Die Abwesenheiten werden einzeln, also unique, angezeigt, aber es tauchen keine Namen auf?

Hat da jemand einen Tip?

Gruß Mirko

8 Antworten

null
    • mirko3
    • vor 11 Tagen
    • Gemeldet - anzeigen

    Man könnte es so

    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let result := for i in my[art != ""] order by text(art) do
            ---
    { i.art }: { i.prename } { i.name }
            ---
        end;
    join(result, "
    ")
    

    oder so

    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let css := "
    <style>
    td {background-color:#e5e6eb;padding:0 .5em}
    </style>";
    html(---
    { css }
    <table>{ for j in my[art != ""] order by text(art) do }
    <tr><td>{ j.art }</td><td>{ j.prename }</td><td>{ j.name }</td></tr>{ end }
    </table>
    ---)
    

    machen. Oder ganz anders.

    • Mirko_E
    • vor 10 Tagen
    • Gemeldet - anzeigen

    Hallo Mirko,

    das funktioniert leider auch nicht, oder ich habe mich vielleicht falsch ausgedrückt.

    Ich möchte das die Art nur einmal angezeigt wird, und darunter dann die Mitarbeiter aufgelistet, z.b sind vielleicht drei MA im Urlaub, und zwei in der Berufsschule, dann soll oben nur einmal Berufsschule stehen, und darunter die beiden Mitarbeiter, genauso bei krank usw.

    Gruß Mirko

    • mirko3
    • vor 10 Tagen
    • Gemeldet - anzeigen

    Aha. Dann versuche es mal so. Mirko

    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let uni := unique((select Abwesenheitsplaner).text(Art));
    let css := "
    <style>
    td {background-color:#e5e6eb;padding:0 .5em}
    </style>";
    html(---
    { css }
    <table>{ for j in uni do }
    <tr><td>{ j }</td><td>{ join(my[art = j].(text(prename) + " " + text(name)), ", ") }</td></tr>{ end }
    </table>
    ---)
    
    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let uni := unique((select Abwesenheitsplaner).text(Art));
    join(for i in uni do
        i + ": " + join(my[art = i].(text(prename) + " " + text(name)), ", ")
    end, "
    ")
    
    • Mirko_E
    • vor 10 Tagen
    • Gemeldet - anzeigen

    Moin Mirko,

    das klappt auf jeden Fall schon mal.

    Wenn ich jetzt noch nur die Auswahlpunkte angezeigt bekommen kann, die an dem Tag ausgewählt sind, wäre das perfekt.

    Wie auf dem Bild zu sehen zeigt er jetzt auch die Auswahlmöglichkeiten an, wo an dem Tag aber keine Abwesenheit vorliegt. Bei Deiner Formel waren auch alle Mitarbeiter, die nicht abwesend waren angezeigt, das habe ich aber geändert bekommen:

    let uni := unique((select Abwesenheitsplaner)[Art != null].text(Art));
    

    Gruß Mirko

    • mirko3
    • vor 10 Tagen
    • Gemeldet - anzeigen

    Dann vielleicht so

    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let uni := unique(my.first(art));
    join(for i in uni do
        i + ": " + join(my[art = i].(text(prename) + " " + text(name)), ", ")
    end, "
    ")
    
    let datum := Datum;
    let my := (select Mitarbeiter).{
            name: Name,
            prename: Vorname,
            art: Abwesenheitsplaner[datum >= 'Erster Tag' and datum <= 'Letzter Tag'].text(Art)
        };
    let uni := unique(my.first(art));
    let css := "
    <style>
    td {background-color:#e5e6eb;padding:0 .5em}
    </style>";
    html(---
    { css }
    <table>{ for j in uni do }
    <tr><td>{ j }</td><td>{ join(my[art = j].(text(prename) + " " + text(name)), ", ") }</td></tr>{ end }
    </table>
    ---)
    
    • Mirko_E
    • vor 9 Tagen
    • Gemeldet - anzeigen

    Moin Mirko,

    das hat super geklappt! 

    Vielleicht hast Du auch noch eine Idee zu den auswählbaren Mitarbeitern.

    Die Kolonnenplanung ist so aufgebaut, dass ich je Tag einen neuen Datensatz anlege. In einer Untertabelle erstelle ich je Kolonne einen neuen Datensatz. In der Untertabelle wähle ich die Mitarbeiter über ein dmulti aus. 

    Ich möchte jetzt nach erstellen einer Kolonne beim erstellen der nächsten Kolonne die Mitarbeiter, die schon verplant sind nicht mehr angezeigt bekommen, und natürlich auch die nicht, die gar nicht erst anwesend sind weil sie Krank, Urlaub etc haben. 

    Es soll am Ende so aussehen, wenn alle Kolonnen geplant sind das dmulti in der Untertabelle nichts mehr anzeigt.

    Aktuell habe ich das nur mit einem dmulti in der haupttabelle hinbekommen, noch ohne die abwesenheiten zu berücksichtigen, da werden mir aber schon mal alle verplanten nicht mehr angezeigt.

    let all := ((select Mitarbeiter) order by Funktion);
    let kopla := Kolonnenplanung.Mitarbeiter;
    let verplant := for k in Kolonnenplanung do
            for m in k.numbers(Mitarbeiter) do
                record(Mitarbeiter,m).Name
            end
        end;
    let frei := for i in all do
            if not contains(concat(verplant), i.Name) then
                record(Mitarbeiter,i)
            end
        end;
    frei
    

    hier mein Versuch in der UT:

    let my := this;
    let all := ((select Mitarbeiter) order by Funktion);
    let verplant := for k in (select Kolonnenplanung)[Kolonnen2 = my] do
            for m in k.numbers(Mitarbeiter) do
                if m != my then
                    record(Mitarbeiter,m).Name
                end
            end
        end;
    let frei := for i in all do
            if not contains(concat(verplant), i.Name) then
                record(Mitarbeiter,i)
            end
        end;
    frei
    

    wie müsste der code aussehen, damit er funktioniert? und evtl .auch die abwesenheiten der MA berücksichtigt. 

    Gruß 
    Mirko

      • mirko3
      • vor 9 Tagen
      • Gemeldet - anzeigen

       Ich würde davon abraten, dmulti zur Speicherung von Daten zu benutzten. Letztlich sind es Referenzen und ändern sich sofort, wenn die Quelle (Mitarbeiter) sich ändert. Ich habe das  mal in einer Beispieldatei exemplarisch zum Basteln für Dich beigelegt. Hier wird in der Tabelle Kolonnenplanung über einen Button ein Textfeld in Kolonnen gefüllt. Da ändert sich auch nichts, wenn später mal dein dmulti völlig anders aussieht, weil z.B. Mitarbeiter gekündigt haben. Vielleicht hilft es Dir ja. FO Mirko

    • Mirko_E
    • vor 8 Tagen
    • Gemeldet - anzeigen

    Hallo Mirko,

    deswegen nutze ich ja gerade das dmulti, da sich Mitarbeiter ändern. Da die Planung maximal einen Monat rückwirkend angeschaut wird sind Änderungen da nicht so gravierend.

    Gruß Mirko