将固定格式的 RPG 转换为自由格式



我在报告生成程序中用固定格式 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
Charles 的

答案是最好的,因为带括号的显式优先级比固定格式隐式优先级更容易阅读,并且您不应该再使用固定格式。但是,要执行所需的操作,在没有扩展运算符的旧式固定格式中,您必须执行以下操作:

 *   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 不是特别流利,所以我不知道您是否可以使用括号来解决固定格式代码中的问题,但这应该可以让您了解这个问题。

相关内容

  • 没有找到相关文章

最新更新