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

Enterprise COBOL打开VB格式XML数据集报文件状态39错误如何解决

问题背景

需要在COBOL程序中处理XML文件,计划使用Enterprise COBOL 6.3的XML PARSE工具实现,输入为变长格式文件,对变长文件操作经验较少。

测试样本数据集属性

Data Set Name . . . . : TDES.XML.SPOT.TR                                 
                                                                         
General Data                           Current Allocation                
 Management class . . : **None**        Allocated blocks  . : 5          
 Storage class  . . . : **None**        Allocated extents . : 1          
  Volume serial . . . : ABCXYZ                                          
  Device type . . . . : 3390                                             
 Data class . . . . . : **None**                                         
  Organization  . . . : PS             Current Utilization               
  Record format . . . : VB              Used blocks . . . . : 1          
  Record length . . . : 10000           Used extents  . . . : 1          
  Block size  . . . . : 10004                                           
  1st extent blocks . : 5                                               
  Secondary blocks  . : 0              Dates                             
  Data set name type  :                 Creation date . . . : 2021/10/27
                                        Referenced date . . : 2021/10/27
                                        Expiration date . . : ***None***
  SMS Compressible  . : NO           

问题代码片段

*****************************************************************
 IDENTIFICATION DIVISION.                                         
 PROGRAM-ID.  XXXXXXXX.                                           
 AUTHOR.  XXXXXXXX.                                                            
******************************************************************
*            E N V I R O N M E N T       D I V I S I O N         *
******************************************************************
 ENVIRONMENT DIVISION.                                            
*                                                                 
 CONFIGURATION SECTION.                                           
*                                                                 
 SPECIAL-NAMES.                                                   
     DECIMAL-POINT IS COMMA.                                      
******************************************************************
*    I N P U T - O U T P U T      S E C T I O N                  *
******************************************************************
 INPUT-OUTPUT SECTION.                                            
*                                                                 
 FILE-CONTROL.                                                    
****************************************************************  

DESODH     SELECT FENTRADA                                              
DESODH         ASSIGN TO FENTRADA                                       
DESODH         ORGANIZATION IS SEQUENTIAL                               
DESODH         ACCESS MODE  IS SEQUENTIAL                               
DESODH         FILE STATUS  IS FS-FENTRADA-XML.                         

******************************************************************
*    D A T A     D I V I S I O N                                 *
******************************************************************
 DATA DIVISION.                                                   
******************************************************************
*    FILE SECTION                                                *
******************************************************************
*                                                                 
 FILE SECTION.                                                    

DESODH FD  FENTRADA                                                     
DESODH     LABEL RECORDS STANDARD                                       
DESODH     RECORD IS VARYING FROM 1 TO 10000 DEPENDING ON W-REC-LENGTH 
DESODH     RECORDING MODE IS V                                          
DESODH     BLOCK CONTAINS 0 RECORDS.                                    
DESODH 01  REG-FENTRADA.                                                
         02 PIC X OCCURS 1 TO 10000 DEPENDING ON W-REC-LENGTH.    

WORKING-STORAGE SECTION.                                         
*                                                                 
******************************************************************
* DEFINICIÓN DEL FICHERO DE ENTRADA                              *
******************************************************************
01  REG-ENTRADA             PIC X(1300).                         
*                                                                 
******************************************************************
* DEFINICIÓN DE LOS FICHEROS DE SALIDA                           *
******************************************************************
      COPY FMIF1113.                                               
*                                                                 
******************************************************************
* DEFINICIÓN DE VARIABLES WORKING                                *
******************************************************************
01  W-VARIABLES-AUXILIARES.                                      

** VARIABLES A CAMBIAR EN CADA PROGRAMA:                          
    05 W-CONT-CAMPOS               PIC 9(03)  VALUE 46.          
** VARIABLES A CAMBIAR EN CADA PROGRAMA:                          
    05 W-SITUACION                 PIC 9(04)  VALUE ZEROS.      

    05 W-MENSAJE                   PIC X(100) VALUE SPACES.     
    05 W-STATUS                    PIC X(02)  VALUE SPACES.     
...................
******************************************************************
 *             P R O C E D U R E   D I V I S I O N                *
******************************************************************
  PROCEDURE DIVISION.                                              
       PERFORM 1000-INICIO                                         
       PERFORM 4000-PROCESO-XML UNTIL SI-FIN-PROCESO-XML          
       PERFORM 3000-FINAL                                          
       STOP RUN.                                                   
******************************************************************
*  1000-INICIO.                                                  *
******************************************************************
  1000-INICIO.                                                     
      MOVE  1000                         TO W-SITUACION.          
DESODH     PERFORM 1060-ABRIR-FICHERO-XML                               
         .                                                 
DESODH******************************************************************
DESODH*  1060-ABRIR-FICHERO-XML                                        *
DESODH******************************************************************
DESODH 1060-ABRIR-FICHERO-XML.                                          
DESODH                                                                  
DESODH     MOVE  1060                         TO W-SITUACION.          
DESODH     SET NO-ERROR-LECTURA            TO TRUE                      
DESODH     SET NO-FIN-FENTRADA             TO TRUE                      
DESODH     SET NO-TAG-ENCONTRADO           TO TRUE                      
DESODH     SET NO-ENCONTRADO-IDENTIFICADOR TO TRUE                      
DESODH     SET NO-VERSION-INFORMATION      TO TRUE                      
DESODH     SET NO-ENCODING-DECLARATION     TO TRUE                      
DESODH     OPEN INPUT FENTRADA                                          
DESODH                                                                  
DESODH     IF  FS-FENTRADA-XML NOT = 00                                 
DESODH        DISPLAY 'ERROR AL ABRIR FICHERO XML. FS: ' FS-FENTRADA-XML
DESODH        MOVE 'ERROR OPEN FENTRADA '      TO W-MENSAJE             
DESODH        MOVE FS-FENTRADA-XML             TO W-STATUS              
DESODH        PERFORM PR-FIN-ERROR-LOGICO                               
DESODH     END-IF.                                                      
DESODH                                                                  
DESODH     PERFORM 8000-LEER-FENTRADA                                   

DESODH******************************************************************
DESODH* 8000-LEER-FENTRADA                                              
DESODH******************************************************************
DESODH 8000-LEER-FENTRADA.                                              
DESODH     MOVE 8000                         TO W-SITUACION             

DESODH     READ FENTRADA                                                
DESODH       AT END SET SI-FIN-PROCESO-XML TO TRUE                      

DESODH     IF FS-FENTRADA-XML                NOT = 0                    
DESODH        DISPLAY 'ERROR EN EL READ XML. FS: ' FS-FENTRADA-XML      
DESODH        MOVE 'ERROR READ FENTRADA '          TO W-MENSAJE         
DESODH        MOVE FS-FENTRADA-XML                 TO W-STATUS          
DESODH        PERFORM PR-FIN-ERROR-LOGICO                               
DESODH     END-IF                                                       
DESODH     .     
...........................more code  

报错信息

********************************* TOP OF DATA **********************************
 IGZ0201W A file attribute mismatch was detected. File FENTRADA in program MIFD1113 had a record length of 10004 and      
          the file specified in the ASSIGN clause had a record length of 10000.                                           
 ERROR AL ABRIR FICHERO XML. FS: 39                                                                                       
 ************************************************                                                                         
 *    PROGRAMA MIFD1113 ERROR EJECUCION         *                                                                         
 ************************************************                                                                         
 *  PARRAFO       : 1060                                                                                                  
 *  STATUS        : 39                                                                                                    
 *  NOMBRE RUT    :                                                                                                       
 *  MENSAJE       : ERROR OPEN FENTRADA                                                                                   
 *  CLAVE-ACCESO  :                                                                                                       
 ************************************************                                                                         
 CEE3250C The system or user abend U1777 R=NULL     was issued.                                                           
          From compile unit BKCANCEL at entry point BKCANCEL at compile unit offset +000006D6 at entry offset +000006D6   
           at address 000C30D6.                                                                                           
 <> LEAID ENTERED (LEVEL 02/26/2016 AT 17.55)                                                                             
 <> LEAID PROCESSING COMPLETE. RC=4                                                                                       
******************************** BOTTOM OF DATA ********************************
问题

打开文件返回状态码39,提示长度不匹配,问题根源是什么?如何修复?

解答

问题根源

z/OS环境下VB(变长记录)格式的数据集,属性中的Record length(LRECL)包含了4字节的记录描述符(RDW,系统用来标识每条记录的长度),用户实际可使用的单条记录最大数据长度为LRECL - 4。
当前测试数据集的LRECL为10000,所以用户数据最大长度为9996,但COBOL程序的FD段定义的最大记录长度为10000,COBOL编译器处理RECORDING MODE IS V的定义时,会自动加上4字节RDW长度,最终程序预期的文件记录长度为10004,和实际数据集的10000不匹配,触发文件状态码39错误。

修复方案

根据业务需求二选一即可:

  1. 调整COBOL程序定义:将FD段的最大记录长度改为9996,适配现有数据集属性,修改代码如下:
FD  FENTRADA                                                     
    LABEL RECORDS STANDARD                                       
    RECORD IS VARYING FROM 1 TO 9996 DEPENDING ON W-REC-LENGTH 
    RECORDING MODE IS V                                          
    BLOCK CONTAINS 0 RECORDS.                                    
01  REG-FENTRADA.                                                
    02 PIC X OCCURS 1 TO 9996 DEPENDING ON W-REC-LENGTH.
  1. 调整数据集属性:如果XML业务数据最大长度确实需要10000,重新分配输入数据集,将LRECL改为10004,对应调整块大小为适配3390设备的合理值即可。

注意:后续使用XML PARSE解析XML内容时,需要跳过记录前4字节的RDW,仅传入实际业务数据部分,避免解析错误。

内容的提问来源于stack exchange,提问作者Ollie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:04