SUBFILE详解_none4978的空间_百度空间
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仍不是很清楚的朋友可以直接拷贝修改,就能用了


郑重声明:资讯 【SUBFILE详解_none4978的空间_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——