顺序读取文件中的特定记录然后显示它
Sequentially read a specific record in a file then display it
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.
我该如何解决这个问题?我的问题是当我输入产品代码时,它不显示产品详细信息。错误是 READ/START 不允许。你能教我如何在文件中找到特定的记录吗?起初我手动创建.DAT文件,根据数据类型和格式插入几条记录。请参阅 .DAT 文件 here.
这是示例输出:
让我们看看你的流量控制。第一节:
PERFORM 3000-DATA-ENTRY-PR-CODE.
PERFORM 4000-OPEN-FILE.
PERFORM 5000-READ-MASTER-FILE.
我假设
你的意思是当你得到错误时你正在执行 3000-DATA-ENTRY-PR-CODE
,它显示为
3000-DATA-ENTRY-PR-CODE.
DISPLAY "PRODUCT CODE : " WITH NO ADVANCING.
ACCEPT WS-PR-CODE.
PERFORM 5000-READ-MASTER-FILE.
请注意,您直接跳转到 5000-READ-MASTER-FILE
,而没有执行 4000-OPEN-FILE
,这会打开文件。
我不会跳转到 PERFORM 5000-READ-MASTER-FILE.
,而是从该部分 return 并允许您的主流程控制先打开然后读取主文件。
我认为您应该使用的是 索引顺序 文件。使用顺序文件,您的选择是
* 将文件加载到数组中,然后在最后重写它
* 复制到一个索引文件然后再复制回来
* 为每次更新打开和关闭文件(并重写每条记录)。
none 以上选项应该 ever 被使用 !!!
索引文件的定义类似于(取自Index file processing:
001600 SELECT VSAM-KSDS-FILE ASSIGN VSAMKSDS
001700 ORGANIZATION IS INDEXED
001800* NOTICE THE RANDOM NEXT
001900 ACCESS MODE IS RANDOM
002000 RECORD KEY IS VSAM-KSDS-RECORD-KEY
000600 FILE STATUS IS VSAM-STATUS-CODE
000700 VSAM-EXTENDED-STATUS-CODE.
并阅读
Move key to File-record-key
READ File
INVALID KEY DISPLAY "Read Error :-", FileStatus
END-READ
布鲁斯·马丁是正确的。要做到这一点,您必须在每次输入后显示信息,唯一明智的方法是使用索引文件。
但是,这可能是您必须使用顺序文件完成的练习。
首先,您需要一个进程来驱动您的程序,在本例中是用户输入。这应该是程序的主循环。
对于除终端输入之外的每个用户输入,您打开文件,循环读取文件直到文件结束,然后在该循环中测试用户输入的数据 与主文件 上的 数据匹配,当匹配时生成输出。 IF
语句可能是您将要使用的语句。
如果这让你完成了作业,那么完全忘记这个 "technique",除了记住 "I mustn't do it that way again. Design first, program after."
一些小技巧:看看如何使用,使用,FILE STATUS; PROCEDURE DIVISION中full-stops/periods个数最少的代码;如果使用数字作为段落名称的前缀,在程序测试之前不要把它们放在上面,这样可以避免重新编号或让它们陷入无用的纠结中;理解 88-leven 条件名称,并使用它们;我从未在真正的程序中见过 PIC A
,它的好处微乎其微,不了解它会导致混淆;不可多,不可少。
最后一个例子是这样的:
MOVE 000000 TO TR-CODE
ADD 1 TO TR-CODE.
A 0 或比喻常数 ZERO(或 ZEROS 或 ZEROES)不必指定长度。编译器整理出来了。
MOVE ZERO TO TR-CODE
ADD 1 TO TR-CODE
.
也是一样。但这样更好:
MOVE 1 TO TR-CODE
.
更容易理解(没有人会问,"why do they MOVE ZERO then ADD 1?"),更容易编码、维护并且对 CPU 的压力更小。
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.
我该如何解决这个问题?我的问题是当我输入产品代码时,它不显示产品详细信息。错误是 READ/START 不允许。你能教我如何在文件中找到特定的记录吗?起初我手动创建.DAT文件,根据数据类型和格式插入几条记录。请参阅 .DAT 文件 here.
这是示例输出:
让我们看看你的流量控制。第一节:
PERFORM 3000-DATA-ENTRY-PR-CODE.
PERFORM 4000-OPEN-FILE.
PERFORM 5000-READ-MASTER-FILE.
我假设
你的意思是当你得到错误时你正在执行 3000-DATA-ENTRY-PR-CODE
,它显示为
3000-DATA-ENTRY-PR-CODE.
DISPLAY "PRODUCT CODE : " WITH NO ADVANCING.
ACCEPT WS-PR-CODE.
PERFORM 5000-READ-MASTER-FILE.
请注意,您直接跳转到 5000-READ-MASTER-FILE
,而没有执行 4000-OPEN-FILE
,这会打开文件。
我不会跳转到 PERFORM 5000-READ-MASTER-FILE.
,而是从该部分 return 并允许您的主流程控制先打开然后读取主文件。
我认为您应该使用的是 索引顺序 文件。使用顺序文件,您的选择是 * 将文件加载到数组中,然后在最后重写它 * 复制到一个索引文件然后再复制回来 * 为每次更新打开和关闭文件(并重写每条记录)。
none 以上选项应该 ever 被使用 !!!
索引文件的定义类似于(取自Index file processing:
001600 SELECT VSAM-KSDS-FILE ASSIGN VSAMKSDS
001700 ORGANIZATION IS INDEXED
001800* NOTICE THE RANDOM NEXT
001900 ACCESS MODE IS RANDOM
002000 RECORD KEY IS VSAM-KSDS-RECORD-KEY
000600 FILE STATUS IS VSAM-STATUS-CODE
000700 VSAM-EXTENDED-STATUS-CODE.
并阅读
Move key to File-record-key
READ File
INVALID KEY DISPLAY "Read Error :-", FileStatus
END-READ
布鲁斯·马丁是正确的。要做到这一点,您必须在每次输入后显示信息,唯一明智的方法是使用索引文件。
但是,这可能是您必须使用顺序文件完成的练习。
首先,您需要一个进程来驱动您的程序,在本例中是用户输入。这应该是程序的主循环。
对于除终端输入之外的每个用户输入,您打开文件,循环读取文件直到文件结束,然后在该循环中测试用户输入的数据 与主文件 上的 数据匹配,当匹配时生成输出。 IF
语句可能是您将要使用的语句。
如果这让你完成了作业,那么完全忘记这个 "technique",除了记住 "I mustn't do it that way again. Design first, program after."
一些小技巧:看看如何使用,使用,FILE STATUS; PROCEDURE DIVISION中full-stops/periods个数最少的代码;如果使用数字作为段落名称的前缀,在程序测试之前不要把它们放在上面,这样可以避免重新编号或让它们陷入无用的纠结中;理解 88-leven 条件名称,并使用它们;我从未在真正的程序中见过 PIC A
,它的好处微乎其微,不了解它会导致混淆;不可多,不可少。
最后一个例子是这样的:
MOVE 000000 TO TR-CODE
ADD 1 TO TR-CODE.
A 0 或比喻常数 ZERO(或 ZEROS 或 ZEROES)不必指定长度。编译器整理出来了。
MOVE ZERO TO TR-CODE
ADD 1 TO TR-CODE
.
也是一样。但这样更好:
MOVE 1 TO TR-CODE
.
更容易理解(没有人会问,"why do they MOVE ZERO then ADD 1?"),更容易编码、维护并且对 CPU 的压力更小。