查看上一个主题 :: 查看下一个主题
|
作者 |
信息 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
大家好,
我有一个带有LRECL 80的PS文件。在那个文件中,我有一个公共标签中的记录。开头标签:原始(1-8)结束标签:ENDMSG(1-6)。我有唯一的键Acct Num(PIC 9(10))和Emp num(PIC 9(9))。我需要删除多次发生的整个记录集。
输入文件:
码: |
原版的: xxxyyy
帐号: 1234567890
Emp Num: 098789076
.
.
.
ENDMSG;
原版的: xxxyyy
帐号: 1234567890
Emp Num: 098789076
.
.
.
ENDMSG;
原版的: Yabcyyy
帐号: 8736450987
Emp Num: 098720987
.
.
.
ENDMSG;
|
输出文件:
码: |
原版的: xxxyyy
帐号: 1234567890
Emp Num: 098789076
.
.
.
ENDMSG;
原版的: Yabcyyy
帐号: 8736450987
Emp Num: 098720987
.
.
.
ENDMSG; |
我的输出文件LRECL是相同的80。
我必须使用SYNCSORT实用程序来实现此目的。请帮助我。 |
|
回到顶部 |
|
 |
侠客
活跃用户

已加入:2008年1月22日 职位:117 地点:自由城
|
|
|
|
您好,
试试下面的代码片段,
码: |
// STEP01 EXEC PGM=SYNCTOOL
// DFSMSG DD SYSOUT = *
// TOOLMSG DD SYSOUT = *
// SYSOUT DD SYSOUT = *
// IN1 DD *
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG;
/*
// OUT1 DD DSN=&TMP1,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT2 DD DSN=&TMP2,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT3 DD DSN=&TMP3,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT4 DD DSN=&TMP4,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// TOOLIN DD *
COPY FROM(IN1) TO(OUT4) USING(CTL1)
COPY FROM(OUT4) TO(OUT1) USING(CTL2)
SELECT FROM(OUT1) TO(OUT2) ON(90,10,ZD) FIRSTDUP
COPY FROM(OUT2) TO(OUT3) USING(CTL3)
/*
// CTL1CNTL DD *
INREC IFTHEN =(WHEN=INIT,
OVERLAY=(90:SEQNUM,10,ZD)),
IFTHEN =(WHEN=(1,4,CH,EQ,C'ACCT'),OVERLAY=(90:11,10))
/*
// CTL2CNTL DD *
INREC IFTHEN =(WHEN=GROUP,
BEGIN=(1,8,CH,EQ,C''),
END =(1,6,CH,EQ,C'ENDMSG'),
PUSH = (81:ID=5))
/*
// CTL3CNTL DD *
OUTREC FIELDS=(1:81,5)
/*
// *
// STEP00 EXEC PGM=SORT
// SYSOUT DD SYSOUT=*
//整理 DD SYSOUT = *
// SORTJNF1 DD DSN =&TMP1,DISP=SHR
// SORTJNF2 DD DSN =&TMP3,DISP=SHR
//SYSIN DD *
JOINKEYS FILE = F1,FIELDS =(81,5,A)
JOINKEYS FILE = F2,FIELDS =(1,5,A)
SORT FIELDS=COPY
仅加入F1,
REFORMAT FIELDS=(F1:1,80) |
输入:
码: |
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG; |
输出:
码: |
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG; |
|
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
原始值与您的匹配相关吗?
编号在文件中是唯一的,还是仅与ACCT NUM唯一(可能重复)? |
|
回到顶部 |
|
 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
你好
侠客 ,感谢您的信息。但是,在SYNCSORT中是否有可能?
引用: |
编号在文件中是唯一的,还是仅与ACCT NUM唯一(可能重复) |
Acct Num和Emp Num是两个不同的值。
如果是这样
码: |
交流编号: 1234567890
编号: 0987890C6
交流编号: 1234567890
编号: 0987890C6
交流编号: 1234567800
编号: 098789076
交流编号: 1234567800
编号: 098789076 |
输出应为:
码: |
交流编号: 1234567890
编号: 0987890C6
交流编号: 1234567800
编号: 098789076 |
我必须比较Acct Num和EMP Num。如果Acct num和Emp num一起出现多次,则我必须删除整个记录集。
注意:EMP NUM是PIC x(9)。很抱歉给您带来不便。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
引用: |
引用: |
编号在文件中是唯一的,还是仅与ACCT NUM唯一(可能重复) |
Acct Num和Emp Num是两个不同的值。
|
天哪,我惊呆的数量是无止境的:-)
这不是我问的问题。从不同的名称可以明显看出它们是不同的东西。
Emp Num是否可以存在多个Acct Num下?
关于原件的问题有任何答案吗?
如果您想尝试Xavier的解决方案,为什么不呢?您是说必须与PGM = SORT一起使用吗? |
|
回到顶部 |
|
 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
法案,
引用: |
Emp Num是否可以存在多个Acct Num下 |
是的,可以。
原始值只是标题值,在第9位之后可能会有所不同。
只允许我使用syncsort。请让我知道是否需要进一步的信息。 |
|
回到顶部 |
|
 |
迪克·谢勒
主持人荣誉

已加入:2006年11月23日 帖子:19245 位置:矩阵内部
|
|
|
|
您好,
建议您提交提供的代码,然后在此处回发。 。 。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
好的,使用Syncsort,您需要执行多个步骤。
我看到您是一名程序员,因此,如果您一步一步需要它,那么它必须是一个程序。
第一步:
将GROUP ID添加到主文件。使用ACCT / EMP / GROUP ID创建KEY文件。
第二步:
重复数据删除密钥(您可以在第一步中执行此操作)
第三步:
从Main和Key加入ID,忽略不匹配项。
Main和Key的GROUP ID应该以“ 原版的”开头。
要获取密钥,您将需要第二个GROUP来按ACCT。
获得EMP时,您将拥有ACCT,并可以创建ACCT,EMP和ID的密钥(来自原始文件)。 |
|
回到顶部 |
|
 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
感谢您的建议法案。
Xavier的解决方案在第一次出现时就删除了重复项。输入文件中可能多次出现。喜欢,
码: |
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG; |
我的输出应为:
码: |
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG; |
我试过像使用NODUPS,ALLDUPS选项,但效果不佳。
我也删除了JOIN UNPAIRED COND,但是由于REFORMAT FIELDS是强制性的,所以它抛出了ABENDU0016。
您能否建议如何删除重复出现的多次事件。
类似于SUM FIELDS = NONE。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
这些问题相互联系吗?相同的数据?还是不同?
您尝试过排序解决方案了吗?如果数据相同,则只需添加SUM FIELDS = NONE。如果数据不同,请修改排序解决方案并添加SUM FIELDS = NONE。
如果所有这些都是相同的数据,那么您可以尝试将所有需求全部放在一起吗?我有点不了解类似数据的含义。 |
|
回到顶部 |
|
 |
侠客
活跃用户

已加入:2008年1月22日 职位:117 地点:自由城
|
|
|
|
您好,
引用: |
我也删除了JOIN UNPAIRED COND,但是由于REFORMAT FIELDS是强制性的,所以它抛出了ABENDU0016。 |
我不明白你为什么要把这个复杂化。
请记住,REFORMAT字段是必填字段,而不是UNPAIRED选项。
您的要求不断变化,
尝试以下(未试用)代码段
码: |
// STEP01 EXEC PGM=ICETOOL
// DFSMSG DD SYSOUT = *
// TOOLMSG DD SYSOUT = *
// SYSOUT DD SYSOUT = *
// IN1 DD *
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
/*
// OUT1 DD DSN=&TMP1,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT2 DD DSN=&TMP2,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT3 DD DSN=&TMP3,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT4 DD DSN=&TMP4,
// DISP=(MOD,PASS,DELETE),
// RECFM = FB,LRECL = 100,BLKSIZE = 0,
// SPACE=(CYL,(10,10),RLSE),UNIT=SYSDA
// OUT8 DD SYSOUT = *
// TOOLIN DD *
COPY FROM(IN1) TO(OUT1) USING(CTL1)
COPY FROM(OUT1) TO(OUT2) USING(CTL2)
SORT FROM(OUT2) TO(OUT3) USING(CTL4)
COPY FROM(OUT3) TO(OUT4) USING(CTL3)
/*
// CTL1CNTL DD *
INREC IFTHEN =(WHEN=INIT,
OVERLAY=(90:C'0000000000')),
IFTHEN =(WHEN=(1,4,CH,EQ,C'ACCT'),OVERLAY=(90:11,10))
/*
// CTL2CNTL DD *
INREC IFTHEN =(WHEN=GROUP,
BEGIN=(1,8,CH,EQ,C''),
END =(1,6,CH,EQ,C'ENDMSG'),
PUSH = (81:ID=5))
/*
// CTL3CNTL DD *
OUTREC FIELDS=(1:81,5)
/*
// CTL4CNTL DD *
排序字段=(90,10,CH,A)
SUM FIELDS=NONE
OMIT COND=(90,10,CH,EQ,C'0000000000')
/*
// *
// STEP00 EXEC PGM=SORT
// SYSOUT DD SYSOUT=*
//整理 DD SYSOUT = *
// SORTJNF1 DD DSN =&TMP2,DISP=SHR
// SORTJNF2 DD DSN =&TMP4,DISP=SHR
//SYSIN DD *
JOINKEYS FILE = F1,FIELDS =(81,5,A)
JOINKEYS FILE = F2,FIELDS =(1,5,A)
SORT FIELDS=COPY
REFORMAT FIELDS=(F1:1,80) |
如果我的假设是正确的,则可能需要根据A / c否或原始消息对它进行调整以再次对其进行排序,除非您希望保留未排序的顺序,那么这可能会起作用。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
萨伯
据我了解,Acct Num和Emp Num共同构成一个唯一键(可能存在重复项)。
我们知道Emp Num可以出现在多个Acct Num下。我不知道,但是假设Acct Num可以有多个Emp Num。它可以? |
|
回到顶部 |
|
 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
侠客 ,你很棒。该代码可以正常工作。再次感谢..!! |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
比尔·伍德格写道: |
萨伯
据我了解,Acct Num和Emp Num共同构成一个唯一键(可能存在重复项)。
我们知道Emp Num可以出现在多个Acct Num下。我不知道,但是假设Acct Num可以有多个Emp Num。它可以? |
那么我将其作为否定...这将使Acct Num具有唯一性(可能重复)。 |
|
回到顶部 |
|
 |
沙伯利根
新的用户
已加入:2010年6月7日 帖子:59 地点:哥印拜陀
|
|
|
|
对不起,比尔错过了你的谈话。
回答您的查询,
引用: |
我们知道Emp Num可以出现在多个Acct Num下。我不知道,但是假设Acct Num可以有多个Emp Num。它可以? |
是的,它可以有多个Emp Num作为Acct Num。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
您是否以此测试过Xavier?
以防万一,这是另一个要测试的。一遍数据。我为相同的Acct Num包括了两个Emp Num。
码: |
// SDDMULTR EXEC PGM =排序
// SYSOUT DD SYSOUT=*
//整理 DD SYSOUT = *
//SYSIN DD *
INREC IFTHEN =(WHEN=GROUP,BEGIN=(1,9,CH,EQ,C'ORIGINAL:'),
PUSH = (081:1,80)),
IFTHEN=(WHEN=GROUP,BEGIN=(1,9,CH,EQ,C'ACCT NUM:'),
END=(1,9,CH,EQ,C'ORIGINAL:'),
PUSH = (161:1,80)),
IFTHEN=(WHEN=GROUP,BEGIN=(1,7,CH,EQ,C'EMP NUM:'),
END=(1,9,CH,EQ,C'ORIGINAL:'),
PUSH = (241:1,80))
SORT FIELDS=(171,10,CH,A,249,10,CH,A),EQUALS
OUTREC IFTHEN =(WHEN=INIT,OVERLAY=(321:171,10,249,10,
SEQNUM,5,ZD,RESTART=(321,20))),
IFTHEN =(WHEN=GROUP,BEGIN=(1,7,CH,EQ,C'EMP NUM:'),
END=(1,9,CH,EQ,C'ORIGINAL:'),
PUSH=(341:341,5))
OUTFIL OMIT=(1,9,CH,EQ,C'ORIGINAL:',
或,1,9,CH,EQ,C'ACCT NUM:',
OR,341,5,ZD,NE,1),
IFOUTLEN=80,
IFTHEN =(WHEN=(1,7,CH,EQ,C'EMP NUM:'),
BUILD=(081,80,/,
161,80,/,
001,80))
// SORTIN DD *
: AAAYYY
交流编号: 1234567890
编号: 111111111
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG; |
给出以下输出:
码: |
: XXXYYY
交流编号: 1234567890
编号: 098789076
.
.
.
ENDMSG;
: AAAYYY
交流编号: 1234567890
编号: 111111111
.
.
.
ENDMSG;
: YABCYYY
交流编号: 8736450987
编号: 098720987
.
.
.
ENDMSG; |
请通过Xavier尝试该测试数据。
确实比我以前建议的只是“加和字段= none”要多一点:-),但不多。如果您想在其中戳戳,可能会有一些枯木。 |
|
回到顶部 |
|
 |
|
 |
查看书签
所有时间均为格林尼治标准时间+ 6小时 |
|