免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2266 | 回复: 8
打印 上一主题 下一主题

请教!COBOL中SUBFILE的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-12 13:21 |只看该作者 |倒序浏览
代码目的:练习COBOL中SUBFILE的使用
          在SUBFILE中显示通过代码生成的数据
代码资源:1-DSPFSF01(CBLLE)
               2-DSPTSF(DSPF)
问题:当执行到WRITE DSPTSF-REC FORMAT IS "C1"这一句的时候程序无故跳出(不是通过STOP RUN)。且无任何提示信息。

现在将代码贴出来。小弟刚开始学习COBOL。请高手指教。
1-DSPFSF01(CBLLE)

      *----------------------------------------------------------------
      * PROGRAM-ID     : DSPFSF01
      * DSPF-ID        : DSPTSF
      * GREAT DATE     : 2006/01/11
      * UPDATE DATE    : @@@@/@@/@@
      *----------------------------------------------------------------
       IDENTIFICATION   DIVISION.
       PROGRAM-ID.      DSPFSF01.
       ENVIRONMENT      DIVISION.
       INPUT-OUTPUT     SECTION.
       FILE-CONTROL.
           SELECT DSPTSF ASSIGN TO WORKSTATION-DSPTSF
           ORGANIZATION IS TRANSACTION
           ACCESS  MODE IS SEQUENTIAL.
      *
       DATA            DIVISION.
       FILE            SECTION.
       FD DSPTSF.
       01 DSPTSF-REC.
          COPY DDS-ALL-FORMATS OF DSPTSF.
       WORKING-STORAGE SECTION.
       01 INDIC-AREA.
          05 IN20 PIC 1.
             88 SUBF-DSP VALUE B"1".
          05 IN21 PIC 1.
             88 SUBF-DSP-CTL VALUE B"1".
          05 IN22 PIC 1.
             88 SUBF-CLR VALUE B"1".
          05 IN12 PIC 1.
             88 LAST-PAGE VALUE B"1".
          05 IN28 PIC 1.
             88 ROLL-UP VALUE B"1".
          05 IN29 PIC 1.
             88 ROLL-DOWN VALUE B"1".
          05 IN98 PIC 1.
             88 IO-ERROR VALUE B"1".
          05 IN03 PIC 1.
             88 NOT-END-OF-JOB VALUE B"0".
             88 END-OF-JOB VALUE B"1".
      *
       77 CYS-NUM PIC 9(4) VALUE 1.
      *
       PROCEDURE       DIVISION.
       DECLARATIVES.
       DISPLAY-ERR-SECTION SECTION.
           USE AFTER STANDARD EXCEPTION PROCEDURE ON DSPTSF.
       DISPLAY-ERR-PARAGRAPH.
           SET IO-ERROR TO TRUE
           MOVE CORR INDIC-AREA TO ERRFMT-O-INDIC
           WRITE DSPTSF-REC FORMAT IS "ERRFMT"
           END-WRITE
           CLOSE DSPTSF.
           STOP RUN.
       END DECLARATIVES.
      *
       MAIN-PROGRAM SECTION.
       MAINLINE.
           OPEN I-O DSPTSF.
           SET NOT-END-OF-JOB TO TRUE.
           MOVE ZEROS TO INDIC-AREA.
           SET SUBF-DSP TO TRUE.
           SET SUBF-DSP-CTL TO TRUE.
           MOVE CORR INDIC-AREA TO C1-O-INDIC.
           WRITE DSPTSF-REC FORMAT IS "C1"
           END-WRITE.
           READ DSPTSF RECORD
           END-READ.
           PERFORM UNTIL END-OF-JOB
             MOVE CORR INDIC-AREA TO C1-O-INDIC
             PERFORM 9 TIMES
               MOVE CYS-NUM TO SSTUNO
               MOVE "12345678901234" TO SSTUNA
               WRITE DSPTSF-REC FORMAT IS "S1"
               END-WRITE
               COMPUTE CYS-NUM = CYS-NUM + 1
             END-PERFORM
             MOVE ZEROS TO INDIC-AREA
             READ DSPTSF FORMAT IS "G1"
             END-READ
             READ DSPTSF FORMAT IS "C1"
             END-READ
             READ DSPTSF FORMAT IS "S1"
             END-READ
             MOVE CORR C1-I-INDIC TO INDIC-AREA
           END-PERFORM.
           CLOSE DSPTSF.
           STOP RUN.


2-DSPTSF(DSPF)

//    *----------------------------------------------------------------
/     * DSPF-ID  : DSPFTSF
//    * UPDATE   : @@@@/@@/@@
//    *№/内容: (      )
//    *----------------------------------------------------------------
     A* 明細画面
     A*----------------------------------------------------------------
//   A          R S1                        SFL
/    A            SSTUNO         4   O 10 22TEXT('学員NO.')
/    A            SSTUNA        14   O 10 60TEXT('学員名前')
     A*----------------------------------------------------------------
     A* 明細画面制御
    A*----------------------------------------------------------------
     A          R C1                     SFLCTL(S1)
     A                                      CF03(03 '終了')
     A                                      CF12(12 '前画面')
     A                                      ROLLUP(2
     A                                      ROLLDOWN(29)
     A                                      OVERLAY
     A                                      PROTECT
     A                                      SFLSIZ(0036)
     A                                      SFLPAG(0009)
     A  20                                  SFLDSP
     A  21                                  SFLDSPCTL
     A  22                                  SFLCLR
     A                                      CSRLOC(H1LIN      H1POS)
     A                                      SFLCSRRRN(&H1CSRRN)
     A                                      RTNCSRLOC(&H1REC &H1FLD)
     A            H1RRN          4S 0H      SFLRCDNBR
     A            H1LIN          3S 0H      TEXT('カーソル制御(行)')
     A            H1POS          3S 0H      TEXT('カーソル制御(桁)')
     A            H1CSRRN        5S 0H      TEXT('カーソル制御(RRN)')
     A            H1REC         10A  H      TEXT('カーソル制御(RECORD)')
     A            H1FLD         10A  H      TEXT('カーソル制御(FIELD)')
     A                                 24 53 'F3 = TERMINATE'
     A*----------------------------------------------------------------
     A* 画面IO
     A*----------------------------------------------------------------
     A          R ERRFMT
     A  98                              6  5 'INPUT-OUTPUT ERROR'


论坛徽章:
0
2 [报告]
发表于 2006-01-12 17:36 |只看该作者
没看出来什么问题,也不debug了,随意说两句,你看看是否可以。
ACCESS  MODE IS SEQUENTIAL. 修改为:
ACCESS  MODE IS SEQUENTIAL
CONTROL-AREA IS INDIC-AREA.

不行就debug试试看吧,肯定会出来msg的。

论坛徽章:
0
3 [报告]
发表于 2006-01-12 17:44 |只看该作者
我也刚玩COBOL 不过我们都是这么写的

SELECT  SCFL    ASSIGN  TO      sdfl-0001-SI      
                          ORGANIZATION    TRANSACTION                  
                          ACCESS  MODE    DYNAMIC                     
                          RELATIVE        STAT-NUMBER                  
                          FILE    STATUS  STAT-SCFL.

论坛徽章:
0
4 [报告]
发表于 2006-01-12 17:50 |只看该作者
按照大肥肥的改的话会有重大度20的错误。
是说INDIC-AREA的长度不对。
??????

论坛徽章:
0
5 [报告]
发表于 2006-01-12 17:55 |只看该作者
呼唤高手给出正解

论坛徽章:
0
6 [报告]
发表于 2006-01-13 09:15 |只看该作者
其实现在的问题不是DSPF上的指示器没法儿被传递到程序中。
就是在DEBUG时无故退出程序,一到write画面的时候就退出了。就好像找不到要write的纪录一样。很郁闷呢。
希望高手帮帮忙。或者有资料的高手能给一段使用SUBFILE的例子也行。

论坛徽章:
0
7 [报告]
发表于 2006-01-13 11:45 |只看该作者
我把程序传上去编译,debug了一下,出现你的错误,修改了一些,但是还是同样问题。
debug的时候,系统会提示出错信息,你的这个错误信息:
赋值的信息长度和文件的定义不一样。
你可以在debug的时候,用shift+esc+3,切换display job, 然后选10显示你的job log, 再用f10, 然后上下
翻页看具体的系统出错信息。
我有空再帮你看看你的这个错误。

论坛徽章:
0
8 [报告]
发表于 2006-01-13 15:08 |只看该作者
先谢谢一下大肥肥。

论坛徽章:
0
9 [报告]
发表于 2006-01-16 14:16 |只看该作者
庆祝浏览数上100!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP