Pregunta

Estoy ejecutando un pgm COBOL que lee un archivo VSAM. Abajo está la sección de entrada y salida en mi pgm.

CONTROL DE ARCHIVO.

 SELECT INPUT-FILE         ASSIGN TO DDINPUT             
                           ORGANIZATION IS INDEXED           
                           ACCESS MODE  IS RANDOM            
                           RECORD KEY   IS INPUT-KEY                                
                           FILE STATUS  IS WS-INPUT-STATUS.

y la entrada FD es la siguiente.

SECCIÓN DE ARCHIVO.

FD INPUT-FILE IS EXTERNAL (ya que está en sub pgm)
COPIA INPUTREC.

Cuando ejecuté este pgm, falló con el código de estado del archivo= 04. En algún lugar encontré que cuando en FD solo tenemos un registro, incluso si el archivo es VB, lo trata es FB. Por lo tanto, FB debe tener un registro contiene o una cláusula variable.

Cuando actualicé mi FD a.

SECCIÓN DE ARCHIVO.

FD INPUT-FILE IS EXTERNAL
REGISTRO VARIANDO EN TAMAÑO DE 1 A 215. COPIA EN REPRODUCCIÓN.

el trabajo funcionó bien.

Tengo una duda. ¿Puedo especificar esta cláusula de variación en la longitud máxima, como si escribiera esto como, por ejemplo, REGISTRO QUE VARÍA EN TAMAÑO DE 1 A 2500? ¿Entonces causará algún problema?

¿Fue útil?

Solución

Suponiendo que su archivo VSAM está correctamente inicializado y su JCL está codificado de manera consistente con los requisitos de su programa, no debería haber ningún problema.

La cláusula VARYING simplemente le dice a COBOL que reserve suficiente espacio en el búfer para el tamaño máximo de registro esperado e indica que el archivo contiene registros que se espera que varíen en tamaño de una llamada de E / S a la siguiente.Si hubiera sido FB (bloque fijo), COBOL espera que el registro tenga un tamaño constante y activará el código de estado 04 si el registro se desvía del tamaño esperado.Para VB (Bloque variable), un código de retorno 04 aún podría ocurrir si el tamaño de su registro excede el límite máximo definido VARYING.

Personalmente, encuentro que las condiciones de estado de E / S de COBOL son algo crípticas de entender.

Aquí hay una tabla de códigos de estado de E / S ANSI COBOL que tengo a mano para fines de depuración de E / S de archivos:

0x - Successful Completion
00 - No futher information
02 - Duplicate Key detected
04 - Wrong Length Record
05 - File created when opened.  With sequential VSAM 00 is returned.
07 - CLOSE with NO REWIND or REEL for non-tape dataset.

1x - End of File conditions
10 - No futher information
14 - Relative record READ outside boundry.

2x - Invalid Key condition
21 - Sequence Error
22 - Duplicate Key
23 - No Record found
24 - Key outside boundry

3x - Permanent I/O Errors
30 - No further information
34 - Record outside file boundry
35 - OPEN and required file not found.
37 - OPEN with invalid mode
38 - OPEN of file closed with a LOCK
39 - OPEN unsuccessful due to conflicting file attributes

4x - Logic Errors
41 - OPEN of file already open
42 - CLOSE of file not open
43 - READ  not executed before REWRITE
44 - REWRITE of different size record
46 - READ after EOF reached
47 - READ attempted for file not opened I-O or EXTEND
48 - WRITE for file not opened OUTPUT, I-O, or EXTEND
49 - DELETE or REWRITE for file not opened I-O

9x - Specific Compiler defined exceptions
90 - No further information
91 - VSAM Password failure
92 - Logic Error
93 - VSAM Resource unavailable
94 - VSAM Sequence record not available
95 - VSAM invalid or incomplete file information
96 - VSAM no DD statement
97 - VSAM OPEN successful, file integrity verified.

Otros consejos

El programa COBOL que lee un archivo de diseño de registro variable dio el código de estado del archivo como 004. Pero después de especificar la cláusula VARYING en la SECCIÓN DE ARCHIVO, salió bien.

Código que dio el código de estado del archivo como 04:

FD  XXXXX-FILE                                 
RECORDING MODE IS V                        
BLOCK CONTAINS 0 RECORDS
LABEL RECORDS STANDARD.   

Después de especificar la cláusula VARYING, el código de estado del archivo es 00:

FD  XXXXX-FILE             
RECORDING MODE IS V    
RECORD IS VARYING IN SIZE FROM 01 TO 2598
BLOCK CONTAINS 0 RECORDS
LABEL RECORDS STANDARD.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top