【问题标题】:M (PowerQuery), set the value of a non-primitive variable in a let statementM(PowerQuery),在 let 语句中设置非原始变量的值
【发布时间】:2021-06-24 12:43:29
【问题描述】:

我正在编写自定义 M 语言(Excel 中的 PowerQuery)函数来查询 RESTful 接口。该接口有大量可选参数。

从一个简单的案例开始——我处理一个作为简单(原始)值传递的可选limit,如下所示——

/* 
 * RESTful API Get from the named endpoint
 */
(endpoint as text, optional limit) =>
let
    // query limit
    // If limit is supplied as a number, it will be converted to text
    // If limit is not supplied it will be set to the value "1000"

    limit = if limit <> null then Text.From(limit) else "1000",

由于完整的 API 有许多参数,我想使用 Record 将它们传递给函数,但后来我意识到我不知道如何说服 M 将默认值写入参数记录。

我尝试了几个选项。

  1. 直接访问-
(endpoint as text, optional params as record) =>
let
    params[limit] = if (params[limit] = null) then "1000",

结果是语法错误-'Token equal expected'

  1. 将limit的新值合并为带有“&”的记录
(endpoint as text, optional params as record) =>
let
    params = params & if params[limit] = null then [limit = "1000"] else [],

结果语法错误-'Token Literal expected'

我显然遗漏了一些关于 let 语句的语法规则的内容,我知道我需要一个 variable = value 赋值,而且看起来好像在 LHS 上放置了除普通变量名之外的任何东西来将元素写入不允许使用结构化值,但我不确定如何实现这一点?

【问题讨论】:

    标签: excel powerquery m let


    【解决方案1】:

    不确定您到底想要什么,但要创建一个记录列表,其中一些记录具有默认参数而其他记录没有,您可以尝试以下操作:

    (newParams as record) => 
    let 
        default = [limit=1000, param2=2, param3=3],
        final = Record.Combine({default, newParams})   
    in 
        final
    

    关于Record.Combine,美妙之处在于,如果两者都存在,右手记录将覆盖左手记录;如果什么都没有,它只会添加它。

    比如:

    let
        Source = [limit=400, param3="x", param7=246],
        conv = fnParams(Source)
    in
        conv
    

    =>

    根据所需的输出字符串格式,您可以使用List.Accumulate 构建它。例如:

    let
        Source = [limit=400, param3="x", param7=246],
        conv = fnParams(Source),
        list = List.Accumulate(List.Zip({Record.FieldNames(conv), Record.ToList(conv)}), "",
            (state,current) =>state & "&" & current{0} & "=" & Text.From(current{1}) )
    in
        list
    

    => &amp;limit=400&amp;param2=2&amp;param3=x&amp;param7=246

    【讨论】:

    • 我对 M 的功能性质究竟如何影响参数传递(何时/如果可以写入或替换参数)仍然有点模糊,但您的解决方案非常优雅@ron-rosenfeld,谢谢你。我需要记住为 M 中的语句语法寻找函数样式的等效项(例如 Record.Combine() )。您回复的后半部分正是我接下来要尝试做的(转换参数值到 URL 参数字符串)所以感谢您回答我还没有问过的问题!
    • @Incans 我还在学习。 MS 文档似乎只记录了非常基本的内容。在线博客在尝试找出某些功能的细微之处时非常有用。
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2013-03-12
    相关资源
    最近更新 更多