Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hallo Zusammen,
ich möchte die Tage zwischen einem Start- und Enddatum ermitteln. Also nicht einfach nur wissen wie viele es sind sondern die einzelnen Datums davon haben.
Meine Tabelle sieht folgend aus:
Teil | Art | Starttermin | Endtermin |
A | Urlaub | 02.03.19 | 05.03.19 |
A | Urlaub | 06.03.19 | 06.03.19 |
A | Arbeit | 07.03.19 | 07.03.19 |
A | Urlaub | 08.03.19 | 10.03.19 |
A | Arbeit | 11.03.19 | 11.03.19 |
B | Urlaub | 05.03.19 | 05.03.19 |
B | Urlaub | 06.03.19 | 08.03.19 |
Und die zweite könnte z.b. folgend aussehen oder man kann es direkt mit z.b. interfallmatch generieren oder so, aber da komme ich eben noch nicht weiter.
KALENDER
Tag | Monat | Jahr |
01 | 03 | 2019 |
02 | 03 | 2019 |
03 | 03 | 2019 |
04 | 03 | 2019 |
05 | 03 | 2019 |
06 | 03 | 2019 |
07 | 03 | 2019 |
08 | 03 | 2019 |
09 | 03 | 2019 |
10 | 03 | 2019 |
11 | 03 | 2019 |
12 | 03 | 2019 |
Denn mein Ziel wäre gerne das ich wüsste das TEIL A
2.3.19 | Urlaub |
3.3.19 | Urlaub |
4.3.19 | Urlaub |
5.3.19 | Urlaub |
6.3.19 | Urlaub |
8.3.19 | Urlaub |
9.3.19 | Urlaub |
10.3.19 | Urlaub |
11.3.19 | Urlaub |
Und überlegt hätte ich das man die Kalendertabelle z. b. an die erste Tabelle anbinden kann um dann filtern zu können an welchen Tagen genau denn Teil A Urlaub hat.
Ich wäre euch sehr dankbar, wenn jemand eine Idee hat und mir helfen könnte.
Vielen Dank im voraus
Merry
Es ist nicht wirklich ganz klar, wie jetzt die Datengrundlage aussieht und wie später gefiltert und gezählt werden soll. Gibt es in der Tabelle mit den Urlaubs-Daten auch Arbeits-Daten oder nicht? Wenn ja, sind diese auch vollständig (in Bezug auf die späteren Auswertungen) oder nicht? Falls eine der beiden Fragen Nein lautet, müssten diese Daten generiert werden.
Ich nehme mal, dass hier nur die Urlaubs-Daten drin sind. Das würde bedeuten, dass man vor den Urlaubstagen erstmal eine Datengrundlage für alle (entsprechenden) Kalendertage schaffen müsste. Das könnte z.B. per:
Grundlage: load Datum resident Kalender; join load Teil resident TeileListe;
geschehen. Alternativ ginge hier auch eine intervalmatch oder while Schleife über ein min/max Datum per Teil.
Persönlich wähle ich nahezu nie den intervalmatch (der Blog von HIC ist aber sehr gut, da er auch die dahinter liegende Logik sehr schön erklärt), sondern eine while-Schleife, mit der man dann eine Mapping-Tabelle erstellen könnte, wie:
map: load Teil & '|' & date(von + iterno() -1), 'Urlaub' resident UrlaubsListe while von + iterno() -1 <= bis;
und das mapped man dann in die finale Tabelle, z.B.:
Final: load *, applymap('map', Teil & '|' & Datum, 'Arbeit') as Type resident Grundlage;
- Marcus
Also ich habe es noch hinbekommen und tatsächlich mit der While Variante und einem Join sowie Mapping.
Wer ähnliches Thema hat oder Lösung braucht, so habe ich es gelöst:
Kalender:
Load date($(varMinDatum)+iterNo()-1) AS Datum
AUTOGENERATE (1)
WHILE $(varMinDatum)+iterNo()-1<= $(varMaxDatum);
Grundlage:
LOAD date(Datum) as Grundlage.Datum
Resident Kalender
;
Join LOAD Teil as Grundlage.Teil
Resident Arbeit_Urlaub;
Map:
Mapping LOAD
Teil & '|' & if(Art ='Urlaub', date(DatumVon + IterNo() - 1) ),
'U'
resident Arbeit_Urlaub
while DatumVon + IterNo()-1 <= DatumBis;
Final:
LOAD
*,
if(Final.Urlaub = 'U',1,0) as Final.UrlaubFlag
;
LOAD Grundlage.Datum as Final.Datum,
Grundlage.Teil as Final.Mitarbeiter,
ApplyMap ('Map', Grundlage.Teil & '|' & Grundlage.Datum,'F') as Final.Urlaub
Resident Grundlage;
Vielen Dank für eure Unterstützung.
Gruß Merry
Hallo Merry
schau mal da rein rein 🙂
Es ist als nicht so leicht zu verstehen, was benötigt wird 🤔
Ich hoffe ich konnte dir mit der Datei Ansatzweise weiterhelfen.
Die Steps sind im Coding mal dokumentiert ich hatte mal einen ähnlichen Fall
Gruß GErold
Hallo Gerold,
also ich glaub du hast mich fast verstanden, nur eins und zwar das ganze soll bei jedem Auftrag immer berechnet werden ohne das es ein Enddatum gibt, denn ich habe viele Aufträge welche in der Zukunft schon ihren Urlaub gebucht haben und ich möchte immer zusätzlich zum Start und Endtermin aufgelistet haben welche Tage dazwischen (Start- und Enddatum) Urlaub gebucht sind bei dem Auftrag.
Und bei deinem Beispiel fehlt jetzt z.b. auch der 7.3., der wird irgendwie nicht angezeigt als Urlaub.
Hast du dafür noch eine Korrekturmöglichkeit zu deinem Beispiel?
Hat Hierzu wirklich niemand eine Idee. Falls immer noch nicht klar ist was ich meine, hier nochmal ein Bsp.
Und zwar hat Teil A folgend Urlaub: "ARTEIT_URLAUB"
Art | von | bis |
Urlaub | 05.03.2019 | 08.03.2019 |
Urlaub | 07.05.2019 | 11.05.2019 |
Arbeit | ... | ... |
Womit ich als Ergebnis folgende Daten geliefert haben will:
Urlaub | 05.03.2019 |
Urlaub | 06.03.2019 |
Urlaub | 07.03.2019 |
Urlaub | 08.03.2019 |
Urlaub | 07.05.2019 |
Urlaub | 08.05.2019 |
Urlaub | 09.05.2019 |
Urlaub | 10.05.2019 |
Urlaub | 11.05.2019 |
Andere Ansätze haben mir auch schon mit einem INTERVALLMATCH einen Weg zeigen willen, aber leider hat auch das nicht geklappt oder ich habe es falsch angewendet.
Oder hat dazu vielleicht jemand eine Idee warum das nicht gehen kann so:
INTERVAL:
Inner Join IntervalMatch(Art)
Load Distinct Von, Bis
resident ARTEIT_URLAUB;
Es ist nicht wirklich ganz klar, wie jetzt die Datengrundlage aussieht und wie später gefiltert und gezählt werden soll. Gibt es in der Tabelle mit den Urlaubs-Daten auch Arbeits-Daten oder nicht? Wenn ja, sind diese auch vollständig (in Bezug auf die späteren Auswertungen) oder nicht? Falls eine der beiden Fragen Nein lautet, müssten diese Daten generiert werden.
Ich nehme mal, dass hier nur die Urlaubs-Daten drin sind. Das würde bedeuten, dass man vor den Urlaubstagen erstmal eine Datengrundlage für alle (entsprechenden) Kalendertage schaffen müsste. Das könnte z.B. per:
Grundlage: load Datum resident Kalender; join load Teil resident TeileListe;
geschehen. Alternativ ginge hier auch eine intervalmatch oder while Schleife über ein min/max Datum per Teil.
Persönlich wähle ich nahezu nie den intervalmatch (der Blog von HIC ist aber sehr gut, da er auch die dahinter liegende Logik sehr schön erklärt), sondern eine while-Schleife, mit der man dann eine Mapping-Tabelle erstellen könnte, wie:
map: load Teil & '|' & date(von + iterno() -1), 'Urlaub' resident UrlaubsListe while von + iterno() -1 <= bis;
und das mapped man dann in die finale Tabelle, z.B.:
Final: load *, applymap('map', Teil & '|' & Datum, 'Arbeit') as Type resident Grundlage;
- Marcus
Ja es gibt in der Datenbank Arbeits- und Urlaubsdaten bis zum Datum heute und teilweise eben auch Urlaubsdaten für die Zukunft, auf welche der Hauptfokus bei der Auswertung liegt. Denn ich will ermitteln wer wann in der Zukunft Urlaub hat also wieviele in der Zukunftswoche X da sind oder nicht.
Somit sind für die Tage bis heute alle Tage fortlaufend vorhanden, aber für die Zukunft eben nicht, da es für die Tage noch keine Arbeitstage gibt sondern nur die Urlaubstage.
Kann ich das While-Mapping im Script auf die Arbeits/Urlaubstabelle anwenden oder gibt dies voraus das es separate Tabellen sind und auch die Teile separat notiert sind?
Grüße
Merry
Ich denke, der wesentliche Punkt, ist die Generierung der fehlenden (Arbeits-) Daten bis zum Zeitpunkt X (vermutlich das Jahres/Perioden-Ende). Grundsätzlich sind da verschiedene Wege möglich, so könnte man z.B. die fehlenden Daten per concatenate an die Arbeits/Urlaubs-Tabelle anhängen und dann würde ein "einfacher" while-loop komplett ausreichen. Allerdings kann es schon etwas schwierig werden, diese Daten zu ermitteln, insbesondere wenn es mehrere Urlaubszeiträume in der Zukunft geben kann, da dann ein einzelnes/einfaches min/max über die Daten und/oder previous/peek wohl nicht mehr gehen wird.
Prinzipiell könnte man es schon so lösen, ich denke aber, dass alle diese Varianten deutlich aufwändiger/komplexer werden, als der gestern vorgeschlagene join-while-mapping Ansatz.
Probiere es doch einfach mal aus - am Besten in einer Dummy-Anwendung mit ein paar Inline- oder Excel-Datensätze, um die Logik und Ergebnisse schnell und einfach prüfen zu können. Wenn es dann funktioniert wie es soll, transferierst Du es einfach in die Zielanwendung.
- Marcus
Also ich habe es noch hinbekommen und tatsächlich mit der While Variante und einem Join sowie Mapping.
Wer ähnliches Thema hat oder Lösung braucht, so habe ich es gelöst:
Kalender:
Load date($(varMinDatum)+iterNo()-1) AS Datum
AUTOGENERATE (1)
WHILE $(varMinDatum)+iterNo()-1<= $(varMaxDatum);
Grundlage:
LOAD date(Datum) as Grundlage.Datum
Resident Kalender
;
Join LOAD Teil as Grundlage.Teil
Resident Arbeit_Urlaub;
Map:
Mapping LOAD
Teil & '|' & if(Art ='Urlaub', date(DatumVon + IterNo() - 1) ),
'U'
resident Arbeit_Urlaub
while DatumVon + IterNo()-1 <= DatumBis;
Final:
LOAD
*,
if(Final.Urlaub = 'U',1,0) as Final.UrlaubFlag
;
LOAD Grundlage.Datum as Final.Datum,
Grundlage.Teil as Final.Mitarbeiter,
ApplyMap ('Map', Grundlage.Teil & '|' & Grundlage.Datum,'F') as Final.Urlaub
Resident Grundlage;
Vielen Dank für eure Unterstützung.
Gruß Merry