IDENTIFICATION DIVISION. PROGRAM-ID. XMLPRUE. ****************************************************************** * *================================================================* * 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. * *==================== INPUT-OUTPUT SECTION. *==================== * FILE-CONTROL. * SELECT FICHXML ASSIGN TO FICHXML STATUS IS FS-FICHXML. * SELECT GOMINOLAS ASSIGN TO GOMINOLAS STATUS IS FS-GOMINOLAS. * SELECT REVISTAS ASSIGN TO REVISTAS STATUS IS FS-REVISTAS. * * *================================================================* * D A T A D I V I S I O N * *================================================================* * DATA DIVISION. * *============ FILE SECTION. *============ * * Fichero de entrada FD FICHXML RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 129 CHARACTERS. 01 REG-FICHXML PIC X(129). * * Fichero de salida FD GOMINOLAS RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 80 CHARACTERS. 01 REG-GOMINOLAS PIC X(80). * Fichero de salida FD REVISTAS RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 80 CHARACTERS. 01 REG-REVISTAS PIC X(80). * * *======================= WORKING-STORAGE SECTION. *======================= * * ---------------------- * BANDERAS E INDICADORES * ---------------------- 01 WB-BANDERAS. 05 WB-FIN-FICHXML PIC X(1) VALUE 'N'. 88 FIN-FICHXML VALUE 'S'. * 05 WB-FIN-PROCESO PIC X(1) VALUE 'N'. 88 FIN-PROCESO VALUE 'S'. * 05 WB-FIN-TABLA PIC X(1) VALUE ' '. 88 FIN-TABLA VALUE 'S'. 88 NO-FIN-TABLA VALUE 'N'. * 05 WB-BUSCA-INI PIC X(1) VALUE 'N'. 88 FIN-BUSCA-INI VALUE 'S'. 88 INI-BUSCA-INI VALUE 'N'. * 05 WB-BUSCA-FIN PIC X(1) VALUE 'N'. 88 FIN-BUSCA-FIN VALUE 'S'. 88 INI-BUSCA-FIN VALUE 'N'. * 05 WB-TABLAS PIC 9(2) VALUE 0. 88 SI-TABLA1 VALUE 1. 88 SI-TABLA2 VALUE 2. *-> Switches campos 05 WB-CAMPOS PIC 9(2) VALUE 0. 88 SI-CAMPO1 VALUE 1. 88 SI-CAMPO2 VALUE 2. 88 SI-CAMPO3 VALUE 3. 88 SI-CAMPO4 VALUE 4. 88 SI-CAMPO5 VALUE 5. 88 SI-CAMPO6 VALUE 6. * * ------- * INDICES * ------- 01 WI-INDICES. 05 WI-POS PIC 9(6) COMP-4. 05 WI-POS-AUX PIC 9(6) COMP-4. 05 WI-INI PIC 9(6) COMP-4. 05 WI-FIN PIC 9(6) COMP-4. * * ------------ * ACUMULADORES * ------------ 01 WA-ACUMULADORES. 05 WA-NUMTBL PIC 9(8). * * * ----------------- * CAMPOS DE TRABAJO * ----------------- 01 WX-TRABAJO. 05 WX-REG-XML PIC X(250000). 05 WX-REG-XML-AUX PIC X(250000). 05 WX-POS-INI PIC 9(6). 05 WX-FIN-ATR PIC 9(6). 05 WX-TABLA-AUX. 10 FILLER PIC X(7) VALUE ''. * * --------------- * FILE STATUS * --------------- 01 FS-STATUS. 05 FS-FICHXML PIC XX. 88 FS-FICHXML-OK VALUE '00'. 88 FS-FICHXML-EOF VALUE '10'. 05 FS-GOMINOLAS PIC XX. 88 FS-GOMINOLAS-OK VALUE '00'. 88 FS-GOMINOLAS-EOF VALUE '10'. 05 FS-REVISTAS PIC XX. 88 FS-REVISTAS-OK VALUE '00'. 88 FS-REVISTAS-EOF VALUE '10'. * * --------------------- * REGISTROS DE FICHEROS * --------------------- 01 WR-ENTRADA PIC X(129). 01 WR-GOMINOLAS. 05 WR-TB1-NOMBRE PIC X(20). 05 WR-TB1-PRECIO PIC X(10). 05 FILLER PIC X(50). 01 WR-REVISTAS. 05 WR-TB1-DESC PIC X(20). 05 WR-TB1-NOMBRE PIC X(20). 05 WR-TB1-PRECIO PIC X(10). 05 WR-TB1-COMPLEM PIC X(10). 05 FILLER PIC X(20). * *================================================================* * P R O C E D U R E D I V I S I O N * *================================================================* * PROCEDURE DIVISION. * ****************************************************************** * | 0000 - PRINCIPAL * *--|------------------+----------><----------+-------------------* ****************************************************************** 00000-PRINCIPAL. * *-> <1> * PERFORM 10000-INICIO * *-> <2> * PERFORM 20000-PROCESO UNTIL FIN-PROCESO * *-> <3> * PERFORM 90000-FINAL . ****************************************************************** * | 10000 - INICIO * ****************************************************************** 10000-INICIO. * INITIALIZE WX-TRABAJO * PERFORM 11000-ABRIR-FICHEROS * SET FIN-TABLA TO TRUE * PERFORM LEER-FICHXML * * Control de Fichero de Entrada Vacio IF FS-FICHXML-EOF DISPLAY 'FICHERO DE ENTRADA VACIO' PERFORM 90000-FINAL END-IF . * ****************************************************************** * 11000 - ABRIR FICHEROS * ****************************************************************** 11000-ABRIR-FICHEROS. * OPEN INPUT FICHXML OUTPUT GOMINOLAS REVISTAS * IF NOT FS-FICHXML-OK DISPLAY 'ERROR EN OPEN DEL FICHERO FICHXML:'FS-FICHXML END-IF * IF NOT FS-GOMINOLAS-OK DISPLAY 'ERROR EN OPEN DEL FICHERO GOMINOLAS:'FS-GOMINOLAS END-IF * IF NOT FS-REVISTAS-OK DISPLAY 'ERROR EN OPEN DEL FICHERO REVISTAS:'FS-REVISTAS END-IF * ****************************************************************** * | 20000 - PROCESO * *--|------------------+----------><----------+-------------------* * | SE REALIZA EL TRATAMIENTO DE LOS DATOS: * * 1| LEEMOS DEL FICHERO DE ENTRADA HASTA COMPLETAR LA VARIABLE * * | WX-REG-XML DE LONGITUD 250000. * * 2| BUSCAMOS LA ETIQUETA QUE NOS INDICA LA TABLA A TRATAR. * * 3| BUSCAMOS LA ETIQUETA QUE INDICA FINAL DE TABLA A TRATAR. * * 4| EJECUTAMOS EL XML PARSE PARA EXTRAER LA INFORMACION DE LA * * | TABLA TRATADA. * * 5| CONTROLAMOS EL FINAL DE FICHERO XML CON . * ****************************************************************** 20000-PROCESO. * PERFORM UNTIL WI-POS GREATER 249800 OR FIN-FICHXML PERFORM LEER-FICHXML END-PERFORM * MOVE WI-POS TO WI-POS-AUX SET INI-BUSCA-INI TO TRUE * IF FIN-TABLA PERFORM 21000-BUSCA-INICIO-TABLA END-IF * PERFORM 22000-BUSCA-FIN-TABLA * MOVE ZEROES TO WB-CAMPOS WB-ATRIBUTO PERFORM 23000-PROCESO-XML * MOVE WX-REG-XML-AUX TO WX-REG-XML * IF WX-REG-XML(1:10) EQUAL '' SET FIN-PROCESO TO TRUE END-IF . * ****************************************************************** * | 21000 BUSCA INICIO TABLA * *--|------------------+----------><----------+-------------------* * | RECORREMOS NUESTRA VARIABLE WX-REG-XML, CON UNA PARTE DEL * * | FICHERO XML, BUSCANDO ALGUNA DE LAS ETIQUETAS DE INICIO DE * * | TABLA. * ****************************************************************** 21000-BUSCA-INICIO-TABLA. PERFORM VARYING WI-INI FROM 1 BY 1 UNTIL FIN-BUSCA-INI OR WI-INI GREATER WK-MAX-REG IF WX-REG-XML(WI-INI:9) EQUAL WK-TABLA1 SET SI-TABLA1 TO TRUE SET FIN-BUSCA-INI TO TRUE END-IF IF WX-REG-XML(WI-INI:8) EQUAL WK-TABLA2 SET SI-TABLA2 TO TRUE SET FIN-BUSCA-INI TO TRUE END-IF END-PERFORM . * ****************************************************************** * | 22000 BUSCA FIN TABLA * *--|------------------+----------><----------+-------------------* * | PARA CADA TABLA, BUSCAMOS SU CORRESPONDIENTE ETIQUETA DE * * | FINAL DE TABLA. * ****************************************************************** 22000-BUSCA-FIN-TABLA. INITIALIZE WX-POS-INI SET INI-BUSCA-FIN TO TRUE IF SI-TABLA1 PERFORM 22010-BUSCA-FIN-TABLA1 END-IF IF SI-TABLA2 PERFORM 22020-BUSCA-FIN-TABLA2 END-IF . * ****************************************************************** * | 22010 BUSCA FIN TABLA1 * *--|------------------+----------><----------+-------------------* * 1| RECORREMOS NUESTRA VARIABLE WX-REG-XML BUSCANDO LA ETIQUETA * * | DE FINAL DE LA TABLA 1: * * 2| EN CASO DE NO ENCONTRAR EL FINAL, NOS QUEDAMOS CON EL ULTIMO* * | REGISTRO LEIDO Y TRATAREMOS HASTA AHI. * * 3| EN SIGUIENTES PASADAS, TRATAREMOS EL RESTO DE LOS REGISTROS * * | HASTA ENCONTRAR EL FINAL DE LA TABLA. * ****************************************************************** 22010-BUSCA-FIN-TABLA1. PERFORM VARYING WI-FIN FROM 1 BY 1 UNTIL FIN-BUSCA-FIN IF WX-REG-XML(WI-FIN:2) EQUAL '/>'(final de cada registro de gominolas) COMPUTE WX-FIN-ATR = WI-FIN + 2 END-IF IF WX-REG-XML(WI-FIN:12) EQUAL ''(final de tabla1) COMPUTE WX-POS-INI = WI-FIN + 12 MOVE WX-REG-XML(WX-POS-INI:) TO WX-REG-XML-AUX MOVE SPACES TO WX-REG-XML(WX-POS-INI:) COMPUTE WI-POS = WI-POS-AUX - WX-POS-INI + 1 SET FIN-BUSCA-FIN TO TRUE SET FIN-TABLA TO TRUE ELSE IF WX-REG-XML(WI-FIN:200) EQUAL SPACES OR WI-FIN GREATER 249800 ADD 1 TO WA-NUMTBL MOVE WA-NUMTBL TO WX-NUMTBL MOVE WX-TABLA-AUX TO WX-REG-XML-AUX(1:16) MOVE WX-REG-XML(WX-FIN-ATR:) TO WX-REG-XML-AUX(17:) MOVE SPACES TO WX-REG-XML(WX-FIN-ATR:) COMPUTE WI-POS = WI-POS-AUX - WX-FIN-ATR + 17 SET FIN-BUSCA-FIN TO TRUE SET NO-FIN-TABLA TO TRUE END-IF END-IF END-PERFORM . * ****************************************************************** * | 22020 BUSCA FIN TABLA2 * *--|------------------+----------><----------+-------------------* * 1| RECORREMOS NUESTRA VARIABLE WX-REG-XML BUSCANDO LA ETIQUETA * * | DE FINAL DE LA TABLA 2: * * 2| EN CASO DE NO ENCONTRAR EL FINAL, NOS QUEDAMOS CON EL ULTIMO* * | REGISTRO LEIDO Y TRATAREMOS HASTA AHI. * * 3| EN SIGUIENTES PASADAS, TRATAREMOS EL RESTO DE LOS REGISTROS * * | HASTA ENCONTRAR EL FINAL DE LA TABLA. * ****************************************************************** 22020-BUSCA-FIN-TABLA2. PERFORM VARYING WI-FIN FROM 1 BY 1 UNTIL FIN-BUSCA-FIN IF WX-REG-XML(WI-FIN:7) EQUAL ''(final de cada registro de revistas) COMPUTE WX-FIN-ATR = WI-FIN + 7 END-IF IF WX-REG-XML(WI-FIN:11) EQUAL ''(final de tabla2) COMPUTE WX-POS-INI = WI-FIN + 11 MOVE WX-REG-XML(WX-POS-INI:) TO WX-REG-XML-AUX MOVE SPACES TO WX-REG-XML(WX-POS-INI:) COMPUTE WI-POS = WI-POS-AUX - WX-POS-INI + 1 SET FIN-BUSCA-FIN TO TRUE SET FIN-TABLA TO TRUE ELSE IF WX-REG-XML(WI-FIN:200) EQUAL SPACES OR WI-FIN GREATER 249800 ADD WK-N-1 TO WA-NUMTBL MOVE WA-NUMTBL TO WX-NUMTBL MOVE WX-TABLA-AUX TO WX-REG-XML-AUX(1:16) MOVE WX-REG-XML(WX-FIN-ATR:) TO WX-REG-XML-AUX(17:) MOVE SPACES TO WX-REG-XML(WX-FIN-ATR:) COMPUTE WI-POS = WI-POS-AUX - WX-FIN-ATR + 17 SET FIN-BUSCA-FIN TO TRUE SET NO-FIN-TABLA TO TRUE END-IF END-IF END-PERFORM . * ****************************************************************** * | 23000 PROCESO XML * *--|------------------+----------><----------+-------------------* * | EJECUTAMOS EL XML PARSE A NUESTRA VARIABLE WX-REG-XML CON * * | LA INFORMACION DE UNA DE LAS TABLA DEL FICHERO XML. * ****************************************************************** 23000-PROCESO-XML. XML PARSE WX-REG-XML PROCESSING PROCEDURE PARSEO-XML ON EXCEPTION DISPLAY 'ERROR EN PARSE:'XML-CODE NOT ON EXCEPTION CONTINUE END-XML . * ****************************************************************** * | PARSEO XML * *--|------------------+----------><----------+-------------------* * 1| COMPROBAMOS QUE TABLA SE ESTA TRATANDO * ****************************************************************** PARSEO-XML. EVALUATE TRUE WHEN SI-TABLA1 PERFORM 23100-PROCESO-XML-TABLA1 WHEN SI-TABLA2 PERFORM 23200-PROCESO-XML-TABLA2 END-EVALUATE . * ****************************************************************** * | 23100 PROCESO XML TABLA1 * *--|------------------+----------><----------+-------------------* * 1| COMPROBAMOS LOS DIFERENTES EVENTOS XML Y GUARDAMOS LA * * | INFORMACION EXTRAIDA EN SU COPY CORRESPONDIENTE. * * 2| ESCRIBIMOS EN EL FICHERO DE SALIDA. * ****************************************************************** 23100-PROCESO-XML-TABLA1. EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' CONTINUE WHEN 'CONTENT-CHARACTERS' CONTINUE WHEN 'END-OF-ELEMENT' IF XML-TEXT EQUAL 'Descripcion' PERFORM ESCRIBIR-GOMINOLAS END-IF WHEN 'ATTRIBUTE-NAME' EVALUATE XML-TEXT WHEN 'nombre' SET SI-CAMPO1 TO TRUE WHEN 'precio' SET SI-CAMPO2 TO TRUE WHEN OTHER MOVE ZEROS TO WB-CAMPOS END-EVALUATE WHEN 'ATTRIBUTE-CHARACTERS' EVALUATE TRUE WHEN SI-CAMPO1 MOVE XML-TEXT TO WR-TB1-NOMBRE WHEN SI-CAMPO2 MOVE XML-TEXT TO WR-TB1-PRECIO END-EVALUATE WHEN OTHER CONTINUE END-EVALUATE . * ****************************************************************** * | 23200 PROCESO XML TABLA2 * *--|------------------+----------><----------+-------------------* * 1| COMPROBAMOS LOS DIFERENTES EVENTOS XML Y GUARDAMOS LA * * | INFORMACION EXTRAIDA EN SU COPY CORRESPONDIENTE. * * 2| ESCRIBIMOS EN EL FICHERO DE SALIDA. * ****************************************************************** 23200-PROCESO-XML-TABLA2. EVALUATE XML-EVENT WHEN 'START-OF-ELEMENT' EVALUATE XML-TEXT WHEN 'Nombre' SET SI-CAMPO3 TO TRUE WHEN 'Precio' SET SI-CAMPO4 TO TRUE WHEN 'Complementos' SET SI-CAMPO5 TO TRUE WHEN OTHER MOVE ZEROS TO WB-CAMPOS END-EVALUATE WHEN 'CONTENT-CHARACTERS' EVALUATE TRUE WHEN SI-CAMPO3 MOVE XML-TEXT TO WR-TB2-NOMBRE WHEN SI-CAMPO4 MOVE XML-TEXT TO WR-TB2-PRECIO WHEN SI-CAMPO5 MOVE XML-TEXT TO WR-TB2-COMPLEM END-EVALUATE WHEN 'END-OF-ELEMENT' IF XML-TEXT EQUAL 'Tipo' PERFORM ESCRIBIR-REVISTAS END-IF WHEN 'ATTRIBUTE-NAME' EVALUATE XML-TEXT WHEN 'descripcion' SET SI-CAMPO6 TO TRUE WHEN OTHER MOVE ZEROS TO WB-CAMPOS END-EVALUATE WHEN 'ATTRIBUTE-CHARACTERS' IF SI-CAMPO6 MOVE XML-TEXT TO WR-TB2-DESC END-IF WHEN OTHER CONTINUE END-EVALUATE . * ****************************************************************** * | 90000 - FINAL * *--|------------------+----------><----------+-------------------* * | FINALIZA LA EJECUCION DEL PROGRAMA * * 1| Cierre de ficheros de programa * * 2| Finalización del Programa * ****************************************************************** 90000-FINAL. * PERFORM 91000-CERRAR-FICHEROS * STOP RUN . * ****************************************************************** * 91000 - CERRAR FICHEROS * ****************************************************************** 91000-CERRAR-FICHEROS. * CLOSE FICHXML GOMINOLAS REVISTAS * IF NOT FS-FICHXML-OK DISPLAY 'ERROR EN CLOSE DEL FICHERO FICHXML:'FS-FICHXML END-IF * IF NOT FS-GOMINOLAS-OK DISPLAY 'ERROR EN CLOSE DEL FICHERO GOMINOLAS:'FS-GOMINOLAS END-IF * IF NOT FS-REVISTAS-OK DISPLAY 'ERROR EN CLOSE DEL FICHERO REVISTAS:'FS-REVISTAS END-IF . * ****************************************************************** * | LEER-FICHXML * *-----------------------------><---------------------------------* * | GUARDAMOS EL REGISTRO LEIDO EN LA VARIABLE WX-REG-XML * ****************************************************************** LEER-FICHXML. * READ FICHXML INTO WR-ENTRADA END-READ EVALUATE TRUE WHEN FS-FICHXML-OK MOVE WR-ENTRADA TO WX-REG-XML(WI-POS:129) ADD 129 TO WI-POS WHEN FS-FICHXML-EOF SET FIN-FICHXML TO TRUE WHEN OTHER DISPLAY 'ERROR EN READ DEL FICHERO FICHXML:'FS-FICHXML END-EVALUATE . * ****************************************************************** * | ESCRIBIR-GOMINOLAS * ****************************************************************** ESCRIBIR-GOMINOLAS. * WRITE REG-GOMINOLAS FROM WR-GOMINOLAS * IF FS-GOMINOLAS-OK INITIALIZE WR-GOMINOLAS ELSE DISPLAY 'ERROR EN WRITE DEL FICHERO GOMINOLAS:'FS-GOMINOLAS END-IF . * ****************************************************************** * | ESCRIBIR-REVISTAS * ****************************************************************** ESCRIBIR-REVISTAS. * WRITE REG-REVISTAS FROM WR-REVISTAS * IF FS-REVISTAS-OK INITIALIZE WR-REVISTAS ELSE DISPLAY 'ERROR EN READ DEL FICHERO RVISTAS:'FS-REVISTAS END-IF . * *================ Fin del Programa XMLPRUE ================*