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 temelli yapı , sözcük temelli olarak geçerli olan 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. Hem ilkel hem de yapılandırılmış değerlerin ayrıntılı belirtimi, dilin hedef etki alanını tanımlar.

  4. Değerler, 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üne sahiptir.

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

  6. Başka bir tür özel değer olan işlevler, 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. İzin ver ifadeleri , daha küçük adımlarda karmaşık ifadeler oluşturmak için kullanılan yardımcı tanımların eklenmesine olanak sağlar.

  9. İfadeler 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ılmadı.)

  11. Son olarak, birleştirilmiş bir 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) ve tek bir değer elde edilebilir.

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

Aşağıdaki örneklerde M'de kullanılabilen farklı değer türleri gösterilmektedir. Kural olarak, bir değer, yalnızca bu değere göre değerlendirilen bir ifadede görünecekleri değişmez form kullanılarak yazılır. (satırının // sonuna kadar devam eden bir açıklamanın başlangıcını gösterdiğine dikkat edin.)

  • İlkel değer 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
    
  • Liste değeri, sıralı bir değer dizisidir. M sonsuz listeleri destekler, ancak değişmez değer olarak yazılırsa listelerin uzunluğu sabittir. Küme ayracı 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ıt, bir alan kümesidir. Alan, adın alanın kaydı içinde benzersiz bir metin değeri olduğu bir ad/değer çiftidir. Kayıt değerlerinin değişmez değer söz dizimi, adların tırnak işareti olmadan yazılmasına olanak tanır ve bu formda tanımlayıcılar olarak da adlandırılır. Aşağıda , ve değerlerine sahip "", "AB" ve "C" adlı üç alan içeren bir kayıt gösterilmektedir12.3

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

    Örnek:

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

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

    Image of an example table in the M formula language.

  • İşlev, bağımsız değişkenlerle çağrıldığında yeni bir değer üreten bir değerdir. İşlev, işlevin parametrelerini parantez içinde listeleyerek ve ardından gider simgesiyle =>birlikte işlevi tanımlayan ifadeyle yazılır. Bu ifade genellikle parametrelere (ada göre) başvurur.

    (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:

Image of the formulas on the right resulting in the values on the left.

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, diğer kayıtların içinde veya iç içe yerleştirilmiş olabilir. 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 adlı Sales bir alan ve kaydın FirstHalf ve SecondHalf alanlarına erişen adlı Total bir alan Sales 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şlecini ({}) 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 ifadelerinin yanı sıra) gecikmeli değerlendirme kullanılarak değerlendirilir ve bu da yalnızca gerektiğinde değerlendirildiği anlamına gelir. Diğer tüm ifadeler hevesli değerlendirme kullanılarak değerlendirilir, yani değerlendirme işlemi sırasında karşılaşıldığında hemen değerlendirilirler. 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.

İşlevler

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

(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 diğer birkaç alandan çağrılan veya yürütülen Add alanının değeri olan bir işlev gösterilmektedir. bir işlev çağrıldığında, işlev gövdesi ifadesinde gerekli giriş değerleri kümesiyle mantıksal olarak değiştirilen bir değer kümesi belirtilir.

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

Kitaplık

M, standart kitaplık olarak adlandırılan bir ifadeden veya kısaca kitaplıktan kullanılabilen 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. Örnek:

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

İşleçler

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

İşlecin anlamı, işlenenlerinin ne tür değerler olduğu 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şlecin bir diğer ö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. Örnek:

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 hata olarak değerlendirilir.

Meta veri

Meta veriler , bir değerle ilişkili bir değerle ilgili bilgilerdir. 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ğeriy, söz dizimi x meta ykullanılarak var olan bir değerle x ilişkilendirilir. Örneğin, aşağıdaki kod bir meta veri kaydını Rating ve Tags alanlarını metin değeriyle "Mozart"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, alandaki ComposerRating ifade alandaki değerin Composer meta veri kaydına erişir ve ardından meta veri kaydının alanına erişir Rating .

[ 
    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. ifadesi let , bir değer kümesinin hesaplanmasına, ad atanmasına ve ardından öğesini izleyen sonraki ifadede kullanılmasına inolanak 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, ve Sales2008adlarına Sales2007 bağlı değerlerden hesaplanan bir sayı değeridir (4600).

If ifadesi

İfade, if mantıksal bir koşula göre iki ifade arasında seçim yapın. Örnek:

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

Mantıksal ifade (2 + 2) true ise ilk ifade (2 > 1), yanlışsa ikinci ifade (1 + 1) seçilir. Seçili ifade (bu durumda 2 + 2) değerlendirilir ve ifadenin if sonucu olur (4).

Hatalar

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 ifadesi kullanılarak try 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 alana erişir Sales[UnitPrice] ve sonucu oluşturan değeri biçimlendirir:

"Unit Price: 2"

Units Alan sıfır olsaydı, UnitPrice alan tarafından işlenen bir hataya tryneden olurdu. Sonuçta elde edilen değer şu şekilde olacaktır:

"No Units"

İfade try , doğru değerleri ve hataları, ifadenin try 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 hemen işleyen aşağıdaki ifadeyi göz önünde bulundurun:

try error "negative unit count"

Bu ifade, önceki birim fiyatı örneğindeki , [Error]ve [Message] alan aramalarını açıklayarak [HasError]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. İfade, try yalnızca küçük bir biçimde elde etmek için isteğe bağlı otherwise bir yan tümcesi ile kullanılabilir:

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