首页 > 解决方案 > Powerquery,在示例中需要访问行时,可以创建参数化函数吗?

问题描述

是否可以在 PowerQuery 中创建一个这样开头的函数,

(Table as table, transformOperations as list) as table =>

这将允许您执行此类操作

Table.FromRecords(
    Table.TransformRows(
        Table1,
        (r) =>
            Record.TransformFields(
                r,
                {
                    { "A", each if r[Column B] = "1" then "Z" else _ },
                    { "B", each if r[Column C] = "1" then "Z" else _ }
                }
            )
    )
)

但是......将能够接受字段转换操作的最终列表,并且仍然能够读取该行中的其他字段?基本上我试图消除对r变量的需求。

标签: powerquery

解决方案


重要的是要记住这each ... _“语法糖”,只是另一种写作方式(_) => ... _。即,变量名是_.

所以我们可以重写你M

Table.FromRecords(
    Table.TransformRows(
        Table1,
        (r) =>
            Record.TransformFields(
                r,
                {
                    { "A", (_) => if r[Column B] = "1" then "Z" else _ },
                    { "B", (_) => if r[Column C] = "1" then "Z" else _ }
                }
            )
    )
)

如果您没有r作为单独的变量名,那么如果您尝试访问[Column B],那么它认为您正在引用,因为它是一个特定字段而不是作为字段之一的记录_[Column B],所以它不存在。_

这里的困难在于您拥有的转换列表取决于来自其他字段的值,因此它不是独立的。

你可以做的是分解这样的功能:

let
    ApplyTransform = (Table as table, rowTransform as function) as table =>
    Table.FromRecords(Table.TransformRows(Table, rowTransform))
in
    ApplyTransform
let
    rowTransform = (Row as record) as record =>
    Record.TransformFields(
        Row,
        {
            { "A", each if Row[Column B] = "1" then "Z" else _ },
            { "B", each if Row[Column C] = "1" then "Z" else _ }
        }
    )
in
    rowTransform

然后你可以像ApplyTransform(Table1, rowTransform).


推荐阅读