Transformaties verwerken
In situaties waarin het antwoord van de gegevensbron niet wordt weergegeven in een indeling die Power BI rechtstreeks kan gebruiken, kunnen Power Query worden gebruikt om een reeks transformaties uit te voeren.
Statische transformaties
In de meeste gevallen worden de gegevens consistent gepresenteerd door de gegevensbron: kolomnamen, gegevenstypen en hiërarchische structuur zijn consistent voor een bepaald eindpunt. In dit geval is het geschikt om altijd dezelfde set transformaties toe te passen om de gegevens op te halen in een indeling die acceptabel is voor Power BI.
Een voorbeeld van statische transformatie vindt u in de zelfstudie TripPin Part 2 - Data Connector for a REST Service wanneer de gegevensbron wordt behandeld als een standaard REST-service:
let
Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
value = Source[value],
toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
expand
De transformaties in dit voorbeeld zijn:
Sourceis een record die wordt geretourneerd door een aanroep naarTripPin.Feed(...).- U haalt de waarde op uit
Sourceeen van de sleutel-waardeparen. De naam van de sleutel isvalueen u kunt het resultaat opslaan in een variabele met de naamvalue. valueis een lijst die u converteert naar een tabel. Elk element invaluewordt een rij in de tabel, die u kunt aanroepen.toTable- Elk element in
valueis zelf een Record.toTableheeft al deze in één kolom:"Column1". Met deze stap worden alle gegevens met de sleutel in een kolom met de naam en alle gegevens met een sleutel in een kolom met de naam"AirlineCode"voor elke rij in"AirlineCode""Name""Name"toTableopgeslagen."Column1"wordt vervangen door deze twee nieuwe kolommen.
Aan het einde van de dag ziet u gegevens in een eenvoudige tabelvorm die u Power BI kunt gebruiken en eenvoudig kunt renderen:

Het is belangrijk te weten dat een reeks statische transformaties van deze specificiteit alleen van toepassing is op één eindpunt. In het bovenstaande voorbeeld werkt deze reeks transformaties alleen als en aanwezig zijn in het antwoord van het REST-eindpunt, omdat ze in code zijn gecodeerd in de "AirlineCode" "Name" M-code. Deze reeks transformaties werkt dus mogelijk niet als u het /Event eindpunt probeert te raken.
Deze hoge mate van specifiekheid kan nodig zijn voor het pushen van gegevens naar een navigatietabel, maar voor meer algemene functies voor gegevenstoegang is het raadzaam om alleen transformaties uit te voeren die geschikt zijn voor alle eindpunten.
Notitie
Zorg ervoor dat u transformaties onder verschillende gegevensomstandigheden test. Als de gebruiker geen gegevens op het eindpunt heeft, resulteren uw transformaties dan in een lege /airlines tabel met het juiste schema? Of is er een fout opgetreden tijdens de evaluatie? Zie TripPin Deel 7: Geavanceerd schema met M-typen voor een discussie over eenheidstests.
Dynamische transformaties
Soms is complexere logica nodig om API-antwoorden te converteren naar stabiele en consistente formulieren die geschikt zijn Power BI gegevensmodellen.
Inconsistente API-antwoorden
Eenvoudige M-controlestroom (if-instructies, HTTP-statuscodes, probeer het... catch-blokken, en meer, zijn doorgaans voldoende voor het afhandelen van situaties waarin er een aantal manieren zijn waarop de API reageert.
Schema on-the-fly bepalen
Sommige API's zijn zodanig ontworpen dat meerdere stukjes informatie moeten worden gecombineerd om de juiste tabelindeling te krijgen. Overweeg het eindpuntreactie /sheets [van]Smartsheet, dat een matrix met kolomnamen en een matrix met gegevensrijen bevat. De Smartsheet-connector kan dit antwoord op de volgende manier parseren:
raw = Web.Contents(...),
columns = raw[columns],
columnTitles = List.Transform(columns, each [title]),
columnTitlesWithRowNumber = List.InsertRange(columnTitles, 0, {"RowNumber"}),
RowAsList = (row) =>
let
listOfCells = row[cells],
cellValuesList = List.Transform(listOfCells, each if Record.HasFields(_, "value") then [value]
else null),
rowNumberFirst = List.InsertRange(cellValuesList, 0, {row[rowNumber]})
in
rowNumberFirst,
listOfRows = List.Transform(raw[rows], each RowAsList(_)),
result = Table.FromRows(listOfRows, columnTitlesWithRowNumber)
- Begin eerst met kolomkopinformatie. U kunt de record van elke kolom in een lijst opnemen, afhankelijk van een kolom die altijd wordt weergegeven
titleRowNumberals deze eerste kolom. - Vervolgens kunt u een functie definiëren waarmee u een rij kunt parseren in een lijst met cel
values. U kunt opnieuw informatierowNumbervoorbereiden. - Pas uw
RowAsList()functie toe op elk van de s die in hetrowAPI-antwoord worden geretourneerd. - Converteer de lijst naar een tabel en geef de kolomkoppen op.