lunes, 28 de marzo de 2011

Procesar múltiples archivos en FTP Batch desde AS400 (Lista LSOUTPUT)

De manera complementaria al post anterior referente a como procesar archivos vía FTP por lotes, aquí describo una manera de procesar una lista de archivos dentro de una determinada ruta (directorio).
Esto es útil cuando no sabemos cuántos archivos vamos a procesar o cuando los nombres de los archivos son variables, ejemplo: ARCHIVO_20110328.TXT


Previamente a todo, logearnos manualmente por FTP y nos ubicamos en la carpeta que contiene los archivos y ejecutar el comando LS. En la figura la carpeta contiene 4 archivos de formato texto, los cuales deben ser “bajados” y procesados individualmente.




Para hacer esto generamos la lista de archivos con el comando LS y derivamos la salida a archivo. Esto lo haremos en el CL.

            El sistema genera un archivo plano de nombre LSOUTPUT y lo deposita en la librería que indiquemos como destino.
      ===> ls *.* (Disk              

  200 PORT subcommand request successful.           
  125 List started.                                 
  250 List completed.                               


Con el comando LS podemos indicar que tipo de archivos incluir en la lista.
En el ejemplo se considera todos los archivos.






Para procesar solamente archivos XML el comando sería:

===> ls *.XML (Disk          


Ejemplo de programa para bajar y procesar múltiples archivos por FTP.

            Serían 2 programas para hacer este trabajo, el primero genera la lista de archivos (archivo LSOUTPUT ) y el segundo lee dicho archivo y realiza el ftp para cada registro.

             PGM                                                           
                                                                           
   /* Crea o Limpia Miembros */                                            
                                                                           
             CLRPFM    FILE(MILIBRERIA/QFTPLOG) MBR(LISTA)                   
             MONMSG    MSGID(CPF3141) EXEC(ADDPFM +                        
                       FILE(MILIBRERIA/QFTPLOG) MBR(LISTA))                  
             CHGCURLIB  CURLIB(MILIBRERIA)                                   
                                                                           
   /* FTP Lista de archivos */                        
                                                                           
             OVRDBF     FILE(INPUT)  TOFILE(MILIBRERIA/QFTPSRC) MBR(LISTA)   
             OVRDBF     FILE(OUTPUT) TOFILE(MILIBRERIA/QFTPLOG) MBR(LISTA)   
             FTP        RMTSYS(SERVIDOR)                                      
             DLTOVR     FILE(INPUT OUTPUT)                                 
                                                                           
   /* Chequea si hay Archivos en lista */                              
                                                                     
          RTVMBRD    FILE(MILIBRERIA/LSOUTPUT) NBRCURRCD(&NROREG)    
          IF         COND(&NROREG *EQ 0) THEN(SNDUSRMSG +           
                       MSG('GENERA LISTA: CARPETA NO CONTIENE +     
                       ARCHIVOS PARA PROCESAR') MSGTYPE(*INFO) +    
                       TOMSGQ(QSYSOPR))                             
          GOTO       CMDLBL(FIN)                                    
          ENDDO                                                      
                                                                    
          OVRDBF     FILE(LSOUTPUT) TOFILE(MILIBRERIA/LSOUTPUT)      
          CALL       PGM(MILIBRERIA/PROCESACL)                            
                                                                    
      FIN:                                                          


PROCESACL

             PGM                                                   
             DCL        VAR(&NOMFILE) TYPE(*CHAR) LEN(20)          
             DCLF       FILE(MILIBRERIA/LSOUTPUT)                    
                                                                   
     LOOP:                                                         
             RCVF       RCDFMT(LSOUTPUT)                           
             MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(FIN))      
             CHGVAR     VAR(&NOMFILE) VALUE(%SST(&LSOUTPUT 1 20))  
                                                                   
   /* Actualiza nombre de archivos en fuente QFTPSRC/ARCHIVO */                
                                                                    
             OVRDBF     FILE(QFTPSRC) TOFILE(MILIBRERIA/QFTPSRC) +     
                        MBR(ARCHIVO)                                
             CALL       PGM(MILIBRERIA/ACTUALIZA) PARM(&NOMFILE)         
                                                                   
   /* Crea o Limpia Miembros */                                    
                                                                   
             CLRPFM    FILE(MILIBRERIA/QFTPLOG) MBR(ARCHIVO)            
             MONMSG    MSGID(CPF3141) EXEC(ADDPFM +                     
                       FILE(MILIBRERIA/QFTPLOG) MBR(ARCHIVO))                
                                                                        
   /* FTP Archivo Txt al AS400 */                     
                                                                        
             OVRDBF     FILE(INPUT)  TOFILE(MILIBRERIA/QFTPSRC) MBR(ARCHIVO) 
             OVRDBF     FILE(OUTPUT) TOFILE(MILIBRERIA/QFTPLOG) MBR(ARCHIVO) 
             FTP        RMTSYS(SERVIDOR)                                   
             DLTOVR     FILE(INPUT OUTPUT)                              

    /* Rpg que procesa el archivo */
                     
             OVRDBF     FILE(ARCHIVO)  TOFILE(MILIBRERIA/ARCHIVO)          
             CALL       PGM(MILIBRERIA/PROCESARPG)                             
             DLTOVR     FILE(*ALL)                                      
                                                                         
             DLTF       FILE(MILIBRERIA/ARCHIVO)                          
             MONMSG     MSGID(CPF2105)                                  
                                                                        
             GOTO       CMDLBL(LOOP)                                    
                                                        
         FIN:                                           
             DLTF       FILE(MILIBRERIA/LSOUTPUT)        
             MONMSG     MSGID(CPF2105)                  
                                                        
             ENDPGM                                      

Fuente de comandos FTP  QFTPSRC/LISTA

USUARIO   CLAVE           
lcd MILIBRERIA                    
cd CARPETA                 
ls *.* (DISK                     
quit                             


Fuente de commandos Ftp para cada archivo QFTPSRC/ARCHIVO

USUARIO    CLAVE              
lcd MILIBRERIA                           
cd CARPETA                        
get Archivo1.txt ARCHIVO              
quit                                    


NOTAS:
·         El programa ACTUALIZA es un RPG que actualiza la línea 4 del fuente QFTPSRC/ARCHIVO
get Archivo1.txt ARCHIVO              
get Archivo2.txt ARCHIVO              
get Archivo3.txt ARCHIVO              
get Archivo4.txt ARCHIVO              
·         El programa PROCESARPG es quien procesa cada archivo texto.
·         El archivo LOG para la lista mostrará lo siguiente:

Se ha redirigido la salida a un archivo.                               
Lectura de entrada del archivo de la alteración temporal especificado. 
Conectando con el sistema principal SERVIDOR en la dirección xx.xx.xx.xxx 
 utilizando el puerto 21.                                              
220 Microsoft FTP Service                                              
Entre el ID de inicio de sesión (USUARIO):                              
331 Password required for USUARIO.                                  
230 User USUARIO logged in.                                         
Windows_NT                                                             
Entre un submandato FTP.                                               
> lcd MILIBRERIA                                                        
El directorio de trabajo local es MILIBRERIA                                                        
Entre un submandato FTP.                                               
> cd CARPETA                                                     
250 CWD command successful.                                            
Entre un submandato FTP.                                                
> ls *.* (DISK                                         
227 Entering Passive Mode (xx,xx,xx,xxx,xxx,xx).        
125 Data connection already open; Transfer starting.   
226 Transfer complete.                                  
Entre un submandato FTP.                               
> quit                                                 
221                                                    

Espero haber sido lo más claro posible, si tienes alguna duda, pregunta no mas =P

No hay comentarios:

Publicar un comentario