我正在玩 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;
正如所问(我可以用更少的行做同样的事情吗?)答案是......不是真的。这就是数据结构的工作原理;它是共享数据块的映射,人们想为各个部分命名。
也就是说,数据结构只是一种选择。如果想在更少的行中执行类似的功能,请考虑完全消除数据结构。在循环中,将单个文员和经理从较大的字符串中提取出来。这段代码没有使用 clerk1...5 - 它们只是为了能够在数据区域的顶部覆盖一个数组。
如果数据区的原因是要从另一个程序传递这些,请考虑使用 CALL/PARM 而不是数据区。直接传两个数组。这将从该程序中删除声明数据区域的行,并避免必须在调用程序中格式化数据区域。
你的数据区有点乏味。除非你需要所有额外的子字段,否则你可以这样定义它:
dcl-ds info2 dtaara('MYDTAARA');
Managers Char(10) Dim(5);
Clerks Char(10) Dim(5);
end-ds;
不需要
dcl-subf
。