【问题标题】:Counting records in a group using DFSORT使用 DFSORT 计算组中的记录
【发布时间】:2021-10-12 14:00:12
【问题描述】:

我有一个包含 JES2 作业输出的文件。我正在使用DFSORT 练习以按作业从文件中检索一些信息。

我想要实现的一件事是:

  • 第一行作业输出
  • 作业输出的最后一行
  • 作业输出的总行数(每个作业)

我设法在我的结果中获得了(完整输出的)总行数、作业编号和总行数:

(1)    (2)    (3)
000001 000001 000001         (1) Total lines
000002 000001 000002         (2) Job number
000003 000001 000003         (3) Lines in job
000004 000001 000004
000005 000001 000005
000006 000001 000006
000007 000001 000007
000008 000001 000008
...
000953 000001 000953
000954 000001 000954
000955 000001 000955
000956 000001 000956
000957 000001 000957
000958 000001 000958
000959 000001 000959
000960 000002 000001   <-- new job output starts here
000961 000002 000002
000962 000002 000003
000963 000002 000004
000964 000002 000005
000965 000002 000006

为了实现上述输出,我使用了以下SYSIN DD 语句(PGM=SORT): 第 1 行: INREC OVERLAY=(135:SEQNUM,6,ZD,START=1,INCR=1)

INREC  IFTHEN=(WHEN=GROUP,                         
                    BEGIN=(21,6,CH,EQ,C'J E S 2 '),
                    PUSH=(142:ID=6),                     <--- Second row
                    HIT=NEXT),                     
       IFTHEN=(WHEN=GROUP,                         
                    BEGIN=(21,6,CH,EQ,C'J E S 2 '),
                    PUSH=(149:SEQ=6))                    <--- 3th row

我想要达到的结果是这样的:

JOBNAME  f_row  l_row  rowcnt
JOB12345 000001 000100 000099
JOB54321 000101 000500 000399

我目前遇到的问题是我不知道如何计算rowcnt 列。我能够计算 rowcnt 列,但我只能在下一份工作的第一行执行此操作(通过SUB)。 我认为最好的方法是使用 IFTHEN 并将 rowcnt 推送到组中的所有记录,但我在过去 2 天内没有这样做。

此时我被卡住了。我不再确定应该使用哪些语句来完成此操作。一些论坛提供了一种使用 2 个单独文件的方法,但在我的情况下这不是首选。 任何正确方向的指导将不胜感激。

【问题讨论】:

    标签: mainframe jcl dfsort


    【解决方案1】:

    我能够解决我的问题。我采取了以下步骤。

    首先我必须添加序列号,它计算总记录、唯一作业和唯一作业中的记录数。我之前能够做到这一点,但我将之前的两个步骤合并为一个:

    INREC BUILD=(135:SEQNUM,6,ZD,START=1,INCR=1)
    OUTREC IFTHEN=(WHEN=GROUP,                          
                   BEGIN=(20,7,CH,EQ,C'J E S 2'),       
                   PUSH=(142:ID=6),                     
                   HIT=NEXT),                           
           IFTHEN=(WHEN=GROUP,                          
                   BEGIN=(20,7,CH,EQ,C'J E S 2'),       
                   PUSH=(149:SEQ=6))                    
    

    这会产生以下输出:

     000952 000001 000952
     000953 000001 000953
     000954 000001 000954
     000955 000001 000955
     000956 000001 000956
     000957 000001 000957
     000958 000001 000958
     000959 000001 000959
     000960 000002 000001    <-- New job starts here
     000961 000002 000002
     000962 000002 000003
     000963 000002 000004
     000964 000002 000005
     000965 000002 000006
     000966 000002 000007
     000967 000002 000008
     000968 000002 000009
     000969 000002 000010
     000970 000002 000011
     000971 000002 000012
     000972 000002 000013
    

    我的下一个工作是让工作中的最高记录数登上榜首。我能够通过按降序对第二个排序输入进行排序来实现这一点,见下文。 我还添加了一个新行(在第 157 位)以推送最高记录数,以便以后可以使用它。

    SORT FIELDS=(142,6,ZD,A,135,6,ZD,D)        
    OUTREC IFTHEN=(WHEN=GROUP,                 
                   END=(20,7,CH,EQ,C'J E S 2'),
                   PUSH=(157:149,6))           
    

    上述步骤提供了以下输出(按第二列排序,然后是第一列)

    000959 000001 000959  000959
    000958 000001 000958  000959
    000957 000001 000957  000959
    000956 000001 000956  000959
    000955 000001 000955  000959
    ...
    000007 000001 000007  000959
    000006 000001 000006  000959
    000005 000001 000005  000959
    000004 000001 000004  000959
    000003 000001 000003  000959
    000002 000001 000002  000959
    000001 000001 000001  000959
    001976 000002 001017  001017    <--- Next job starts, highest row count is 1017
    001975 000002 001016  001017
    001974 000002 001015  001017
    001973 000002 001014  001017
    001972 000002 001013  001017
    001971 000002 001012  001017
    001970 000002 001011  001017
    001969 000002 001010  001017
    001968 000002 001009  001017
    001967 000002 001008  001017
    001966 000002 001007  001017
    

    在第四列中,我现在有作业中的总行数。剩下的就是恢复到原来的记录顺序。这是通过对相同的列进行排序来完成的,但对第二个排序输入使用升序而不是降序。

    SORT FIELDS=(142,6,ZD,A,135,6,ZD,A)
    

    回顾这个解决方案时,我想的很困难,导致我无法弄清楚:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-29
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 2015-10-07
      相关资源
      最近更新 更多