IF 构造
IF 指令允许根据逻辑条件执行不同的计算。在这种情况下,要使用的语法为
… := if
例如,我们可以编写:
[LO].[X00000] := if [C00000] == 0 then [D00000] else [E00000] end;
通常,IF 指令的结果为:
- 当
为真时,为 ; - 当
为假时,为 。
从技术上讲,为了对 IF 表达式求值,系统会执行以下运算
在某些情况下,这可能给出错误结果。有关更多详细信息,请参阅 BOUND 函数的高级用法。
语法
IF 指令可以嵌套,并且 ELSE 条件可以省略。
示例 1
[LO].@CONDITION := [C00000] == 10;
[LO].[X00000] := @CONDITION * [D00000](Dest1.[D16]);
此外,假设数据库中有以下数据。
科目 C00000
| Entity | Account | Scenario | Category | CustDim1 | CustDim2 | Period | Amount |
|---|---|---|---|---|---|---|---|
| A00 | C00000 | 2013BDG | $AMOUNT | D11 | D21 | 01 | 10 |
| A00 | C00000 | 2013BDG | $AMOUNT | D12 | D21 | 01 | 10 |
| A00 | C00000 | 2013BDG | $AMOUNT | D13 | D21 | 01 | 30 |
| A00 | C00000 | 2013BDG | $AMOUNT | D14 | D21 | 01 | 50 |
| A00 | C00000 | 2013BDG | $AMOUNT | D15 | D21 | 01 | 10 |
科目 D00000
| Entity | Account | Scenario | Category | CustDim1 | CustDim2 | Period | Amount |
|---|---|---|---|---|---|---|---|
| A00 | D00000 | 2013BDG | $AMOUNT | D16 | D21 | 01 | 20 |
在对 @CONDITION 求值时,系统会为科目 C00000 的每条现有记录生成一条记录,在条件成立处赋值为 1,否则为 0。我们将得到以下值:
| Entity | CustDim1 | CustDim2 | Amount |
|---|---|---|---|
| A00 | D11 | D21 | 1 |
| A00 | D12 | D21 | 1 |
| A00 | D13 | D21 | 0 |
| A00 | D14 | D21 | 0 |
| A00 | D15 | D21 | 1 |
我们脚本的结果将为:
| Entity | Account | Scenario | Category | CustDim1 | CustDim2 | Period | Amount |
|---|---|---|---|---|---|---|---|
| A00 | X00000 | 2013BDG | $AMOUNT | D11 | D21 | 01 | 20*1 |
| A00 | X00000 | 2013BDG | $AMOUNT | D12 | D21 | 01 | 20 *1 |
| A00 | X00000 | 2013BDG | $AMOUNT | D15 | D21 | 01 | 20*1 |
示例 2
[LO].@CONDITION := Dest1 <> “xxx”;
[LO].[X00000] := @CONDITION * [D00000](Dest1.[GEN]);
这是使用 IF 条件在给定维度(在此例中为自定义维度 1)上展开科目的另一种方式。系统通过对自定义维度 1 中代码不同于 xxx 的每个元素创建记录列表来对 @CONDITION 求值。如果代码为 xxx 的记录不存在,则意味着我们应打开与自定义维度 1 元素数量相同的、金额为 1 的记录。