Jaa


Johdanto

Yleiskatsaus

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:

  1. sanastollinen rakenne - määrittää sanastollisesti kelvollisten tekstien joukon.

  2. Arvot, lausekkeet, ympäristöt ja muuttujat, tunnisteet ja arviointimalli muodostavat kielen peruskäsitteet.

  3. arvojen yksityiskohtainen määritys, sekä primitiivinen että jäsennetty, määrittää kielen kohdetoimialueen.

  4. Arvoilla on tyypeistä, itse erityinen arvo, jotka sekä luonnehtivat perustyyppisiä arvoja että kantavat lisämetatietoja, jotka koskevat jäsennettyjen arvojen muotoja.

  5. Sarja operaattoreita, M:ssä, määrittää, millaisia lausekkeita voidaan muotoilla.

  6. Funktiot, toisentyyppiset erikoisarvot, luovat perustan M-vakiokirjastolle ja mahdollistavat uusien abstraktiotoimintojen lisäämisen.

  7. Errors- 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.

  8. Let-lausekkeet mahdollistaa monimutkaisten lausekkeiden luomiseen käytettävien lisämääritysten käyttöönoton pienemmissä vaiheissa.

  9. If-lausekkeet tukevat ehdollista arviointia.

  10. osat yksinkertaisen modulaarisuusmekanismin. (Power Query ei vielä hyödynnä vielä osia.)

  11. 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:n 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; lausekkeet, 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 asti.)

  • primitiivi arvo 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 
    
  • tietueen 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 tunnisteiden . Seuraavassa on tietue, joka sisältää kolme kenttää nimeltä "A", "B", ja "C", joilla on arvot 1, 2, ja 3.

    [ 
          A = 1,  
          B = 2,  
          C = 3 
    ]
    
  • taulukon on joukko arvoja järjestettynä 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.

    Esimerkiksi:

    #table( {"A", "B"}, { {1, 2}, {3, 4} } ) 
    

    Tämä luo seuraavan muotoisen taulukon:

    Kuva M-kaavakielen esimerkkitaulukosta.

  • -funktio on arvo, joka argumenteilla käynnistettynä tuottaa uuden arvon. Funktio kirjoitetaan luettelemalla funktion parametrit, jotka sulkeisiin, ja sen perässä on goes-to-symboli =>, 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:

kuva oikealla olevista kaavoista, joiden tuloksena ovat vasemmalla olevat arvot.

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 sijoittaasisä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 Sales tietueen SecondHalf 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. Voit käyttää sijaintiindeksioperaattoria ({}) luettelon kohteen käyttämiseen sen numeerisen indeksin avulla. 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 tietueet (sekä let-lausekkeet) arvioidaan käyttämällä laiskuuden arviointia, mikä tarkoittaa, 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).

Toimintoja

M:ssä 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. Esimerkiksi:

(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ääntai 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
]

Kirjasto

M sisältää yhteisen määritelmäjoukon, joka on käytettävissä lausekkeesta, jota kutsutaan vakiokirjaston, tai vain kirjaston lyhyesti. 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. Esimerkiksi:

Number.E                        // Euler's number e (2.7182...) 
Text.PositionOf("Hello", "ll")  // 2

Toimijoiden

M sisältää joukon operaattoreita, joita voidaan käyttää lausekkeissa. operaattorien sovelletaan operandeja symbolisten lausekkeiden muodostamiseksi. Esimerkiksi lausekkeessa 1 + 21 ja 2 numerot 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 yhdistelmäoperaattoria (&):

"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ä. Esimerkiksi:

1 + "2"  // error: adding number and text isn't supported

Lausekkeet, jotka arvioitaessa kohtaavat määrittämättömiä operaattoriehtoja, arvioivat virheitä.

Metatieto

Metadata on tietoa arvosta, joka liittyy 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ämällä syntaksia x meta y. Esimerkiksi seuraava koodi liittää metatietotietueen, joka sisältää Rating- ja Tags-kenttiä, joiden tekstiarvo on "Mozart":

"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ää Composer-kentän arvon metatietotietuetta ja metatietotietueen Rating 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 mahdollistaa joukon arvojen laskemisen, määrittämisen nimet ja käytön sitten lausekkeessa, joka seuraa 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 Sales2007 ja Sales2008nimiin sidotuista arvoista.

If-lauseke

if-lauseke valitsee kahdesta lausekkeesta kahden loogisen ehdon perusteella. Esimerkiksi:

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 if lausekkeen (4) tulos.

Virheitä

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 try-lausekkeen 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 tryolisi käsitellyt. Tulokseksi saatava arvo olisi silloin ollut seuraava:

"No Units"

try-lauseke muuntaa oikeat 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ää edellisen yksikköhintaesimerkin [HasError], [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