Giriş

Genel bakış

Microsoft Power Query, birçok özelliği kapsayan güçlü bir "veri alma" deneyimi sunar. Power Query'nin temel bir özelliği, desteklenen veri kaynaklarının bir veya daha fazla koleksiyonundaki verileri filtrelemek ve birleştirmektir. Bu tür veri karmaları Power Query formül dili (resmi olmayan şekilde "M" olarak bilinir) kullanılarak ifade edilir. Power Query, yinelenebilir veri karmasını etkinleştirmek için M belgelerini Excel, Power BI, Analysis Services ve Dataverse gibi çok çeşitli Microsoft ürünlerine ekler.

Bu belge M belirtimini sağlar. İlk sezgileri ve dili tanımayı amaçlayan kısa bir giriş sonrasında belge, dili birkaç aşamalı adımda tam olarak ele almaktadır:

  1. sözcük yapısı sözcük temelli olarak geçerli metin kümesini tanımlar.

  2. Değerler, ifadeler, ortamlar ve değişkenler, tanımlayıcılar ve değerlendirme modeli,dilin temel kavramlarını oluşturur.

  3. , ilkel ve yapısal olan değerlerinin ayrıntılı belirtimi, dilin hedef etki alanını tanımlar.

  4. Değerler,türe sahiptir ve hem temel değer türlerini niteleyen hem de yapılandırılmış değerlerin şekillerine özgü ek meta veriler taşıyan özel bir değer türüdür.

  5. M'de işleç kümesi, ne tür ifadelerin oluşturulabileceğini tanımlar.

  6. İşlevleri, başka bir tür özel değer, M için zengin bir standart kitaplığın temelini sağlar ve yeni soyutlamaların eklenmesini sağlar.

  7. İfade değerlendirmesi sırasında işleçler veya işlevler uygulanırken hatalar oluşabilir. Hatalar değer olmasa da, hataları değerlere geri eşleyen hataları işlemenin yolları vardır.

  8. Let ifadeleri karmaşık ifadeleri daha küçük adımlarda oluşturmak için kullanılan yardımcı tanımların eklenmesine olanak tanır.

  9. ifadeler koşullu değerlendirmeyi destekliyorsa.

  10. Bölümler basit bir modülerlik mekanizması sağlar. (Bölümler henüz Power Query tarafından kullanılmamaktadır.)

  11. Son olarak, birleştirilmiş dil bilgisi bu belgenin diğer tüm bölümlerindeki dil bilgisi parçalarını tek bir tam tanımda toplar.

Bilgisayar dili teorisyenleri için: Bu belgede belirtilen formül dili çoğunlukla saf, yüksek sıralı, dinamik olarak yazılan, kısmen tembel işlevsel bir dildir.

İfadeler ve değerler

M'deki merkezi yapı,ifadesidir. Bir ifade değerlendirilebilir (hesaplanabilir), bu da tek bir değeriüretir.

Birçok değer kelimenin tam anlamıyla ifade olarak yazılabilir, ancak bir değer bir ifade değildir. Örneğin, ifade 1değerine değerlendirilir; ifadeleri 2değerine değerlendirilir. Bu ayrım incedir, ancak önemlidir. İfadeler değerlendirme için tariflerdir; değerler değerlendirmenin sonuçlarıdır.

Aşağıdaki örnekler, M'de kullanılabilen farklı değer türlerini örneklendirmektedir. Kural olarak, bir değer, yalnızca bu değerin hesaplandığı bir ifadede gözüken doğrudan biçimi kullanılarak yazılır. (// satırın sonuna kadar devam eden bir açıklamanın başlangıcını gösterdiğine dikkat edin.)

  • temel değeri sayı, mantıksal, metin veya null gibi tek parçalı değerdir. Boş değer, herhangi bir verinin yokluğunu belirtmek için kullanılabilir.

    123                  // A number
    true                 // A logical
    "abc"                // A text
    null                 // null value
    
  • listesi değeri, sıralı bir değer dizisidir. M sonsuz listeleri destekler, ancak literali olarak yazılırsa listelerin uzunluğu sabittir. Süslü parantez karakterleri { ve }, listenin başlangıcını ve sonunu belirtir.

    {123, true, "A"}     // list containing a number, a logical, and 
                          //     a text 
    {1, 2, 3}            // list of three numbers 
    
  • kayıtalanları kümesidir. Bir alan, adı alan kaydı içinde benzersiz olan bir metin değeri olan ad/değer çiftidir. Kayıt değerlerinin söz dizimi, adların tırnak işareti olmadan yazılmasına olanak tanır. Bu, tanımlayıcıları olarak da adlandırılan bir formdur. Aşağıda, "A", " "B"ve "C" adlı üç alan içeren ve 1, 2ve 3değerleri olan bir kayıt gösterilmektedir.

    [ 
          A = 1,  
          B = 2,  
          C = 3 
    ]
    
  • tablo, sütunlar (adla tanımlanır) ve satırlar halinde düzenlenmiş bir değer kümesidir. Tablo oluşturmak için değişmez söz dizimi yoktur, ancak listelerden veya kayıtlardan tablo oluşturmak için kullanılabilecek birkaç standart işlev vardır.

    Örneğin:

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

    Bu, aşağıdaki şekilde bir tablo oluşturur:

    M formül dilinde bir örnek tablonun görüntüsü.

  • işlevi, bağımsız değişkenlerle çağrıldığında yeni bir değer üreten bir değerdir. İşlev, işlevin parametreleri parantez içinde ve ardından =>giden simgesi ve ardından işlevi tanımlayan ifade listelenerek yazılır. Bu ifade genellikle parametrelere (isimle) atıfta bulunur.

    (x, y) => (x + y) / 2`
    

Değerlendirme

M dilinin değerlendirme modeli, elektronik tablolarda yaygın olarak bulunan ve hesaplama sırasının hücrelerdeki formüller arasındaki bağımlılıklara göre belirlenebildiği değerlendirme modelinden sonra modellenmiştir.

Excel gibi bir elektronik tabloya formül yazdıysanız, soldaki formüllerin hesaplandığında sağ taraftaki değerlerle sonuçlanmış olduğunu fark edebilirsiniz:

Sağ taraftaki formüllerin görüntüsü, soldaki değerlere neden olur.

M'de, ifadenin bölümleri ifadenin diğer bölümlerine ada göre başvurabilir ve değerlendirme işlemi başvurulan ifadelerin hesaplanma sırasını otomatik olarak belirler.

Önceki elektronik tablo örneğine eşdeğer bir ifade oluşturmak için bir kayıt kullanabilirsiniz. Bir alanın değerini başlatırken, aşağıdaki gibi alanın adını kullanarak kayıttaki diğer alanlara başvurabilirsiniz:

[  
    A1 = A2 * 2,  
    A2 = A3 + 1,  
    A3 = 1  
]

Yukarıdaki ifade aşağıdakine eşdeğerdir (her ikisi de eşit değerler olarak değerlendirilir):

[  
    A1 = 4,  
    A2 = 2,  
    A3 = 1  
]

Kayıtlar içinde bulunabilir veya diğer kayıtların içindeiç içe yer alabilir. Bir kaydın alanlarına ada göre erişmek için () arama işlecini kullanabilirsiniz. Örneğin, aşağıdaki kayıtta kayıt içeren Sales adlı bir alan ve Sales kaydının FirstHalf ve SecondHalf alanlarına erişen Total adlı bir alan vardır:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = Sales[FirstHalf] + Sales[SecondHalf] 
]

Yukarıdaki ifade, değerlendirildiğinde aşağıdakiyle eşdeğerdir:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = 2100 
]

Kayıtlar listelerin içinde de bulunabilir. Listedeki bir öğeye sayısal dizinine göre erişmek için konumsal dizin işleci ({}) kullanabilirsiniz. Liste içindeki değerlere, listenin başından sıfır tabanlı dizin kullanılarak başvurulur. Örneğin, dizinler 0 ve 1 aşağıdaki listedeki birinci ve ikinci öğelere başvurmak için kullanılır:

[ 
    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 
]

Liste ve kayıt üyesi ifadeleri (let ifadeleri) gecikmeli değerlendirmekullanılarak değerlendirilir ve bu da yalnızca gerektiğinde değerlendirildiği anlamına gelir. Diğer tüm ifadeler hevesli değerlendirmekullanılarak değerlendirilir, bu da değerlendirme süreci sırasında karşılaşıldıklarında hemen değerlendirildikleri anlamına gelir. Bunu düşünmenin iyi bir yolu, liste veya kayıt ifadesini değerlendirmenin, liste öğelerinin veya kayıt alanlarının istendiğinde (arama veya dizin işleçleri tarafından) nasıl hesaplanması gerektiğini hatırlayan bir liste veya kayıt değeri döndürdüğünü anımsamaktır.

Işlev

M'de işlevi, bir dizi giriş değerinden tek bir çıkış değerine eşlemedir. İşlev, önce gerekli giriş değerleri kümesini (işlevin parametreleri) adlandırarak ve ardından gider (=>) simgesinin ardından bu giriş değerlerini (işlevin gövdesi) kullanarak işlevin sonucunu hesaplayan bir ifade sağlayarak yazılır. Örneğin:

(x) => x + 1                    // function that adds one to a value 
(x, y) =>  x + y                // function that adds two values

İşlev, sayı veya metin değeri gibi bir değerdir. Aşağıdaki örnekte, daha sonraçağrılan veya diğer birçok alandan yürütülen Add alanının değeri olan bir işlev gösterilmektedir. Bir işlev çağrıldığında, işlevin gövdesinde gerekli giriş değerleri kümesi yerine mantıksal olarak yerleştirilen bir değerler kümesi belirtilir.

[ 
    Add = (x, y) => x + y,
    OnePlusOne = Add(1, 1),     // 2 
    OnePlusTwo = Add(1, 2)      // 3
]

Kütüphane

M, standart kitaplığıveya kısaca kitaplığı olarak adlandırılan bir ifadede kullanılabilecek ortak bir tanım kümesi içerir. Bu tanımlar bir dizi adlandırılmış değerden oluşur. Bir kitaplık tarafından sağlanan değerlerin adları, ifade tarafından açıkça tanımlanmadan bir ifade içinde kullanılabilir. Mesela:

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

Operatörler

M, ifadelerde kullanılabilecek bir işleç kümesi içerir. İşleçleriişlenenlere uygulanır sembolik ifadeler oluşturmak için. Örneğin, 1 + 2 ifadesinde, 1 ve 2 işlenenler, işleç ise toplama operatörüdür (+).

İşlecin anlamı, işlenenlerin ne tür değerler olduğuna bağlı olarak değişebilir. Örneğin, artı işleci sayıların yanı sıra diğer değer türleriyle de kullanılabilir:

1 + 2                   // numeric addition: 3 
#time(12,23,0) + #duration(0,0,2,0) 
                        // time arithmetic: #time(12,25,0)

İşlenene bağlı anlamı olan bir işleç örneği de birleşim işlecidir (&):

"A" & "BC"              // text concatenation: "ABC" 
{1} & {2, 3}            // list concatenation: {1, 2, 3} 
[ a = 1 ] & [ b = 2 ]   // record merge: [ a = 1, b = 2 ]

Bazı işleçlerin tüm değer bileşimlerini desteklemediğini unutmayın. Mesela:

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

Değerlendirildiğinde tanımsız işleç koşullarıyla karşılaşan ifadeler,hataları olarak değerlendirilir.

Meta veriler

Meta Veri, bir değerle ilişkili bir değer hakkında bilgidir. Meta veriler,meta veri kaydı olarak adlandırılan bir kayıt değeri olarak temsil edilir. Meta veri kaydının alanları, bir değerin meta verilerini depolamak için kullanılabilir.

Her değerin bir meta veri kaydı vardır. Meta veri kaydının değeri belirtilmemişse, meta veri kaydı boş olur (alanları yoktur).

Meta veri kayıtları, ek bilgileri herhangi bir değerle göze çarpmadan ilişkilendirmek için bir yol sağlar. Meta veri kaydını bir değerle ilişkilendirmek, değeri veya davranışını değiştirmez.

meta veri kayıt değeri y, söz dizimi x meta ykullanılarak x var olan bir değerle ilişkilendirilir. Örneğin, aşağıdaki kod bir meta veri kaydını Rating ve Tags alanlarıyla "Mozart"metin değeriyle ilişkilendirir:

"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]

Zaten boş olmayan bir meta veri kaydı taşıyan değerler için meta veri uygulamanın sonucu, var olan ve yeni meta veri kaydının kayıt birleştirme işleminin hesaplanmasıdır. Örneğin, aşağıdaki iki ifade birbirine ve önceki ifadeye eşdeğerdir:

("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ] 
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])

Value.Metadata işlevi kullanılarak belirli bir değer için meta veri kaydına erişilebilir. Aşağıdaki örnekte, ComposerRating alanındaki ifade, Composer alanındaki değerin meta veri kaydına erişir ve ardından meta veri kaydının Rating alanına erişir.

[ 
    Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ], 
    ComposerRating = Value.Metadata(Composer)[Rating] // 5
]

let ifadesi

Şimdiye kadar gösterilen örneklerin çoğu ifadenin sonucuna ifadenin tüm değişmez değerlerini eklemiştir. let ifadesi bir değer kümesinin hesaplanmasına, ad atanmasına ve ardından inizleyen bir ifadede kullanılmasına olanak tanır. Örneğin, satış verileri örneğimizde şunları yapabilirsiniz:

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

Yukarıdaki ifadenin sonucu, Sales2007 ve Sales2008adlarına bağlı değerlerden hesaplanan bir sayı değeridir (4600).

If ifadesi

if ifadesi, mantıksal bir koşula göre iki ifade arasında seçim sağlar. Örneğin:

if 2 > 1 then
    2 + 2
else  
    1 + 1

Mantıksal ifade (2 > 1) doğruysa ilk ifade (2 + 2), yanlışsa ikinci ifade (1 + 1) seçilir. Seçili ifade (bu örnekte 2 + 2) değerlendirilir ve if ifadesinin (4) sonucu olur.

Hata

hata, bir ifadeyi değerlendirme işleminin bir değer üretemediğinin göstergesidir.

Hatalar, hata koşullarıyla karşılaşan işleçler ve işlevler tarafından veya hata ifadesi kullanılarak oluşturulur. Hatalar try ifadesi kullanılarak işlenir. Bir hata oluştuğunda, hatanın neden oluştuğunun belirtilmesi için kullanılabilecek bir değer belirtilir.

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])

Yukarıdaki örnek Sales[UnitPrice] alanına erişir ve sonucu oluşturan değeri biçimlendirir:

"Unit Price: 2"

Units alanı sıfır olsaydı, o zaman UnitPrice alanı bir hataya neden olurdu ve bu hata trytarafından ele alınırdı. Sonuçta elde edilen değer şu şekilde olacaktır:

"No Units"

try ifadesi, doğru değerleri ve hataları, try ifadesinin bir hatayı işleyip işlemediğini ve hatayı işlerken ayıklanan doğru değeri veya hata kaydını gösteren bir kayıt değerine dönüştürür. Örneğin, bir hata oluşturan ve ardından hemen ele alan aşağıdaki ifadeyi göz önünde bulundurun:

try error "negative unit count"

Bu ifade, önceki birim fiyatı örneğindeki [HasError], [Error]ve [Message] alan aramalarını açıklayarak aşağıdaki iç içe geçmiş kayıt değerini değerlendirir.

[ 
    HasError = true, 
    Error = 
        [ 
            Reason = "Expression.Error", 
            Message = "negative unit count", 
            Detail = null 
        ] 
]

Yaygın bir durum, hataları varsayılan değerlerle değiştirmektir. try ifadesi, isteğe bağlı bir otherwise yan tümcesi ile birlikte kullanılarak bunu kompakt bir biçimde elde etmek mümkün:

try error "negative unit count" otherwise 42 
// 42