【问题标题】:REXX code used in SORT parm of JCLJCL 的 SORT 参数中使用的 REXX 代码
【发布时间】:2013-12-13 03:56:27
【问题描述】:

我在使用一些 REXX 代码创建的 JCL 中有一个排序参数,如下所示:

/* REXX */                                                           
'EXECIO * DISKR ZEROGDT (STEM ZGD.'                                  
S21='                     '                                          
OUTVAR1=' SORT FIELDS=COPY'                                          
'EXECIO 1 DISKW ACCOUNT (STEM OUTVAR'                                
DO I=1 TO ZGD.0                                                      
   ACCTNBR=SUBSTR(ZGD.I,33,16)                                       
   IF I=1 THEN DO                                                    
     OUTVAR1=" OMIT FORMAT=CH,COND=(33,16,EQ,C'"||ACCTNBR||"',OR,"   
   END                                                               
   ELSE DO                                                           
      IF I=ZGD.0 THEN OUTVAR1=S21||" 33,16,EQ,C'"||ACCTNBR||"')"     
      ELSE OUTVAR1=S21||" 33,16,EQ,C'"||ACCTNBR||"',OR,"              
   END                                                               
   'EXECIO 1 DISKW ACCOUNT (STEM OUTVAR'                             
END                                                                  
'EXECIO 0 DISKW ACCOUNT (FINIS'                                      

我知道上面的 REXX 代码创建了一个排序参数如下:

SORT FIELDS=COPY                                     
OMIT FORMAT=CH,COND=(33,16,EQ,C'8257310018808572',OR,
                     33,16,EQ,C'8257310018076428',OR,
                     33,16,EQ,C'8257310017959681',OR,
                     33,16,EQ,C'8257310016504835',OR,
                     33,16,EQ,C'8257310016059467',OR)

但是,它无法处理输入文件中的单个记录。我正在尝试修改 REXX 代码以处理单个记录,但无法处理。任何帮助表示赞赏。

【问题讨论】:

  • “无法处理”是什么意思?
  • 嗯,代码本身很清楚,如果有第一条记录,就开始省略cond。如果它不是第一条记录,只需附加到省略条件,如果它是最后一条记录,则关闭省略条件的括号。如果只有一条记录,它应该打开省略条件的括号并结束它。此代码中似乎不存在该条件。当我尝试以不同的方式添加它时,我得到了错误。
  • 这行得通吗? OUTVAR1="省略格式=CH,COND=(33,16,EQ,C'"||ACCTNBR||"')"
  • 是的,应该。但不幸的是,我无法获得正确的工作条件。我已经尝试了很多排列和组合,但没有得到它的工作。

标签: sorting rexx


【解决方案1】:

下面的代码允许第一行也是最后一行,原始代码 由于 IF 语句的嵌套方式,无法解释这一点。

/* REXX */                                                           
'EXECIO * DISKR ZEROGDT (STEM ZGD.'                                  
OUTVAR=' SORT FIELDS=COPY'                                          
'EXECIO 1 DISKW ACCOUNT (STEM OUTVAR'                                
DO I=1 TO ZGD.0                                                      

   IF I = 1 THEN  
      OUTVAR = " OMIT FORMAT=CH,COND=(33,16,EQ,C'" || SUBSTR(ZGD.I,33,16)
   ELSE
      OUTVAR = COPIES(' ', 21) || " 33,16,EQ,C'" || SUBSTR(ZGD.I,33,16)

   IF I = ZGD.0 THEN
      OUTVAR = OUTVAR || ")" /* This is the last line, close paren. */
   ELSE
      OUTVAR = OUTVAR || ",OR," /* Another line to follow, continue */

   'EXECIO 1 DISKW ACCOUNT (STEM OUTVAR'                             
END                                                                  
'EXECIO 0 DISKW ACCOUNT (FINIS'                                      

对于单行输入,这应该产生:

SORT FIELDS=COPY                                     
OMIT FORMAT=CH,COND=(33,16,EQ,C'8257310018808572')

对于多行它应该产生:

SORT FIELDS=COPY                                     
OMIT FORMAT=CH,COND=(33,16,EQ,C'8257310018808572',OR,
                     33,16,EQ,C'8257310018076428',OR,
                     33,16,EQ,C'8257310017959681')

【讨论】:

  • 谢谢尼尔B!这对我来说效果很好,并且与我的初始代码相比很容易理解!
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多