如何添加页码(COBOL)

时间:2013-04-04 01:30:37

标签: cobol

好的,所以我正在做作业但后来发现我被要求为每4条记录添加页码和更改页面。由于这是一个在线课程,我认为讲座视频中没有关于页码的内容。所以主要问题是

  1. 添加包含日期和页码的标题
  2. 每页打印4条记录,表示打印4条记录后需要更改页面。
  3. 我真的不知道该怎么做。

    以下是我完成的代码:

       ENVIRONMENT DIVISION.
       FILE-CONTROL.   SELECT STOCK-IN ASSIGN TO 'F:/CS201S13/PROJECT2.TXT'
                       ORGANIZATION IS LINE SEQUENTIAL.
                       SELECT STOCK-OUT ASSIGN TO 'F:/CS201S13/PROJECT2OUTPUT.TXT'
                       ORGANIZATION IS LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD STOCK-IN.
       01 STOCK-RECORD.
           05 ST-TRANSACTION-INFORMATION.
               10 ST-TRANSACTION-SHARES    PIC 9(3).
               10 ST-TRANSACTION-STOCK     PIC X(14).
           05 ST-PURCHASE-INFORMATION.
               10 ST-PURCHASE-PRICE        PIC 9(5)V99.
               10 ST-PURCHASE-DATE.
                   15 ST-PURCHASE-YEAR     PIC 99.
                   15 ST-PURCHASE-MONTH    PIC 99.
                   15 ST-PURCHASE-DAY      PIC 99.
           05 ST-SALE-INFORMATION.
               10 ST-SALE-PRICE            PIC 9(5)V99.
               10 ST-SALE-DATE.
                   15 ST-SALE-YEAR         PIC 99.
                   15 ST-SALE-MONTH        PIC 99.
                   15 ST-SALE-DAY          PIC 99.
       FD STOCK-OUT. 
       01 STOCK-RECORD-OUT.
           05 ST-TRANSACTION-INFORMATION-OUT.
               10 ST-TRANSACTION-SHARES-OUT PIC 9(3).
               10 ST-TRANSACTION-STOCK-OUT  PIC X(14).
           05 TOTAL-PURCHASE               PIC 9(8)V99.
           05                              PIC X(4).
           05 TOTAL-SALE                   PIC 9(8)V99.
           05                              PIC X(4).
           05 TOTAL-PROFIT                 PIC 9(8)V99.
           05                              PIC X(4).
           05 ST-PURCHASE-DATE-OUT.
               10 ST-PURCHASE-YEAR-OUT     PIC 99.
               10                          PIC X VALUE '/'.
               10 ST-PURCHASE-MONTH-OUT    PIC 99.
               10                          PIC X VALUE '/'.
               10 ST-PURCHASE-DAY-OUT      PIC 99.
           05                              PIC X(4).
           05 ST-SALE-DATE-OUT.
               10 ST-SALE-YEAR-OUT         PIC 99.
               10                          PIC X VALUE '/'.
               10 ST-SALE-MONTH-OUT        PIC 99.
               10                          PIC X VALUE '/'.
               10 ST-SALE-DAY-OUT          PIC 99.
           05                              PIC X(4).
           05 RECORD-OUT                   PIC 9 VALUE 0.
           05 PAGE-OUT                     PIC 9.
       WORKING-STORAGE SECTION.
       01 ARE-THERE-MORE-RECORDS PIC XXX VALUE 'YES'.
       01 IS-THIS-PAGE-FULL      PIC XXX VALUE 'NO '.
       PROCEDURE DIVISION.
       100-MAIN-PROCESS.
       OPEN INPUT STOCK-IN
            OUTPUT STOCK-OUT
       MOVE ST-TRANSACTION-INFORMATION TO ST-TRANSACTION-INFORMATION-OUT
       PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO '
           READ STOCK-IN
               AT END
                   MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
               NOT AT END
                   PERFORM 200-PROCEDURE-RTN
                   ADD 1 TO RECORD-OUT
           END-READ
       END-PERFORM
       CLOSE STOCK-IN
             STOCK-OUT
       STOP RUN.
       200-PROCEDURE-RTN.
       IF RECORD-OUT = 4
           MOVE 'YES' TO IS-THIS-PAGE-FULL
           MOVE 0 TO RECORD-OUT
           MOVE 'NO ' TO IS-THIS-PAGE-FULL
           ADD 1 TO PAGE-OUT
       END-IF
       MULTIPLY ST-PURCHASE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-PURCHASE
       MULTIPLY ST-SALE-PRICE BY ST-TRANSACTION-SHARES GIVING TOTAL-SALE
       SUBTRACT TOTAL-PURCHASE FROM TOTAL-SALE GIVING TOTAL-PROFIT
       WRITE STOCK-RECORD-OUT.
    

2 个答案:

答案 0 :(得分:5)

你们都很近,而且很远。

“关闭”,因为在将IS-THIS-PAGE-FULL设置为YES和NO之间需要一些代码。

“很远”因为你有很多事要做,而不仅仅是“修补”你拥有的东西。

程序是否正在编写输出文件(STOCK-OUT)报告,或者是STOCK-OUT报告?如果是报告,请更改名称,以便明确它是报告,而不是输出文件。

如果这看起来很多,请不要担心。您应该学习如何在Cobol中编程,以及学习Cobol。不会在一夜之间发生。

没有特别的顺序:

  • 始终包括对所有文件的所有IO操作的FILE-STATUS检查。目前,如果你的输入无法打开并且系统没有使程序失败(即使你的输入也是如此,你可能会学习Cobol能够使用任何系统,而不仅仅是你的系统有)那么没有记录会被阅读,你的“文件结束测试”将永远不会是,你将有一个BFL(大脂肪循环)。通过FILE-STATUS检查,产生有用的消息,包括适用于READ或WRITE失败的密钥/参考/记录号。

你可能觉得这是很多工作。但是,将所有内容放在一起的“模板”文件中,然后每次将这些文件粘贴(甚至复制)到程序中。

  • 您在FD中有VALUE子句。这些不符合您的想法。

  • 您的页数有一位数,不太可能有一般申请。

  • 为什么使用YES和NO作为文字?查看SET动词,与“条件名称”相关,使用88进行测试和“标志/开关”。

  • 在输入打开之后但在读取记录之前,您有“移动ST-TRANSACTION-INFORMATION”,并且在程序中只有一个引用它。这不会起作用。

  • 要阅读文件,请查看“启动阅读”方法。

    读取输入 循环直到文件结束(文件状态为88)   处理数据   读输入 端环

这避免了AT END / NOT AT END,允许处理标题(如果存在)和“空文件”而不会堵塞主逻辑。代码“扩展”了标题/预告片(包括它们的正确数量),键的序列检查等,但你只需要编码一次然后“模板”它。

  • 根据您FD中的VALUE子句,您希望RECORD-OUT为零,因此4的测试实际上会让您在第一页上获得5,之后会有4个。

  • 您总是假设会有“利润”(正数),这是不现实的,但您不允许“利润”的签名值。

现在,报告。

对于您的报告FD,只需简单一点,即打印行的长度。

在WORKING-STORAGE中,定义所需标题和标题的数据。定义打印行的数据。由于您处于工作存储状态,因此在PROCEDURE DIVISION中为所有不具有MOVEd数据的内容添加VALUE。

如果您已经写了四个项目(或者当您的程序告诉您这个项目时)并且您有第五个项目,请编写标题和标题,记住更新页码。

我说“或者当你的程序告诉你这个”时,因为你可以将“写入的记录”的原始值设置为4.注释它,以便很清楚它是你想要的,以及为什么你想要它。原因是,你不必再处理“第一次”标题和其他事情。第一次,或者“控制中断”(我想你很快就会到达那里)将“已经在页面上完成”设置为页面的最大值,并且标题会在你想要的时候弹出。

格式化打印行。执行para打印(这是“页面已满”测试的位置)。

注意:您可以在日期中使用VALUE作为“/”s,或者您可以使用PICture中的“/”编辑字符,如下所示:

05  an-input-date PIC X(8) (can be other definitions).
...
05  date-to-print PIC X(4)/XX/XX.
...
MOVE an-input-date TO date-to-print

我喜欢看到你正在使用“最小全停/期间”。你可以再往前走一点。

MOVE an-input-date TO date-to-print
.

然后你在一个段落中得到你的最后一个句号/句号,而没有“附加”到任何特定的代码行,这使得“折腾代码”更容易,因为你不必考虑“我做需要/不需要那里的全停/句号“。

您还可以在这里查看一些Cobol问题,并了解一些常规技巧和建议。

答案 1 :(得分:2)

如果不支持LINAGE,这可能会有所帮助,也可能没有用,你必须做一些明确的计算。

  *****************************************************************
  * Example of LINAGE File Descriptor
  * Author: Brian Tiffin
  * Date:   10-July-2008
  * Tectonics: $ cobc -x linage.cob
  *            $ ./linage <filename ["linage.cob"]>
  *            $ cat -n mini-report
  *****************************************************************
   IDENTIFICATION DIVISION.
   PROGRAM-ID. linage-demo.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      select optional data-file assign to file-name
          organization is line sequential
          file status is data-file-status.
      select mini-report assign to "mini-report".

   DATA DIVISION.
   FILE SECTION.
   FD  data-file.
   01  data-record.
      88 endofdata        value high-values.
      02 data-line        pic x(80).
   FD  mini-report
      linage is 16 lines
          with footing at 15
          lines at top 2
          lines at bottom 2.
   01  report-line         pic x(80).

   WORKING-STORAGE SECTION.
   01  command-arguments   pic x(1024).
   01  file-name           pic x(160).
   01  data-file-status    pic 99.
   01  lc                  pic 99.
   01  report-line-blank.
      02 filler           pic x(18) value all "*".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(34)
          VALUE "THIS PAGE INTENTIONALLY LEFT BLANK".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(18) value all "*".
   01  report-line-data.
      02 body-tag         pic 9(6).
      02 line-3           pic x(74).
   01  report-line-header.
      02 filler           pic x(6) VALUE "PAGE: ".
      02 page-no          pic 9999.
      02 filler           pic x(24).
      02 filler           pic x(5) VALUE " LC: ".
      02 header-tag       pic 9(6).
      02 filler           pic x(23).
      02 filler           pic x(6) VALUE "DATE: ".
      02 page-date        pic x(6).

   01  page-count          pic 9999.

   PROCEDURE DIVISION.

   accept command-arguments from command-line end-accept.
   string
      command-arguments delimited by space
      into file-name
   end-string.
   if file-name equal spaces
      move "linage.cob" to file-name
   end-if.

   open input data-file.
   read data-file
      at end
          display
               "File: " function trim(file-name)
               " open error or empty"
          end-display
          go to early-exit
   end-read.

   open output mini-report.

   write report-line
      from report-line-blank
   end-write.

   move 1 to page-count.
   accept page-date from date end-accept.
   move page-count to page-no.
   write report-line
      from report-line-header
      after advancing page
   end-write.

   perform readwrite-loop until endofdata.

   display
      "Normal termination, file name: "
      function trim(file-name)
      " ending status: "
      data-file-status
   end-display.
   close mini-report.

  * Goto considered harmful?  Bah!  :)
   early-exit.
   close data-file.
   exit program.
   stop run.

  ****************************************************************
   readwrite-loop.
   move data-record to report-line-data
   move linage-counter to body-tag
   write report-line from report-line-data
      end-of-page
          add 1 to page-count end-add
          move page-count to page-no
          move linage-counter to header-tag
          write report-line from report-line-header
              after advancing page
          end-write
   end-write
   read data-file
      at end set endofdata to true
   end-read
   .

  *****************************************************************
  * Commentary
  * LINAGE is set at a 20 line logical page
  *  16 body lines
  *   2 top lines
  *   A footer line at 15 (inside the body count)
  *   2 bottom lines
  * Build with:
  * $ cobc -x -Wall -Wtruncate linage.cob
  * Evaluate with:
  * $ ./linage
  * This will read in linage.cob and produce a useless mini-report
  * $ cat -n mini-report
  *****************************************************************
   END PROGRAM linage-demo.