Ibm midrange 将固定格式RPG转换为自由格式

Ibm midrange 将固定格式RPG转换为自由格式,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我在报告生成程序中使用固定格式RPG编写了以下代码。我试着用自由格式重写这个。检查前后的报告似乎是一样的。但是,如果这方面有任何错误,请告诉我 * * CONTROL BREAK WITHIN SOLIDS OR PATTERNS * C* WOSRT1 IF

我在报告生成程序中使用固定格式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 )) ); 
If ( (WOSRT1 = '1' and WOBKCL <> WOBKCLsave) or    
     (WOSRT1 = '2' and ( WOCLT# <>  WOCLT#save     
                      or WOCLTH <> WOCLTHsave ))); 
等价物:

If ( (WOSRT1 = '1' and WOBKCL <> SVCOLR) or                          
     (WOSRT1 = '2' and ( WOCLT# <>  SVCLT# or WOCLTH <> SVCLTH )) ); 
If ( (WOSRT1 = '1' and WOBKCL <> WOBKCLsave) or    
     (WOSRT1 = '2' and ( WOCLT# <>  WOCLT#save     
                      or WOCLTH <> WOCLTHsave ))); 

RDi中的自由格式转换器将其转换为:

   IF WOSRT1 = '1'
   AND WOBKCL <> WOBKCLsave
   OR WOSRT1 = '2'
   AND WOCLT# <> WOCLT#save
   OR WOCLTH <> WOCLTHsave;
这就解释了为什么你会得到一个不同于你期望的自由形式版本的结果

复杂的IFs很难使用传统的固定格式IFxx操作代码,您为什么要费心呢

即使在固定格式中,也可以使用IF和扩展因子2

 C                   IF        ( (WOSRT1 = '1' and WOBKCL <> SVCOLR)                           
 C                               OR (WOSRT1 = '2'   
 C                                   and ( WOCLT# <>  SVCLT#  
 C                                         or WOCLTH <> SVCLTH   
 C                                       )                       
 C                                  )                             
 C                             )                                   
 C                   endif
C IF((WOSRT1='1'和WOBKCL SVCOLR)
C或(WOSRT1='2'
C和(WOCLT#SVCLT#
C或WOCLTH SVCLTH
(C)
(C)
(C)
C endif

RDi中的自由格式转换器将其转换为:

   IF WOSRT1 = '1'
   AND WOBKCL <> WOBKCLsave
   OR WOSRT1 = '2'
   AND WOCLT# <> WOCLT#save
   OR WOCLTH <> WOCLTHsave;
这就解释了为什么你会得到一个不同于你期望的自由形式版本的结果

复杂的IFs很难使用传统的固定格式IFxx操作代码,您为什么要费心呢

即使在固定格式中,也可以使用IF和扩展因子2

 C                   IF        ( (WOSRT1 = '1' and WOBKCL <> SVCOLR)                           
 C                               OR (WOSRT1 = '2'   
 C                                   and ( WOCLT# <>  SVCLT#  
 C                                         or WOCLTH <> SVCLTH   
 C                                       )                       
 C                                  )                             
 C                             )                                   
 C                   endif
C IF((WOSRT1='1'和WOBKCL SVCOLR)
C或(WOSRT1='2'
C和(WOCLT#SVCLT#
C或WOCLTH SVCLTH
(C)
(C)
(C)
C endif

这几乎肯定是运算符优先级的问题。运算符“”和“”的优先级高于运算符“”或“”因此,如果没有任何内容来对最后一个代码块进行分组,则等效的自由格式为:

If (WORSRT = '1' And WOBKCL <> WOBKCLsave) Or
   (WOSRT1 = '2' And WOCLT# <> WOCLT#save) Or
   (WOCLTH <> WOCLTHsave);
If(WORSRT='1'和WOBKCL WOBKCLsave)或
(WOSRT1='2'和WOCLT#WOCLT#save)或
(WOCLTH WOCLTHsave);

这与您的预期不符。我对固定格式RPG不是特别熟练,所以我不知道您是否可以在固定格式代码中使用括号来解决这个问题,但这应该会让您了解这个问题。

这几乎肯定是一个具有运算符优先级的问题。运算符“”和“”的优先级高于运算符“”或“”因此,如果没有任何内容来对最后一个代码块进行分组,则等效的自由格式为:

If (WORSRT = '1' And WOBKCL <> WOBKCLsave) Or
   (WOSRT1 = '2' And WOCLT# <> WOCLT#save) Or
   (WOCLTH <> WOCLTHsave);
If(WORSRT='1'和WOBKCL WOBKCLsave)或
(WOSRT1='2'和WOCLT#WOCLT#save)或
(WOCLTH WOCLTHsave);

这与您的预期不符。我对固定格式RPG不是特别熟练,所以我不知道您是否可以在固定格式代码中使用括号来解决问题,但这应该会让您了解这个问题。

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

 *   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 ))
(WOSRT1='2'和(WOCLT#WOCLT#save或WOCLTH WOCLTHsave))

您有
A和(B或C)
。旧式固定格式RPG的问题在于不能将或放在括号中。您需要重写它,使括号围绕AND。幸运的是,
是关联的,因此您可以将其写成
(A和B)或(A和C)
查尔斯答案是最好的,因为带括号的显式优先级比固定格式的隐式优先级更容易阅读,并且您不应该再使用固定格式了。但是,要在没有扩展运算符的旧式固定格式中执行所需操作,必须执行以下操作:

 *   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 ))
(WOSRT1='2'和(WOCLT#WOCLT#save或WOCLTH WOCLTHsave))

您有
A和(B或C)
。旧式固定格式RPG的问题在于不能将或放在括号中。您需要重写它,使括号围绕AND。幸运的是,
是关联的,所以你可以把它写成
(A和B)或(A和C)

是的,这是我需要添加的一个新条件,正如我在第三个代码段下面的问题中提到的。啊,我现在明白了。我将继续从我的答案中删除这一部分。是的,这是我需要添加的一个新条件,正如我在第三段代码下面的问题中提到的。啊,我现在明白了。我将继续从我的答案中删除这一部分。