在脚本中做决策

我们所做的任何事情都涉及到决策,编写脚本也不例外。有时您只希望一个命令在其他某个条件为真时运行,有时您可能希望根据一个表中的某些记录所包含的内容来处理它们。ACLScript 提供了多种在脚本中做决策的方法,而它们全都使用条件表达式。

什么是条件表达式?

条件表达式是任何求值为真或假的表达式。条件表达式指示执行脚本中的哪些操作,并且由脚本编写者指定。

这是一个具有相当技术性的定义,但一个简单的现实示例可以帮助阐释它的含义:

示例

您正在街上走着,这时您看到您认识的某个人。您想要礼貌地跟这个人打声招呼,但您是应该说“上午好”还是“下午好”呢?

答案取决于一个简单的条件:现在是否已经过了中午 12:00?如果答案为,则您应该说“上午好”,否则应该说“下午好”。

在该示例中,条件表达式根据其求值结果是否为真(是)决定了您采取的行动(您使用哪一句问候语)。

可以按如下方式将前面示例中的表达式转换为 ACLScript:

COMMENT 检查当前时间是否为中午 12:00 及以后
NOW() >= `t120000`

您可以通过复制以下行,然后将其粘贴到 Analytics 的命令行中来运行该示例。根据您完成此工作的时间的不同,该表达式的求值结果为真或假:

DISPLAY NOW() >= `t120000`

提示

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

一旦您运行该示例,您可以尝试更改该表达式中的字面量时间值中午 12:00,以便它的求值结果为相反的值。

决定命令是否应该运行

Analytics 提供了 IF 命令,以便您可以决定命令是否应该运行。命令需要两个输入:

  • 条件表达式
  • 要在表达式为真的条件下运行的命令

如果条件表达式的求值结果为假,则命令不运行。

说“下午好”

继续使用上面的示例,尝试将以下代码粘贴到命令行中:

IF NOW() >= `t120000` DISPLAY "下午好"

如果时间晚于中午 12:00,则 DISPLAY 命令将“下午好”打印到输出选项卡。但是,如果您所处的地点仍然是上午,那么该命令不会打印任何内容。脚本不会运行 DISPLAY 命令。

说“上午好”

如果您的表达式求值结果为假,您可能想知道如何使该命令打印“上午好”。尽管某些脚本语言提供了 "else" 结构以同时处理真和假两种情况,但 ACLScript 未提供。相反,您对相反的表达式使用第二个 IF 命令。

请尝试将以下表达式粘贴到命令行中:

IF NOW() < `t120000` DISPLAY "上午好"

该示例的工作方式与前一个示例类似,区别在于如果当前时间早于中午 12:00,则 DISPLAY 命令打印“上午好”。

这在脚本中会是什么样子?

迄今为止的示例已被限制到 DISPLAY 命令,该命令只能从命令行使用。但是在脚本中,适用相同的原理。与将问候语打印到显示选项卡不同,在以下示例中,脚本将问候语存储在一个名为 v_greeting 的变量中:

COMMENT 根据一天中时间的不同存储正确的问候语
IF NOW() >= `t120000` ASSIGN v_greeting = "Good afternoon"
IF NOW() < `t120000` ASSIGN v_greeting = "Good morning"

如果该脚本在中午 12:00 之前运行,则该变量中存储的值是“上午好”,而如果它在中午 12:00 及以后运行,则该变量中存储的值是“下午好”。尝试将该脚本粘贴到您的脚本编辑器中并运行它。您可以在它运行之后在变量选项卡上检查该变量的值。

决定处理哪些记录

有时您想要决定脚本是否运行某个命令(如上所示),但有时您希望命令仅对表中的某些记录运行。这是另一种决策情景,但是它不同于使用 IF 命令的情景。

在您想要有选择地处理记录的情况下,ACLScript 在许多命令上提供了 IF 参数。当您使用该方法时,命令要求您指定一个条件表达式作为输入。该表达式被针对表中的每个记录进行测试,当它的求值结果为真时,记录被处理:

COMMENT 对其 Quantity 大于 5 的记录的 Amount 域进行求和运算
TOTAL Amount IF Quantity > 5

计算发生在下午的交易

您可以使用相同的条件表达式 NOW( ) >= `t120000` 来计算表中所有发生在下午的交易。请考虑下面的交易数据表:

Transaction_Amount Unit_Cost Product_No Transaction_Date Quantity
618.3 6.87 070104397 2000-11-17 12:00 90
6705.12 6.87 070104677 2000-11-17 9:30 976
7955.46 6.87 070104657 2000-11-17 14:45 1158
4870.83 6.87 070104327 2000-11-17 15:00 709
10531.71 6.87 070104377 2000-11-17 9:57 1533
5734 47 030414313 2000-10-30 1:00 122
2196 18 030414283 2000-10-30 18:25 122

为了计算 Transaction_Amount 域的和,您使用 TOTAL 命令:

COMMENT 求 Transaction_Amount 域的和
TOTAL Transaction_Amount

该命令处理该表中的每个记录,并且计算出总和为 38,611.42,这是所有交易的和。

为了向命令中添加一些决策结构,并且只处理那些发生在中午 12:00 及以后的交易,您向 TOTAL 中添加了 IF 参数。您使用与开头示例中相同的条件表达式,但是将 NOW( ) 替换为交易日期的时间部分:

COMMENT 对所有发生在下午的交易的 Transaction_Amount 进行求和
COMMENT 使用函数提取 Transaction_Date 域中的数据的时间部分
TOTAL Transaction_Amount IF CTOT(TIME(Transaction_Date)) >= `t120000`

在该命令中,您必须使用某些函数来分离交易日期的时间部分,但是一旦您那样做,决策就将是开头示例中的相同条件表达式:当前时间是否是中午 12:00 及以后?如果答案为,则金额被包括在和中。

该命令计算出总和为 15,640.59,这是该表中所有发生在下午的交易的和。