RPGLE数据结构特点?

问题描述 投票:0回答:2

我正在玩 RPGLE 数据结构功能。 我们在一个数据区存储了 5 个文员和 5 个经理。
然后我们想把它们带入和RPG程序中并将它们切成
适用于 SQL Where 子句的两个字符串。 这似乎有点啰嗦。我可以用更少的线做同样的事情吗?下面的代码。简化示例。

DCL-DS info2 DTAARA('*LIBL/MYDTAARA');                                                 
    dcl-subf DTA       char(300);                                                      
    dcl-subf Manager  char(50) overlay(DTA:51) ;                                      
    dcl-subf Manager1 char(10) overlay(Manager:01) ;                                  
    dcl-subf Manager2 char(10) overlay(Manager:11) ;                                  
    dcl-subf Manager3 char(10) overlay(Manager:21) ;                                  
    dcl-subf Manager4 char(10) overlay(Manager:31) ;                                  
    dcl-subf Manager5 char(10) overlay(Manager:41) ;                                  
    dcl-subf Clerk  char(50) overlay(DTA:201) ;                                  
    dcl-subf Clerk1 char(10) overlay(Clerk:01) ;                                
    dcl-subf Clerk2 char(10) overlay(Clerk:11) ;                                
    dcl-subf Clerk3 char(10) overlay(Clerk:21) ;                                
    dcl-subf Clerk4 char(10) overlay(Clerk:31) ;                                
    dcl-subf Clerk5 char(10) overlay(Clerk:41) ;                                
    dcl-subf Managers Overlay(Manager)  Like(Manager1) Dim(5);                      
    dcl-subf Clerks Overlay(Clerk) Like(Clerk1) Dim(5);                   
 End-ds ;  
         


 Dcl-s sCLERK Char(80)   ;            
 Dcl-s sMANAGER Char(80)   ;    
 Dcl-s x   Int(2)        ;             
 Dcl-s C   CHAR(1)       ;   // comma  
 Dcl-c Q   CONST('''')   ;   // quote  

For x = 1 to 5 by 1;                                                   
 If Clerks(x) <> *blanks ;                                        
    sCLERK  =  %trim(sCLERK)  + C + Q + %trim(Clerks(x)) + Q;     
    C =',';                                                           
 EndIf ;                                                              
EndFor;                                                                
C =' ';                                                                
For x = 1 to 5 by 1;                                                   
  If Managers(X) <> *blanks ;                                      
    sMANAGER  =  %trim(sMANAGER) + C + Q + %trim(Managers(x)) + Q;      
    C =',';                                                            
  EndIf ;                                                              
EndFor;                                                                                                
ibm-midrange rpgle
2个回答
2
投票

正如所问(我可以用更少的行做同样的事情吗?)答案是......不是真的。这就是数据结构的工作原理;它是共享数据块的映射,人们想为各个部分命名。

也就是说,数据结构只是一种选择。如果想在更少的行中执行类似的功能,请考虑完全消除数据结构。在循环中,将单个文员和经理从较大的字符串中提取出来。这段代码没有使用 clerk1...5 - 它们只是为了能够在数据区域的顶部覆盖一个数组。

如果数据区的原因是要从另一个程序传递这些,请考虑使用 CALL/PARM 而不是数据区。直接传两个数组。这将从该程序中删除声明数据区域的行,并避免必须在调用程序中格式化数据区域。


0
投票

你的数据区有点乏味。除非你需要所有额外的子字段,否则你可以这样定义它:

dcl-ds info2    dtaara('MYDTAARA');                                                 
  Managers      Char(10) Dim(5);                      
  Clerks        Char(10) Dim(5);                   
end-ds;  

不需要

dcl-subf

© www.soinside.com 2019 - 2024. All rights reserved.