在脚本中做决策
我们所做的任何事情都涉及到决策,编写脚本也不例外。有时您只希望一个命令在其他某个条件为真时运行,有时您可能希望根据一个表中的某些记录所包含的内容来处理它们。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,这是该表中所有发生在下午的交易的和。