Subfile WRITE fails with CPF5021 (status 9N / extended status 831D), even on a minimal test program
asked 15 hours ago by @qa-j8byczol0unnjiqgo1rt 0 rep · 29 views
I'm learning COBOL on IBM i (PUB400, V7R5M0) and I'm stuck on a subfile issue. It reproduces even on the simplest possible program, so I don't think it's a logic bug in my code — it looks more like an environment or DDS-level issue I'm missing.
Here is the DDS source (TESTSFL):
A INDARA
A CA03(03 'F3=Quitter')
A R SFLREC SFL
A NOM 10A O 4 5
A R SFLCTL SFLCTL(SFLREC)
A SFLSIZ(0010)
A SFLPAG(0005)
A N31 SFLDSP
A N32 SFLDSPCTL
A N33 SFLCLR
A FILLER1 1A H
A 1 2'TEST SUBFILE MINIMAL'
And here is the COBOL program (TESTPGM):
IDENTIFICATION DIVISION.
PROGRAM-ID. TESTPGM.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SCREEN-FILE ASSIGN TO WORKSTATION-TESTSFL-SI
ORGANIZATION IS TRANSACTION
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS RRN
FILE STATUS IS WS-STATUS WS-STATUS-EXT.
DATA DIVISION.
FILE SECTION.
FD SCREEN-FILE.
01 SCREEN-RECORD.
COPY DDS-ALL-FORMATS OF TESTSFL.
WORKING-STORAGE SECTION.
01 WS-STATUS PIC X(2).
01 WS-STATUS-EXT PIC X(4).
01 RRN PIC 9(4) VALUE ZERO.
01 IND-AREA.
05 IND-TAB PIC X OCCURS 99 TIMES VALUE "0".
01 IND-MAP REDEFINES IND-AREA.
05 FILLER PIC X(2).
05 IN03 PIC X.
88 IN03-ON VALUE "1".
PROCEDURE DIVISION.
MAIN-LOGIC.
OPEN I-O SCREEN-FILE.
MOVE "1" TO IND-TAB(33).
WRITE SCREEN-RECORD FORMAT IS "SFLCTL"
INDICATORS ARE IND-AREA.
MOVE "0" TO IND-TAB(33).
MOVE 1 TO RRN.
MOVE "Ligne un" TO NOM OF SFLREC-O.
WRITE SCREEN-RECORD FORMAT IS "SFLREC"
INDICATORS ARE IND-AREA.
ADD 1 TO RRN.
MOVE "Ligne deux" TO NOM OF SFLREC-O.
WRITE SCREEN-RECORD FORMAT IS "SFLREC"
INDICATORS ARE IND-AREA.
MOVE "1" TO IND-TAB(31).
MOVE "1" TO IND-TAB(32).
WRITE SCREEN-RECORD FORMAT IS "SFLCTL"
INDICATORS ARE IND-AREA.
READ SCREEN-FILE FORMAT IS "SFLCTL"
INDICATORS ARE IND-AREA.
CLOSE SCREEN-FILE.
STOP RUN.\>
The very first WRITE SCREEN-RECORD FORMAT IS "SFLREC" (RRN=1) fails with WS-STATUS = '9N'.
The job log shows this message:
CPF5021 (severity 30): "Incorrect relative record number or field selection error.
The relative record number value was either less than one or greater than the
maximum allowed for the operation. If you are using field selection, the field
selected does not fit the available screen area."
Extended file status (second FILE STATUS data item) = 831D.
Here is what I've already checked and ruled out:
RRN confirmed = 1 at the time of the failing WRITE (checked in debug).
SFLSIZ(0010)/SFLPAG(0005)look consistent with the number of records written (2).-SIsuffix present on the ASSIGN clause (required since DDS hasINDARA).INDICATORS AREpresent on every I/O statement against the file.No duplicate
TESTSFLobject elsewhere in the library list.Fresh interactive session makes no difference.
Tried
PIC 9(4)vsPIC 9(4) BINARYfor the relative key — no difference.Added
CONTROL-AREA ISclause — no difference.
Any idea what could be causing this, or what else I should check?