在 ACLScript 中使用变量

在 Analytics 中编写脚本时,通常需要考虑更改或变化的值。例如:

  • 脚本配置您需要一种简单的方法来自定义脚本逻辑中的值(如表名称或字段名称),而无需更新值的每个实例

  • 用户输入当用户运行脚本时,他们想要自定义输入值,如日期范围或阈值金额

  • 临时存储脚本中的逻辑需要临时存储一个随着脚本运行而不断更新的值,如计数器或运行合计

出于上述目的及其他目的,您使用变量

什么是变量?

您可以将变量视为一个命名容器,它保存或存储可以更改的值。值可以更改,但变量的名称不会更改。作为脚本编写者,您可以在整个脚本逻辑中使用固定的变量名。当脚本运行时,它不会处理变量名。相反,它访问并处理变量当前包含的任何值。

在下面的示例中,v 开始日期v 结束日期 是变量名称,日期是变量中包含的值。

变量的好处

在整个脚本中,您可以使用变量而不是字面值。通过将实际的表名称、字段名称、文本值、数字和日期替换为指代这些项的变量,可以极大地提高脚本的灵活性。您可以编写一个可以在无限多种情况下使用的脚本,而不是编写只适用于一种非常特定的情况的脚本。

如何以及在何处使用变量?

就像它们指代的字面项一样,变量可被创建、重命名、更新、删除、用于计算和各种表达式中、导出和提取。换句话说,它们可以在字面项有效的任何位置使用。

如何创建变量?

您可以使用 Analytics 命令 — ASSIGN 命令或其他几个命令之一创建变量。通常,您可以在脚本中包含该命令,但也可以通过在 Analytics 命令行中输入 ASSIGN 命令来手动创建变量。

示例

您希望脚本具有一个可自定义的日期范围,因此您创建了一个开始日期变量和一个结束日期变量。

在下面的示例中,名为 v_start_date 的变量当前包含日期值 `20210101`,名为 v_end_date 的变量当前包含日期值 `20210331`

您可以使用这两个变量来存储用户指定的任何开始日期和结束日期。在该脚本逻辑中,您在任何需要日期的地方指定了 v_start_datev_end_date,但当该脚本运行时,它使用用户指定的实际日期。

ASSIGN v_start_date = `20210101`
ASSIGN v_end_date = `20210331`

提示

通过将 ASSIGN 命令及其参数复制到 Analytics 命令行并按 Enter 键,可以创建上述变量之一。在导航器中,打开变量选项卡并查看结果。

如果命令行文本框不可见,请选择窗口 > 命令行

显示 Analytics 项目中的变量

在使用变量时,能够查看 Analytics 项目中存在的变量及其当前值是极为有用的。有两种方法可用于显示变量及其值:

  • 变量选项卡

  • DISPLAY VARIABLES 命令

“变量”选项卡

使用导航器中的变量选项卡可实时跟踪创建变量和向这些变量分配值的过程。该只读选项卡显示 Analytics 项目中所有变量的名称、数据类型和当前值。名称按字母顺序排列。

如果您逐行遍历一个脚本,则该脚本中定义的任何变量或系统生成的任何变量在创建时都会出现在变量选项卡中。如果该变量已经存在,则其值会基于脚本逻辑动态更新。(在脚本编辑器中,使用单步执行 选项可单步执行脚本。)

能够准确地即时观察脚本变量发生的变化是一个重要的诊断工具。此功能使您可以通过单独检查脚本语法来查明可能难以定位的脚本错误。

如果您运行一个脚本,则在到达断点或脚本完成时,变量选项卡中会显示所有与变量相关联的变化。

DISPLAY VARIABLES 命令

DISPLAY VARIABLES 命令显示 Analytics 项目中所有变量的名称、数据类型和当前值。变量名称被基于变量的创建时间或最新更新时间,按时间倒序列出。

DISPLAY 变量名称返回与单个变量相关联的信息。

您可以以两种不同的方式使用 DISPLAY VARIABLES 命令:

  • 项目变量的当前状态在命令行中键入 DISPLAY VARIABLES,然后按 Enter 键。

    该项目中的所有变量及其当前值将将按时间倒序显示在屏幕上。

  • 脚本中不同位置的项目变量状态DISPLAY VARIABLES 添加到脚本中您想要捕获项目变量状态的一个或多个位置。您也可以为此目的而使用断点,不同之处在于断点会暂停脚本执行,而 DISPLAY VARIABLES 命令则不会。

    脚本完成后,在命令日志中双击相应的 DISPLAY VARIABLES 条目。位于脚本中指定位置的项目变量的状态将按时间倒序显示在屏幕上。

说明

您不能在 GROUP 命令内部使用 DISPLAY VARIABLES 命令。

关于 ACLScript 变量需要了解的八件事

如果您熟悉其他编程或脚本语言,那么您已经熟悉变量及其多种用途。ACLScript 变量的主要特征如下所述。

如果您不熟悉脚本和变量,那么一旦您开始使用变量,下面的信息将更有意义。

1. 赋值时会自动创建变量

2. 可采用不同的方法创建变量

3. 变量的数据类型被自动指定

4. 变量名是灵活的,但有一些限制

5. 变量具有全局作用域

6. 变量会在 Analytics 项目被关闭之前一直存在

7. 可以显式删除变量

8. 系统变量由某些 Analytics 命令自动创建

1. 赋值时会自动创建变量

当您向命名变量分配初始值时,将自动创建(声明)一个变量。向变量分配初始值也称为初始化变量。

在下面的示例中,当您使用 ASSIGN 命令将值"Ap_Trans" 分配给变量时,会自动创建 v_input_table 变量。换句话说,创建变量并向该变量分配值(声明和初始化)只需一步。

ASSIGN v_input_table = "Ap_Trans"

何时何地创建变量?

只要在首次使用变量之前创建变量,就可以在脚本中的任何位置创建变量。

最佳做法是在脚本开头创建所有用户输入变量和脚本配置变量。如果采用这种方法,用户可以在脚本启动时输入所有必需的输入值,然后让脚本独自运行。您还可以确信,所有必需的脚本配置变量都位于脚本开头的单个有条理的位置。

不需要用户输入或高级配置的变量则可以在脚本中需要它们的位置创建。

如有必要,可以为字符或日期时间变量指定一个空值,以便该变量存在但初始时为空。

ASSIGN v_input_table = ""
ASSIGN v_all_field_list = BLANKS(20000)
ASSIGN v_start_date = `19000101`

2. 可采用不同的方法创建变量

创建变量的方法取决于您打算如何使用该变量。

用法 创建方法

脚本配置

临时存储

脚本运行过程中的其他用途

 

ASSIGN 命令

请在脚本中的单独一行上使用 ASSIGN 命令 来声明和初始化变量。被分配的值的数据类型决定了该变量的数据类型。

说明

显式指定 ASSIGN 关键字是一种最佳做法,因为这使脚本更易于阅读和理解。但是,您可以省略 ASSIGN 关键字并简单地指定:

变量名称 = 变量值

用户输入

ACCEPT 命令

使用 ACCEPT 命令 可创建一个以交互方式提示用户提供一个或更多个脚本输入值的基本对话框。每个输入值(不管它代表什么)都被存储在一个命名字符变量中。

另请参见创建交互式脚本

DIALOG 命令

使用 DIALOG 命令 和关联的对话框生成器可创建一个以交互方式提示用户提供一个或更多个脚本输入值的更加高级的对话框。每个输入值都被存储在一个命名变量中。大多数输入选项使用字符变量。

除了 ACCEPT 命令提供的选项之外,DIALOG 命令还会提供附加选项,例如复选框、单选按钮,以及下拉列表。

另请参见创建交互式脚本

PARAM 标签、TABLE 标签、FIELD 标签

对于在机器人中运行的脚本中的用户输入,请创建分析标头并使用 PARAM 标记TABLE 标记FIELD 标记

PARAM 标签是一个要求您显式指定关联变量的数据类型的变量创建方法。

TABLE 标签和 FIELD 标签在字符变量中存储输入值。

凭据输入

PASSWORD 命令

使用 PASSWORD 命令 可创建一个对话框,以交互方式提示用户输入密码、令牌或其他敏感信息。PASSWORD 命令在受保护的内存位置为凭据值提供安全的数据输入和加密存储。

作为凭据安全处理的一部分,包含敏感信息的变量不会被显示,也不能直接维护。

另请参见创建交互式脚本

您还可以使用 SET PASSWORD 命令直接指定密码,而需用户输入。但是,密码在脚本中以纯文本显示。

PASSWORD 标签

对于在机器人中运行的脚本中的凭据输入,请创建分析标头并使用 PASSWORD 标记

3. 变量的数据类型被自动指定

当您使用 ASSIGN命令时,分配给变量的值的数据类型决定了该变量的数据类型。此过程被称为隐式类型化。在大多数情况下,您不会在 Analytics 中显式指定变量的数据类型。

提示

请密切注意您编写的脚本中变量的数据类型。脚本错误的一个常见原因是变量的数据类型与您使用该变量的方式不匹配。有关详细信息,请参见变量的数据类型的重要性

可以分配给变量的值的种类

您可以将字面值分配给变量,也可以将先字段分配给变量,然后使用当前选定记录中的字段值初始化该变量。您还可以将一个变量的当前值分配给另一个变量。

值的数据类型

在 Analytics 中,每个数据值都是下列数据类型(或类别)之一:

  • 字符

  • 数值

  • 日期时间

  • 逻辑

值的数据类型通过下列方式之一确定:

  • 字面值字面值的数据类型由围绕该值的限定符的存在与否以及构成该值的字母数字字符确定。

  • 字段字段中的值的数据类型由该字段的数据类型确定。

  • 变量“from”变量的数据类型及其包含的值已被设置,并且成为“to”变量的数据类型。通常,创建变量后不再更改变量的数据类型,尽管不会阻止您这样做。

示例:使用 ASSIGN 命令创建不同数据类型的变量

说明

当您使用 ACCEPT 命令创建变量或 DIALOG 命令中的大多数选项时,无论其包含的值的类型如何,该变量都具有字符数据类型。

变量和值的数据类型 示例

字符

字符值可能包括字母数字字符和特殊字符。

字面字符值必须用单引号或双引号围起来。

如果字符值包含引号,请使用此方法:

  • 如果它包含双引号,请用单引号将整个值围起来。
  • 如果它包含单引号,请用双引号将整个值围起来。

字符示例

将字符值 "Vendor_number" 分配给 v_input_table 变量。

ASSIGN v_input_table = "Vendor_number"

将当前选定记录中的 Vendor_number 字段的值分配给 v_identifier 变量。

ASSIGN v_identifier = Vendor_number

说明

了解将限定字段名和非限定字段名分配给变量之间的区别是很重要的。

分配 "Vendor_number" 时会分配构成字段名的实际字符串。

分配 Vendor_number 时会分配 Vendor_number 字段中包含的值之一。

数值

数值类型值可包括数字 0 到 9、小数分隔符和一个负号。

不得用任何限定符围绕字母数值类型值。

数值示例

将数值类型值 1000 分配给 v_min_amount 变量。

ASSIGN v_min_amount = 1000

将当前选定记录中的数值类型 Invoice_Amount 字段的值分配给 v_running_total 变量。

ASSIGN v_running_total = Invoice_Amount

日期时间

日期时间值可以是日期、时间或日期时间。该值必须使用 Analytics 支持的格式。

有关受支持的日期时间格式的详细信息,请参阅日期时间文本的格式

字面日期时间值必须用反引号围起来。

说明

Analytics 还支持使用字符数据类型的日期时间值。有关详细信息,请参阅关于日期时间值的一点题外话

日期时间示例

将日期值 `20210101` 分配给 v_start_date 变量。

ASSIGN v_start_date = `20210101`

将当前选定记录中的日期时间 Invoice_Date 字段的值分配给 v_date 变量。

ASSIGN v_date = Invoice_Date

逻辑

逻辑值可以是 TF

不得用任何限定符围绕字母数值类型值。

逻辑示例

将逻辑值 T 分配给 v_Q1 变量。

ASSIGN v_Q1 = T

将当前选定记录中的逻辑 Approved 字段的值分配给 v_approved 变量。

ASSIGN v_approved = Approved

4. 变量名是灵活的,但有一些限制

在大多数情况下,您可以用任何最适合您的目的的方式命名变量。

自愿约定

下列自愿约定使脚本更易于阅读和理解:

  • 赋予变量易于理解的描述性名称,这些名称与变量在脚本中执行的角色直接相关。稍微长一点的、清晰的描述性名称比不能明确表明变量用途的、较短的、晦涩的名称要好。

  • 采用一种通用的命名约定,例如在每个变量名前面加上 v_

强加限制

Analytics 对变量名称施加下列限制:

  • 最大长度 31 个字符

  • 有效字符字母数字字符和下划线字符 (_)。该名称不能包含任何特殊字符或空格,也不能以数字开头。

    说明

    在将要在变量替换中使用的变量的名称中,请勿使用非英语字符(如 é)。包含非英文字符的变量名称会导致变量代入出故障。

    此帮助主题的非英语版本(如法语版本)可能会显示带有重音字符的变量名。请确保在实际脚本中,在将在变量替换中使用的任何变量名中都不使用重音字符。

  • 唯一性变量名在 Analytics 项目中必须是唯一的,因为变量在整个项目中全局有效

变量名称不区分大小写。在 ACLScript 中,v_start_datev_Start_Date 是相同的变量。

5. 变量具有全局作用域

在 Analytics 脚本中创建的变量可供该脚本的所有后续部分使用。它也可供 Analytics 项目中的任何其他脚本使用。如果您想要在父脚本中定义的子脚本中使用变量,则此行为非常有用。

ACLScript 不支持变量的局部作用域。

6. 变量会在 Analytics 项目被关闭之前一直存在

变量将一直保留在计算机内存中,直到包含它的 Analytics 项目被关闭或者您显式删除它为止。

如果您希望变量在您关闭项目后仍然存在,并在您重新打开该项目时可用,则可以创建永久变量。在变量名前面加上一个下划线即可创建永久变量。例如:_v_start_date。该变量及其包含的值都将持续存在。消除永久变量的唯一方法是显式删除它。

说明

在机器人中运行的脚本不支持永久变量。

7. 可以显式删除变量

要显式删除一个或多个当前变量,可以使用变量选项卡中的删除按钮或 DELETE 命令。

使用“删除”按钮删除变量

要显式删除 Analytics 项目中的一个、多个或所有变量,请使用导航器变量选项卡顶部的删除按钮。

  1. 导航器中,打开变量选项卡。

  2. 执行以下操作之一:

    • 要删除所有变量,请单击删除

    • 要删除特定变量,请选择该变量然后单击删除

      使用 Ctrl+单击以选择多个非相邻变量。

  3. 在确认对话框中单击

    变量已删除。

使用 DELETE 命令删除变量

要显式删除 Analytics 项目中的一个或所有变量,请在命令行或脚本中使用 DELETE 命令。

要显式删除特定变量:

DELETE 变量名称 OK

要显式删除所有变量:

DELETE ALL OK

什么东西会被删除?

删除变量时,您只是从计算机的内存中删除命名容器及其包含的值。

删除变量不会影响脚本中与该变量相关的任何内容。您可以通过在命令行中手动运行 ASSIGN 命令或者通过运行包含变量赋值的脚本来在内存中恢复该变量。

删除一个变量和它的值也不会影响由该值指代的、存在于该变量外部的任何内容(如 Analytics 表)。

示例

下面的两个示例说明了变量和该变量指代的项如何成为不同的实体。删除其中一个不会影响另一个。

说明

这些示例使用变量替换将变量名替换为变量的内容。

在第一个示例中,删除变量 v_test_table 会删除变量值 "Running_totals",但不会删除实际的 Running_totals 表。

ASSIGN v_test_table = "Running_totals"

COMMENT 成功执行
OPEN %v_test_table%

COMMENT 删除变量
DELETE v_test_table OK

COMMENT 成功执行
OPEN Running_totals

在第二个示例中,删除实际的 Running_totals 表对 v_test_table 变量没有任何影响,尽管变量值现在指代一个不存在的表。

ASSIGN v_test_table = "Running_totals"

COMMENT 成功执行
OPEN %v_test_table%

COMMENT 删除该变量所指代的表
DELETE FORMAT %v_test_table% OK

COMMENT 发生错误“表‘Running_totals‘无效”而失败
OPEN %v_test_table%

8. 系统变量由某些 Analytics 命令自动创建

当您执行某些 Analytics 命令时,系统变量被自动创建。例如,COUNT 命令生成 COUNTn 系统变量,其中包含已清点的记录数。您可以在脚本的后续部分中使用这些变量及其包含的值。

例如,如果用户选择一个不包含任何记录的表,则此脚本将自动终止:

ACCEPT "选择输入表:" FIELDS "xf" TO v_input_table
OPEN %v_input_table%
COUNT
PAUSE "您选择的表不包含任何记录。该脚本将终止。"IF COUNT1 = 0
ESCAPE IF COUNT1 = 0
DO SCRIPT summarize_transactions

有关详细信息,请参见由 Analytics 命令创建的系统变量

变量的数据类型的重要性

当 Analytics 命令或函数引用某个变量时,该变量的数据类型必须与该命令或函数所接受的数据类型相匹配。如果数据类型不匹配,则会出现错误,并且命令或函数的处理将失败。

为了在这些情况下避免错误,您可以使用 Analytics 函数将存储的变量值转换为可用的数据类型。例如,以下表达式将一个存储在字符变量中的日期转换为日期时间数据类型:

CTOD(v_character_date)

以下表达式将一个存储在字符变量中的数字转换为数值数据类型:

VALUE(v_character_number, 2)

有关详细信息,请参阅转换函数

说明

如果日期和数字由用户输入提供,则它们被存储在字符变量中。有关详细信息,请参阅可采用不同的方法创建变量

关于日期时间值的一点题外话

在 Analytics 中,您可以处理使用日期时间数据类型或字符数据类型的日期时间值。通常,与日期时间值关联的数据类型基于您将数据导入 Analytics 时数据的性质。

对于包含日期值、时间值或日期时间值的变量而言,这意味着什么呢?简单说来,您需要知道正在处理的底层数据的数据类型。您的脚本语法需要基于所使用的数据类型而有所不同。

示例

下面的两个示例显示了基于用户提供的日期范围过滤日期字段的语法。

  • 在第一个示例中,日期字段使用日期时间数据类型。

  • 在第二个示例中,日期字段使用字符数据类型。

  • 在这两个示例中,v_start_datev_end_date 变量都使用字符数据类型,因为它们是使用 ACCEPT 命令或 DIALOG 命令创建的。

在第一个示例中,您必须使用 CTOD( ) 函数将日期范围值从字符数据类型转换到日期时间数据类型。(CTOD 代表“字符到日期”。)您必须执行此转换,以便日期范围值的数据类型与日期时间日期字段的数据类型相匹配。

SET FILTER TO BETWEEN(datetime_date_field, CTOD(v_start_date), CTOD(v_end_date))

在第二个示例中,您无须执行任何日期范围值转换,因为它们已经与字符日期字段的数据类型相匹配。如果您转换它们,它们将不再匹配,并且产生脚本错误。

SET FILTER TO BETWEEN(character_date_field, v_start_date, v_end_date)

变量替换

当您使用字符变量作为 Analytics 命令或函数的输入时,需要用该变量的值替换变量名。如果您不执行此替换,则该命令或函数将尝试对实际变量名而不是该变量所包含的值进行操作,从而产生错误。

变量替换是用字符变量中包含的值替换变量名的方法。要使用变量替换,需要将字符变量的名称用百分号 (%) 围起来。例如,%v_input_table% 会检索 v_input_table 中存储的实际表名称并且用它替换变量名。

由于脚本的用户输入通常被存储在字符变量中,因此变量替换的常见用途是将用户输入融入到脚本逻辑中。

说明

变量替换仅适用于包含表示字符数据的值的字符变量。如果对其他数据类型的变量或包含表示数字、日期时间或逻辑值的值的字符变量使用变量替换,则可能会出现不可靠的结果或错误。

示例

您希望脚本允许用户选择输入表。该脚本随后打开用户选择的表。您将变量替换与 OPEN 命令一起使用,以便该命令对正确的表名称进行操作。

当您指定 OPEN %v_input_table% 时,脚本实际看到的是以下内容:

OPEN Name_of_table_selected_by_user

ACCEPT "选择输入表:" FIELDS "xf" TO v_input_table
OPEN %v_input_table%

如果您在本例中不使用变量替换,则该脚本很可能会失败,因为 OPEN 命令尝试打开一个名为 v_input_table 的表,而具有该名称的表并不存在。

ACCEPT "选择输入表:" FIELDS "xf" TO v_input_table
OPEN v_input_table

使用变量替换可能很棘手

某些情况看起来可能需要进行变量替换,但实际上变量替换会导致错误。

请考虑前面给出的示例之一:

SET FILTER TO BETWEEN(character_date_field, v_start_date, v_end_date)

在本例中,您对作为字符数据同时存储在变量和字段中的日期值进行比较,因此对这些变量使用变量替换应该可行:

SET FILTER TO BETWEEN(character_date_field, %v_start_date%, %v_end_date%)

那么,为什么变量替换会在这种情况下导致错误呢?答案在于变量替换是绝对字面意义的。要解决此错误,请查看存储在这些变量中的精确值,手动将其替换到表达式中,然后查看得到的表达式。例如:

SET FILTER TO BETWEEN(character_date_field, 20000101, 20001231)

此表达式将使用字符数据类型的日期与替换后使用数值数据类型的数字进行比较,从而产生数据类型不匹配的问题。

因为您使用 BETWEEN( ) 指定了一个字符字段,该函数自动将 v_start_datev_end_date 中的值解释为字符值,以至于无需使用变量替换。

有关详细信息,请参见疑难解答

该规则的一个例外情况

在某些情况下,您或许能够对数值变量使用变量替换而不会出现问题。这样做的好处是可以在日志中捕获该数值变量的值,从而有助于排除故障。

下面的两个示例都将 COUNT1 数值变量的值分配给 v_counter 数值变量。但是,在第一个示例中,实际分配的值没有被捕获到日志中。在第二个示例中,实际值被捕获。

COMMENT log entry: ASSIGN v_counter = COUNT1
ASSIGN v_counter = COUNT1
COMMENT log entry: ASSIGN v_counter = 500
ASSIGN v_counter = %COUNT1%

手动维护变量

您可以使用可从 Analytics 主菜单中访问的变量对话框手动维护变量。您可以创建、重命名、复制或删除变量,也可以更新变量值。

您执行的任何维护仅影响内存中变量的当前实例。例如,如果您重命名一个变量,则仅会重命名内存中变量的实例。您不会在脚本中重命名该变量。

说明

在某些情况下,通过用户界面手动维护变量可能带来便利。与使用命令维护变量相比,手动维护不会提供任何附加功能。

大多数脚本编写者只在脚本编辑器和相关功能(如命令行和变量选项卡)中使用变量。

  1. 从 Analytics 主菜单中,选择编辑 > 变量

    变量对话框将打开并显示该项目中所有系统变量和用户定义变量的列表。系统变量是由命令自动创建的。

  2. 执行下列任一操作:
    创建一个新的变量
    1. 单击新建以打开表达式生成器

    2. 表达式文本框中,输入要分配给该变量的值或表达式。

      字面量值必须使用正确的格式和限定符(需要时)。有关详细信息,请参阅变量的数据类型被自动指定

    3. 可选。单击验证以检查该值或表达式是否有效。

    4. 另存为文本框中键入变量名称。

      有关详细信息,请参阅:

    5. 单击确定

      该变量被创建并出现在变量选项卡中。

    更新变量值
    1. 在该列表中选择一个变量,然后单击确定以打开表达式生成器

    2. 表达式文本框中,更新被分配给该变量的值或表达式。

      字面量值必须使用正确的格式和限定符(需要时)。有关详细信息,请参阅变量的数据类型被自动指定

    3. 可选。单击验证以检查该值或表达式是否有效。

    4. 单击确定

      分配给该变量的值将在计算机内存中更新。

    重命名变量
    1. 在该列表中选择一个变量,然后单击重命名

    2. 重命名文本框中,输入一个新的名称,然后单击确定

      该变量将在计算机内存中被重命名。

    3. 单击取消以关闭变量对话框。

    复制变量
    1. 在该列表中选择一个变量,然后单击复制

      该变量及其值将在计算机内存中被复制。一个数值后缀被添加到所复制变量的名称中。

    2. 执行以下操作之一:

      • 单击完成以关闭变量对话框。

      • 单击确定以更新被分配给该变量的值或表达式。

    删除变量
    1. 在该列表中选择一个变量。

    2. 可选。使用 Shift+单击Ctrl+单击选择多个要删除的变量。

    3. 单击删除

    4. 再次单击删除

      变量将被从计算机内存中删除。

    5. 单击完成以关闭量对话框。

变量用法示例

用于脚本配置的变量

您想要创建一个计算销售税金额并且能够处理定期变化的销售税税率的脚本。

需要的变量

为了允许配置不同的税率和日期范围,您使用ASSIGN 命令创建以下变量组。

变量名称 变量包含
v_tax_1 第一个税率
v_tax_2 第二个税率
v_tax_2_start 第二个税率的生效日期
v_tax_2_end 第二个税率的结束日期,或者如果该税率仍然有效,则为当前日期。

脚本

COMMENT 创建并初始化销售税率和日期范围的变量
COMMENT 如果需要,可以通过添加其他税率和日期范围变量来扩展脚本
ASSIGN v_tax_1 = 0.05
ASSIGN v_tax_2 = 0.06
ASSIGN v_tax_2_start = `20210701`
ASSIGN v_tax_2_end = `20211231`

COMMENT 创建一个对两个不同期间使用不同销售税率的条件计算字段
DEFINE FIELD sales_tax COMPUTED

Invoice_Amount * v_tax_2 IF BETWEEN(Invoice_Date, v_tax_2_start, v_tax_2_end)
Invoice_Amount * v_tax_1

“变量”选项卡中已创建并初始化的变量

运行该脚本后,已创建并初始化的变量将显示在变量选项卡中。

因为 ASSIGN 命令创建了这些变量,所分配的值的数据类型决定了这些变量的数据类型。在本例中,有两个数值变量和两个日期时间变量。

用于用户输入的变量

您想要创建一个脚本,以允许用户选择 Analytics 项目中的任何表,按数值范围和日期范围过滤该表中的记录,并将过滤后的记录输出到一个新表。

需要的变量

为了给该脚本捕获用户输入,您使用ACCEPT 命令创建以下变量组。

变量名称 变量包含
v_input_table 要用作输入的 Analytics 表的名称
v_output_table 包含已过滤记录的 Analytics 输出表的名称
v_numeric_field 输入表中要用于数值范围的数值字段
v_min_amount 数值范围的下限
v_max_amount 数值范围的上限
v_date_field 输入表中要用于日期范围的日期字段
v_start_date 该日期范围中的最早日期
v_end_date 该日期范围中的最晚日期

脚本编写注意事项

由于您使用 ACCEPT 命令以交互方式提示用户提供脚本输入值,因此每个输入值都被存储在一个命名字符变量中,即使该值表示数字或日期也是如此。考虑到这一事实,您需要在脚本中的某些位置使用 Analytics 函数将变量值转换为脚本逻辑所需的数据类型。

例如:

  • VALUE( ) 函数将 v_min_amount 中存储的数字从字符数据类型转换到数值数据类型:

    VALUE(v_min_amount, 2)
  • CTOD( ) 函数将 v_start_date 中存储的日期从字符数据类型转换到日期时间数据类型:

    CTOD(v_start_date)

需要进行这些数据类型转换的原因在于,这些变量中的值被与使用数值或日期时间数据类型的字段中的值进行比较。

您还需要使用变量替换来访问某些变量中存储的表和字段的实际名称。

例如:

OPEN %v_input_table%

脚本

COMMENT 创建一个对话框以提示用户提供输入表和输出表
ACCEPT "选择一个输入表:" FIELDS "xf" TO v_input_table, "指定一个输出表名称(不能有空格):" TO v_output_table

COMMENT 打开用户选择的输入表
OPEN %v_input_table%

COMMENT 创建一个对话框以提示用户提供一个数值字段和一个数值范围
ACCEPT "选择一个要作为过滤依据的字段:" FIELDS "N" TO v_numeric_field, "指定最小金额:" TO v_min_amount, "指定最大金额:" TO v_max_amount

COMMENT 创建一个对话框以提示用户提供一个日期字段和一个日期范围
ACCEPT "选择一个要作为过滤依据的日期字段:" FIELDS "D" TO v_date_field, "指定开始日期 (YYYYMMDD):" TO v_start_date, "指定结束日期 (YYYYMMDD):" TO v_end_date

COMMENT 基于用户的数值和日期范围过滤输入表
SET FILTER TO BETWEEN(%v_numeric_field%, VALUE(v_min_amount, 2), VALUE(v_max_amount, 2)) AND BETWEEN(%v_date_field%, CTOD(v_start_date), CTOD(v_end_date))

COMMENT 将过滤后的记录集提取到用户指定的输出表中
EXTRACT RECORD TO %v_output_table%

COMMENT 打开包含已过滤记录的输出表
OPEN %v_output_table%

“变量”选项卡中已创建并初始化的变量

运行该脚本后,已创建并初始化的变量将显示在变量选项卡中。

因为 ACCEPT 命令创建了这些变量,所以即使变量值表示数字或日期,这些变量也使用字符数据类型。

WRITE1 是系统变量。在当前情况下,该值表示输出表 (v_output_table) 中的记录数。有关详细信息,请参见由 Analytics 命令创建的系统变量

用于用户输入变量的默认值

您可以在用户输入字段中预先填充默认值,而不是向用户显示空白字段。默认值可以节省工作,还可以通过显示输入值的正确格式来减少错误。

要指定默认值,首先需要使用ASSIGN 命令以默认值初始化变量。然后可将ACCEPT 命令与同一变量名结合使用,以使用户可以选择性地覆盖默认值。

此示例与上面的用于用户输入的变量基本相同,只是添加了一个预备部分,以使用数值和日期范围的默认值初始化变量。

使用默认值初始化变量

要使用默认值初始化变量,请使用 ASSIGN 命令创建下列变量。

变量名称 变量包含
v_min_amount 数值范围的下限
v_max_amount 数值范围的上限
v_number_of_months 日期范围的长度(以月为单位)
v_end_date 日期范围中的最晚日期(计算值)
v_start_date 日期范围中的最早日期(计算值)

脚本编写注意事项

由于您将默认值预先填充到由 ACCEPT 命令创建的字段中,因此这些值必须使用字符数据类型。如果您尝试预填充其他数据类型的值,则不会显示这些值。

要顾虑这一事实,您可能需要使用 Analytics 函数将默认值转换到字符数据类型。(在脚本的稍后部分,您可以使用其他函数将变量值逆向转换到脚本逻辑所需的数据类型。)

例如:

  • STRING( ) 函数将数字 5000 转换为字符串,并随后将其存储在 v_min_amount 变量中:

    ASSIGN v_min_amount = STRING(5000, 4)
  • DATE( ) 函数将计算的结束日期转换为字符串,并随后将其存储在 v_end_date 变量中:

    ASSIGN v_end_date = ALLTRIM(DATE(EOMONTH(TODAY(),-1)))

日期范围计算

日期范围计算将默认范围设置为当前日期之前的 12 个完整月份。要更改该范围的长度,请更新分配给 v_number_of_months 变量的值。要了解用于计算日期范围的函数的更多信息,请参阅EOMONTH( ) 函数

脚本

COMMENT 设置 Analytics 会话持续时间的日期格式
SET DATE "YYYYMMDD"

COMMENT 指定数值范围的下限和上限的默认值
ASSIGN v_min_amount = STRING(5000, 4)
ASSIGN v_max_amount = STRING(100000, 6)

COMMENT 以月为单位指定计算日期范围的长度
ASSIGN v_number_of_months = 12

COMMENT 基于当前日期和由 v_number_of_months 指定的长度,计算默认日期范围的开始日期和结束日期
ASSIGN v_end_date = ALLTRIM(DATE(EOMONTH(TODAY(),-1)))
ASSIGN v_start_date = ALLTRIM(DATE(EOMONTH(CTOD(v_end_date), -v_number_of_months) + 1))

COMMENT 创建一个对话框以提示用户提供输入表和输出表
ACCEPT "选择一个输入表:" FIELDS "xf" TO v_input_table, "指定一个输出表名称(不能有空格):" TO v_output_table

COMMENT 打开用户选择的输入表
OPEN %v_input_table%

COMMENT 创建一个对话框以提示用户提供一个数值字段和一个数值范围
ACCEPT "选择一个要作为过滤依据的字段:" FIELDS "N" TO v_numeric_field, "指定最小金额:" TO v_min_amount, "指定最大金额:" TO v_max_amount

COMMENT 创建一个对话框以提示用户提供一个日期字段和一个日期范围
ACCEPT "选择一个要作为过滤依据的日期字段:" FIELDS "D" TO v_date_field, "指定开始日期 (YYYYMMDD):" TO v_start_date, "指定结束日期 (YYYYMMDD):" TO v_end_date

COMMENT 基于用户的数值和日期范围过滤输入表
SET FILTER TO BETWEEN(%v_numeric_field%, VALUE(v_min_amount, 2), VALUE(v_max_amount, 2)) AND BETWEEN(%v_date_field%, CTOD(v_start_date), CTOD(v_end_date))

COMMENT 将过滤后的记录集提取到用户指定的输出表中
EXTRACT RECORD TO %v_output_table%

COMMENT 打开包含已过滤记录的输出表
OPEN %v_output_table%

用于临时存储的变量

您需要创建一个脚本,以基于数值字段中的值计算运行合计。对于标识符字段中的每个唯一值,运行合计都从零 (0.00) 开始。

需要的变量

该脚本使用变量来达到三个不同目的:

  • 用户输入

  • 值的临时存储

  • 脚本配置

用户输入

为了给该脚本捕获用户输入,您使用ACCEPT 命令创建以下变量组。

变量名称 变量包含
v_input_table 要用作输入的 Analytics 表的名称
v_output_table 包含运行合计的 Analytics 输出表的名称
v_id_field 输入表中包含标识符值(如客户或供应商 ID)的字段
v_numeric_field 输入表中用于计算运行合计的数值字段
值的临时存储以及脚本配置

要允许在脚本逐个记录处理输入表时临时存储值,可以使用ASSIGN 命令创建并更新以下两个变量。如果需要,您可以为运行合计配置一个不同于零 (0.00) 的起点。

变量名称 变量包含
v_id_value 脚本当前正在处理的记录中的标识符值
v_running_total

脚本当前正在处理的记录中的运行合计值

脚本

COMMENT
允许在不显示确认对话框的情况下覆盖文件
END
SET SAFETY OFF

COMMENT
创建一个对话框以提示用户提供输入表和输出表
END
ACCEPT "选择一个输入表:" FIELDS "xf" TO v_input_table, "指定一个输出表名称(不能有空格):" TO v_output_table
OPEN %v_input_table%

COMMENT
创建一个对话框以提示用户提供一个字符标识符字段
END
ACCEPT "选择一个字符标识符字段:" FIELDS "C" TO v_id_field

COMMENT
创建一个对话框以提示用户提供一个数值字段
END
ACCEPT "选择一个数值字段:" FIELDS "N" TO v_numeric_field

COMMENT
按该字符标识符字段对该表进行索引(排序)
END
INDEX ON %v_id_field% TO "ID_field_sorted"
SET INDEX TO "ID_field_sorted"

COMMENT
将字符标识符字段中的当前值分配给 v_id_value 变量。
当 v_input_table 被首次打开时,当前值是该字段中的第一个值。随后,当前值取决于该脚本当前正在处理的记录。
END
ASSIGN v_id_value = %v_id_field%

COMMENT
将运行合计的起始值设置为零 (0.00)
END
ASSIGN v_running_total = 0.00

COMMENT
逐个记录地处理该表。对于每个唯一标识符,为该数值字段计算运行合计。
END
GROUP IF v_id_value = %v_id_field%
  ASSIGN v_running_total = v_running_total + %v_numeric_field%
  EXTRACT %v_id_field% %v_numeric_field% v_running_total AS "%v_numeric_field% running total" TO %v_output_table%
ELSE
  ASSIGN v_id_value = %v_id_field%
  ASSIGN v_running_total = 0.00
  ASSIGN v_running_total = v_running_total + %v_numeric_field%
  EXTRACT %v_id_field% %v_numeric_field% v_running_total AS "%v_numeric_field% running total" TO %v_output_table%
END

COMMENT 打开包含计算的运行合计的输出表
OPEN %v_output_table%

COMMENT 在覆盖文件前恢复显示确认对话框的默认行为
SET SAFETY ON

“变量”选项卡中已创建并初始化的变量

运行该脚本后,已创建并初始化的变量将显示在变量选项卡中。

ACCEPT命令创建的变量使用字符数据类型。ASSIGN 命令创建的变量(v_id_valuev_running_total)使用分配的值的数据类型。

分配给 v_id_valuev_running_total 的值会随着脚本的执行而不断更新。在脚本完成之前,变量选项卡将显示它们的最终值。

有关系统变量 (WRITEn) 及其编号方案的信息,请参阅递增式编号的系统变量

疑难解答

在脚本中使用变量时,有两种一般性错误最常见:

  • 意外结果脚本运行至完成,但包含变量的分析未产生预期结果。

  • 数据类型问题脚本失败,并显示与数据类型相关的错误,如“表达式类型不匹配”或“需要字符表达式”。

意外结果

对于第一种错误,请尝试以下故障排除方法:

  1. 导航器中,打开变量选项卡。

  2. 在 Analytics 命令行中,输入 DELETE ALL OK 以删除任何现有变量。

    如果命令行文本框不可见,请选择窗口 > 命令行

  3. 脚本编辑器中,使用单步执行 选项逐行单步执行脚本,并在变量选项卡中跟踪每个变量的创建和分配的值。

    您可能会发现分配给变量的值不是您想要的值,需要调整脚本逻辑。有关详细信息,请参见测试和调试脚本

说明

您无法单步执行多行命令,如 GROUP、LOOP 或 DEFINE FIELD . . .COMPUTED。要在这种情况下测试脚本逻辑,请暂时将脚本逻辑(舍弃周围的命令语法)复制到一个单独的脚本中。

数据类型问题

在开发使用变量的脚本的过程中,您很可能会遇到由不匹配的数据类型导致的错误。如果您在同一个表达式中同时使用转换函数和变量替换,则尤其可能出现错误。

遇到错误是正常的,而克服错误的途径是测试不同的方法并牢记下列原则:

  • 密切注意表达式中每个元素中的数据类型。表达式中的所有数据类型是否都符合 ACLScript 的要求?

  • 请记住,变量替换是绝对字面意义的。如果您怀疑变量替换导致错误,请观察存储在变量中的精确值,然后手动将该值替换到表达式中。仅执行这一简单的故障排除步骤就可能揭示问题。

  • 在脚本中的不同位置插入 DISPLAY VARIABLES 命令可以捕获项目变量的即时状态。

  • 逐行单步执行脚本并设置断点可使故障排除工作变得更加容易。有关详细信息,请参见测试和调试脚本