- 论坛徽章:
- 0
|
我在项目中遇到了以下问题,希望大家来探讨一下。
相关程序如下:
PTEST:
0001.00 PGM
0002.00 CALL PGM(P111)
0003.00 ENDPGM
|
P111:
0002.00 PGM
0018.00 DCL VAR(&QRYSTR) TYPE(*CHAR) LEN(60) VALUE(' ')
0018.01 DCL VAR(&I) TYPE(*DEC) VALUE('1')
0018.02 CHGVAR VAR(&QRYSTR) VALUE('111')
0057.00 NEXTLP: OVRDBF FILE(FILE1) SHARE(*YES) +
0058.00 OVRSCOPE(*CALLLVL)
0061.00 OPNQRYF FILE((FILE1)) OPTION(*INP *UPD) +
0062.00 QRYSLT('XCO *EQ %VALUES(' *CAT +
0063.00 &QRYSTR *CAT ')') KEYFLD(*FILE) +
0064.00 MAPFLD((F1 F2 *ZONED 3) (F2 +
0065.00 F1 *DEC 3)) OPNSCOPE(*JOB)
0066.00 CHGVAR VAR(&QRYSTR) VALUE(' ')
0140.00 CALL PGM(RPG01)
0145.00 CLOF OPNID(FILE1)
0146.00 DLTOVR FILE(FILE1) LVL(*)
0146.01 RCLRSC
0146.02 RCLACTGRP ACTGRP(ATG0001)
0146.03
0146.04 MONMSG MSGID(CPF1653)
0146.05 CHGVAR VAR(&QRYSTR) VALUE('222')
0146.03
0146.04 MONMSG MSGID(CPF1653)
0146.05 CHGVAR VAR(&QRYSTR) VALUE('222')
0146.06 CHGVAR VAR(&I) VALUE(&I + 1)
0146.07 IF COND(&I *LT 3) THEN(DO)
0146.08 GOTO NEXTLP
0146.09 ENDDO
0205.00 ENDPGM
|
RPG01:
0001.00 FFILE1 UP E K DISK
0003.00 C CALL 'RPG02'
0004.00 C EVAL *INLR ='1' |
RPG02:
0001.00 FFILE1 IF E K DISK
0002.00 DVAR1 S 6
0002.01 DVAR2 S 6
0003.00 C
0004.00 C EVAL VAR1 = '111111'
0005.00 C VAR1 CHAIN FILE1 30
0006.00 C IF *IN30 = '0'
0007.00 C EVAL VAR2 = VAR1
0008.00 C ENDIF
0009.00 C RETURN
|
CALL PTEST, 在执行P111的第二个LOOP时报“Shared open not allowed for query. ” 错。
而把rpg02改成如下代码时没这个错:
RPG02:
0001.00 FFILE1 IF E K DISK
0002.00 DVAR1 S 6
0002.01 DVAR2 S 6
0003.00 C
0005.00 C IF NOT(%OPEN(FILE1))
0006.00 C OPEN FILE1
0007.00 C ENDIF
0004.00 C EVAL VAR1 = '111111'
0005.00 C VAR1 CHAIN FILE1 30
0006.00 C IF *IN30 = '0'
0007.00 C EVAL VAR2 = VAR1
0008.00 C ENDIF
0012.00 C IF %OPEN(FILE1)
0013.00 C CLOSE FILE1
0014.00 C ENDIF
0009.00 C RETURN
|
这是有关OPNSCOP(*JOB), SHARE(*YES), 在RPG02中用到了OPNQRYF打开的文件,却没有显著式的关闭,引起了报错,尽管我找到了几种解决的方法,就是在上面的一种,还有就是在OVRDBF时指定到其他文件,如FILE2,或在RPG02中用FILE1的逻辑文件而非直接用FILE1.但我还是不明白其中的真正原因,请大家来探讨一下。
程序代码可能不是很好,请见谅! |
|