如果你使用过其他编程工具(例如 Visual Basic 或 JavaScript),你可能会问:变量在哪里? PowerApps 稍有不同,需要不同的方法。 与其去获取变量,不妨问自己:我会在 Excel 中做什么?

在其他工具中,你可能会显式执行某个计算,然后将结果存储在变量中。 但是,PowerApps 和 Excel 都会在输入数据更改时自动重新计算公式,因此你通常不需要创建和更新变量。 尽可能使用这种方法,你就可以更轻松地创建、了解和维护应用。

某些情况下,需要在 PowerApps 中使用变量,通过添加行为公式扩展 Excel 的模型。 这些公式在特定情况下(例如,用户选择某个按钮)运行。 在行为公式中,设置一个可在其他公式中使用的变量通常很有用。

一般情况下,应避免使用变量。 但有时候,只有使用变量才能获得所需的体验。

将 Excel 转换成 PowerApps

Excel

让我们回顾一下 Excel 的工作原理。 单元格可以包含值(例如数字或字符串),也可以包含公式(基于其他单元格的值)。 用户向单元格输入其他值以后,Excel 会自动根据新的值重新计算任何公式。 不需编程即可启用此行为。

Excel 没有变量。 包含公式的单元格的值随输入而更改,但无法记住公式的结果,也无法将结果存储在单元格或任何其他地方。 如果更改某个单元格的值,则整个电子表格都会更改,以前计算出来的值就会丢失。 Excel 用户可以复制和粘贴单元格,但那是在用户的手动控制之下完成的,不可能通过公式来完成。

PowerApp

在 PowerApps 中创建的应用的行为与 Excel 很类似。 可以将控件添加到屏幕的任意位置,并根据其在公式中的用途为其命名,不需更新单元格。

例如,可以添加一个“标签”控件,将它命名为“TextBox1”,同时还添加两个“文本输入”控件,分别命名为“TextInput1”和“TextInput2”,这样便可以在应用中复制 Excel 行为。 如果随后将 TextBox1Text 属性设置为 TextInput1 + TextInput2,则会始终自动显示 TextInput1TextInput2 中的数字之和。

请注意,上图选中的是 TextBox1 控件,在屏幕顶部的公式栏中显示了其 Text 公式。 在这里,我们可以找到公式 TextInput1 + TextInput2。 该公式在这些控件之间创建了一个依赖关系,就像在 Excel 工作簿中的单元格之间创建依赖关系一样。 让我们更改一下 TextInput1 的值:

上图表明 TextBox1 的公式已自动重新计算,显示新值。

在 PowerApps 中,使用公式不仅可以确定控件的主值,还可以确定属性(例如格式设置)。 在下一示例中,标签的“Color”属性的公式会自动将负值显示为红色。 If 函数看起来应该与 Excel 中的很相似:
If( Value(TextBox1.Text) < 0, Red, Black )

现在,如果 TextBox1.Text 中的计算结果为负,则相应的数字将显示为红色:

很多情况下都可以使用公式:

  • 启用设备的 GPS 后,地图控件就可以使用公式通过 Location.LatitudeLocation.Longitude 来显示当前位置。 移动时,地图会自动跟踪你的位置。
  • 其他用户可能会更新数据源。 例如,团队中的其他人可能会更新 SharePoint 列表中的项。 刷新数据源时,相关公式会根据更新的数据自动重新计算。 就此示例来说,你可以进一步将库的 Items 属性设置为公式 Filter( SharePointList ),以便自动显示新筛选的记录集。

权益

使用公式生成应用具有很多优点:

  • 如果你知道 Excel,你就知道 PowerApps。 二者的模型和公式语言是相同的。
  • 如果你使用过其他编程工具,可以试想一下,完成这些示例需要多少代码。 在 Visual Basic 中,需要为每个文本输入控件上发生的更改事件编写事件处理程序。 在每个这样的处理程序中,用于执行计算的代码很冗长,并且可能会出现不同步的情况,或者需要你编写通用子例程。 而在 PowerApps 中,这一切只需一个单行公式即可完成。
  • 若要了解 TextBox1 的文本源自何处,只需查看 Text 属性中的公式即可。 其他方式不会影响该控件的文本。 在传统编程工具中,可以从程序的任何位置通过任何事件处理程序或子例程更改该标签的值。 这就难以跟踪变量的更改时间和位置。
  • 如果用户更改了滑块控件,然后又改变了主意,则可将滑块改回其原始值。 这样一来,就好像没有做过任何更改一样:应用所显示的控件值与以前显示的一样。 不需进行分支试验并询问假设性的问题,就像在 Excel 中一样。

如果可以使用公式达到某种效果,则通常会选择使用公式。 让 PowerApps 中的公式引擎为你服务。

了解何时使用变量

让我们将简单的加法器更改一下,使之操作起来就像一台老式的带汇总功能的加法机。 如果选择“加”按钮,则会将一个数字加到汇总中。 如果选择“清除”按钮,则会将汇总重置为零。

我们的加法机使用了某个 Excel 中不存在的东西:按钮。 在该应用中,不能仅使用公式来计算汇总,因为其值取决于用户采取的一系列操作。 必须手动记录和更新汇总。 大多数编程工具将该信息存储在“变量”中。

有时候,需要使用变量才能让应用的表现符合预期。 但该方法需注意以下事项:

  • 必须手动更新汇总。 自动重新计算在此方面不会为你代劳。
  • 不能再根据其他控件的值计算汇总。 汇总结果取决于用户选择“加”按钮的次数,以及每次操作时文本输入控件中的具体值。 在执行加法计算时,到底是用户输入了 77 并选择“加”两次,还是用户指定了 24 和 130? 你只知道总和为 154,但无法分辨上述两种过程。
  • 可以通过不同的方式来改变总和。 在此示例中,“加”按钮和“清除”按钮都可以更新总和。 如果应用表现异常,则到底是哪个按钮引发的问题?

创建上下文变量

创建加法机需要一个变量来存储汇总。 PowerApps 中的最简单变量为“上下文变量”。

上下文变量的工作原理:

  • 通过 UpdateContext 函数创建和设置上下文变量。 如果在对某个上下文变量进行首次更新时,该变量并不存在,则会使用默认值“空”创建该变量。
  • 使用记录创建和更新上下文变量。 在其他编程工具中,通常使用“=”来赋值,例如“x = 1”。 上下文变量则使用 { x: 1 } 这样的形式。 使用上下文变量时,可直接使用其名称。
  • 也可使用 Navigate 函数,在显示屏幕时设置上下文变量。 如果将屏幕视为一种过程或子例程,则此操作类似于其他编程工具中的参数传递。
  • 上下文变量的作用范围仅限于单个屏幕的上下文(Navigate 除外),这也是其得名的原因。 不能超出相应的上下文使用或设置上下文变量。
  • 上下文变量可以存储包括字符串、数字、记录和在内的任何值。
  • 当用户关闭某个应用时,其所有上下文变量也会丢失。

让我们使用一个上下文变量重新生成加法机:

  1. 添加一个文本输入控件,将其命名为 TextInput1,同时添加两个按钮,分别命名为 Button1Button2

  2. Button1Text 属性设置为“加”,将 Button2 的“Text”属性设置为“清除”。

  3. 若要在用户选择“加”按钮时更新汇总,请将 OnSelect 属性设置为以下公式:
    UpdateContext( { RunningTotal: RunningTotal + Text1 } )

    用户首次选择“加”按钮并调用 UpdateContext 后,将创建默认值为“空”的 RunningTotal。 进行加法计算时,“空”值将被视为零。

  4. 若要在用户选择“清除”按钮时将汇总设置为 0,请将 OnSelect 属性设置为以下公式:
    UpdateContext( { RunningTotal: 0 } )

    同样,UpdateContext 与公式 UpdateContext( { RunningTotal: 0 } ) 一起使用。

  5. 添加一个“标签”控件,然后将“Text”属性设置为“RunningTotal”。

    此公式将自动重新计算,为用户显示的 RunningTotal 值随用户选择的按钮而变化。

  6. 预览该应用,我们创建的加法机完全符合上述说明。

创建集合

若要从任意屏幕引用某个变量(不只是从创建该变量的屏幕引用),请使用集合来保存全局变量。

集合工作原理:

  • 通过 ClearCollect 函数创建和设置集合。 可以改用 Collect 函数,但该函数实际上需要另一个变量,而不能替换旧的变量。
  • 集合是数据源,因此也是表。 若要访问集合中的单个值,请使用 First 函数,并从生成的记录中提取一个字段。 如果使用了单个值和 ClearCollect,则该字段为“Value”字段,如以下示例所示:
    First( VariableName ).Value
  • 任何公式都可以从应用中的任意屏幕访问集合。
  • 当用户关闭应用时,将清空其所有集合。

让我们使用集合重新创建加法机:

  1. 添加一个文本输入控件,将其命名为 TextInput1,同时添加两个按钮,分别命名为 Button1Button2

  2. Button1Text 属性设置为“加”,将 Button2 的“Text”属性设置为“清除”。

  3. 若要在用户选择“加”按钮时更新汇总,请将 OnSelect 属性设置为以下公式:
    ClearCollect( RunningTotal, First( RunningTotal ).Value + TextInput1 )

    使用 ClearCollect 和单个值即可在集合中创建包含单个“Value”字段的记录。 用户首次选择“加”按钮并调用 ClearCollect 后,RunningTotal 将为。 进行加法计算时,First 将返回“空”,后者将被视为零。

  4. 若要在用户选择“清除”按钮时将汇总设置为 0,请将 OnSelect 属性设置为以下公式:
    ClearCollect( RunningTotal, 0 )

    同样,ClearCollect 与公式 ClearCollect( RunningTotal, 0 ) 一起使用。

  5. 若要显示汇总,请添加一个标签,然后将“Text”属性设置为以下公式:
    First(RunningTotal).Value

    此公式提取 RunningTotal 集合的第一个记录的“Value”字段。 标签会自动显示“RunningTotal”值,它会随用户选择的按钮而变化。

  6. 若要运行加法机,请按 F5 打开“预览”,在文本输入控件中输入数字,然后选择相应的按钮。

  7. 若要返回到默认工作区,请按 Esc。

  8. 若要查看集合中的值,请在“文件”菜单上选择“集合”。