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代表{zd0}值,一般就用这个;
SFLPAG(N):N:决定了每页显示多少条记录,自己看着办吧:)
SFLDSP/SFLDSPCTL:注意前面有指示器。它们的作用是控制SUBFILE的显示,这两个是必须执行的。
SFLCLR:当前面指示器为真,xxSUBFILE的显示
SFLEND(*MORE):若前面指示器为真,则在{zh1}一页页尾显示"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 *记录指针指向最{sg}
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仍不是很清楚的朋友可以直接拷贝修改,就能用了 |