Cobol,代码65文件已锁定
我试图访问同一个文件以执行两个特定任务。第一个任务是更新、添加和删除记录。访问必须是随机的。第二个任务是在控制台上显示所有记录。访问必须是顺序的。我从COBOL接收到Cobol,代码65文件已锁定,cobol,Cobol,我试图访问同一个文件以执行两个特定任务。第一个任务是更新、添加和删除记录。访问必须是随机的。第二个任务是在控制台上显示所有记录。访问必须是顺序的。我从COBOL接收到code 65文件锁定,因为程序试图在同一时间访问同一文件两次。有没有办法修复这个错误?还是有不同的方法来做到这一点?或者我必须编写一个单独的程序来在控制台上显示记录吗?我被卡住了 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. S
code 65文件锁定
,因为程序试图在同一时间访问同一文件两次。有没有办法修复这个错误?还是有不同的方法来做到这一点?或者我必须编写一个单独的程序来在控制台上显示记录吗?我被卡住了
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MAST-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-5\SALES.IND.TXT'
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY M-SALESPERSON-NUM.
SELECT MAST2-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-5\SALES.IND.TXT'
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
RECORD KEY M2-SALESPERSON-NUM.
DATA DIVISION.
FILE SECTION.
FD MAST-FILE
LABEL RECORDS ARE STANDARD.
01 MAST-RECORD.
05 M-SALESPERSON-NUM PIC XXX.
05 M-CUSTOMER-NAME PIC X(15).
05 M-TOTAL-SALES PIC 9(5)V99.
05 M-COST-OF-SALES PIC 9(4)V99.
FD MAST2-FILE
LABEL RECORDS ARE STANDARD.
01 MAST2-RECORD.
05 M2-SALESPERSON-NUM PIC X(3).
05 M2-SALESPERSON-NAME PIC X(15).
05 M2-TOTAL-SALES PIC 9(5)V99.
05 M2-COST-OF-SALES PIC 9(4)V99.
WORKING-STORAGE SECTION.
01 SALES-DATA.
05 SALESPERSON-NUM PIC X(3).
05 SALESPERSON-NAME PIC X(15).
05 TOTAL-SALES PIC 9(5)V99.
05 COST-OF-SALES PIC 9(4)V99.
01 OUTPUT-RECORD.
05 PIC X(1) VALUE SPACES.
05 O-SALESPERSON-NUM PIC X(3).
05 PIC X(3) VALUE SPACES.
05 O-SALESPERSON-NAME PIC X(3).
05 PIC X(3) VALUE SPACES.
05 O-TOTAL-SALES PIC 9(5)V99.
05 PIC X(3) VALUE SPACES.
05 O-COST-OF-SALES PIC 9(4)V99.
01 PROGRAM-DATA-ITEMS.
05 I-SALESPERSON-NUM PIC XXX.
05 WAIT-OK PIC X.
05 CHOICE PIC 9 VALUE 0.
05 READ-OK PIC X.
05 REWRITE-OK PIC X.
05 DELETE-OK PIC X.
PROCEDURE DIVISION.
10-MAINLINE.
OPEN I-O MAST-FILE
OPEN INPUT MAST2-FILE
PERFORM 20-PROCESS-LOOP
CLOSE MAST-FILE
MAST2-FILE
STOP RUN.
20-PROCESS-LOOP.
PERFORM UNTIL CHOICE = 5
PERFORM 30-DISPLAY-MENU
EVALUATE CHOICE
WHEN 1
PERFORM 40-UPD-SALES
WHEN 2
PERFORM 90-ADD-SALES
WHEN 3
PERFORM 110-DELETE-SALES
WHEN 4
PERFORM 120-DISPLAY-SALES
END-EVALUATE
END-PERFORM.
30-DISPLAY-MENU.
DISPLAY 'SALES MAINTENANCE SYSTEM'
DISPLAY ' '
DISPLAY ' SELECT ONE:'
DISPLAY ' '
DISPLAY ' 1. UPDATE SALES RECORD'
DISPLAY ' 2. ADD SALES RECORD'
DISPLAY ' 3. DELETE SALES RECORD'
DISPLAY ' 4. DISPLAY SALES RECORD'
DISPLAY ' 5. QUIT'
DISPLAY ' '
DISPLAY 'ENTER CHOICE (1 - 5): ' WITH NO ADVANCING
ACCEPT CHOICE
PERFORM UNTIL CHOICE >= 1 AND <= 5
DISPLAY ' '
DISPLAY 'ERROR: ENTER CHOICE (1 - 5): ' WITH NO ADVANCING
ACCEPT CHOICE
END-PERFORM.
40-UPD-SALES.
DISPLAY 'UPDATE SALES: ENTER SALESPERSON NUMBER: ' WITH NO ADVANCING
ACCEPT SALESPERSON-NUM
MOVE SALESPERSON-NUM TO M-SALESPERSON-NUM
PERFORM 50-READ-RECORD
IF READ-OK = 'N'
DISPLAY 'RECORD DOES NOT EXIST - PRESS ENTER'
ACCEPT WAIT-OK
ELSE
DISPLAY SALES-DATA
PERFORM 100-INPUT-NEW-RECORD
PERFORM 60-REWRITE-RECORD
END-IF.
50-READ-RECORD.
MOVE 'Y' TO READ-OK
READ MAST-FILE INTO SALES-DATA
INVALID KEY
MOVE 'N' TO READ-OK
END-READ.
60-REWRITE-RECORD.
REWRITE MAST-RECORD FROM SALES-DATA
INVALID KEY
DISPLAY 'REWRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-REWRITE.
70-WRITE-RECORD.
MOVE 'Y' TO REWRITE-OK
WRITE MAST-RECORD FROM SALES-DATA
INVALID KEY
MOVE 'N' TO REWRITE-OK
END-WRITE
IF REWRITE-OK = 'N'
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF.
80-DELETE-RECORD.
MOVE 'Y' TO DELETE-OK
DELETE MAST-FILE
INVALID KEY
MOVE 'N' TO DELETE-OK
END-DELETE
IF REWRITE-OK = 'N'
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF.
90-ADD-SALES.
DISPLAY 'ADD SALES RECORD: ENTER SALESPERSON NUMBER: ' WITH NO ADVANCING
ACCEPT SALESPERSON-NUM
MOVE SALESPERSON-NUM TO M-SALESPERSON-NUM
PERFORM 50-READ-RECORD
IF READ-OK = 'Y'
DISPLAY 'RECORD ALREADY EXISTS - PRESS ENTER'
ACCEPT WAIT-OK
ELSE
PERFORM 100-INPUT-NEW-RECORD
PERFORM 70-WRITE-RECORD
IF REWRITE-OK = 'Y'
DISPLAY 'RECORD ' SALESPERSON-NUM ' ADDED TO FILE'
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF
END-IF.
100-INPUT-NEW-RECORD.
MOVE SALESPERSON-NUM TO M-SALESPERSON-NUM
DISPLAY ' ENTER SALESPERSON NAME: ' WITH NO ADVANCING
ACCEPT SALESPERSON-NAME
DISPLAY ' ENTER TOTAL SALES: ' WITH NO ADVANCING
ACCEPT TOTAL-SALES
DISPLAY ' ENTER COST OF SALES: ' WITH NO ADVANCING
ACCEPT COST-OF-SALES.
110-DELETE-SALES.
DISPLAY 'DELETE SALES RECORD: ENTER SALESPERSON NUMBER: ' WITH NO ADVANCING
ACCEPT SALESPERSON-NUM
MOVE SALESPERSON-NUM TO M-SALESPERSON-NUM
PERFORM 50-READ-RECORD
IF READ-OK = 'N'
DISPLAY 'RECORD DOES NOT EXIST - PRESS ENTER'
ACCEPT WAIT-OK
ELSE
PERFORM 80-DELETE-RECORD
IF DELETE-OK = 'Y'
DISPLAY 'RECORD DELETED - PRESS ENTER'
ACCEPT WAIT-OK
END-IF
END-IF.
120-DISPLAY-SALES.
MOVE SALESPERSON-NUM TO M2-SALESPERSON-NUM
MOVE SALESPERSON-NAME TO M2-SALESPERSON-NAME
MOVE TOTAL-SALES TO M2-TOTAL-SALES
MOVE COST-OF-SALES TO M2-COST-OF-SALES
READ MAST2-FILE
AT END MOVE HIGH-VALUES TO M2-SALESPERSON-NUM
END-READ
PERFORM UNTIL M2-SALESPERSON-NUM = HIGH-VALUES
MOVE M2-SALESPERSON-NUM TO O-SALESPERSON-NUM
MOVE M2-SALESPERSON-NAME TO O-SALESPERSON-NAME
MOVE M2-TOTAL-SALES TO O-TOTAL-SALES
MOVE M2-COST-OF-SALES TO O-COST-OF-SALES
DISPLAY OUTPUT-RECORD
READ MAST2-FILE
AT END MOVE HIGH-VALUES TO M2-SALESPERSON-NUM
END-READ
END-PERFORM.
end program Program1.
环境部。
输入输出部分。
文件控制。
选择MAST-FILE分配给“G:\CPSC315-COBOL\COBOLAssignments\P15-5\SALES.IND.TXT”
组织被编入索引
访问是随机的
记录键M-SALESPERSON-NUM。
选择MAST2-FILE分配给“G:\CPSC315-COBOL\COBOLAssignments\P15-5\SALES.IND.TXT”
组织被编入索引
访问是顺序的
记录键M2-SALESPERSON-NUM。
数据司。
文件部分。
FD-MAST-FILE
标签记录是标准的。
01桅杆记录。
05 M-SALESPERSON-NUM PIC XXX。
05 M-客户名称图X(15)。
05 M-总销售额图9(5)V99。
05 M-销售成本图9(4)V99。
FD MAST2文件
标签记录是标准的。
01 MAST2-记录。
05 M2-销售人员-数量图X(3)。
05 M2-销售人员姓名图X(15)。
05平方米-总销售额图9(5)V99。
05平方米-销售成本图9(4)V99。
工作和储存科。
01销售数据。
05销售人员数量图X(3)。
05销售人员姓名图X(15)。
05总销售额图9(5)V99。
05销售成本图9(4)V99。
01输出记录。
05 PIC X(1)值空间。
05 O-销售员人数图X(3)。
05 PIC X(3)值空间。
05 O-销售人员姓名图X(3)。
05 PIC X(3)值空间。
05 O-总销售额图9(5)V99。
05 PIC X(3)值空间。
05销售成本图9(4)V99。
01程序数据项。
05 I-销售人员编号PIC XXX。
05等待-好,图X。
05选择PIC 9值0。
05 READ-OK图X。
05重写-OK图X。
05删除-确定图X。
程序司。
10号干线。
打开I-O文件
打开输入MAST2文件
执行20进程循环
关闭文件
MAST2-FILE
停,跑。
20-过程-循环。
执行直到选择=5
执行30-显示-菜单
评估选择
当1
执行40-UPD-销售
当2
执行90%的附加销售
当3
执行110-DELETE-SALES
当4
执行120-显示-销售
最终评估
结束表演。
30-显示-菜单。
显示“销售维护系统”
显示''
显示“选择一个:”
显示''
显示'1。更新销售记录'
显示'2。添加销售记录'
显示'3。删除销售记录'
显示'4。显示销售记录'
显示'5。退出
显示''
显示“输入选项(1-5)”,不前进
接受选择
当您打开文件I-O时,执行直到选项>=1和,这意味着您打开它进行输入和输出。扔掉你的第二个文件
要定位文件以显示数据,可以使用键读取,然后读取。。。下一步…,或者您可以使用开始。。。然后读。。。下一个
始终在分配中使用文件状态。然后使用您告诉COBOL将文件状态输入到的文件状态字段来检查以前的IO。将其用作文件结尾(值为“10”)。使用88。这样,您就不需要无效的键,并且在END和所有与IO相关联的END语句都可以执行,因为这样您就没有IO的内置条件。这将简化事情
你的结构对初学者来说很好。刷新看到没有执行。。。通过
我建议您在第12列的一行中尝试使用单个句号/句点的效果。然后,您就可以移动段落的最后一行代码,而不必考虑附加到它的句号/句点(因为它没有附加到它)
使用更多的执行。打开和关闭对程序的逻辑并不重要。将它们隐藏在段落中,对它们执行文件状态检查。读/写/删除和任何其他IO语句也是如此。将它们隐藏在您执行的命名良好的过程中
考虑一些IFs的大小(行数)。将代码放在一个命名良好的过程中,代码可以由人在较高的层次上“读取”,只有在需要时才查看细节
不要,不要,不要,乱搞两个文件。不要,不要,不要打开同一个文件两次(在我的时间里,我已经编写了一些COBOL程序,而且我从来没有想过,这是实现任何事情的合理方法,更不用说你所做的简单任务了)
<>你可能想考虑动态的而不是随机的(这就是它的目的)。如果您只进行随机访问,则使用RANDOM。实际上,您也希望进行顺序访问(查找有关跳过顺序访问的参考,以便进一步讨论)
变成:
50-READ-RECORD.
READ MAST-FILE KEY key-name INTO SALES-DATA
IF NOT ( W-MAST-FILE-OR-OR-NOT-FOUND )
some code to deal with the pickle, which is nothing to do with
business-logic, so hide it away
END-IF
.
80-DELETE-RECORD.
MOVE 'Y' TO DELETE-OK
DELETE MAST-FILE
INVALID KEY
MOVE 'N' TO DELETE-OK
END-DELETE
IF REWRITE-OK = 'N'
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF.
80-DELETE-RECORD.
DELETE MAST-FILE
IF NOT W-MAST-FILE-LAST-IO-OK
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF
.
变成:
50-READ-RECORD.
READ MAST-FILE KEY key-name INTO SALES-DATA
IF NOT ( W-MAST-FILE-OR-OR-NOT-FOUND )
some code to deal with the pickle, which is nothing to do with
business-logic, so hide it away
END-IF
.
80-DELETE-RECORD.
MOVE 'Y' TO DELETE-OK
DELETE MAST-FILE
INVALID KEY
MOVE 'N' TO DELETE-OK
END-DELETE
IF REWRITE-OK = 'N'
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF.
80-DELETE-RECORD.
DELETE MAST-FILE
IF NOT W-MAST-FILE-LAST-IO-OK
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF
.
每个IO段落都是自包含、自验证的,当您处于业务逻辑中时,“文件状态”字段自然只具有良好的状态。在这些段落中,你要处理的“不可能发生”(但总有一天会发生)
您可以在其他地方编写代码。您的“标志”数量减少(文件状态字段的值替换了对标志的需要)您的IOs没有条件pa
80-DELETE-RECORD.
DELETE MAST-FILE
IF NOT W-MAST-FILE-LAST-IO-OK
DISPLAY 'WRITE ERROR: SALESPERSON NUMBER ' SALESPERSON-NUM
DISPLAY 'PRESS ENTER TO CONTINUE'
ACCEPT WAIT-OK
END-IF
.