" DEALER.DAT" 148错误的打开模式或写入访问模式

时间:2015-03-24 20:39:31

标签: cobol

我没有错误,我正在使用可视工作室进行编译。我有两个输入文件和两个输出文件,它们应该使用事务将经销商文件中的数据更新到经销商文件

   program-id. FREDERICKBOWSERProgram3 as "CSDP 241 .Program3".

   ENVIRONMENT DIVISION.

   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT Dealer ASSIGN TO "Dealer.dat" ORGANIZATION IS SEQUENTIAL.

      SELECT Trans  ASSIGN TO "Trans.dat" ORGANIZATION IS SEQUENTIAL.                                
       SELECT DealOut ASSIGN TO "Dealer-Out.TXT"
               FILE STATUS IS DealOut-FILE-STATUS.
       SELECT RejectOut ASSIGN TO "Reject.TXT"
               FILE STATUS IS RejectOut-FILE-STATUS.
   data division.
   FILE SECTION.
   FD Dealer.
       01 INPUT1                      PIC X(165).

   FD Trans.
       01 INPUT2                      PIC X(32).
    FD DealOut.
           01 OUTPUT1                   PIC X(165).
    FD RejectOut.
           01 OUTPUT2                  PIC X(32).
   working-storage section.        
   01  SWITCHES.
       05  FIRST-EXECUTION-SWITCH        PIC X    VALUE "Y".
           88  FIRST-EXECUTION                        VALUE "Y".
       05  ALL-RECORDS-PROCESSED-SWITCH      PIC X    VALUE "N".
           88  ALL-RECORDS-PROCESSED                  VALUE "Y".
   01 PRINT-AREA.
    03  Dealer-Number                    Pic X(8).
           03  Dealer-Name.
               05  Last-Name                    Pic X(25).
               05  First-Name                   Pic X(15).
               05  Middle-Name                  Pic X(10).
           03  Address-Line-1                   Pic X(38).
           03  City                             Pic X(21).
           03  State-Or-Country                 Pic X(5).
           03  Postal-Code                      Pic 9(5).
           03  Consignment-Percent              Pic 9(3).
           03  Last-Sold-Amount                 Pic S9(7)v99.
           03  Last-Sold-Date                   Pic 9(8).
           03  Sold-To-Date                     Pic S9(7)v99.
           03  Commission-To-Date               Pic S9(7)v99. 
   01 PRINT-AREA2.
       03  Transaction-Date                 Pic  9(8).
       03  Transaction-Text.
           05  Transaction-Type             Pic  X(4).
           05  Transaction-Dealer-Number    Pic  X(8).
       03  Transaction-Price                Pic  S9(7)v99.
       03  Transaction-Qty                  Pic  9(3).   
   01  FILE-STATUS-FIELDS.
       05  DealOut-FILE-STATUS     PIC XX.
           88  DealOut-SUCCESSFUL           VALUE "00".
       05  RejectOut-FILE-STATUS     PIC XX.
           88  RejectOut-SUCCESSFUL           VALUE "00".
   01 NEWNEW.
       05 CURRT-TRANS                  PIC S9(7)v99.
       05 CURRT-COMM                   PIC  9(3)v99.
   procedure division.

   000-UPDATE-TRANS-MASTER.
    OPEN INPUT Trans
               EXTEND Dealer
        OUTPUT DealOut     
         RejectOut.

       MOVE LOW-VALUE TO Dealer-Number.     
       PERFORM 200-PROCESS-TRANS
           UNTIL ALL-RECORDS-PROCESSED.

       CLOSE  Dealer
              Trans
              DealOut
              RejectOut.
       STOP RUN.
   200-PROCESS-TRANS.
       PERFORM 210-READ-TRANS.
       PERFORM 220-PROCESS-DEALER
               UNTIL Dealer-Number >= Transaction-Dealer-Number.
       IF     Dealer-Number = HIGH-VALUE
               AND Transaction-Dealer-Number = HIGH-VALUE
               SET ALL-RECORDS-PROCESSED TO TRUE
       ELSE
           IF INPUT1 = Transaction-Dealer-Number
               PERFORM 250-APPLY-TRANSACTION
           ELSE
               PERFORM 260-WRITE-ERROR-TRANSACTION.

   210-READ-TRANS.
       READ Trans INTO PRINT-AREA2
           AT END
               MOVE HIGH-VALUE TO Transaction-Dealer-Number.


   220-PROCESS-DEALER.

       IF FIRST-EXECUTION
           PERFORM 230-READ-OLD-DEALER
           MOVE "N" TO FIRST-EXECUTION-SWITCH
      ELSE
           PERFORM 240-WRITE-NEW-DEALER.
           PERFORM 230-READ-OLD-DEALER.
   230-READ-OLD-DEALER.

      READ Dealer INTO PRINT-AREA
           AT END
               MOVE HIGH-VALUE TO Dealer-Number.
   240-WRITE-NEW-DEALER.

       WRITE INPUT1 FROM PRINT-AREA.
       IF NOT DealOut-SUCCESSFUL
           DISPLAY "WRITE ERROR ON NEWMAST FOR ITEM NUMBER "
           Dealer-Number
            DISPLAY "FILE STATUS CODE IS " DealOut-FILE-STATUS
            SET ALL-RECORDS-PROCESSED TO TRUE.

   250-APPLY-TRANSACTION.
      MULTIPLY Transaction-Qty BY Transaction-Price GIVING CURRT-TRANS.
      ADD CURRT-TRANS TO Sold-To-Date.
      MULTIPLY CURRT-TRANS BY Consignment-Percent GIVING CURRT-COMM.
      ADD CURRT-COMM TO Commission-To-Date.



   260-WRITE-ERROR-TRANSACTION.

        WRITE OUTPUT2 FROM PRINT-AREA2.
        IF NOT RejectOut-SUCCESSFUL
           DISPLAY "WRITE ERROR ON ERRTRAN FOR ITEM NUMBER "
               Transaction-Dealer-Number
           DISPLAY "FILE STATUS CODE IS " RejectOut-FILE-STATUS
           SET ALL-RECORDS-PROCESSED TO TRUE.


   end program FREDERICKBOWSERProgram3.

2 个答案:

答案 0 :(得分:1)

您正在使用OPEN EXTEND代理商。

使用此方法是将记录添加到文件的“结尾”。之前的记录保持不变。

EXTENDOUTPUT类似,不过它会保留现有数据,并允许您的程序添加到其中。

使用EXTEND,您不希望READ该文件。而且你不希望更新记录。

您需要打开文件I-O

您应该对所有文件使用FILE STATUS,并在每次IO完成后检查值。

您没有使用“范围分隔符”。在1985年它们被引入之前就可以了,但是对于新代码这些天你应该使用范围分隔符。

这是一个很好的例子,来自你的代码:

   220-PROCESS-DEALER.

       IF FIRST-EXECUTION
           PERFORM 230-READ-OLD-DEALER
           MOVE "N" TO FIRST-EXECUTION-SWITCH
      ELSE
           PERFORM 240-WRITE-NEW-DEALER.
           PERFORM 230-READ-OLD-DEALER.

看倒数第二行。它以一个完整的句号结束,终止了IF的范围。下面一行缩进,好像它应该是IF的一部分,不是IF的一部分,它是无条件的。

当你这样编码时,这个错误就不那么容易了:

   220-PROCESS-DEALER.

       IF FIRST-EXECUTION
           PERFORM 230-READ-OLD-DEALER
           MOVE "N" TO FIRST-EXECUTION-SWITCH
       ELSE
           PERFORM 240-WRITE-NEW-DEALER
           PERFORM 230-READ-OLD-DEALER
       END-IF
       .

请注意,我已经使句点终止的句点尽可能容易被发现,并且没有将它附加到任何代码行。您现在可以复制/粘贴该代码,而不必担心它是否应该保留句号/句号,因为没有一行代码。

答案 1 :(得分:0)

写完Procedure Division后,当你关闭所有工作空间时,确保你使用了goback.关键字

例如:

CLOSE  Dealer
       Trans
       DealOut
       RejectOut.

       goback.
相关问题