No puedo alocar archivo de salida.

Todo lo relacionado con REXX en este ambiente.
Responder
Lancelotemv
Usuario
Usuario
Mensajes: 10
Registrado: 12 Nov 2010, 20:21
País: Peru
Ciudad: Lima
Ocupación: Analista funcional

No puedo alocar archivo de salida.

Mensaje por Lancelotemv » 03 Oct 2013, 20:03

Estimados Compañeros,

Una ayuda, tengo problemas en alocar el fichero X1OUT, este archivo es creado por un JOB de una paso especifico y luego desde otro paso se invoca al programa REXX para llenarlo de acuerdo a la lectura de un componente de un archivo particionado, el problema es que para los demás archivos de salida(X2OUT, X3OUT y X4OUT) lo hace correctamente para el X1OUT no lo hace bien, me sale el siguiente mensaje, a ver si me pueden ayudar, realmente no le encuentro el error, adjunto el código.

Mensaje:

IRX0555E The input or output file X1OUT is not allocated. It cannot be opened for i/o
IRX0670E EXECIO error while trying to GET or PUT a record.


Código: Seleccionar todo

/*------------------------------------------------------------------*           
 * REXX - GENERA ARCHIVOS CON RELACION COMPONENTE VS PROGRAMAS *                
 *------------------------------------------------------------------*/          
/*123456789 123456789 123456789 123456789 123456789 123456789 123456*/          
PARSE ARG CLI FODATE                                                            
ADDRESS TSO                                                                     
MSGSTAT = MSG("OFF")                                                            
SAY 'CLI    = ' CLI                                                             
SAY 'FODATE = ' FODATE                                                          
FODATETMP = SUBSTR(FODATE,1,6)                                                  
/* FICHERO CON LISTA DE LIBRERIAS VS PROGRAMAS */                               
LIBRERIA0 = 'PPACD.OP8.ICOM.EX.LIB.F' || FODATE                                 
SAY 'LIBRERIA0 = ' LIBRERIA0                                                    
LIBRERIA1 = 'PPACD.OP8.RCOL.EX.PRGFUE.F' || FODATETMP                           
LIBRERIA2 = 'PPACD.OP8.RCOL.EX.PRGTAB.F' || FODATETMP                           
LIBRERIA3 = 'PPACD.OP8.RCOL.EX.PRGCPY.F' || FODATETMP                           
LIBRERIA4 = 'PPACD.OP8.RCOL.EX.PRGDCL.F' || FODATETMP                           
"ALLOC FI(INFILE0) DSN('"LIBRERIA0"') SHR"                                      
"EXECIO * DISKR INFILE0 ( FINIS STEM MYFILE0."                                  
"FREE F(INFILE0)"                                                               
CALL PRGPRG                                                                     
EXIT                                                                            
/* FIN */                                                                       
/* LEO COMPONENTE DE LIBRERIA PARTICIONADA */                                 
PRGPRG:                                                                         
I = 1                                                                           
DO WHILE I <= MYFILE0.0                                                         
   LIBRERIA = SUBSTR(MYFILE0.I,55,44)                                           
   PROGRAMA = SUBSTR(MYFILE0.I,01,08)                                           
   LIBRERIA1= STRIP(LIBRERIA,'B',' ')                                           
   PROGRAMA1= STRIP(PROGRAMA,'B',' ')                                           
   DSINFO   = LISTDSI("'"LIBRERIA1"'")                                          
   VOLUM    = SYSVOLUME                                                         
   SAY 'LIBRERIA1 : ' LIBRERIA1                                                 
   SAY 'PROGRAMA1 : ' PROGRAMA1                                                 
   FUENTE = LIBRERIA1 || '(' || PROGRAMA1 || ')'                                
   SAY 'FUENTE    : ' FUENTE                                                    
   "ALLOC FI(INFILE1) DSN('"FUENTE"') SHR"                                      
   "EXECIO * DISKR INFILE1 ( FINIS STEM MYFILE1."                               
   "FREE F(INFILE1)"                                                            
   STATUS = SYSDSN("'"LIBRERIA1"'")                                             
   IF STATUS = 'OK' THEN DO                                                     
      CALL ANAPRG                                                               
      CALL ANATAB                                                               
      CALL ANACPY                                                               
      CALL ANADCL                                                               
   END                                                                          
   I = I + 1                                                                    
END                                                                             
RETURN                                                                          
/* ANALIZA PROGRAMA, PARA OBTENER EL PROGRAMA LLAMADO */                        
ANAPRG:                                                                         
J = 0                                                                           
K = 1                                                                           
DO WHILE K <= MYFILE1.0                                                         
   FILA  = SUBSTR(MYFILE1.K,01,72)                                              
   COL   = SUBSTR(MYFILE1.K,07,01)                                              
   X1    = WORDPOS('CALL',FILA)                                                 
   IF X1 > 0 & COL = ' ' THEN                                                   
   DO                                                                           
     WPGM = WORD(FILA,X1+1)                                                     
     J = J + 1                                                                  
     REGSAL1.J = WPGM || '|' || PROGRAMA1                                       
     SAY 'CALL  : ' WPGM                                                        
   END                                                                          
   K = K + 1                                                                    
END                                                                             
IF J > 0 THEN                                                                   
DO                                                                              
REGSAL1.0 = J                                                                   
"ALLOC FI(X1OUT) DA('"LIBRERIA1"') OLD REUSE"                                   
"EXECIO * DISKW X1OUT (STEM REGSAL1."                                           
"EXECIO 0 DISKW X1OUT (FINIS"                                                   
"FREE F(X1OUT)"                                                                 
END                                                                             
RETURN                                                                          
/* ANALIZA PROGRAMA, PARA OBTENER LA TABLA USADA */                             
ANATAB:                                                                         
J = 0                                                                           
K = 1                                                                           
DO WHILE K <= MYFILE1.0                                                         
   FILA  = SUBSTR(MYFILE1.K,01,72)                                              
   COL   = SUBSTR(MYFILE1.K,07,01)                                              
   X1    = WORDPOS('INCLUDE',FILA)                                              
   IF X1 > 0 & COL = ' ' THEN                                                   
   DO                                                                           
     WTAB = WORD(FILA,X1+1)                                                     
     J = J + 1                                                                  
     REGSAL2.J = WTAB || '|' || PROGRAMA1                                       
     SAY 'TABLA : ' WTAB                                                        
   END                                                                          
   K = K + 1                                                                    
END                                                                             
IF J > 0 THEN                                                                   
DO                                                                              
REGSAL2.0 = J                                                                   
"ALLOC FI(X2OUT) DA('"LIBRERIA2"') OLD REUSE"                                   
"EXECIO * DISKW X2OUT (STEM REGSAL2."                                           
"EXECIO 0 DISKW X2OUT (FINIS"                                                   
"FREE F(X2OUT)"                                                                 
END                                                                             
RETURN                                                                          
/* ANALIZA PROGRAMA, PARA OBTENER LAS COPYS */                                  
ANACPY:                                                                         
J = 0                                                                           
K = 1                                                                           
DO WHILE K <= MYFILE1.0                                                         
   FILA  = SUBSTR(MYFILE1.K,01,72)                                              
   COL   = SUBSTR(MYFILE1.K,07,01)                                              
   X1    = WORDPOS('COPY',FILA)                                                 
   IF X1 > 0 & COL = ' ' THEN                                                   
   DO                                                                           
     WCOPY = WORD(FILA,X1+1)                                                    
     J = J + 1                                                                  
     REGSAL3.J = WCOPY || '|' || PROGRAMA1                                      
     SAY 'COPY : ' WCOPY                                                        
   END                                                                          
   K = K + 1                                                                    
END                                                                             
IF J > 0 THEN                                                                   
DO                                                                              
REGSAL3.0 = J                                                                   
"ALLOC FI(X3OUT) DA('"LIBRERIA3"') OLD REUSE"                                   
"EXECIO * DISKW X3OUT (STEM REGSAL3."                                           
"EXECIO 0 DISKW X3OUT (FINIS"                                                   
"FREE F(X3OUT)"                                                                 
END                                                                             
RETURN                                                                          
/* ANALIZA PROGRAMA, PARA OBTENER LAS DCLGEN */                                 
ANADCL:                                                                         
J = 0                                                                           
K = 1                                                                           
DO WHILE K <= MYFILE1.0                                                         
   FILA  = SUBSTR(MYFILE1.K,01,72)                                              
   COL   = SUBSTR(MYFILE1.K,07,01)                                              
   X1    = WORDPOS('INCLUDE',FILA)                                              
   IF X1 > 0 & COL = ' ' THEN                                                   
   DO                                                                           
     WINCLUDE = WORD(FILA,X1+1)                                                 
     J = J + 1                                                                  
     REGSAL4.J = WINCLUDE || '|' || PROGRAMA1                                   
     SAY 'INCLUDE : ' WINCLUDE                                                  
   END                                                                          
   K = K + 1                                                                    
END                                                                             
IF J > 0 THEN                                                                   
DO                                                                              
REGSAL4.0 = J                                                                   
"ALLOC FI(X4OUT) DA('"LIBRERIA4"') OLD REUSE"                                   
"EXECIO * DISKW X4OUT (STEM REGSAL4."                                           
"EXECIO 0 DISKW X4OUT (FINIS"                                                   
"FREE F(X4OUT)"                                                                 
END                                                                             
RETURN                                                                          

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 545
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: No puedo alocar archivo de salida.

Mensaje por Vicente » 04 Oct 2013, 09:53

Hola:

En la línea:
"ALLOC FI(X1OUT) DA('"LIBRERIA1"') OLD REUSE"
Tratas de utilizar un fichero con disposicion OLD, es decir, ha de existir.
Pero ... ¿Que valor tiene la variable LIBRERIA1 en el momento de la ejecución del ALLOC?
¿Corresponde con el nombre de una librería existente?
Para dar respuesta a estas preguntas, puedes ejecutar tu REXX añadiendo, al principio,las instrucciones:

TRACE R
msgstatus = MSG(ON)

y analizar la salida de SYSTSRPT

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

NJB
Su anfitrion
Su anfitrion
Mensajes: 1114
Registrado: 12 Oct 2003, 16:27
País: Argentina
Ciudad: Capilla del Señor
Ocupación: System Programmer
Contactar:

Re: No puedo alocar archivo de salida.

Mensaje por NJB » 04 Oct 2013, 16:06

Hola

Sin entrar en el tema de lleno es una muy buena técnica analizar la variable RC cada vez que se tira un comando externo, como en este caso el alloc, el execio, etc.

Si no dan 0 algo paso y hay que analizarlo. Lo mas lógico en esos casos es abortar el rexx y mandar algún aviso con el error que da. Lo bueno es que todos lo códigos de retorno están listados para casi todos los comandos en los manuales.

El execio siempre falla si el alloc no fue exitoso, y aun asi también puede fallar por otras razones.
Insisto en el RC

Saludos
Norberto Bocalandro

Responder