RPGLE自由格式:如何用SETLL和READE查找指定键控字段重复记录
RPGLE自由格式:用SETLL和READE查找第二个键控字段的重复记录
我明白你要解决的问题——用RPGLE自由格式的SETLL和READE找出文件中第二个键控字段的重复记录,你的初始代码只做了简单的存在性检查(相当于去重),没法定位重复的记录对吧?下面给你一个可行的实现方案,附带详细解释:
前提准备
首先要确保你的源文件(假设叫INPUTFILE)能通过第二个键控字段(比如XXPART)进行键值访问:
- 如果源文件的主键不包含
XXPART作为可查询的键项,你需要创建一个逻辑文件或者SQL视图,将XXPART设为键字段(比如逻辑文件的键定义为XXPART,或者包含XXPART的组合键),这样SETLL和READE才能按XXPART分组读取记录。
完整示例代码
// 定义文件:INPUTFILE为源数据文件,OUTPUTWORKFILE为输出重复记录的文件 dcl-f INPUTFILE keyed; dcl-f OUTPUTWORKFILE disk; // 定义变量:存储当前处理的XXPART、计数、临时记录缓存 dcl-s currentPart like(INPUTFILE.XXPART); dcl-s partCount packed(5:0); dcl-s tempRec like(INPUTFILE); /free // 定位到源文件起始位置,读取第一条记录 SETLL *START INPUTFILE; READ INPUTFILE; // 遍历源文件所有不同的XXPART分组 dow not %eof(INPUTFILE); currentPart = INPUTFILE.XXPART; partCount = 0; // 第一步:统计当前XXPART的出现次数 SETLL (currentPart) INPUTFILE; READE (currentPart) INPUTFILE tempRec; dow not %eof(INPUTFILE); partCount += 1; READE (currentPart) INPUTFILE tempRec; enddo; // 如果该XXPART出现多次(即存在重复),写入所有对应记录到输出文件 if partCount > 1; SETLL (currentPart) INPUTFILE; READE (currentPart) INPUTFILE; dow not %eof(INPUTFILE); WRITE OUTPUTWORKFILE; READE (currentPart) INPUTFILE; enddo; endif; // 跳转到下一个不同的XXPART,避免重复处理同一分组 SETGT (currentPart) INPUTFILE; READ INPUTFILE; enddo; // 关闭文件,结束程序 close INPUTFILE; close OUTPUTWORKFILE; *inlr = *on; /end-free
代码逻辑解释
初始化与遍历分组:
- 用
SETLL *START和READ定位到源文件的第一条记录,开启主循环。 - 每次循环获取当前的
XXPART,作为要检查的目标字段。
- 用
统计重复次数:
- 用
SETLL (currentPart) INPUTFILE定位到该XXPART的第一条记录。 - 通过
READE遍历所有同XXPART的记录,统计出现次数partCount。
- 用
输出重复记录:
- 如果
partCount > 1(说明该XXPART存在重复),再次用SETLL和READE遍历该分组的所有记录,写入到输出文件OUTPUTWORKFILE。
- 如果
跳过已处理分组:
- 用
SETGT (currentPart) INPUTFILE跳转到比当前XXPART更大的下一条记录,确保主循环只处理每个XXPART一次,避免重复统计。
- 用
额外注意事项
- 如果你的输出需求是仅保留重复的
XXPART值(而非所有对应记录),可以修改逻辑,在partCount > 1时只写入一次currentPart即可。 - 确保输出文件
OUTPUTWORKFILE的记录格式与源文件兼容,或者根据需求调整字段映射。
内容的提问来源于stack exchange,提问作者user9741303
相关产品推荐
相关产品推荐

