如何添加页码(COBOL)

Luy*_*ian 3 cobol

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

  1. 要添加包含日期和页码的标题,
  2. 每页打印4条记录,这意味着打印4条记录后需要更改页面.

我真的不知道该怎么做.

这是我完成的代码:

   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.
Run Code Online (Sandbox Code Playgroud)

Bil*_*ger 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
Run Code Online (Sandbox Code Playgroud)

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

MOVE an-input-date TO date-to-print
.
Run Code Online (Sandbox Code Playgroud)

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

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