我在报告生成程序中用固定格式 RPG 编写了以下代码片段。我尝试以自由格式重写它。之前和之后生成的报告在检查时似乎相同。但是,如果有任何错误,请告诉我。
*
* CONTROL BREAK WITHIN SOLIDS OR PATTERNS
*
C* WOSRT1 IFEQ '1'
C* WOBKCL ANDNE SVCOLR
C* WOSRT1 OREQ '2'
**** WOPATT ANDNESVPATT
C* WOCLT# ANDNE SVCLT#
等效:
If ( (WOSRT1 = '1' and WOBKCL <> SVCOLR) or
(WOSRT1 = '2' and ( WOCLT# <> SVCLT# or WOCLTH <> SVCLTH )) );
代码片段 - 2:
* CONTROL BREAK WITHIN SOLIDS OR PATTERNS
C* WOSRT1 IFEQ '1'
C* WOBKCL ANDNE WOBKCLsave
C* WOSRT1 OREQ '2'
C* WOCLT# ANDNE WOCLT#save
等效:
If ( (WOSRT1 = '1' and WOBKCL <> WOBKCLsave) or
(WOSRT1 = '2' and ( WOCLT# <> WOCLT#save
or WOCLTH <> WOCLTHsave )));
第一个代码段中的条件 WOCLTH <> SVCLTH,第二个代码段中的条件 WOCLTH <> WOCLTHsave 是我需要添加到 Break 逻辑中的附加条件。
当我尝试以固定格式(最后一行(添加此条件时,报告记录以无意的方式发生了更改。请问有人也可以指出以下内容有什么问题吗?
* CONTROL BREAK WITHIN SOLIDS OR PATTERNS
C WOSRT1 IFEQ '1'
C WOBKCL ANDNE WOBKCLsave
C WOSRT1 OREQ '2'
C WOCLT# ANDNE WOCLT#save
C WOCLTH ORNE WOCLTHsave
RDi 中的自由格式转换器将其转换为:
IF WOSRT1 = '1'
AND WOBKCL <> WOBKCLsave
OR WOSRT1 = '2'
AND WOCLT# <> WOCLT#save
OR WOCLTH <> WOCLTHsave;
由于AND
优先于OR
,我会添加这样的括号:
IF (WOSRT1 = '1'
AND WOBKCL <> WOBKCLsave)
OR (WOSRT1 = '2'
AND WOCLT# <> WOCLT#save)
OR WOCLTH <> WOCLTHsave;
从而解释为什么您得到的结果与自由格式版本所期望的结果不同。
使用传统的固定格式 IFxx 操作码很难进行复杂的 IF,您为什么要打扰?
即使在固定格式中,您也可以使用具有扩展因子 2 的 IF
。 C IF ( (WOSRT1 = '1' and WOBKCL <> SVCOLR)
C OR (WOSRT1 = '2'
C and ( WOCLT# <> SVCLT#
C or WOCLTH <> SVCLTH
C )
C )
C )
C endif
答案是最好的,因为带括号的显式优先级比固定格式隐式优先级更容易阅读,并且您不应该再使用固定格式。但是,要执行所需的操作,在没有扩展运算符的旧式固定格式中,您必须执行以下操作:
* CONTROL BREAK WITHIN SOLIDS OR PATTERNS
C WOSRT1 IFEQ '1'
C WOBKCL ANDNE WOBKCLsave
C WOSRT1 OREQ '2'
C WOCLT# ANDNE WOCLT#save
C WOSRT1 OREQ '2'
C WOCLTH ORNE WOCLTHsave
TL/DR;
如果在括号表达式中分解最后一个条件
(WOSRT1 = '2' and ( WOCLT# <> WOCLT#save or WOCLTH <> WOCLTHsave ))
你有A and (B or C)
.旧式固定格式 RPG 的问题在于您不能将 OR 放在括号中。您需要重写它,以便括号围绕 AND。 幸运的是,AND
是关联的,因此您可以将其编写为 (A and B) or (A and C)
。
这几乎可以肯定是运算符优先级的问题。 运算符 'And' 的优先级高于运算符 'Or',因此无需对最后一个代码块进行分组,等效的自由格式为:
If (WORSRT = '1' And WOBKCL <> WOBKCLsave) Or
(WOSRT1 = '2' And WOCLT# <> WOCLT#save) Or
(WOCLTH <> WOCLTHsave);
这与你的预期不符。 我对固定格式的 RPG 不是特别流利,所以我不知道您是否可以使用括号来解决固定格式代码中的问题,但这应该可以让您了解这个问题。