You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:45:54