OPNQRYF查询正常但RPG无数据 提示共享打开选项被忽略
问题场景
开发过程中使用OPNQRYF命令筛选指定记录时,关联的RPG程序持续触发十进制数据错误,疑似未读取到有效数据,因此编写最简测试版本程序排查问题。已知OPNQRYF可正确筛选出2条符合条件的记录,CPYFRMQRYF也成功将筛选结果复制到QTEMP库下的F0312文件,但RPG程序始终无法读取到有效数据,作业日志提示Open options ignored for shared open of member F0312。
测试CL程序代码
PGM PARM(&PSICU) DCL VAR(&PSICU ) TYPE(*CHAR) LEN( 8) DCL VAR(&RECS) TYPE(*DEC) LEN(10 0) OVRDBF FILE(F0312) NBRRCDS(111) SHARE(*YES) OPNQRYF FILE((F0312)) OPTION(*INP *UPD) FORMAT(*FILE) OPTIMIZE(*ALLIO) + OPNID(*FILE) SEQONLY(*NO) TYPE(*PERM) KEYFLD((RUICUT) (RUICU) (RUDOCM) (RUAN8)) + QRYSLT('(RUICU *EQ ' *CAT &PSICU *CAT ') & (RUPOST *EQ " ")') CPYFRMQRYF FROMOPNID(F0312) TOFILE(QTEMP/F0312) MBROPT(*ADD) CRTFILE(*YES) FMTOPT(*NOCHK) RTVMBRD FILE(QTEMP/F0312) NBRCURRCD(&RECS) IF COND(&RECS *EQ 0) THEN(GOTO CMDLBL(EOJ)) CALL PGM(SMITHMIS/TSTOPNQRYR) PARM(&PSICU) EOJ: DLTF FILE(QTEMP/F0312) CLOF OPNID(F0312) MONMSG MSGID(CPF0000 CPC0000 CPD0000) DLTOVR FILE(F0312) MONMSG MSGID(CPF0000 CPC0000 CPD0000) ENDPGM
测试RPG程序代码
FF0312 IF E DISK FQSYSPRT O F 132 OF PRINTER C *ENTRY PLIST C PARM PSICU 8 C* C MOVELPSICU @NM C CALL 'X0012' C* ---- ------- C PARM @NM 22 C PARM #NUMR 156 C Z-ADD#NUMR $WRK8 80 C Z-ADD$WRK8 PSICU# 80 C* C *INLR DOWEQ'0' C READ I0312 99LR C* C* C* If negative document, make it positive C* C RUDOC IFLT *ZERO C MULT -1 RUDOC C ENDIF C* C RUDOCM IFLT *ZERO C MULT -1 RUDOCM C ENDIF C* C* Determine if record should be processed. C* C *IN99 IFEQ '0' C *INLR ANDEQ'0' C RUPOST CABEQ'A' END C* ----- --- C ENDIF C* C RUICU IFNE PSICU# C GOTO END C ENDIF C* C *INLR CABEQ'1' END C* ----- --- C ADD 1 CNT 50 C EXCPTDETL C END TAG C ENDDO OQSYSPRT E 2 DETL O CNT Z 5
作业日志输出
Member F0312 file F0312 in D81QUADTA opened. 900 - CPYFRMQRYF FROMOPNID(F0312) TOFILE(QTEMP/F0312) MBROPT(*ADD) CRTFILE(*YES) FMTOPT(*NOCHK) Physical file F0312 created in library QTEMP. Member F0312 added to file F0312 in QTEMP. 2 records copied from member F0312. 1000 - RTVMBRD FILE(QTEMP/F0312) NBRCURRCD(&RECS) 1300 - CALL PGM(SMITHMIS/TSTOPNQRYR) /* The CALL command contains parameters */ Open options ignored for shared open of member F0312.
故障根因
问题出在CL程序的覆写逻辑和打开句柄复用逻辑上,共两个核心问题:
- 缺少指向QTEMP文件的覆写:CL中仅对生产库的F0312配置了
SHARE(*YES)的数据库覆写,调用RPG前没有新增覆写将F0312的访问路径指向QTEMP下复制好的筛选结果文件,导致RPG打开F0312时,直接复用了OPNQRYF创建的原生产库F0312的共享打开句柄,完全没有访问QTEMP中存储的2条有效记录,这也是日志提示“Open options ignored for shared open of member F0312”的直接原因。 - 查询游标已到文件尾:
CPYFRMQRYF执行复制操作时,已经把OPNQRYF打开的查询结果集游标读取到了文件末尾,RPG复用这个已经到达末尾的共享句柄时,第一次读取操作就直接命中文件尾,读不到任何有效数据;若此时缓冲区残留非数值型脏数据,还会触发十进制数据错误。
修复方式:执行完CPYFRMQRYF后,先关闭OPNQRYF打开的原F0312句柄、删除原有F0312的覆写,再新增
OVRDBF FILE(F0312) TOFILE(QTEMP/F0312)覆写,最后调用RPG即可正常读取筛选后的记录。
内容的提问来源于stack exchange,提问作者Misty
相关产品推荐
相关产品推荐

