【问题标题】:If else in sort JCLIf else in sort JCL
【发布时间】:2021-12-17 04:44:27
【问题描述】:

我有两个要求:

  1. 我必须在 Cobol 程序中连接文件中的一些字段。我必须连接的方式是基于上述字段之一。连接的字段必须在新文件中输出。

  2. 然后我必须使用 JCL 调用的排序实用程序对这个新文件进行排序。

问题
我需要为 2 个条件对同一个文件进行排序。我尝试过使用 ifthen outrec 构建。如何一次性对它进行排序?

这是一个源代码示例:

ID DIVISION.
PROGRAM-ID. FOO.    
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   Select Infil assign to inp001.
   Select Outfil assign to out001.
DATA DIVISION.
FILE SECTION.
FD Infil.
01 Main.
     03 A.    
      05 ws-Pc.  Pic x(1).
      05 filler  Pic x(5).
     03 B.  Pic x(4).
     03 C.  Pic x(4).
     03 D.  Pic 9(13)V99.
     03 E.  Pic  x(13).

FD Outfil.
01 Temp Pic x(42).

WORKING-STORAGE SECTION.
01 file-flag Pic x(01).
  88 file-end value 'Y'.
  88 not-file-end value 'N'.
PROCEDURE DIVISION.
 Open input Infil
 Open output Outfil
 read Infil
   at end
     set file-end to true
   not at end
     set not-file-end to true
 end-read

 Perform until file-end
     If  ws-Pc = 3
       String A B C Delimited by size
              into Temp
       End-String
     Else
        String A B C E Delimited by size
              into Temp
       End-String       
     End-if 

     Write Temp
     read Infil
       at end 
        Set file-end to true
     end-read
 end-Perform.
end program foo.    

这是排序实用程序所需的逻辑:

  If ws-Pc=3
    Sort(fieldA,fieldB)
  Else
    Sort(fieldA,fieldB,fieldE)
  End-if.


 

【问题讨论】:

  • 到目前为止你尝试了什么?
  • SORT 不是 JCL。你写了一些 JCL 来运行 SORT 程序。您的 COBOL 程序可能以不同的返回码结束,以指示您需要哪种类型。然后在JCL你可以为每个案例创建一个步骤,并使用JCL IF根据COBOL程序的返回码选择运行哪个步骤。
  • 对字段进行排序 =(1,6,ch,a,7,4,ch,a)。我已经尝试过这个第一个条件它工作正常..像这样我需要为其他条件排序相同的数据集。
  • 如何使用带有INPUT PROCEDURE 和/或OUTPUT PROCEDURE 的COBOL SORT 语句来连接字段?
  • @user13766556 在排序条件中,您键入要根据字段 D 进行排序。但是,结果文件中不存在字段 D。这正常吗?

标签: sorting if-statement cobol mainframe jcl


【解决方案1】:

我可以向您推荐三种变体:

  1. 如果您确定在没有字段 E(ws-pc 等于 3)的情况下最后 13 个字符是相同的(例如空格),您可以只使用这个 sysin:
SORT FIELDS=(1,6,CH,A,7,4,CH,A),EQUALS

确实,多亏了 equals,您的所有输入在排序后都将保持其相对顺序。对于 ws-pc=3 的情况,它将根据字段 A 和 B 进行排序。字段 E 不重要,因为它对所有人都是一样的。

  1. 如果您不确定最后 13 个字符是否相同,您可以自己做:
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'3'),BUILD=(1,14,13X)) 
SORT FIELDS=(1,6,CH,A,7,4,CH,A),EQUALS

这将强制您的最后一个字符为空格。

  1. 如果您不想使用“EQUALS”,您可以通过在未使用的字段 E 中附加行号来创建自己的排序。然后您必须将其删除。
INREC IFTHEN=(WHEN=(1,1,CH,EQ,C'3'),BUILD=(1,14,SEQNUM,13,ZD)) 
SORT FIELDS=(1,6,CH,A,7,4,CH,A)
OUTREC IFTHEN=(WHEN=(1,1,CH,EQ,C'3'),BUILD=(1,14,13X)) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多