Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hallo Zusammen,
ich benötige Mal wieder eure Hilfe und zwar Habe ich einen Datensatz pro Person, welche verschiedene Abteilungen durchläuft, diese werden auch mit einem Gültigkeitsdatum festgehalten und jetzt soll in einer Tabelle immer die Abteilung zu dem passenden Datum ermittlen.
Dazu folgendes Beispiel:
Datum | Person | gearbeiteteZeit |
01.02.2019 | Maria | 6 |
02.02.2019 | Maria | 5 |
03.02.2019 | Maria | 4 |
…. | ||
28.02.2019 | Maria | 5 |
01.03.2019 | Maria | 4 |
02.03.2019 | Maria | 6 |
03.03.2019 | Maria | 3 |
.... |
Und dann gibt es noch folgendes Verzeichniss, wo ersichtlich ist wann es geändert wurde
Gültig ab | Wen | Abteilung |
01.03.2019 | Maria | Verkauf |
01.01.2019 | Maria | Einkauf |
Jetzt möchte ich zu jedem Datum die passende Abteilung in einem Diagramm ermitteln, indem ich prüfe welches Gültig ab ist das nächst kleinere für das jeweilige Datum.
Wer hat hier eine Idee ?
Vielen Dank im Voraus
Merry
Ist im Prinzip dasselbe wie hier: Ermitteln-der-einzelnen-Datums-zwischen-zwei-Datums und falls es kein bis/von Datum gibt, muss man es halt mit Interrekord-Funktionen, wie Peek-or-Previous generieren, in etwa so:
load Person, von, if(previous(Person)<>Person, today(), date(previous(von)-1)) as bis
resident Quelle order by Person, von desc;
Abhängig von den Daten und Anforderungen braucht es vielleicht noch ein/zwei mehr Bedingungen, um alle Eventualitäten abzufangen. Probiere es (Schritt für Schritt in einem Dummy) einfach mal aus.
Schöne Grüße
Marcus
Ist im Prinzip dasselbe wie hier: Ermitteln-der-einzelnen-Datums-zwischen-zwei-Datums und falls es kein bis/von Datum gibt, muss man es halt mit Interrekord-Funktionen, wie Peek-or-Previous generieren, in etwa so:
load Person, von, if(previous(Person)<>Person, today(), date(previous(von)-1)) as bis
resident Quelle order by Person, von desc;
Abhängig von den Daten und Anforderungen braucht es vielleicht noch ein/zwei mehr Bedingungen, um alle Eventualitäten abzufangen. Probiere es (Schritt für Schritt in einem Dummy) einfach mal aus.
Schöne Grüße
Marcus
Danke für die Antwort.
Ok ja dann muss ich mal schauen wie ich es löse, ich hatte gehofft es gibt hier eine andere Möglichkeit wie z. b. mit einem der folgenden Varianten
if( gueltig_ab < Datum, only({<gueltig_ab={max(gueltig_ab)}>}Arbeit)
oder statt Only folgend
if( gueltig_ab < Datum, FirstSortetValue(Arbeit,gueltig_ab))
oder ganz ohne if
FirstSortetValue({<gueltig_ab={"<=(Datum)"}>}Arbeit,gueltig_ab)
es zu lösen, aber leider klappt das nicht so ganz wie gewünscht. Oder muss ich die Formel nur etwas anpassen, damit es so auch läuft?
Ich möchte nicht sagen, dass es nicht möglich wäre, es auch in der Oberfläche zu berechnen, denke aber, es würde deutlich komplexer, als es einfach im Skript zu machen.
Es gibt halt mehrere gültig_ab und sicher auch multiple Datumswerte jeweils pro Person, gegen die das ermittelt werden müsste. Das meint, man müsste erstmal mit (verschachtelten) aggr-Funktionen eine entsprechende (virtuelle) Tabelle generiert werden, auf die man dann die Bedingungen anwenden könnte. Vermutlich möglich, aber IMO absolut nicht empfehlenswert.
- Marcus
Danke für deine Hilfe - es hat mal wieder geklappt womit ich die Daten jetzt so habe wie ich sie brauche.
Umgesetzt habe ich es mit deinem Tipp, zuerst das Gueltig_bis in einer Tabelle ermitteln und dann in dem ich das selben vorgehen wie das letzte mal(also über den Link wo erwähnt wurde) gemacht habe nur etwas verkürzt also ohne das mapping da ich die eigentliche mappingTabelle als endTabelle genommen habe, da dort schon raus kam was ich wollte.
Grüße
Merry
ok jetzt wäre nur noch die Frage wie ich es im Diagramm zum Anzeigen bekomme und zwar habe ich mir es folgend vorgestellt:
Only({<Final.Monat ={"=$(=MonthStart(Datum))"}>}Final.Arbeit)
Und verbunden ist diese Tabelle schon über den Mitarbeiter, jetzt soll es nur noch bei ausgewähltem Datum die passende Arbeit zu dem jeweiligen Monat anzeigen. Zur Info es muss immer ein einzelner Monat ausgewählt sein.
Was habe ich falsch gemacht an meiner Formel oder muss ich anders machen?
Ohne nähere Kenntnis vom Datenmodell ist es schwierig zu sagen, warum das so jetzt nicht geht, aber es gibt hier schon ein paar Auffälligkeiten, z.B. wird hier ein Monatsfeld (jedenfalls dem Namen nach) mit einem Zeitstempel verglichen. Hier könnte jetzt sowohl der numerische Wert unterschiedlich sein, als auch das Format. Hinzu kommt, dass der Bedingungswert eine (adhoc) Variable ist, die global berechnet wird und nicht etwa auf der dimensionalen Ebene. Darüber hinaus wird only() verwendet, dass bei mehreren verfügbaren Werten NULL zurückgibt.
Insofern sollte eher etwas wie das hier ein valides (Zwischen-)Ergebnis liefern:
concat({<Final.Arbeit ={"=num(Final.Monat)=num(month(Datum))"}>}Final.Arbeit, ' + ')
Der Monatsvergleich innerhalb der Set Analysis ist jetzt eine Art von implizierter If-Schleife und erfolgt auf Datensatzebene, es werden definitiv nur die numerischen Werte verglichen (theoretisch kann man darauf innerhalb einer If verzichten, macht die Logik hier aber etwas klarer) und falls es mehrere Werte geben sollte, gibt concat() diese auch aus - man sieht diese somit und könnte sich dann überlegen, ob man sie durch min/max/avg/sum ersetzen kann oder ob das grundsetzlich anders aufgebaut werden müsste.
Ein weiterer Punkt ist die Aussage, dass diese Daten über den Mitarbeiter mit einander verknüpft sind - das muss nicht unbedingt ausreichend sein, sondern möglicherweise müsste auch über das Datum verknüpft werden, mit einem zusammengesetzten Schlüssel oder vielleicht einer gänzlich anderen Zuordnung/Matching der Tabellen untereinander.
Schöne Grüße
Marcus