Record.FieldValues()

Record.FieldValues()可以抽象地概括为function(record as record) as list,意思为这个函数仅有一个参数,这个参数的种类只能为记录(record),由这个函数产生的结果为串列(list)。简单来说,Record.FieldValues()会移除作为自变量的某个记录的字段名称,使其退化为仅剩字段值的串列,该串列中的组成元素的相对位置与其在记录中的相对位置保持一致。比如,= Record.FieldValues( [ Field1 = 1, Field2 = 2 ] )产生的结果为{ 1, 2 }。Record.FieldValues()虽然非常简单,但是该函数与复合的记录( [ A=[],...,Z=[] ] )进行搭配,可以达到模拟RC数值参考的效果。

情景介绍:假设需要构造一个只有三行两列的参数表,该表的最小下界为0,最小上界由MinCeiling参数决定(图中的参数值为10,000)。第二行的下界等于第一行的上界,这一行的上界等于该行的下界加上10,000。第三行的下界等于第二行的上界,最后一行的上界为无限大。

这个表格如果使用Excel的工作表制作,过程会十分轻松,因为每一个单元格都有对应的“A1 Style”地址。如果需要使用M语言制造,就需要使用以下代码模拟"R1C1 Style"地址:

let
    ExTable=
        Table.FromRecords(
            Record.FieldValues(
                [
                    R1 = [ C1 = 0, C2 = MinCeiling ],
                    R2 = [ C1 = R1[C2], C2 = C1 + 10000 ],
                    R3 = [ C1 = R2[C2], C2=Number.PositiveInfinity ]
                ]
            ),
            type table [ C1 = Int64.Type, C2 = Int64.Type ]
        ),
    RenameCols=
        Table.RenameColumns(
            ExTable,
            {
                { "C1", "Floor" },
                { "C2", "Ceiling" }
            }
        )
in
    RenameCols

以上代码使用了Table.FromRecords()和Record.FieldValues()进行模拟R1C1风格的数值参考。在M语言的体系中,记录中的字段的值是可以参考其他字段的值,所以外层记录的其中一个字段R2 = [ C1 = R1[C2], C2 = C1 + 10000 ]意思为C1的值等于外层记录中的R1字段的C2字段的值(R1字段的值为外层记录的内嵌记录),而C2的值等于在同一记录中的C1字段的值加上10,000。外层记录的其他记录的意思可以按照类似思路推导。外层的记录通过Record.FieldsValues()的转换后就退化为串列套记录的结构:{[]..[]}。这种结构符合Table.FromRecords()对第一个参数的结构要求,Record.FieldValues()的结果传入该函数后就是想要的结果。

附件

4 Replies to “Record.FieldValues()”

  1. 使用 type table [ ,] 是可以在转换过程中直接调整数据类型吧,试了下还可以将文本型的数据定义为数值且不会报错,但如果是用Table.TransformColumnTypes将文本转换为数值就会报错,真是神奇呢

    1. 目前发现运行时间有区别,=Record.FieldValues=Record.ToList的结果为false也说明不是同一函数

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注