使用SORT的大型机JCL记录转置 [英] Mainframes JCL Record transposing using SORT

查看:263
本文介绍了使用SORT的大型机JCL记录转置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在使用SORT(snycsort或DFSORT)将记录转置为列之后进行.它应该可扩展到任意数量的记录.这可能吗?

I want to do following transposing of records into column using SORT (snycsort or DFSORT). It should be scalable to any number of records .Is this possible ?


DE001XYX   A 
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
DE003ZZZ A
DE001XYX A
CD100000 B
CD200000 C
DE001KKK A
CD100000 B
........

转置


DE001XYX   CD100000   CD200000   
DE001KKK   CD100000   
DE003ZZZ   
DE001XYX   CD100000   CD200000   
DE001KKK   CD100000   
.....

推荐答案

这是我最喜欢的一个问题,并渴望自己解决一段时间.经过研究和试用,我只是想出了一个解决方案.

This is one question which I Favorited and longed to solve it myself for quite some time. After some research & try outs, I've just come up with a solution.

更新: 下面提供了一种简易的方法.它通过1遍本身即可解决问题,而最初的方法需要3遍.

UPDATE: Improvised approach is given below. It solves the problem in 1 pass itself whereas the initial approach took 3 passes.

改进的方法: 不需要3次通过.

Improvised approach: No need of 3 passes.

***************************** Top of Data ******************************
//JOBNAME JOB ('ACCOUNT INFORMATION'),'TRANSPOSE',                      
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                                
//STEP1   EXEC PGM=SORT                                                 
//SORTIN  DD *                                                          
DE001XYX   A                                                            
CD100000   B                                                            
CD200000   C                                                            
DE001KKK   A                                                            
CD100000   B                                                            
DE003ZZZ   A                                                            
DE001XYX   A                                                            
CD100000   B                                                            
CD200000   C                                                            
DE001KKK   A                                                            
CD100000   B                                                            
//SORTOUT DD SYSOUT=*                                                   
//SYSOUT  DD SYSOUT=*                                                   
//SYSIN   DD *                                                          
 SORT FIELDS=(30,1,CH,A)                                                
 INREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),                      
              END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1)),                    
       IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,         
              30:14,1)),                                                
       IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),                                  
              BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),              
       IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),                                  
              BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))                     
 SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI                                   
 OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)                         
**************************** Bottom of Data ****************************

结果与OP在其问题中显示的输出相同.

Results in the same output which OP has shown in his/her question.

初始方法:

第1步: 我将WHEN=GROUPBEGINENDPUSH参数一起使用.

Step 1: I used WHEN=GROUP with BEGIN, END and PUSH parameters.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',          
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID             
//STEP1   EXEC PGM=SORT                              
//SORTIN  DD *                                       
DE001XYX   A                                         
CD100000   B                                         
CD200000   C                                         
DE001KKK   A                                         
CD100000   B                                         
DE003ZZZ   A                                         
DE001XYX   A                                         
CD100000   B                                         
CD200000   C                                         
DE001KKK   A                                         
CD100000   B                                         
//SORTOUT DD SYSOUT=*                                
//SYSOUT  DD SYSOUT=*                                
//SYSIN   DD *                                       
 SORT FIELDS=COPY                                    
 OUTREC IFTHEN=(WHEN=GROUP,BEGIN=(12,1,CH,EQ,C'A'),  
               END=(12,1,CH,EQ,C'C'),PUSH=(14:ID=1))

PUSH=(14:ID=1)表示1的位置14是对每个组递增的标识符.不管先前的组是否以C终止,每个A都指示一个新组.启动新组时,标识符+1.

PUSH=(14:ID=1) means position 14 for 1 is an identifier that increments for each group. Each A indicates a new group regardless of whether the previous group was terminated with C. The identifier is +1'd when a new group is started.

注意:由于我们只允许一个字符作为ID,所以当ID计数器达到10时,位置14会显示一个"0".您也可以为该地址分配1个以上的字节ID.

Note: Since we are only allowing one character for the ID, when the ID counter gets to 10, a '0' will appear in position 14. You may also assign more than 1 byte for the ID.

第1步的输出:

********************************* TOP OF DATA **********************************
DE001XYX   A 1                                                                  
CD100000   B 1                                                                  
CD200000   C 1                                                                  
DE001KKK   A 2                                                                  
CD100000   B 2                                                                  
DE003ZZZ   A 3                                                                  
DE001XYX   A 4                                                                  
CD100000   B 4                                                                  
CD200000   C 4                                                                  
DE001KKK   A 5                                                                  
CD100000   B 5                                                                  
******************************** BOTTOM OF DATA ********************************

步骤2:获取步骤1的输出.分别根据三个键A,B和C修改DE,CD1和CD2记录的位置.

Step 2: Take the output from Step 1. Modify the position of DE, CD1 and CD2 records based on the three keys A, B and C respectively.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',                     
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                        
//STEP1   EXEC PGM=SORT                                         
//SORTIN  DD *                                                  
DE001XYX   A 1                                                  
CD100000   B 1                                                  
CD200000   C 1                                                  
DE001KKK   A 2                                                  
CD100000   B 2                                                  
DE003ZZZ   A 3                                                  
DE001XYX   A 4                                                  
CD100000   B 4                                                  
CD200000   C 4                                                  
DE001KKK   A 5                                                  
CD100000   B 5                                                  
//SORTOUT DD SYSOUT=*                                           
//SYSOUT  DD SYSOUT=*                                           
//SYSIN   DD *                                                  
 SORT FIELDS=COPY                                               
 OUTREC IFTHEN=(WHEN=(12,1,CH,EQ,C'A'),BUILD=(1:1,8,19Z,28:12,1,
               30:14,1)),                                       
        IFTHEN=(WHEN=(12,1,CH,EQ,C'B'),                         
               BUILD=(1:9Z,10:1,8,18:10Z,28:12,1,30:14,1)),     
        IFTHEN=(WHEN=(12,1,CH,EQ,C'C'),                         
               BUILD=(1:18Z,19:1,8,28:12,1,30:14,1))            
/*      

注意:在步骤3中,将二进制零插入其中作为占位符,以便可以用数据填充它们.

Note: Binary zeros are inserted in between, as place holders so that they can be filled in with data, in Step 3.

步骤2的输出

********************************* TOP OF DATA **********************************
DE001XYX                   A 1                                                  
         CD100000          B 1                                                  
                  CD200000 C 1                                                  
DE001KKK                   A 2                                                  
         CD100000          B 2                                                  
DE003ZZZ                   A 3                                                  
DE001XYX                   A 4                                                  
         CD100000          B 4                                                  
                  CD200000 C 4                                                  
DE001KKK                   A 5                                                  
         CD100000          B 5                                                  
******************************** BOTTOM OF DATA ********************************

在十六进制模式为ON的情况下,您将能够看到二进制零(X'00).

With Hex mode ON, you will be able to see the binary zeros (X'00).

***************************** Top of Data ******************************
DE001XYX                   A 1                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000101000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 1                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000201000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
                  CD200000 C 1                                          
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000301000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE001KKK                   A 2                                          
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000102000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 2                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000202000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE003ZZZ                   A 3                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450039990000000000000000000103000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
DE001XYX                   A 4                                          
CCFFFEEE0000000000000000000C4F444444444444444444444444444444444444444444
450017870000000000000000000104000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 4                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000204000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
                  CD200000 C 4                                          
000000000000000000CCFFFFFF4C4F444444444444444444444444444444444444444444
000000000000000000342000000304000000000000000000000000000000000000000000
DE001KKK                   A 5                                          
CCFFFDDD0000000000000000000C4F444444444444444444444444444444444444444444
450012220000000000000000000105000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
         CD100000          B 5                                          
000000000CCFFFFFF0000000000C4F444444444444444444444444444444444444444444
000000000341000000000000000205000000000000000000000000000000000000000000
----------------------------------------------------------------------- 
**************************** Bottom of Data ****************************

第3步:将第2步的输出作为输入,使用SUM FIELDS组合组的DE,CD1和CD2记录,并在第30位的ID字段上使用SORT FIELDS .

Step 3: With output from Step 2 as input, use SUM FIELDS to combine DE, CD1 and CD2 records of the group, with SORT FIELDS on the ID field in 30th Position.

//JOBNAME JOB ('ACCOUNT NAME'),'TRANSPOSE',                     
//     CLASS=2,MSGCLASS=H,NOTIFY=&SYSUID                        
//STEP1   EXEC PGM=SORT                                         
//SORTIN  DD *                                                  
DE001XYX                   A 1                                                  
         CD100000          B 1                                                  
                  CD200000 C 1                                                  
DE001KKK                   A 2                                                  
         CD100000          B 2                                                  
DE003ZZZ                   A 3                                                  
DE001XYX                   A 4                                                  
         CD100000          B 4                                                  
                  CD200000 C 4                                                  
DE001KKK                   A 5                                                  
         CD100000          B 5                                                  
//SORTOUT DD SYSOUT=*                                           
//SYSOUT  DD SYSOUT=*                                           
//SYSIN   DD *
  SORT FIELDS=(30,1,CH,A)                       
  SUM FIELDS=(1,8,10,8,19,8),FORMAT=BI          
  OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8)
/* 

使用OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8),将DE,CD1和CD2字段之间的二进制零替换为空格.

With OUTREC FIELDS=(1:1,8,9:X,10:10,8,18:X,19:19,8), replace binary zeros in between DE, CD1 and CD2 fields with spaces.

第3步的输出结果:开始了!

***************************** Top of Data ******************************
DE001XYX CD100000 CD200000                                              
DE001KKK CD100000                                                       
DE003ZZZ                                                                
DE001XYX CD100000 CD200000                                              
DE001KKK CD100000                                                       
**************************** Bottom of Data ****************************


有关具有二进制零的SUM FIELDS的更多详细信息:


More details on SUM FIELDS with Binary zeros:

二进制加法以两个位模式进行操作.让我们考虑以下记录(十六进制模式为开,因为我想显示如何对十六进制值执行二进制加法运算).

Binary addition operates on two bit patterns. Let's consider the following records (Hex mode is ON as I would like to show how Binary addition is being performed on the Hex values).

****** ********
000001 DE001XYX
       CCFFFEEE
       45001787
---------------
000002         
       00000000
       00000000

第一个字节的十六进制值X'C4'与第二个记录的第一个字节中的二进制零相加.

Hex value of the first byte, X'C4' is being added with the binary zeros in the 1st byte of 2nd record.

 C4
+00
 --
 C4

X'C4'在EBCDIC中表示字母'D'

X'C4' denotes Letter 'D' in EBCDIC

如果我们将第一个字节中的Binary 0更改为Binary 1(X'01'),结果将有所不同.

If we change the Binary zero in the first byte to Binary one (X'01'), results will vary.

 C4
+01
 --
 C5

X'C5'在EBCDIC中表示字母'E'.

X'C5' denotes Letter 'E' in EBCDIC.

使用二进制零,我们可以对字母数字数据项(EBCDIC字符a-z,A-Z,0-9)执行SUM FIELDS,以将它们分组为一条记录.

With Binary zeros we can perform SUM FIELDS on Alphanumeric data items (EBCDIC characters a-z, A-Z, 0-9) to group them onto one single record.

这篇关于使用SORT的大型机JCL记录转置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆