Cobol,代码65文件已锁定

Cobol,代码65文件已锁定,cobol,Cobol,我试图访问同一个文件以执行两个特定任务。第一个任务是更新、添加和删除记录。访问必须是随机的。第二个任务是在控制台上显示所有记录。访问必须是顺序的。我从COBOL接收到code 65文件锁定,因为程序试图在同一时间访问同一文件两次。有没有办法修复这个错误?还是有不同的方法来做到这一点?或者我必须编写一个单独的程序来在控制台上显示记录吗?我被卡住了 ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. S

我试图访问同一个文件以执行两个特定任务。第一个任务是更新、添加和删除记录。访问必须是随机的。第二个任务是在控制台上显示所有记录。访问必须是顺序的。我从COBOL接收到
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
    .