在400中我们都知道有个多MEMBER的概念。如何取得多MEMBER中的数据,就要用到OVRDBF这个命令。
OVRDBF命令的功能是:
(1) 覆盖 ( 替换 ) 在程序中命名的文件
(2) 覆盖程序中使用的文件的一些参数
(3) 覆盖在程序中命名的文件和覆盖被处理文件的一些参数。
这个命令可用于物理文件、逻辑文件和分布式数据管理 (DDM) 文件。
OVRDBF有以下几种用法:
1,程序用多MEMBER。
大多是CL中用OVRDBF,然后在CL中调用RPG。如:
OVRDBF XXDB1 YOURLIB/XXXDB
2,FTP用,通常如下:
OVRDBF FILE(INPUT) TOFILE(INPUT) MBR(XXXI)
OVRDBF FILE(OUTPUT) TOFILE(OUTPUT) MBR(XXXO)
FTP RMTSYS('10.237.11.201')
INPUT中的MEMBER可以如下写,OUTPUT的MEMBER就是FTP的log输出
user pwd
LCD XETDBF
BIN
PUT R2G.R2G R2G.DAT
LS
QUIT
3,有人喜欢用STRSQL来查看数据,多MEMBER就给带来了不便,我们也可以用OVRDBF来实现自己的要求。方法如下:
进入SQL画面后执行如下语句:
CALL QCMD
OVRDBF FILE(BB) TOFILE(YOURLIB/#FILE) MBR(MBR001) OVRSCOPE(*JOB)
F3返回后直接对BB操作就可以了。
参数OVRSCOPE的介绍贴地址:
参数OVRSCOPE有3个选项,*JOB,*CALLLVL,*ACTGRPDFN
*JOB就是整个job的范围,这是一个最大的范围,所有程序都受此影响
*CALLLVL和程序调用的先后顺序有关(调用链)
这里有个call level的概念,先调用的程序的call level小,后调用的大
*ACTGRPDFN是整个group的范围
这里有个group的概念,编译程序时有个参数DFTACTGRP可指定group,
如果不指定,则会到一个叫*DFTACTGRP的组中,所有rpg3的程序都会编译到该组
建立:
*JOB,*CALLLVL比较简单,不会变化
*ACTGRPDFN最终的范围取决于运行该命令的程序
如果该程序运行在某个group中,则范围就是该group
如果该程序运行在*DFTACTGRP,则范围是该程序对应的call level
重建:
如果对一个file Ovrdbf后,又对此file做一次ovrdbf会发生什么呢
答案是后一次会替换前一次,也就是说最后一次有效,但前提是相同范围内
*JOB的范围是整个job,只要在同一个job,后建的会将前面的替换
*CALLLVL的范围是当前的call level
*ACTGRPDFN的范围是当前的group
使用:(重要)
ovrdbf起作用的时候是打开文件的时候
如果对一个file同时存在3种不同范围的ovrdbf,究竟会用哪个呢?
这要取决于打开这个文件的程序
程序的group是*DFTACTGRP的,首先会找job范围的ovrdbf,如果没有,则找call level范围的
注意,如果在不同的call level都有定义ovrdbf,则会找call level最小的那个
程序的group不是*DFTACTGRP的,首先会找job范围的ovrdbf,如果没有,则找group范围的
如果group中还没有,则会找call level范围的
生存期:
ovrdbf会在对应的范围结束时自动消失
*job会在job结束时消失,*CALLLVL会在该call level结束时消失
*ACTGRPDFN会在该group结束时消失
删除:
可在对应的范围内删除
*job的可在job内删除,*CALLLVL的可在该call level里删除
*ACTGRPDFN的可在该group内删除
注意,在同一个组中有很多程序,他们调用的先后顺序不同,call level也不同
比如程序a调用程序b,在a里建的范围为group的ovrdbf,可在程序b里删除
程序b里建的范围为group的ovrdbf不会应为程序b的终止而消失(参看生存期)
阅读(753) | 评论(0) | 转发(0) |