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) 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