在脚本中使用全局脚本编写选项,以增强故事
学习目标
使用全局脚本选项增强故事。
全局脚本变量和 URL 参数





全局脚本变量
在之前的课程中,我们使用本地脚本变量。它们是在单个脚本块中使用 var 函数定义的。该值只能在该特定块内访问,无法从外部访问。
全局脚本变量定义为"故事级别的自有固定对象"。这意味着可以从故事中的所有脚本块访问它们。
在下面的示例中,你可以看到 SAP Analytics Cloud 故事*"大纲*"选项卡和"脚本变量"面板。您可以:
在故事的" 大纲 "选项卡中创建新脚本变量
命名脚本变量
选择脚本变量的数据类型
使脚本变量可用作 URL 参数。对于 数组 类型变量和非基本类型变量( string 、 boolean 、 integer 和 number 以外的类型),URL 参数函数不适用,默认情况下会禁用此选项。

使用全局脚本变量,可以将 URL 中的参数传递到故事中。例如,您可以:
传递一个值,该值用作维的筛选器
传递用于定义特定布局的值。
如果要将全局脚本变量作为 URL 参数传递,则必须使用以下格式在 URL 中以 p_ 作为变量名称的前缀:<yourAppURL>&p_<VariableName>=<VariableValue>。
例如,<yourAppURL>&p_viewMode=condensed。此场景用于练习,因此您将在本课的后面看到创建该场景的步骤。
使用作为"URL"参数公开的脚本变量时,这些变量在故事的初始加载时设置。
使用"启用动态 URL"选项,还可以在故事使用期间更新 URL 值。例如,当用户使用 URL 参数 p_Entity=Germany 打开故事并在查看模式下将过滤器更改为法国。然后,URL 参数更新为 p_Entity=France,而无需完全重新启动故事。然后,用户还可以将此 URL 加入书签,并与其他人共享,确定将应用相同的过滤器。
注意
性能:
在可能的情况下,使用本地脚本变量而不是全局脚本变量。
属性绑定
在之前的课程中,你查看了使用直接输入手动定义微件的项目,并使用脚本编写动态定义微件的项目。在本课中,我们将了解如何使用属性绑定****动态定义微件的项目。
属性绑定功能使故事设计人员可以选择将值绑定到以下对象之一:
脚本变量
模型变量
磁贴过滤器和变量
微件值绑定是为属性创建动态值的简单方法,例如"列表框"微件的项目。
在以下示例中,可以看到一个列表框,其中显示表的已定义过滤器值。所选条目将写回到全局脚本变量。

简单微件的值可以绑定到以下值之一:
Primitive-type 脚本变量
应用程序属性
磁贴过滤器和变量
模型变量
注意
支持的类型因微件而异。
支持的绑定类型(按小部件)
值绑定可用于各种不同的微件。以下列表提供了微件和支持的绑定类型的概览:
列表框 、 下拉列表 、 复选框 组和单选按钮组
可绑定值: 标识 、 显示文本
支持的绑定:脚本变量、微件筛选器和变量以及模型变量
输入字段 、 文本区域
可绑定值: IDText
支持的绑定:脚本变量、微件筛选器和变量、模型变量和故事属性(包括当前用户/时间/日期、上次修改日期、上次修改日期/时间、上次修改者、创建者)
滑块
可绑定值: 当前值
支持的绑定:脚本变量、微件筛选器和变量、模型变量
范围滑块
可绑定值: 起始 值和 结束值
支持的绑定:脚本变量、微件筛选器和变量、模型变量
图像
可绑定值: 图像 URL
支持的绑定:脚本变量
您还可以利用在运行时回写功能的选项。这样,你就可以自动将用户选择的值分配给全局脚本变量,全局脚本变量可能在其他脚本或微件中使用。
全局脚本对象和函数
全局脚本对象充当容器或库。它是故事中不可见的一部分。

可以使用以下语法调用脚本函数: <ScriptObjectName>.<ScriptFunctionName>();
作为故事设计人员,你可以使用 函数来封装某些可在其他脚本函数(如事件处理程序)中使用的脚本逻辑。这样可以防止代码重复,并使故事维护更容易。添加脚本对象后,可以在此对象上创建函数。每个脚本函数都具有:
可配置 名称 (必填)
返回类型 (可选)
参数 (可选)

可以在脚本中像访问其他微件一样使用其名称访问脚本对象。在脚本对象的函数中,你可以访问故事中的所有对象,例如微件、全局变量或弹出窗口。
使用输入参数和返回类型
在以下示例的左侧,可以看到脚本对象 Utils 和名为 deviceSize 的脚本函数。
它使用宽度和高度作为输入参数,并返回包含大小和方向的数组。
在右侧,您可以看到以下内容:
脚本函数中的脚本
脚本函数的用法
控制台中显示的结果

使用基于模式的函数
使用基于模式的函数,您可以通过仅提供输入和输出示例(而不是编写脚本代码)来创建基于字符串的函数。例如,你可以将电子邮件地址(如 john.doe@sap.com)转换为名称(如 John Doe)。

你可以从故事的*"大纲*"中,创建基于模式的函数作为"脚本对象"的子代。
添加基于模式的函数 选择"添加基于模式的函数",将其添加到故事中。完成此操作后,必须通过输入和输出训练示例创建模式。
属性 在名称字段中为函数添加名称。还可以向函数添加可选的"说明"。
创建模式 选择"创建模式"旁边的*"添加*
"图标。在*"训练示例*"下,定义输入和输出(例如*,Input:* max.mustermann@sap.com 将变为 Output: Max Mustermann)。
有时,由于潜在的不明确性,一个示例是不够的。在这种情况下,您可以通过为每个训练示例选择添加
图标来使用最多三个训练示例。创建/重置 选择"创建",以便机器学习算法开始查找与每个示例匹配的模式。 更改训练示例后,模式将回退到其默认值,仅返回输入。如果要撤销对新训练示例或已修改训练示例的更改,请选择重置。这会将基于模式的函数设置为最后一个工作模式。
验证模式 如果模式创建成功,则可以通过输入遵循训练示例模式的输入示例来验证模式。如果输入不符合上述模式的示例,则 函数将保留其缺省模式,仅输出输入。要验证模式,请选择验证模式旁的添加
图标。在输入字段和输出字段中输入测试示例,您应该会看到正确的输出。
cast() 函数

您已经了解到,通过为其分配值来定义本地脚本变量的数据类型。这适用于所有简单的数据类型,例如 boolean、string 或 integer。
在上面的示例中,您可以看到以黄色突出显示的简单过滤器。简单筛选器的脚本为:
var mySimpleFilter = "201901";
Table_1.getDataSource().setDimensionFilter("0CALMONTH", mySimpleFilter);
但是,如果您尝试分配应表示多个过滤器值格式的 JSON 格式,则该方法将不起作用。
var myComplexFilterfilter = {values:["201901", "201902"], exclude: true};
上述代码将显示错误消息,因为系统不知道如何解释 JSON {values:\["201901", "201902"\], exclude: true}。
借助 cast(type, arg) 函数,可以指定数据类型并传递参数。
var myComplexFilterfilter = cast(Type.MultipleFilterValue, {values:["201901", "201902"], exclude: true});
上述代码指示脚本引擎对给定 JSON MultipleFilterValue 使用数据类型 {values:\["201901", "201902"\], exclude: true}。
添加全局脚本变量作为 URL 参数
**业务场景:**团队中的某些报表查看者希望在打开故事时仅看到 KPI 磁贴,而其他查看者则希望在打开故事时看到完整故事。
由于将来不想维护故事的两个不同版本,因此你决定引入 URL 参数,以便能够启用压缩或完全启动行为。
添加并配置全局脚本变量,然后使用 onIntialization 操作将以下代码添加到故事中:
if (viewMode === "condensed") {
TS_Content.setVisible(false);
} else {
TS_Content.setVisible(true);
}
为每个组提供不同的 URL:
您将 &p_viewMode=conversed 添加到报表查看者的 URL,这些查看者只希望在打开时查看故事中的 KPI 磁贴。
将 &p_viewMode=full 添加到要在打开时查看详细故事的报表查看者的 URL。
此简短视频将引导你了解所需的最终故事和脚本。
视频:本节含 SAP 官方视频(视频 ID
1_pjl29bdn),需在 learning.sap.com 在线观看。
模拟步骤
以下练习模拟 SAP Analytics Cloud 中的高级模式,并引导您添加创建演示视频中显示的最终故事所需的脚本。
**任务流:**在本练习中,您将:
将全局脚本变量 viewMode 添加到故事
将脚本添加到 onIntialization 操作
测试故事的 URL 参数
练习:开始练习(SAP 官方交互式练习)
将变量值传递到其他页面
**业务场景:**以前,你通过脚本编写使用按钮筛选表来增强故事。你团队会请求附加功能,以便能够在单独的故事页面上查看一些更详细的数据。预期是,使用按钮应用于第一页的过滤器也应用于详细信息页面。
你可以向故事中添加全局脚本变量,然后为按钮的 onClick 事件分别添加 year = "2018"; 、 year = "2019"; 和 year = "all"; 。
创建新页面后,将以下脚本添加到 onActive 事件:
if (year === "all") {
TBL_Details.getDataSource().removeDimensionFilter("0CALYEAR");
} else {
TBL_Details.getDataSource().setDimensionFilter("0CALYEAR", year);
}
此简短视频将引导你了解所需的最终故事和脚本。
视频:本节含 SAP 官方视频(视频 ID
1_j0cq57gi),需在 learning.sap.com 在线观看。
模拟步骤
以下练习模拟 SAP Analytics Cloud 中的高级模式,并引导您添加创建演示视频中显示的最终故事所需的脚本。
**任务流:**在本练习中,您将:
将全局脚本变量 year 添加到故事中
向 onActive 事件添加脚本
测试故事
练习:开始练习(SAP 官方交互式练习)