Johdanto
Yleiskuvaus
Microsoft Power Query tarjoaa tehokkaan "get data" -käyttökokemuksen, joka sisältää monia ominaisuuksia. Power Queryn keskeisenä ominaisuutta on suodattaa ja yhdistää, eli koostaa tietoja yhdestä tai useammasta tuettujen tietolähteiden monipuolisesta kokoelmasta. Mikä tahansa tällainen tietojen kooste ilmaistaan käyttämällä Power Query -kaavakieltä (tunnetaan epävirallisesti nimellä "M"). Power Query upottaa M-asiakirjoja useisiin Microsoft-tuotteisiin, kuten Exceliin, Power BI:hin, Analysis Servicesiin ja Dataverseen, jotta tietojen kooste voidaan toistaa.
Tämä asiakirja sisältää M-määrityksen. Lyhyen johdannon jälkeen, jossa pyrkii rakentamaan ensimmäistä intuitiota ja perehdytystä kieleen, asiakirja kattaa kielen tarkasti useissa vaiheissa:
Sanastollinen rakenne määrittää sanastollisesti kelvollisten tekstien joukon.
Arvot, lausekkeet, ympäristöt ja muuttujat, tunnisteet ja arviointimalli muodostavat kielen peruskäsitteet.
Arvojen yksityiskohtainen määritys, sekä primitiivinen että jäsennetty, määrittää kielen kohdetoimialueen.
Arvoilla on tyyppejä, jotka itse ovat erityisiä arvotyyppejä, jotka sekä luonnehtivat perustyyppisiä arvoja että kantavat lisämetatietoja, jotka koskevat jäsennettyjen arvojen muotoja.
M-operaattoreiden joukko määrittää, millaisia lausekkeita voidaan muotoilla.
Funktiot, jotka ovat toisentyyppisiä erikoisarvoja, luovat perustan M-vakiokirjastolle ja mahdollistavat uusien abstraktiotoimintojen lisäämisen.
Virheitä voi ilmetä, kun operaattoreita tai funktioita käytetään lausekkeen arvioinnin aikana. Vaikka virheet eivät olekaan arvoja, on olemassa tapoja käsitellä virheitä , jotka yhdistävät virheet takaisin arvoihin.
Let-lausekkeet mahdollistavat monimutkaisten lausekkeiden luomiseen käytettävien lisämääritysten käyttöönoton pienemmissä vaiheissa.
If-lausekkeet tukevat ehdollista arviointia.
Osat muodostavat yksinkertaisen modulaarisuusmekanismin. (Power Query ei vielä hyödynnä vielä osia.)
Lopuksi yhdistetty kielioppi kerää tämän asiakirjan kaikkien muiden osien kielioppiosat yhdeksi kokonaiseksi määritykseksi.
Tietokonekielenteoreetikot: tässä asiakirjassa määritetty kaavakieli on enimmäkseen puhdas, korkeamman asteen dynaamisesti kirjoitettu, osittain laiska toiminnallinen kieli.
Lausekkeet ja arvot
M-kielen keskirakenne muodostaa lausekkeen. Lauseke voidaan laskea niin, että tulokseksi saadaan yksittäinen arvo.
Vaikka monet arvot voidaan kirjoittaa kirjaimellisesti lausekkeena, arvo ei ole lauseke. Esimerkiksi lauseke 1
antaa tulokseksi arvon 1; lauseke 1+1
antaa tulokseksi arvon 2. Tämä ero on hienovarainen, mutta tärkeä. Lausekkeet ovat arvioimista varten reseptejä; -arvot ovat arvioinnin tuloksia.
Seuraavissa esimerkeissä havainnollistetaan M:ssä käytettävissä olevat eri arvot. Käytäntönä arvo kirjoitetaan literaalilomakkeella, jossa ne näkyvät lausekkeessa, joka antaa tulokseksi vain kyseisen arvon. (Huomaa, että //
ilmaisee kommentin alun, joka jatkuu rivin loppuun.)
Primitiiviarvo on yksiosainen arvo, kuten luku, looginen arvo, teksti tai tyhjäarvo. Tyhjäarvon avulla voidaan ilmaista kaikkien tietojen puuttumista.
123 // A number true // A logical "abc" // A text null // null value
Luettelon arvo on järjestetty arvojen järjestys. M tukee äärettömiä luetteloita, mutta jos se kirjoitetaan literaalina, luetteloiden pituus on kiinteä. Aaltosulkeet
{
ja}
ilmaisevat luettelon alun ja lopun.{123, true, "A"} // list containing a number, a logical, and // a text {1, 2, 3} // list of three numbers
Tietue on joukko kenttiä. Kenttä on nimi/arvo-pari, jossa nimi on kentän tietueen sisällä ainutlaatuinen tekstiarvo. Tietuearvojen literaalisyntaksi sallii nimien kirjoittamisen ilman lainausmerkkejä. Tässä muodossa niitä kutsutaan myös tunnisteiksi. Seuraavassa on tietue, joka sisältää kolme kenttää nimeltä "
A
", "B
" ja "C
", joilla on arvot1
,2
ja3
.[ A = 1, B = 2, C = 3 ]
Taulukko on arvojoukko, joka on järjestetty sarakkeisiin (jotka tunnistetaan nimen mukaan) ja riveihin. Taulukon luomiseen ei ole literaalisyntaksia, mutta on olemassa useita vakiofunktioita, joiden avulla voidaan luoda taulukoita luetteloista tai tietueista.
Esimerkkejä:
#table( {"A", "B"}, { {1, 2}, {3, 4} } )
Tämä luo seuraavan muotoisen taulukon:
Funktio on arvo, joka argumenteilla käynnistettynä tuottaa uuden arvon. Funktio kirjoitetaan luettelemalla funktion parametrit sulkeissa, joiden jäljessä on merkki goes-to
=>
, jota seuraa funktion määrittävä lauseke. Tämä lauseke viittaa yleensä parametreihin (nimen mukaan).(x, y) => (x + y) / 2`
Arviointi
M-kielen arviointimalli on mallinnettu laskentataulukoista yleisesti löytyvän arviointimallin mukaan. Siinä laskutoimitusten järjestys voidaan määrittää soluissa olevien kaavojen välisten riippuvuuksien perusteella.
Jos olet kirjoittanut kaavoja laskentataulukossa, kuten Excelissä, saatat tunnistaa vasemmalla olevat kaavat oikealla oleviksi arvoiksi, kun ne lasketaan:
M-koodissa lausekkeen osat voivat viitata muihin lausekkeen osiin nimen mukaan, ja arviointiprosessi määrittää automaattisesti järjestyksen, jossa viitatut lausekkeet lasketaan.
Voit käyttää tietuetta, joka tuottaa lausekkeen, joka vastaa edellistä laskentataulukkoesimerkkiä. Kentän arvoa alustettaessa tietueen muihin kenttiin voi viitata kentän nimen avulla seuraavasti:
[
A1 = A2 * 2,
A2 = A3 + 1,
A3 = 1
]
Yllä oleva lauseke vastaa seuraavia arvoja (jossa molemmat arvioivat yhtä suuria arvoja):
[
A1 = 4,
A2 = 2,
A3 = 1
]
Tietueet voivat sisältyä muihin tietueisiin tai olla niissä sisäkkäin. Voit käyttää hakuoperaattoria ([]
), jos haluat käyttää tietueen kenttiä nimen mukaan. Esimerkiksi seuraavassa tietueessa on kenttä nimeltä Sales
, joka sisältää tietueen, ja kenttä nimeltä Total
, joka käyttää - FirstHalf
ja SecondHalf
- Sales
kenttiä:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = Sales[FirstHalf] + Sales[SecondHalf]
]
Yllä oleva lauseke vastaa seuraavia, kun sitä arvioidaan:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = 2100
]
Tietueet voivat sisältyä myös luetteloihin. Sijainnin indeksioperaattorin ({}
) avulla voit käyttää luettelon kohdetta sen numeerisen indeksin perusteella. Luettelon arvoihin viitataan käyttämällä nollapohjaista indeksiä luettelon alusta. Esimerkiksi indeksejä 0
ja 1
käytetään viittaamaan ensimmäiseen ja toiseen kohteeseen alla olevassa luettelossa:
[
Sales =
{
[
Year = 2007,
FirstHalf = 1000,
SecondHalf = 1100,
Total = FirstHalf + SecondHalf // 2100
],
[
Year = 2008,
FirstHalf = 1200,
SecondHalf = 1300,
Total = FirstHalf + SecondHalf // 2500
]
},
TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600
]
Luettelot ja jäsenlausekkeiden kirjaukset (sekä let-lausekkeet) arvioidaan käyttäen laiskuuden arviointia, mikä tarkoittaa sitä, että ne arvioidaan vain tarpeen mukaan. Kaikki muut lausekkeet arvioidaan käyttämällä laajennettua arviointia, mikä tarkoittaa, että ne arvioidaan välittömästi, kun ne tulevat vastaan arviointiprosessin aikana. Hyvä tapa ajatella tätä on muistaa, että luettelo- tai tietuelausekkeen arvioiminen palauttaa luettelon tai tietueen arvon, joka itse muistaa, miten sen luettelokohteet tai tietuekentät on laskettava pyydettäessä (haku- tai indeksioperaattoreiden suorittamana).
Funktiot
M-funktio on yhdistämismääritys syötearvojen joukosta yksittäiseen tulostearvoon. Funktio kirjoitetaan ensin nimeämällä pakollinen syötearvojen joukko (funktion parametrit) ja antamalla sitten lauseke, joka laskee funktion tuloksen käyttämällä kyseisiä syötearvoja (funktion runko) goes-to(=>
)-symbolin jälkeen. Esimerkkejä:
(x) => x + 1 // function that adds one to a value
(x, y) => x + y // function that adds two values
Funktiolla on arvo, kuten luku tai tekstiarvo. Seuraavassa esimerkissä näytetään funktio, joka on Lisää kenttä, joka käynnistetään tai suoritetaan useista muista kentistä. Kun funktio käynnistetään, määritetään arvojoukko, joka korvataan loogisesti vaadituille syötearvojen joukolle funktion leipätekstilausekkeessa.
[
Add = (x, y) => x + y,
OnePlusOne = Add(1, 1), // 2
OnePlusTwo = Add(1, 2) // 3
]
Library
M sisältää yhteisen määritelmäjoukon, joka on käytettävissä lausekkeesta, jota kutsutaan vakiokirjastoksi tai lyhyesti vain kirjastoksi. Nämä määritykset koostuvat nimettyjen arvojen sarjasta. Kirjaston antamien arvojen nimet ovat käytettävissä lausekkeessa ilman, että ne on määritetty eksplisiittisesti lausekkeen avulla. Esimerkkejä:
Number.E // Euler's number e (2.7182...)
Text.PositionOf("Hello", "ll") // 2
Operaattorit
M sisältää joukon operaattoreita, joita voidaan käyttää lausekkeissa. Operaattoreitasovelletaan operandteihin , jotta voidaan muodostaa symbolisia lausekkeita. Esimerkiksi lausekkeessa 1 + 2
numerot 1
ja 2
ovat operandeja, ja operaattori on lisäämisoperaattori (+
).
Operaattorin merkitys voi vaihdella sen operandin arvojen lajin mukaan. Plus-operaattoria voidaan käyttää esimerkiksi muuntyyppisillä arvoilla lukujen lisäksi:
1 + 2 // numeric addition: 3
#time(12,23,0) + #duration(0,0,2,0)
// time arithmetic: #time(12,25,0)
Toinen esimerkki operaattorista on operandi-riippuvainen, mikä tarkoittaa, että yhdistelmäoperaattori (&
):
"A" & "BC" // text concatenation: "ABC"
{1} & {2, 3} // list concatenation: {1, 2, 3}
[ a = 1 ] & [ b = 2 ] // record merge: [ a = 1, b = 2 ]
Huomaa, että jotkin operaattorit eivät tue kaikkia arvoyhdistelmiä. Esimerkkejä:
1 + "2" // error: adding number and text isn't supported
Lausekkeet, jotka arvioitaessa kohtaavat määrittämättömiä operaattoriehtoja, arvioivat virheitä.
Metatiedot
Metatiedot ovat tietoja arvosta, joka on liitetty arvoon. Metatiedot esitetään tietuearvona, jota kutsutaan metatietotietueeksi. Metatietotietueen kenttiä voidaan käyttää metatietojen tallentamiseen arvolle.
Jokaisella arvolla on metatietotietue. Jos metatietotietueen arvoa ei ole määritetty, metatietotietue on tyhjä (sillä ei ole kenttiä).
Metatietotietueiden avulla voit liittää lisätietoja mihin tahansa arvoon huomaamattomalla tavalla. Metatietotietueen liittäminen arvoon ei muuta arvoa tai sen toimintaa.
Metatietotietueen arvo y
liittyy olemassa olevaan arvoon x
käyttäen syntaksia x meta y
. Esimerkiksi seuraava koodi liittää metatietotietueen Rating
ja Tags
-kenttiin joiden tekstiarvo "Mozart"
on :
"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]
Arvoille, joissa on jo jokin muu kuin tyhjä metatietotietue, metatietojen käytön tulos on se, että se käyttää olemassa olevan ja uuden metatietotietueen tietueen yhdistämisen laskentaa. Esimerkiksi seuraavat kaksi lauseketta vastaavat toisiaan ja edellistä lauseketta:
("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ]
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])
Arvon metatietotietuetta voi käyttää Value.Metadata-funktiolla. Seuraavassa esimerkissä ComposerRating
-kentän lauseke käyttää -kentän arvon Composer
metatietotietuetta ja sitten Rating
metatietotietueen -kenttää.
[
Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ],
ComposerRating = Value.Metadata(Composer)[Rating] // 5
]
Let-lauseke
Monet tähän mennessä näytetyt esimerkit ovat sisällyttäneet lausekkeen kaikki literaaliarvot lausekkeen tulokseen. let
Lauseke sallii joukon arvojen laskennan, määritetyt nimet ja käytön sitten lausekkeessa, joka seuraa kohdetta in
. Esimerkiksi myyntitietojen esimerkissä voit tehdä seuraavia asioita:
let
Sales2007 =
[
Year = 2007,
FirstHalf = 1000,
SecondHalf = 1100,
Total = FirstHalf + SecondHalf // 2100
],
Sales2008 =
[
Year = 2008,
FirstHalf = 1200,
SecondHalf = 1300,
Total = FirstHalf + SecondHalf // 2500
]
in Sales2007[Total] + Sales2008[Total] // 4600
Edellä olevan lausekkeen tulos on lukuarvo (4600
), joka lasketaan nimiin Sales2007
ja Sales2008
sidotuista arvoista.
If-lauseke
if
Lauseke valitsee kahdesta lausekkeesta välillä loogisen ehdon perusteella. Esimerkkejä:
if 2 > 1 then
2 + 2
else
1 + 1
Ensimmäinen lauseke (2 + 2
) valitaan, jos looginen lauseke (2 > 1
) on tosi, ja toinen lauseke (1 + 1
) valitaan, jos se on epätosi. Valittu lauseke (tässä tapauksessa 2 + 2
) lasketaan ja siitä tulee lausekkeen if
tulos (4
).
Virheet
Virhe on osoitus siitä, että lausekkeen arviointiprosessi ei voinut tuottaa arvoa.
Virheilmoituksia aiheuttavat operaattorit ja funktiot, jotka kohtaavat virhe-ehtoja, tai käyttämällä virhelauseketta. Virheitä käsitellään -lausekkeen try
avulla. Kun virhe ilmenee, määritetään arvo, jonka avulla voidaan ilmaista, miksi virhe ilmeni.
let Sales =
[
Revenue = 2000,
Units = 1000,
UnitPrice = if Units = 0 then error "No Units"
else Revenue / Units
],
UnitPrice = try Number.ToText(Sales[UnitPrice])
in "Unit Price: " &
(if UnitPrice[HasError] then UnitPrice[Error][Message]
else UnitPrice[Value])
Yllä oleva esimerkki käyttää - Sales[UnitPrice]
kenttää ja muotoilee tuloksen tuottavan arvon:
"Unit Price: 2"
Jos - Units
kentän arvo olisi ollut nolla, - UnitPrice
kenttä olisi aiheuttanut virheen, jonka -parametri olisi käsitellyt try
. Tulokseksi saatava arvo olisi silloin ollut seuraava:
"No Units"
try
Lauseke muuntaa arvot ja virheet tietuearvoksi, joka ilmaisee, käsittelikö try
lauseke virhettä vai ei, ja joko oikean arvon tai virhetietueen, jonka se poimi virheenkäsittelyn aikana. Otetaan esimerkiksi seuraava lauseke, joka aiheuttaa virheen ja käsittelee sen heti:
try error "negative unit count"
Tämä lauseke antaa tulokseksi seuraavan sisäkkäisen tietuearvon, joka selittää [HasError]
edellisen yksikkö-hinta-esimerkin - [Error]
, - ja [Message]
-kenttien haut.
[
HasError = true,
Error =
[
Reason = "Expression.Error",
Message = "negative unit count",
Detail = null
]
]
Yleinen tapa on korvata virheet oletusarvoilla. - try
lauseketta voidaan käyttää valinnaisen otherwise
-lauseen kanssa, joka tekee juuri tämän kompaktissa muodossa:
try error "negative unit count" otherwise 42
// 42