免费注册 查看新帖 |

Chinaunix

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

SUBFILE全攻略[ 原创] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-22 13:14 |只看该作者 |倒序浏览
16:12 2006-03-31
==================
SUBFILE详解
SUBFILE可能是400中除RLU之外最麻烦最复杂也最常用的东东了,经过一番研究,终于搞清楚了其中原理。它是遵循SDA的格式框架的,只8过其中的键字稍微多些,RPG中对其的调用稍复杂些而已。
1、DSPF的格式:
    建议它由4个记录构成,但用于首尾记录是可选的。它们只是显示一些固定的辅助信息而已。真正发挥作用的是中间的两项:数据记录和控制记录。就是下图的SUBF和SUBFC。
    数据记录:它的定义同一般DSPF的DDS并无二样,它决定了是哪些记录,在什么位置显示。要说明的是,在标识记录名的那行的键字栏,要填关键字SFL以指示当前记录是一个SUBFILE。这里我们可以看到,以后我们所用的SUBFILE都可以以此为蓝本。所做的修改就是将此记录中的字段名和位置改变而已,其它的都没什么重大改变。
    控制记录:在定义记录后面的键字栏,填入SFLCTL(SUBF_name)这里SUBF_name就是之前定义的数据记录名。这个记录主要用于控制前面记录的显示参数,比如每页显多少?多少页?何时显示等等。现在分别介绍这些参数。
        SFLSIZ(N):N:1-9999:表示共有多少记录可显示,9999代表最大值,一般就用这个;
        SFLPAG(N):N:决定了每页显示多少条记录,自己看着办吧:)
        SFLDSP/SFLDSPCTL:注意前面有指示器。它们的作用是控制SUBFILE的显示,这两个是必须执行的。
        SFLCLR:当前面指示器为真,清除SUBFILE的显示
        SFLEND(*MORE):若前面指示器为真,则在最后一页页尾显示"Bottom"
        OVERLAY:这个是覆盖,不用也行。但建议使用。
        CA12(...):表示12功能键用于退出,它和后面2行都必须放在SUBFC控制记录中
        后面两行:这个不用说了,是表头固定列标题。它必须放在此记录中
    HEAD/FOOT:这两个记录不用说了,用来显示固定的字串。

附图参考:一个SUBFILE的标准框架。
SUBFILE
     A* ------------INIT ON ABOVE ------------------------------            
     A                                      DSPSIZ(24 80 *DS3)               
     A                                                                       
     A          R HEAD                                                      
     A                                  2  1DATE                             
     A                                      EDTCDE(Y)                        
                                                                             
     A* ------------- RECORDS FOR SUBFILE --------------------               
     A          R SUBF                      SFL                              
     A            OPT            1   I  9 14                                 
     A            PFFLD1         5A  O  9 16                                 
     A            PFFLD2        20A  O  9 26                                 
                                                                             
     A* ------------- CONTROL TO SUBFILE ---------------------               
     A          R SUBFC                     SFLCTL(SUBF)                     
     A                                      SFLSIZ(9999)                     
     A                                      SFLPAG(0003)                     
     A  30                                  SFLDSP                           
     A  31                                  SFLDSPCTL                        
     A  32                                  SFLCLR                    
     A  33                                  SFLEND(*MORE)            
     A                                      OVERLAY                  
     A                                      CA12(12 'EXIT')           
     A                                  7 15'FIELD 1'                 
     A                                      COLOR(WHT)               
     A                                  7 27'FIELD 2'                 
     A                                      COLOR(WHT)               

     A* --------------- FOOT DEFIN --------------------               
     A          R FOOT                                                   
     A                                      OVERLAY                       
     A                                 24 11'F12=EXIT'                    
     A                                      COLOR(BLU)                    
                                                                     

2、如何显示一个SUBFILE
    显示SUBFILE的过程同显示一般DSPF有着小小不同。一个完整的显示、接收用户的选择包括以下3个步骤:
  1)将欲显示的数据文件(PF、LF)装入;
  2)显示SUBFILE;
  3)得到用户选择的行。
  具体的说明,我以注释的方式在下图源码中说明清楚。



FMYPF      IF   E           K DISK             *待显示的数据文件                           
FMYSUBFIL  CF   E             WORKSTN          *这就是那个SUBFILE文件名,文件类型为C混合型
F                                     sfile(subf:rrn)   *这个SFILE及SUBF(数据记录名:RRN)是一定要的!
                                                        *因为数据记录可看作一个FILE,它是必须有RRN的。
                                                        *在装入要显示的文件数据时,自增1即可。后面有用到。
                                                                          
C*    ----------   MAIN PROCEDURE -------------                           
C                   WRITE     HEAD                      *这里的WRITE作用就是显示名为HEAD的记录               
C                   WRITE     FOOT                      *同上,显示FOOT记录                  
C                   EXSR      CLRSFL                    *这2行调用子程序                  
C                   EXSR      REDRCD                                      
C*    Read selected records
C                   setoff                                           80   
C                   readc     subf                                   80 *读SUBF数据记录中那些被修改的记录  
C     *in80         doweq     '0'                                       *如果读到,则  
C     pffld1        dsply                                               *显示那条记录的字段PFFLD1的值  
C                   readc     subf                                   80 *继续读  
C                   enddo                                               *结束
C                   SETON                                        LR     *程序结束退出  

                                                                          
C*  ---------   SUB1 SR----------                                         
C     REDRCD        BEGSR                                               *子程REDRCD开始  
C                   Z-ADD     0             RRN               4 0       *定义RRN这个变量                     
     *LOVAL        SETLL     FMYPF                                      *记录指针指向最首个  
                   READE     FMYPF                                  90  *读  
     *IN90         doweq     '0'                                        *读到的话  
                   ADD       1             RRN                          *这里RRN自增1, 若增2则两记录间隔一空行
                   eval      PFFLD2='('+%trimr(PFFLD2) + ')'            *将数据文件中的此字段值用括号括起来再显示
                                                                        *这里PFFLD2就是SUBF记录的字段名,同时也是数据文件的输入字段名  
                                                                        *对PFFLD2写入的值到时就会显示出来
C                  WRITE     SUBF                                       *写入SUBF  
C                  READ      FMYPF                                  90  *继续读  
C                  SETON                                            30  *以下两行打开SUBFILE的显示开关(指示器)  
C                  seton                                            31   
C                  exfmt     SUBFC                                      *正式调用SUBFILE开始显示
C                  ENDSR                                                



去年的笔记了,今天才找到。对SUBFILE仍不是很清楚的朋友可以直接拷贝修改,就能用了

论坛徽章:
0
2 [报告]
发表于 2007-02-22 14:16 |只看该作者
哇~~~MM好漂亮啊!!!

论坛徽章:
0
3 [报告]
发表于 2007-02-23 08:57 |只看该作者
姐姐,你还是换一张照片吧!
这张照片曾经出现在很多不良场所。。。
省得别人误解。没别的意思

论坛徽章:
0
4 [报告]
发表于 2007-02-24 03:18 |只看该作者
加精鼓励~~~

论坛徽章:
0
5 [报告]
发表于 2007-02-26 09:36 |只看该作者
學習  學習。。。。。

论坛徽章:
0
6 [报告]
发表于 2007-02-26 11:35 |只看该作者
SUBFILE 的难点还在于对光标,翻页的控制,如果有更详细深入的例子各解释那就更完美了。

论坛徽章:
0
7 [报告]
发表于 2007-03-16 13:40 |只看该作者
受益

论坛徽章:
0
8 [报告]
发表于 2007-03-16 16:41 |只看该作者
程序有誤:
1. C                   EXSR      CLRSFL                    *这2行调用子程序   -----子程序在哪呢?
2.*IN90         doweq     '0'                          --------------------------------Enddo在哪呢?

论坛徽章:
0
9 [报告]
发表于 2007-03-16 16:43 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2007-03-16 22:30 |只看该作者
pantierui ,还是有问题呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP