Cobol 按顺序读取文件中的特定记录,然后显示它
我怎样才能解决这个问题?我的问题是,当我输入产品代码时,它不会显示产品详细信息。不允许读取/启动错误。你能教我如何在文件中找到特定的记录吗?首先,我手动创建了.DAT文件,根据数据类型和格式插入了一些记录。请查看.DAT文件 以下是示例输出:Cobol 按顺序读取文件中的特定记录,然后显示它,cobol,Cobol,我怎样才能解决这个问题?我的问题是,当我输入产品代码时,它不会显示产品详细信息。不允许读取/启动错误。你能教我如何在文件中找到特定的记录吗?首先,我手动创建了.DAT文件,根据数据类型和格式插入了一些记录。请查看.DAT文件 以下是示例输出: 让我们看看你的流量控制。首先,本节: INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MASTER-FILE ASSIGN TO "MASTER-PRODUCT-FILE.DAT" O
让我们看看你的流量控制。首先,本节:
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MASTER-FILE ASSIGN TO "MASTER-PRODUCT-FILE.DAT"
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL.
SELECT TRANSACTION-FILE ASSIGN TO "INVENTORY-FILE.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
FILE SECTION.
FD MASTER-FILE.
01 MASTER-RECORDS.
05 PR-CODE PIC 9(7).
05 PR-NAME PIC X(30).
05 PR-PRICE PIC 9(5)V99.
05 PR-QUANTITY PIC S9(6).
FD TRANSACTION-FILE.
01 TRANSACTION-RECORDS.
05 TR-CODE PIC 9(6).
05 TR-DATE.
10 DATE-YEAR PIC 9(4).
10 DATE-MONTH PIC 99.
10 DATE-DAY PIC 99.
05 TR-PRODCODE PIC 9(7).
05 TR-PRODNAME PIC X(30).
05 TR-PRODPRICE PIC 9(5).
05 TR-PRODQUANTITY PIC S9(6).
05 TR-PRODSALES PIC 9(6)V99.
WORKING-STORAGE SECTION.
*Current Date
01 CDate.
05 CYear PIC 9(4).
05 CMonth PIC 99.
05 CDay PIC 99.
*Current Time
01 CTime.
05 CHour PIC 99.
05 CMinute PIC 99.
*End of File
01 EOF PIC A(1).
*Input Product Code
01 WS-PR-CODE PIC 9(7).
PROCEDURE DIVISION.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
0000-MAIN.
PERFORM 1000-INCREMENT.
PERFORM 2000-INTRO.
PERFORM 3000-DATA-ENTRY-PR-CODE.
PERFORM 4000-OPEN-FILE.
PERFORM 5000-READ-MASTER-FILE.
PERFORM 6000-CLOSE-FILE.
*-----------------------------------------------------------------
1000-INCREMENT.
*Increment the transaction code to 1
MOVE 000000 TO TR-CODE
ADD 1 TO TR-CODE.
*-----------------------------------------------------------------
2000-INTRO.
*Current date and time validation
ACCEPT CDate FROM DATE YYYYMMDD.
ACCEPT CTime FROM TIME.
*System's header
DISPLAY SPACES.
DISPLAY "--------------------------------------------------".
DISPLAY "| INVENTORY SYSTEM |".
DISPLAY "--------------------------------------------------".
DISPLAY SPACES.
DISPLAY " TRANSACTION NUMBER : "TR-CODE
DISPLAY " TRANSACTION DATE : "CMonth"/"CDay"/"CYear
DISPLAY " TRANSACTION TIME : "CHour":"CMinute
DISPLAY SPACES.
DISPLAY " **** PLEASE ENTER PRODUCT DETAILS **** ".
*-----------------------------------------------------------------
3000-DATA-ENTRY-PR-CODE.
DISPLAY "PRODUCT CODE : " WITH NO ADVANCING.
ACCEPT WS-PR-CODE.
PERFORM 5000-READ-MASTER-FILE.
*-----------------------------------------------------------------
4000-OPEN-FILE.
OPEN I-O MASTER-FILE
OPEN OUTPUT TRANSACTION-FILE.
*-----------------------------------------------------------------
5000-READ-MASTER-FILE.
PERFORM UNTIL EOF = "Y"
READ MASTER-FILE INTO WS-PR-CODE
AT END MOVE "Y" TO EOF
NOT AT END DISPLAY MASTER-RECORDS
END-READ
END-PERFORM.
*-----------------------------------------------------------------
6000-CLOSE-FILE.
CLOSE MASTER-FILE.
CLOSE TRANSACTION-FILE.
STOP RUN.
我猜想
您的意思是,当您收到错误时,您正在执行3000-DATA-ENTRY-PR-CODE,该错误为
PERFORM 3000-DATA-ENTRY-PR-CODE.
PERFORM 4000-OPEN-FILE.
PERFORM 5000-READ-MASTER-FILE.
请注意,您直接跳转到5000-READ-MASTER-FILE,而从未执行过打开文件的4000-OPEN-FILE
与其跳转执行5000-READ-MASTER-FILE.,我将从该部分返回,并允许您的主流控件首先打开然后读取主文件。我认为您应该使用的是索引顺序文件。使用顺序文件,您的选项将是 *将文件加载到数组中,然后在最后重写它 *复制到索引文件,然后将其复制回 *为每次更新打开和关闭文件,并重写每条记录 以上选项均不应使用 索引文件的定义如下所示: 001600选择VSAM-KSDS-FILE分配VSAMKSDS 001700组织已编制索引 001800*注意下一个随机事件 001900访问模式是随机的 002000记录键为VSAM-KSDS-RECORD-KEY 000600文件状态为VSAM-STATUS-CODE 000700 VSAM-EXTENDED-STATUS-CODE。 阅读 将密钥移动到文件记录密钥 读取文件 无效的键显示读取错误:-,FileStatus 端读
这有几个索引顺序示例,Bruce Martin也是正确的。唯一明智的方法是使用索引文件,在每次输入后都必须显示信息 但是,这可能是您必须使用顺序文件完成的练习 首先,您需要一个进程来驱动您的程序,在本例中,它是用户输入。这应该是程序的主循环 对于除终端1之外的每个用户输入,打开文件,循环读取文件直到文件结束,并在该循环中根据主文件上的数据测试用户输入的数据,当存在匹配时生成输出。IF语句可能就是您将用于此目的的语句 如果这让你通过了作业,那就完全忘记这个技巧,记住我不能再那样做了。先设计,后编程 一些提示:查看如何使用和使用文件状态;程序划分中具有最小句号/周期数的代码;如果使用数字作为段落名称的前缀,在程序测试之前不要使用数字,这样可以避免重新编号,或者让它们陷入无用的混乱;理解并使用88个leven条件名称;我从来没有在真实的程序中看到过PICA,它的好处微乎其微,缺乏对它的了解会导致混乱;不要做得太多,但也不要做得太少 最后一个例子是:
3000-DATA-ENTRY-PR-CODE.
DISPLAY "PRODUCT CODE : " WITH NO ADVANCING.
ACCEPT WS-PR-CODE.
PERFORM 5000-READ-MASTER-FILE.
一个0,或者一个象征性的常数0,或者一个或多个零,不需要给定长度。编译器对其进行排序
MOVE 000000 TO TR-CODE
ADD 1 TO TR-CODE.
那是一样的。但这更好:
MOVE ZERO TO TR-CODE
ADD 1 TO TR-CODE
.
更容易理解没有人会问,为什么他们移动零然后添加1?更容易编码,维护和减少对CPU的压力 哦。我懂了。谢谢我试试。Eric J。它修复了文件的读取,但它显示了所有记录。如何根据用户输入的产品代码读取和显示特定记录?不确定。。。我用COBOL编程已经20多年了。我想试试这个。谢谢你的建议。竖起大拇指!
MOVE 1 TO TR-CODE
.