节
节
注意
该章节普通用户不需要关注,仅对开发者有用。
section-document是由多个命名表达式组成的M程序。
目前无法直接操作节(至少在Power BI和Excel中无法操作),只能引用部分内容。
section-document:
section
section:
literal-attributes_opt section
section-name ;
section-membersopt
section-name:
identifier
section-members:
section-member section-members_opt
section-member:
literal-attributesopt shared
opt section-member-name =
expression ;
section-member-name:
identifier
在M中,节(section)是一个组织概念,可以在文档中进行命名和分组相关表达式。每个节都有一个节名(section-name),用于标识该节并限定在该节中声明的节成员(section-members)的名称。
提示
一个节文档是一段文本(或说是一个文本文件),一个节文档可以定义多个节。
在Power BI和Excel文件中嵌入了M文档。Excel中所有编写的M代码包含在一个名为“Section1”的节中,每个查询都被添加了shared
关键字。因为都在同一个节中,因此查询可以引用其它查询。
节成员由成员名(section-member-name)和表达式(expression)。节成员表达式可以直接按成员名称引用同一节中的其它成员。
section Section1; // 定义节名
// 定义节成员
A = 1;
B = 2;
C = A + B;
节表达式可以通过来引用位于节中的其它节成员,该表达式使用节名称来限定节成员名称。
section-access-expression:
identifier !
identifier
下面演示跨节引用:
section Section1;
A = "Hello"; //"Hello"
B = 1 + Section2!A; //3
section Section2;
A = 2; //2
B = Section1!A & " world!"; /"Hello, world"
可以选择将节成员声明为shared
,这样在引用其它节中的节成员时就不在需要使用节访问表达式(section-access-expression)。只要引用节中没有同名的节成员并且其它节中都没有名称一样的共享成员(使用shared
修饰的节成员),就可以使用非限定成员名称来引用外部节中的共享成员。
访问节成员时类似环境中的规则,如果其它节中存在共享节成员A,当前节中存在节成员A,那么会优先访问当前节中的节成员A。
section Section1;
shared A = 1; // 1
section Section2;
B = A + 2; // 3 (引用Section1中的A)
section Section3;
A = "Hello"; // "Hello"
B = A + " world"; // "Hello world" (引用本地的A)
C = Section1!A + 2; // 3
如果在多个节中定义共享成员,可以生成有效的全局环境,但是访问共享成员时会引发错误。
section Section1;
shared A = 1;
section Section2;
shared A = "Hello";
section Section3;
B = A; //Error: shared member A has multiple definitions
计算一组_section-document_时:
- 每个_section-name_必须在全局环境中唯一。
- 在一个节中,每个节成员必须具有唯一的节成员名。
- 具有多个定义的共享节成员(具有相同名称)在访问时会引发错误。
- 在访问节成员之前,不会计算节成员的表达式组件。
- 在计算节成员表达式组件时引发的错误在向外传播之前与该节成员相关联,然后每次访问该节成员时再次引发错误。
文档链接
一组M节文档可以链接到一个不透明的记录值,每个节文档的共享成员在记录中都有一个字段。
生成的记录值对于执行链接过程的全局环境完全封闭。因此,此类记录是用于从其它(链接的)M文档集组合M文档的合适组件。没有命名冲突的机会。
标准库函数Embedded.Value
可用于检索与重复使用的M组件相对应的“嵌入式”记录值。
文档自检
M通过#sections
和#shared
关键字提供对全局环境的编程访问。
sections
内部变量#sections
将全局环境中的所有节作为记录返回。此记录按节名称设置键,每个键都是按节成员名称进行检索的相应节的记录表示形式。
下面是两个节组成的文档,以及通过在该文档上下文中计算#sections
内在变量而生成的记录。
section Section1;
A = 1;
B = 2;
section Section2;
C = "Hello";
D = "world";
#sections
//[
// Section1 = [ A = 1, B = 2],
// Section2 = [ C = "Hello", D = "world" ]
//]
计算#sections
时:
- 内部变量
#sections
保留文档内所有节成员表达式的计算状态。 - 内部变量
#sections
不强制计算任何未计算的节成员。
shared
内部变量#shared
返回一个记录,其中包含当前范围内所有共享成员的名称和值。
section Section1;
shared A = 1;
B = 2;
Section Section2;
C = "Hello";
shared D = "world";
//[
// A = 1,
// D = "world"
//]
计算#shared
时:
- 内部变量
#shared
保留文档内所有节成员表达式的计算状态。 - 内部变量
#shared
不强制计算任何未计算的节成员。