# 6.9 M language ची सोपी ओळख

Source: https://ravindrabagale.com/mr/powerbi/ch06-power-query-essentials/6-9-introduction-to-the-m-language.html
Language: mr (Marathi with English technical terms)

प्रत्येक query ही M expression असते. Home › Advanced Editor मध्ये पूर्ण code दिसतो. let … in block मध्ये named steps लिहिलेले असतात. प्रत्येक step सहसा आधीच्या step चा वापर करतो.

पहिलं example CSV आणतं, headers व types सेट करतं, columns rename करतं, Quantity > 0 filter लावतं आणि Order Date / Order Hour तयार करतं. दुसरं UTC timestamp IST मध्ये बदलतं. शेवटचं delivery band function आहे.

let
    Source = Csv.Document(
        File.Contents("C:\QuickCommerce\Blinkit_Orders_2025.csv"),
        [Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
    ),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers", {
        {"OrderID", type text},
        {"OrderDateTime", type datetime},
        {"Quantity", Int64.Type},
        {"Amount", Currency.Type},
        {"DeliveryTimeMins", Int64.Type}
    }),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type", {
        {"OrderID", "Order ID"}, {"OrderDateTime", "Order DateTime"},
        {"DeliveryTimeMins", "Delivery Time Mins"}
    }),
    #"Filtered Rows" = Table.SelectRows(#"Renamed Columns", each [Quantity] > 0),
    #"Added Order Date" = Table.AddColumn(#"Filtered Rows", "Order Date",
        each DateTime.Date([Order DateTime]), type date),
    #"Added Order Hour" = Table.AddColumn(#"Added Order Date", "Order Hour",
        each Time.Hour([Order DateTime]), Int64.Type)
in
    #"Added Order Hour"

= Table.AddColumn(Source, "Order DateTime", each
    DateTimeZone.RemoveZone(
        DateTimeZone.SwitchZone(DateTime.AddZone([OrderDateTimeUTC], 0), 5, 30)
    ), type datetime)

// Query named fnDeliveryBand
(mins as nullable number) as text =>
    if mins = null then "Not delivered"
    else if mins <= 10 then "Within 10 min"
    else if mins <= 20 then "11-20 min"
    else "Over 20 min"

M मधल्या महत्त्वाच्या गोष्टी

M case-sensitive आहे. Table.SelectRows योग्य; table.selectrows वेगळं आणि चुकीचं नाव आहे.

Spaces असलेलं step नाव #"Step Name" असं लिहितात.

each function लिहिण्याचा छोटा मार्ग आहे. Row context मध्ये [Column] त्या row ची value दाखवतो.

in नंतर दिलेली value query चा output असते.

Comments साठी // किंवा /* … */ वापरा.

UTC ते IST

DateTime.AddZone(…, 0) timezone नसलेल्या value ला UTC म्हणून ओळख देतं; DateTimeZone.SwitchZone(…, 5, 30) IST मध्ये बदलतं; RemoveZone पुन्हा साधा Date/Time देतं. आपल्या sample files आधीच IST मध्ये आहेत; त्यांना पुन्हा 5:30 जोडू नका.

Function वापरा

fnDeliveryBand query save करा. Add Column › Invoke Custom Function किंवा fnDeliveryBand([Delivery Time Mins]) वापरा. Null साठी Not delivered, 10 पर्यंत Within 10 min, 20 पर्यंत 11-20 min आणि पुढे Over 20 min मिळतं.

Code पाठ करण्याची गरज नाही. UI मधून step बनवा आणि Formula bar मध्ये काय तयार झालं ते वाचा.

रवींद्र बागले यांची tip

Text.Upper आणि [Amount] यांची capital letters महत्त्वाची आहेत. आधी UI ने code तयार होऊ द्या; मग छोटी edit करून परिणाम पाहा.
