Er is een all-in-one pakket voor consultancy-achtige bedrijven. Daar zitten projecten in. Projecten hebben taken. Taken kunnen voor het gemak in een folder gestoken worden. Een folder kan in een andere folder gestoken worden, onbeperkt diep.
Dat wil dus zeggen dat er dingen kunnen bestaan als
projectA > taak 1
projectA > taak 2
projectA > folder1 > taak 3
projectA > folder1 > taak 4
projectA > folder2 > taak 5
projectA > folder2 > taak 6
projectA > folder2 > folder3 > taak 7
projectA > folder2 > folder3 > taak 8
projectA > folder2 > folder3 > folder4 > taak 9
projectA > folder2 > folder3 > folder4 > taak 10
enzover, ad infinitum.
Er zijn allerlei manieren om data uit dat pakket te krijgen, maar helaas: er is geen enkele manier om dat volledige “pad” te krijgen. Ik kan een lijst van taken krijgen, met per taak het project, de folder waarin een taak zit, en zelfs nog de folder waarin die folder zit. Maar dan krijg ik voor bovenstaande dus iets als dit:
taak | project | folder | parentFolder |
---|---|---|---|
taak 1 | projectA | (geen) | (geen) |
taak 2 | projectA | (geen) | (geen) |
taak 3 | projectA | folder1 | (geen) |
taak 4 | projectA | folder1 | (geen) |
taak 5 | projectA | folder2 | (geen) |
taak 6 | projectA | folder2 | (geen) |
taak 7 | projectA | folder3 | folder2 |
taak 8 | projectA | folder3 | folder2 |
taak 9 | projectA | folder4 | folder3 |
taak 10 | projectA | folder4 | folder3 |
In het geval hierboven ziet dat er nog min of meer doenbaar uit, omdat ik op de één of andere manier alle folders heb staan, en dus alles zou kunnen reconstrueren. Helaas: in de werkelijkheid zitten er dingen als dit in:
project > departement1 > 2022Q3 > soort werk A > profielnaam X > project management
project > departement1 > 2022Q3 > soort werk A > profielnaam X > sales
project > departement1 > 2022Q3 > soort werk A > profielnaam X > werk
project > departement1 > 2022Q3 > soort werk B > profielnaam X > project management
project > departement1 > 2022Q3 > soort werk B > profielnaam X > sales
project > departement1 > 2022Q3 > soort werk B > profielnaam X > werk
project > departement1 > 2022Q4 > soort werk A > profielnaam X > project management
project > departement1 > 2022Q4 > soort werk A > profielnaam X > sales
project > departement1 > 2022Q4 > soort werk A > profielnaam X > werk
project > departement1 > 2022Q4 > soort werk B > profielnaam X > project management
project > departement1 > 2022Q4 > soort werk B > profielnaam X > sales
project > departement1 > 2022Q4 > soort werk B > profielnaam X > werk
project > departement2 > 2022Q3 > soort werk A > profielnaam X > project management
project > departement2 > 2022Q3 > soort werk A > profielnaam X > sales
project > departement2 > 2022Q3 > soort werk A > profielnaam X > werk
project > departement2 > 2022Q3 > soort werk B > profielnaam X > project management
project > departement2 > 2022Q3 > soort werk B > profielnaam X > sales
project > departement2 > 2022Q3 > soort werk B > profielnaam X > werk
project > departement2 > 2022Q4 > soort werk A > profielnaam X > project management
project > departement2 > 2022Q4 > soort werk A > profielnaam X > sales
project > departement2 > 2022Q4 > soort werk A > profielnaam X > werk
project > departement2 > 2022Q4 > soort werk B > profielnaam X > project management
project > departement2 > 2022Q4 > soort werk B > profielnaam X > sales
project > departement2 > 2022Q4 > soort werk B > profielnaam X > werk
…en dát geeft dan iets als dit:
taak | project | folder | parentFolder |
---|---|---|---|
project management | project | profielnaam X | soort werk A |
sales | project | profielnaam X | soort werk A |
werk | project | profielnaam X | soort werk A |
project management | project | profielnaam X | soort werk B |
sales | project | profielnaam X | soort werk B |
werk | project | profielnaam X | soort werk B |
Wat dus een vervelende zaak is.
Een mens zou dus verwachten dat er ergens een ingebouwde methode zou zijn om een lijstje van de bovenliggende folders te kunnen krijgen — maar neen. Het moet met een verschrikkelijke omweg:
- de lijst van de folders binnentrekken; die hebben telkens ofwel een parentFolder, ofwel geen parentFolder (in welk geval ze rechtstreeks onder het project hangen)
- de lijst van de taken binnentrekken; die hebben telkens ofwel een folder waar ze in zitten, ofwel geen folder waar ze in zitten (in welk geval ze rechtstreeks onder het project hangen)
Ik wil daar een platte lijst uit krijgen zoals hierboven (dus project [ > folder niveau 1 [ > folder niveau 2 [ > ... ] ] ] > taak
). En ik heb geen flauw idee hoe ik dat het meest proper zou kunnen doen in Power BI. Ik heb dus maar een Pythonscriptje geschreven dat doet wat het moet doen — dit is het relevant stukje, eens ik folders (“chapters”) en projecten in een lijst heb staan:
tasks = {}
response = session.get(TASKS_ENDPOINT)
content = xmltodict.parse(response.content)
for item in content["DATA"]["ROWS"]["ROW"]:
if item["projectID"] is not None:
#if no chapter: taskID, projectName > taskName
if item["chapterID"] is None:
tasks[item["taskID"]] = item["projectName"] + " > " + item["taskName"]
#if chapter: taskID, projectName > all intermediary chapterNames > taskName
else:
done = False
path = ""
parent = item["chapterID"]
while not done:
thispath = next((x for x in items if x.ID == parent), None)
path = thispath.name + " > " + path
if thispath.parentID is None:
done = True
else:
parent = thispath.parentID
tasks[item["taskID"]] = path + item["taskName"]
# sort tasks by path
tasks = sorted(tasks. Items(), key=lambda val:(val[1], val[0]))
En ja ik weet dat het beter kan, er is ongetwijfeld een manier om het allemaal in één trok in de een of andere daarvoor geëigende datastructuur te pleuren zonder inefficiënte omwegen — laat mijn hoofd met grust ik ben geen ontwikkelaar. En behalve dat: ja ik ben half aan het spelen met het idee dat dat script dan maar periodiek zal moeten gerund worden en zijn resultaat ergens zal moeten wegschrijven in csv of json of zo op een plaats dat Power BI het kan inlezen.
‘t Is mij namelijk lichtjes beu, dat worstelen met Power BI en dat all-in-one systeem dat net dat ene nuttige ding niet heeft. Grr.
Reacties
Eén reactie op “Geen bug maar een (onbestaande) feature”
[…] Er is een rapport in Power BI. Dat haalt zijn gegevens uit enerzijds een resource planning-achtige tool, en anderzijds uit een rapport dat uit een pythonscriptje komt. […]