M dili dersi arkadaki kodu okumayı öğretti. Bu derste kodu sen yazıyorsun.
Satislar, Aylik_Satis, Bayi_Subat, Sehir_Bolge, Hedefler, Urun_Listesi, Musteri_Ham, Bayi_Ocak.Her şey bir değer, her ifade bir sonuç
M bir formül dilidir: komut sırası çalıştırmaz, tek bir ifadeyi değerlendirir. Değer türleri: null, logical, number, text, date, datetime, duration, binary, list, record, table, function, type.
let
Tutar = 1000,
Oran = 0.2,
KDV = Tutar * Oran
in
Tutar + KDV
let ara adlar tanımlar, in sonucu söyler. Uygulanan adımlar listesindeki her satır, let içindeki bir addır. Son adımdan sonra virgül olmaz; bu, elle yazarken en sık hatadır.
Tembel değerlendirme
M, gereken değeri hesaplar. Sonuçta kullanılmayan adım çalışmaz. Aşağıdaki kod hata vermez, çünkü Kotu hiç istenmiyor:
let
Kotu = error "çalışsaydı patlardı",
Iyi = 5
in
Iyi
Sıra da bağlayıcı değildir: adımlar birbirine adla bağlanır. Yine de okunurluk için sırayla yaz.
each ve alt çizgi
each, tek parametreli fonksiyonun kısaltmasıdır: each [Tutar] * 2 ile (_) => _[Tutar] * 2 aynı şeydir. Köşeli parantez, _ kaydının alanını okur. Listelerde alan yoktur, doğrudan _ yazılır.
let
Satirlar = Table.SelectRows(Satislar, each [Şehir] = "Ankara"),
Ciftler = List.Select({1, 2, 3, 4}, each Number.IsEven(_))
in
[Tablo = Table.RowCount(Satirlar), Liste = Ciftler]
null kuralları ve if
- İşlemde null varsa sonuç null’dur:
1 + nullnull döner. - Karşılaştırmada da:
[Tutar] > 1000, Tutar null ise null olur. ifyalnız true ya da false kabul eder.if null thenhata verir: We cannot convert the value null to type Logical.Table.SelectRowsnull sonucu olan satırı atar; bu yüzden filtre sessizce çalışır, Koşullu sütun ise aynı satırda hata verir.- Çözüm: önce null’u sına ya da
??kullan:([Tutar] ?? 0) > 1000.
Metin birleştirme ve tür dönüşümü
M örtük tür dönüşümü yapmaz. "Tutar: " & 1250 hata verir; Text.From(1250) gerekir. Excel ve DAX alışkanlığının en çok çarptığı yer burasıdır. Büyük küçük harf de önemlidir: table.addcolumn tanınmaz.
Tür sistemi: değer türü ve sütun türü
x is number sınar, x as number doğrular ve uymazsa hata verir. Fonksiyon parametresinde de aynı denetim çalışır. Sütun türü ayrı bir bilgidir: Table.TransformColumnTypes değerleri çevirir, Table.AddColumn(..., type number) ise yalnız etiket koyar, değeri çevirmez.
let
Sinama = [Sayi = 5 is number, Metin = "5" is number, BosMetin = null is nullable text],
Cevirme = Number.FromText("12.5") + 1
in
[Sinama = Sinama, Cevirme = Cevirme]
Türleri karşılaştırmak
Değerin türünü sınamak için x is number ya da Value.Is(x, type number) yaz. Türü bir değer olarak sınamak için Type.Is(Value.Type(x), type number). Value.Type(1) = type number yazma: M belirtimi tür eşitliğini uygulamaya bırakır, yalın türlerde true dönebileceğini söyler ama (type [a = text]) = (type [a = text]) için dönmeyebilir. Bu alt küme yalın türde true verir, kayıt ve tablo türünde tahmin etmez, durur.
[Bir = Type.Is(type text, type nullable text), Iki = Type.Is(type nullable text, type text), Uc = Type.Is(Value.Type(5), type number)]
Table.TransformColumnTypes(t, {{"Tarih", type date}}, "tr-TR"). Kültür vermezsen bilgisayarın bölge ayarı kullanılır, aynı kod başka makinede başka sonuç verebilir. Lab kültürsüz durumda tarihi kabul etmez, kültür ister.