在大型机中使用DFSORT实用程序的乘法除法

时间:2017-01-31 03:12:48

标签: mainframe jcl dfsort

有两个文件FILE1.DATA和FILE2.DATA 使用大型机中的DFSORT计算百分比(FILE1中的记录数/ FILE2中的记录数)* 100。如果超过阈值(90%),则设置返回代码。

//********Extracting Unique records data*****************
//SORTT000 EXEC PGM=SORT   
//SYSOUT   DD  SYSOUT=*    
//SORTIN   DD  DSN=SAMPLE.DATA1,DISP=SHR 
//SORTOUT  DD  DSN=FILE1.DATA,                          
//             SPACE=(2790,(5376,1075),RLSE),                    
//             UNIT=TSTSF,                                       
//             DCB=(RECFM=FB,LRECL=05,BLKSIZE=0),                
//             DISP=(NEW,CATLG,DELETE)                           
//SYSIN    DD  *                                                 
 SORT FIELDS=(10,5,CH,A) 
 OUTREC FIELDS=(1:10,5)  
 SUM FIELDS=NONE         
/*                  
//************Getting count of records*****************     
//STEP001  EXEC PGM=ICETOOL                               
//TOOLMSG  DD SYSOUT=*         
//DFSMSG   DD SYSOUT=*                                    
//SYSOUT DD SYSOUT=*                                      
//SYSPRINT DD SYSOUT=*                                    
//IN1      DD DISP=SHR,DSN=FILE1.DATA
//IN2      DD DISP=SHR,DSN=FILE2.DATA
//OUT1     DD DSN=FILE1.DATA.COUNT,    
//            SPACE=(2790,(5376,1075),RLSE),      
//            UNIT=TSTSF,                         
//            DCB=(RECFM=FB,LRECL=06,BLKSIZE=0),  
//            DISP=(NEW,CATLG,DELETE)     
//OUT2     DD DSN=FILE2.DATA.COUNT,  
//            SPACE=(2790,(5376,1075),RLSE),      
//            UNIT=TSTSF,                         
//            DCB=(RECFM=FB,LRECL=06,BLKSIZE=0),  
//            DISP=(NEW,CATLG,DELETE)    
//TOOLIN   DD *                                           
   COUNT FROM(IN1)  WRITE(OUT1) DIGITS(6)                   
   COUNT FROM(IN2)  WRITE(OUT2) DIGITS(6)                    
/*      
//*******Calculating percentage and if above 90% setting RC 04*****                                                  
//STEP002  EXEC PGM=SORT                                             
//SYSOUT   DD SYSOUT=*                                               
//SORTIN   DD DSN=FILE2.DATA.COUNT,DISP=SHR                
//         DD DSN=FILE1.DATA.COUNT,DISP=SHR                
//SORTOUT  DD DSN=FILE.DATA.COUNT.OUT,     
//            SPACE=(2790,(5376,1075),RLSE),      
//            UNIT=TSTSF,                         
//            DCB=(RECFM=FB,LRECL=80,BLKSIZE=0),  
//            DISP=(NEW,CATLG,DELETE)                    
//SETRC    DD SYSOUT=*                                               
//SYSIN    DD *                                                      
  INREC IFTHEN=(WHEN=INIT,BUILD=(1,6,X,6X'00',SEQNUM,1,ZD,80:X)),    
  IFTHEN=(WHEN=(14,1,ZD,EQ,2),OVERLAY=(8:1,6))                       
  SORT FIELDS=(7,1,CH,A),EQUALS                                      
  SUM FIELDS=(8,4,BI,12,2,BI)                                        
  OUTREC OVERLAY=(15:X,1,6,ZD,DIV,+2,M11,LENGTH=6,X,                 
                 (8,6,ZD,MUL,+100),DIV,1,6,ZD,MUL,+100,EDIT=(TTT.TT))

  OUTFIL FNAMES=SETRC,NULLOFL=RC4,INCLUDE=(23,6,CH,GT,C'090.00')          
  OUTFIL BUILD=(05:C'TOTAL NUMBER RECRODS IN FILE2        : ',1,6,/, 
                05:C'TOTAL NUMBER RECRODS IN FILE1        : ',8,6,/, 
                05:C'PERCENTAGE                           : ',23,6,/,
               80:X)                                                
//*                                                                  
  1. 我面临的问题是数据集FILE1.DATA.COUNT和FILE1.DATA.COUNT创建了15个记录长度,尽管提到了LRECL 6.(请注意,这是第一个答案编写时存在的问题,并且现在不涉及上述代码)。
  2. 我们可以将两个步骤合并为一个吗?
  3. 这是什么,(15:X,1,6,ZD,DIV,+2,M11,LENGTH=6,X, (8,6,ZD,MUL,+100),DIV,1,6,ZD,MUL,+100,EDIT=(TTT.TT)),具体是什么意思?

1 个答案:

答案 0 :(得分:3)

你的第一个问题的答案只是你没有说出来 ICETOOL的COUNT运算符你想要输出数据多长时间,所以 它提出了自己的数字。

这来自DFSORT应用程序编程指南:

  

WRITE(countdd)指定计数数据集的ddname   由ICETOOL为此操作制作。必须是countdd DD语句   当下。 ICETOOL按如下方式设置计数数据集的属性:

     

v RECFM设置为FB。

     

v LRECL设置为以下之一:

     

- 如果指定了WIDTH(n),则LRECL设置为n。如果计算,请使用WIDTH(n)   记录长度和LRECL必须设置为特定值(对于   例如,80),或者如果你想确保计数记录的长度   不超过特定的最大值(例如,20个字节)。

     

- 如果未指定WIDTH(n),则将LRECL设置为计算的所需值   记录长度。如果您的LRECL不需要设置为特定的   值,您可以让ICETOOL确定并设置相应的LRECL   未指定WIDTH(n)的值。

  

位数(d)

     

指定输出记录中计数的d位数,覆盖输出记录   默认为15位数。 d可以是1到15.计数写为d   带前导零的十进制数字。 DIGITS只能指定   指定了WRITE(countdd)。

     

如果您知道您的计数需要少于15位数,则可以使用   通过指定DIGITS(d)来代替较少的位数(d)。对于   例如,如果指定了DIGITS(10),则使用10位数而不是15位。

     

如果您使用DIGITS(d)并且计数超过了位数   使用后,ICETOOL终止操作。你可以防止溢出   通过为DIGITS(d)指定适当更高的d值。对于   例如,如果DIGITS(5)导致溢出,您可以使用DIGITS(6)   代替。

  

WIDTH(n)的

     

指定您希望ICETOOL用于的记录长度和LRECL   计数数据集。 n可以是1到32760.WIDTH只能指定   如果指定了WRITE(countdd)。 ICETOOL总是计算记录   写入计数记录所需的长度,并按如下方式使用:

     

v如果指定了WIDTH(n)并且计算的记录长度较小   ICETOOL大于或等于n,将记录长度和LRECL设置为n。   ICETOOL用右边的记录填充右边的计数记录   长度。

     

v如果指定了WIDTH(n)并且计算的记录长度更长   比n,ICETOOL发出错误消息并终止操作。

     

v如果未指定WIDTH(n),ICETOOL将设置记录长度和   LRECL到计算的记录长度。

     

如果您的计数记录长度和LRECL必须设置为a,请使用WIDTH(n)   特殊值(例如,80),或者如果你想确保   计数记录长度不超过特定最大值(例如,   20个字节)。否则,您可以让ICETOOL计算并设置   通过不指定WIDTH(n)来适当记录长度和LRECL。

对于你的第二个问题,是的,它可以一步完成,并大大简化。

问题是,通过做其他事情可以进一步简化。究竟还有什么取决于你的实际任务,我们不知道,我们只知道你为自己的任务选择的解决方案。

例如,您想知道一个文件何时在另一个文件大小的10%范围内。一种方法是,如果不需要点对点精度,则与管理存储的技术人员交谈。告诉他们你想做什么,他们可能已经有了一些可以用来做的事情(在讨论这个时,请记住这些是技术上数据集,而不是文件)。

或者,某些东西之前已经读过或写过这些文件。如果这样做的最后一个程序还没有产生它读/写的数量(在我看来,标准的良好实践,也与程序协调)然后修改程序现在这样做。那里。魔法。你有自己的数量。

安排这些计数属于他们自己的数据集(最好是记录类型,标题/预告片,更标准的良好做法)。

采取两个计数的更大(期望)的一步,"解决"什么是00%(除了简单的减法,除了正确的数据之外什么都不需要),并生成一个SYMNAMES格式文件(固定长度的80字节记录),带有一个带有该值的常量的SORT符号。

使用NULLOUT或NULLOFL将INCLUDE / OMIT与第二个记录计数相比使用符号的第二步。

上述类型解决方案的优点是它们基本上只使用很少的资源。在大型机上,客户支付资源。您的客户在年底可能不会那么高兴,因为他们发现他们已经为阅读付费并且计算了" 7.3m记录,以便您可以设置RC。

好吧,也许7.3米不是那么大,但是,当你有"解决方案"时,下一个人将用100,000条记录来做,下一条有1,000,000条记录。全部设置RC。任何一次运行(即使有10,000个记录的例子)都将超过大型机"的成本。解决方案在未来15年内每天运行。

关于你的第三个问题:

 OUTREC OVERLAY=(15:X,1,6,ZD,DIV,+2,M11,LENGTH=6,X,
                (8,6,ZD,MUL,+100),DIV,1,6,ZD,MUL,+100,EDIT=(TTT.TT)) 

在INREC之后,在SORT / MERGE和SUM(如果存在)之后处理OUTREC。请注意,在JCL中指定这些顺序的物理顺序不会影响它们的处理顺序。

OVERLAY说"用这些数据操作更新当前记录中的信息(BUILD总是创建当前记录的新副本)。

15:"第15栏" (记录15)。

X插入一个空白。

1,6,ZD表示"信息,此刻,在开始位置1,长度为6,这是一个分区十进制格式"。

DIV是分开的。

+2是数字常量。

1,6,ZD,DIV,+ 2表示"从位置1开始取六位数字,然后除以2,得到一个'结果&#39 ;,将被放置在下一个可用位置(在您的情况下为16)。

M11是一个内置的编辑掩码。有关该掩码的详细信息,请在手册中查找,因为您将在当时发现其他有用的预定义掩码。用它来格式化结果。

LENGTH = 6将结果限制为六位数。

到目前为止,前六个位置的数字将除以2,从位置16开始处理(通过掩码)为六位数的无符号分区小数。

该陈述的其余内容相似。括号影响"优先级"正常方式的数字运算符(请参阅手册以熟悉优先规则)。

EDIT =(TTT.TT)是一个使用定义的编辑掩码,在这种情况下插入一个小数点,截断原来最左边的数字,并在必要时有重要的前导零。