免费注册 查看新帖 |

Chinaunix

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

AS/400开发经验点滴(九)-- SPECIAL文件的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-13 11:36 |只看该作者 |倒序浏览
AS/400开发经验点滴(九)-- SPECIAL文件的使用




一.        什么是SPECIAL文件

我们知道文件是要有存放位置的,是要与某种设备相连的。RPG程序中在定义文件时需要指定文件类别。RPG程序支持文件种类有:

    设备文件        描述        RPG 设备名
    打印文件Printer Files        提供打印输出格式描述,以及对打印设备访问        PRINTER
    磁带文件Tape Files        提供对存储在磁带设备上的数据文件的访问        SEQ
    磁盘文件Diskette Files        提供对存储在磁盘上的数据文件的访问        DISK
    显示文件Display Files        提供对显示设备的访问        WORKSTN
    通信文件ICF Files        允许程序之间通信        WORKSTN



此外,RPG程序中还有一种特殊的文件设备类型,定义为SPEICAL。它可以允许指定一种不能被RPG直接操作的的输入/输出设备。对文件的输入/输出操作可以由用户写的程序来完成。用户写的程序名必须在文件定义的F规范中用PGMNAME 关键词来标识。例如:

  1. FTSPF01    IF   E             SPECIAL PGMNAME('TPGMDTQ')  
复制代码


虽然SPECIAL文件原目的是提供一种让RPG程序从不能直接 操作的设备上可以进行访问的方法。但SPECIAL文件的使用可以不仅限于此,实际上通过SPECIAL文件,可以做很多事。它可以通过指定用户写的程序来允许RPG程序完成一些RPG程序不可能完成的任务,或者通过规范输入/输出方法来简化程序结构等等。


二.        SPECIAL文件有关参数定义





RPG程序本身是通过RPG操作码打开(OPEN),读(READ),写(WRITE),关闭(CLOSE) SPECIAL文件,SPEICAL文件再把这些动作传递给PGNNAME标识的用户程序,再由用户程序来完成对实际设备文件的打开,读,写,关闭等操作。实际上对SPECIAL文件,RPG程序自动创建四个参数:

操作码(option ),
返回状态(status),
错误码(error),
记录域(area)

这四个参数可以被RPG编译器和用户程序访问,但不能被包含SPECIAL文件的RPG程序本身访问。对用户程序而言,其中option是输入参数,status和error是返回参数,area则是用来传递SPECIAL文件记录或接受记录缓冲数据的输入/输出参数:

    参数         类型         长度        说明
    Option         Character         1         (O:打开文件C:关闭文件R:读W:写D:删除U:更改F:强制文件结束)
    Status         Character         1         (0:正常1:文件结束2:错误)
    Error         Packed         5,0         (用户定义错误类型)
    Area         Character         Varies         (SPECIAL文件的纪录缓冲)


除了以上四个隐含参数外,在RPG程序中还可以增加另外的参数传递给用户程序。这可以在SPECIAL文件定义中用PLIST关键词来标识参数列表来实现。然后在RPG程序C规范中用PLIST操作码来定义具体的额外参数。


三.        使用SPECIAL文件的范例


下面通过用SPECIAL文件来操作DTAQ,以提供一个完整范例。该例子用一个RPG程序通过SPECIAL文件调用一个CL程序写一条记录到一个DTAQ中,然后再用另一个RPG程序通过SPECIAL文件调用CL程序从DTAQ中读纪录并显示出来。

1 创建一最大缓冲长度为180的DTAQ

  1. CRTDTAQ DTAQ(TPSFQ) MAXLEN(180) SEQ(*FIFO)
复制代码



2  用DDS创建两个文件,用作SPECIAL文件。定义一字段SP0001,长度为180,用来与DTAQ传递和接受数据的记录。

  1. TSPF01

  2.      A          R RSPF01                                                   
  3.      A            SP0001       180          TEXT('QDATA')                  
  4.      A                                      COLHDG(-                       
  5.      A                                      'QDATA')            
复制代码
  1. TSPF02

  2.      A          R RSPF02                                             
  3.      A            SP0001       180          TEXT('QDATA')            
  4.      A                                      COLHDG(-                  
  5.      A                                      'QDATA')                             
复制代码

3  写一CL程序TPGMDTQ,除了四个隐含参数外,另加指定DTAQ 信息的四个参数。该CL程序指定R和W操作,即读写DTAQ。

  1. TPGMDTQ

  2. /**                                                               **/         
  3. /** Description - This program is used to send and receive        **/         
  4. /**               from dataq.                                     **/         
  5.                                                                               
  6.              PGM        PARM(&OPTION &STATUS &ERROR &AREA &DATAQ +            
  7.                           &LIB &WAIT &LEN)                                    
  8.              DCL        VAR(&OPTION) TYPE(*CHAR) LEN(1)                       
  9.              DCL        VAR(&STATUS) TYPE(*CHAR) LEN(1)                       
  10.              DCL        VAR(&ERROR)  TYPE(*DEC) LEN(5 0)                     
  11.              DCL        VAR(&AREA) TYPE(*CHAR) LEN(180)                       
  12.              DCL        VAR(&DATAQ)  TYPE(*CHAR) LEN(10)                     
  13.              DCL        VAR(&LIB)    TYPE(*CHAR) LEN(10)                     
  14.              DCL        VAR(&LEN) TYPE(*DEC) LEN(5 0) VALUE(180)              
  15.              DCL        VAR(&WAIT) TYPE(*DEC) LEN(5 0)                        
  16.                                                                               
  17.              IF         COND(&OPTION *EQ 'R') THEN(DO)                        
  18.              CALL       PGM(QRCVDTAQ) PARM(&DATAQ &LIB &LEN +                 
  19.                           &AREA &WAIT)                                       
  20.              IF         COND(&LEN *LE 0) THEN(CHGVAR VAR(&AREA) +            
  21.                           VALUE(' '))                                         
  22.              ENDDO                                                            
  23.                                                                               
  24.              IF         COND(&OPTION *EQ 'W') THEN(DO)                        
  25.              CALL       PGM(QSNDDTAQ) PARM(&DATAQ &LIB &LEN &AREA)            
  26.              ENDDO                                                            
  27.                                                                               
  28.              IF         COND(&OPTION *EQ 'O') THEN(GOTO CMDLBL(ENDALL))      
  29.                                                                               
  30. RETURN              
  31. ENDALL:     ENDPGM     
复制代码
                                          

4 一RPG程序使用SPECIAL文件向DTAQ中写一条记录。用PGMNAME标识CL程序TPGMDTQ,用PLIST标识另外的DTAQ参数。


  1. TSPFPGMW

  2.      F*  Write to TSPFQ  queue.                                                           
  3.      FTSPF02    O    E             SPECIAL PGMNAME('TPGMDTQ')                             
  4.      F                                     PLIST(DQOUT)                                   
  5.      F*****************************************************************                  
  6.      C     DQOUT         PLIST                                                            
  7.      C                   PARM                    DATAQ            10                     
  8.      C                   PARM                    LIB              10                     
  9.      C                   PARM                    WAIT              5 0                    
  10.      C                   PARM                    OUTLEN            5 0                    
  11.      C                                                                                    
  12.      C                   Z-ADD     180           OUTLEN                                   
  13.      C                   MOVEL     'TSPFQ   '    DATAQ            10                     
  14.      C                   MOVEL     'CNDEVLGB'    LIB              10                     
  15.      C                   Z-SUB     1             WAIT                                    
  16.      C*  SEND                                                                             
  17.      C                   EVAL      SP0001 = 'This is a tesk!'                             
  18.      C                   WRITE     RSPF02                                                
  19.      C                   RETURN                                                           
  20.      C                   MOVE      '1'           *INLR                                    
复制代码
      

5  一RPG程序使用SPECIAL文件从DTAQ中读入记录,并显示出来:

  1. TSPFPGMR

  2.      F*  Read from TSPFQ queue.                                                      
  3.      FTSPF01    IF   E             SPECIAL PGMNAME('TPGMDTQ')                        
  4.      F                                     PLIST(DQIN)                              
  5.      F*****************************************************************              
  6.      C     DQIN          PLIST                                                      
  7.      C                   PARM                    DATAQ            10                 
  8.      C                   PARM                    LIB              10                 
  9.      C                   PARM                    WAIT              5 0               
  10.      C                   PARM                    OUTLEN            5 0               
  11.      C                                                                              
  12.      C                   Z-ADD     180           OUTLEN                              
  13.      C                   MOVEL     'TSPFQ   '    DATAQ            10                 
  14.      C                   MOVEL     'MYTSTLIB'    LIB              10                 
  15.      C                   Z-SUB     1             WAIT                                
  16.      C*  Receive                                                                     
  17.      C                   READ      RSPF01                                 40         
  18.      C                   MOVEL     SP0001        DTXT             40                 
  19.      C     DTXT          DSPLY                                                      
  20.      C                   RETURN                                                
复制代码



通过上面例子,我们可以看到:通过SPECIAL文件,在RPG程序中我们可以象通常读写磁盘文件一样就可以用DTAQ进行程序间数据交换了。而真正的读写DTAQ操作是在另一CL程序里实现的。


BLOG LIOU
2005.06.13

参考:

Special Files Can Do It All
http://www.itjungle.com/fhg/fhg041305-story01.html

论坛徽章:
0
2 [报告]
发表于 2005-06-13 13:04 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

老哥就是牛!强烈支持!小弟受教了!谢谢!

论坛徽章:
0
3 [报告]
发表于 2005-06-13 13:05 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

看過以前lz的帖子,對lz實在是佩服.不知道lz現在是否還在做400開發?以後有機會一定還要向lz多多請教啊.看了lz的總結系列,覺得自己這兩年做400開發,做的實在太失敗了

论坛徽章:
0
4 [报告]
发表于 2005-06-13 13:23 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

好、设为精华帖子、供大家学习。。。

论坛徽章:
0
5 [报告]
发表于 2005-06-13 14:12 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

好!

论坛徽章:
0
6 [报告]
发表于 2005-06-13 14:33 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

偶对英雄的景仰如滔滔江水~~连绵不绝~~~!

论坛徽章:
0
7 [报告]
发表于 2005-06-14 11:49 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

什么都不说了,支持!支持!支持!

论坛徽章:
0
8 [报告]
发表于 2005-06-14 12:51 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

楼主好厉害,佩服,佩服!

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-08-03 06:20:00
9 [报告]
发表于 2005-06-14 14:42 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

强的,好文收藏,吸收中。。。

论坛徽章:
0
10 [报告]
发表于 2005-06-14 18:38 |只看该作者

AS/400开发经验点滴(九)-- SPECIAL文件的使用

收藏先!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP