RPG程序迁移外部打印文件后,如何用OVRPRTF仅引用指定打印文件的特定设置?
从指定打印文件继承特定属性来覆盖OVRPRTF的实现方案
你的需求是可行的,虽然IBM i的OVRPRTF命令本身没有直接提供类似FROMFILE的参数来选择性继承其他打印文件的设置,但我们可以通过动态提取目标打印文件的属性值,再构建自定义的OVRPRTF命令来实现这个效果。
为什么直接用TOFILE会出问题?
先解释下你遇到的核心问题:当使用OVRPRTF FILE(MYOUTPUT) TOFILE(PRTF132)时,系统会完全用PRTF132的所有属性替换MYOUTPUT的定义,包括那些和你外部打印文件不兼容的底层设置(比如行格式、路由数据相关的属性),这就导致了行重叠、路由数据异常等问题。而单独指定LPI/CPI/OUTQ这类参数时,只是覆盖特定属性,保留了程序中外部打印文件的原有定义,所以输出正常。
实现步骤:提取属性+动态构建OVRPRTF
我们可以通过两种方式获取PRTF132的目标属性,再生成对应的OVRPRTF命令:
方法1:使用DSPFD命令导出属性到文件
- 首先运行
DSPFD命令,把PRTF132的属性导出到一个临时文件:
DSPFD FILE(YOURLIB/PRTF132) TYPE(*ATR) OUTPUT(*OUTFILE) OUTFILE(QTEMP/PRTFATTR)
- 在你的CL或RPG程序中,读取
QTEMP/PRTFATTR文件,提取以下字段的值:QPLPI:行间距(对应LPI参数)QPCPI:字符间距(对应CPI参数)QPOUTQ:输出队列(对应OUTQ参数)
- 动态构建
OVRPRTF命令,将提取到的值代入:
OVRPRTF FILE(MYOUTPUT) LPI(&LPI_VAL) CPI(&CPI_VAL) OUTQ(&OUTQ_VAL)
方法2:用SQL查询系统视图(更简洁)
IBM i提供了QSYS2.PRINT_FILE_ATTRIBUTES系统视图,可以直接查询打印文件的属性:
SELECT PRINT_FILE_LPI, PRINT_FILE_CPI, OUTPUT_QUEUE_NAME FROM QSYS2.PRINT_FILE_ATTRIBUTES WHERE PRINT_FILE_LIBRARY = 'YOURLIB' AND PRINT_FILE_NAME = 'PRTF132'
你可以在RPG程序中嵌入这个SQL查询,把结果赋值给变量,再用这些变量构建OVRPRTF命令,这种方式不需要处理物理文件,代码更简洁。
总结
你不需要完全另行开发新方案,利用IBM i自带的系统命令或SQL视图,就能实现“从PRTF132引用特定设置覆盖MYOUTPUT”的需求。这种方式既保留了原有流程的灵活性,又避免了TOFILE带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Player1st




