如何在Visual COBOL中通过Sort语句统计文件总记录数并筛选显示?
关于Visual COBOL中通过SORT语句统计总记录数的解决方案
嘿,你已经找对方向啦!完全可以借助SORT语句的INPUT PROCEDURE来统计文件的总记录数,而且你现有的代码已经有了核心逻辑,只需要做一些小调整就能实现需求,咱们一步步来梳理:
核心思路:利用INPUT PROCEDURE遍历所有记录
SORT的INPUT PROCEDURE会处理输入文件的每一条记录——不管这条记录是否符合筛选条件、是否会被RELEASE到排序文件里。所以在这里统计总记录数是天然合适的场景:每成功读取一条记录,就累加总记录数计数器,最后就能得到文件的总记录数。
你的代码调整建议
看你当前的B-210-SELECT-RECORDS代码,核心的计数逻辑是对的,但循环结构需要微调,确保所有记录都被正确计数:
修正后的INPUT PROCEDURE代码
B-210-SELECT-RECORDS. OPEN INPUT CUSTOMER-SALES-FILE MOVE "N" TO SW-END-OF-FILE. // 循环读取所有记录,直到文件结束 PERFORM UNTIL SW-END-OF-FILE = "Y" READ CUSTOMER-SALES-FILE INTO CUSTOMER-SALES-RECORD AT END MOVE "Y" TO SW-END-OF-FILE NOT AT END ADD 1 TO AC-RECORD-TOTAL // 每读一条就累加总记录数 PERFORM B-370-RELEASE-RECORDS // 这里处理筛选和RELEASE逻辑 END-READ END-PERFORM CLOSE CUSTOMER-SALES-FILE.
关键细节说明
- 总记录数的累加时机:在
NOT AT END分支里立刻累加AC-RECORD-TOTAL,这样不管这条记录是否符合筛选条件,都会被计入总记录数,完全符合你的需求。 - 循环条件修正:把原代码的
UNTIL END-OF-FILE改成UNTIL SW-END-OF-FILE = "Y",和你定义的文件结束开关保持一致,避免逻辑错误。 - 筛选与RELEASE逻辑:在
B-370-RELEASE-RECORDS里,你可以保留原有的筛选判断——如果记录符合用户输入的条件,就执行RELEASE SORT-FILE FROM CUSTOMER-SALES-RECORD,同时累加符合条件的记录计数器(比如AC-MATCHED-COUNT)。
最后展示统计结果
在你的输出过程B-220-DISPLAY-REPORT的末尾,添加总记录数和符合条件记录数的展示即可:
DISPLAY "=====================================" DISPLAY " 文件总记录数: " AC-RECORD-TOTAL DISPLAY " 符合条件的记录数: " AC-MATCHED-COUNT DISPLAY "====================================="
注意事项
- 确保
AC-RECORD-TOTAL和AC-MATCHED-COUNT在WORKING-STORAGE SECTION中定义为数值型变量,并且初始值设为0,比如:01 AC-RECORD-TOTAL PIC 9(9) VALUE 0. 01 AC-MATCHED-COUNT PIC 9(9) VALUE 0. - 如果你的文件非常大,要选择足够长度的变量类型,避免计数溢出。
这样调整后,你的程序就能同时输出符合条件的记录、符合条件的记录数,以及文件的总记录数啦!
内容的提问来源于stack exchange,提问作者Loonette
相关产品推荐
相关产品推荐

