COBOL II COBOL COmmon CO mmon Bussines Oriented Language • Lenguaje de computación orientado a aplicaciones comerciales • Auto Auto--documentable • Diseñado para integrar nuevas facilidades sin cambiar la estructura general del lenguaje • Cobol se ha perfeccionado y estandarizado desde 1959: – – – – COBOL ANS COBOL VS COBOL II COBOL III Codificación Cobol • Código fuente escrito en registros secuenciales • Similitud a tarjetas perforadas de 80 posiciones • Comprende: – – – – – 1a. Sección de numeración Columna de comentarios Area A Area B 2a. Sección de numeración 1-6 1a. SECCION NUMERACION 7 * 8-11 AREA “A” 12 72 AREA “B” 73-80 2a. SECCION NUMERACION 4 Divisiones • Estructura general IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. ( 2 Secciones Secciones) ) CONFIGURATION SECTION. INPUTINPUT -OUTPUT SECTION. DATA DIVISION. ( 3 Secciones) FILE SECTION. WORKINGWORKING -STORAGE SECTION. LINKAGELINKAGE -SECTION. PROCEDURE DIVISION. Primitivas de Cobol • Construcción de programas – – – – Programas divididos en párrafos Cada párrafo es utilizado para ejecutar una función específica Los párrafos contienen instrucciones del lenguaje Las instrucciones son cláusulas seguidas por punto (.) de acuerdo al idioma inglés – Punto(s) obligatorios antes de cada división, sección o párrafo y al final de cada definición de variable • Cada división tiene sentencias o cláusulas obligatorias y otras opcionales Primitivas de Cobol • Nombres de campos – Máximo 30 caracteres – Se pueden usar letras mayúsculas (A-Z), números (0-9), y guiones – Espacios y otros caracteres están prohibidos – El guión no puede ser el primer o último carácter • Palabras – Definidas por el usuario – Reservadas • Necesarias en entradas de Cobol • Palabras clave: ADD, READ, REWRITE, TO, UNTIL • Palabras optativas Primitivas de Cobol • Lineas de continuación – Cuando se requiere continuar una sentencia o entrada, se continúa en la área B – Para continuar literales no numéricas se utiliza un guión en la columna 7 • Nombres especiales • Números de nivel – 01 y 77 puede iniciar en el área A o B – 02 a 49, 66 u 88 debe estar en el área B • Líneas en blanco permitidas en cualquier parte del programa Identification Division • Primera línea en un programa de Cobol • Primer cláusula es PROGRAMPROGRAM-ID y es la única obligatoria • sintaxis: IDENTIFICATION PROGRAM-ID. AUTHOR. INSTALLATION. DATE-WRITTEN. DATE-COMPILED. SECURITY. DIVISION. nombre-programa. nombre-programador. nombre-instalación. fecha-escritura-programa. fecha-compilación-programa. ESTE PROGRAMA ESTA RESTRINGIDO. Environment Division • Utilizada para nombrar y asociar archivos a un dispositivo • Describe características de archivos • Sintaxis sección de configuración: ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. [computadora-fuente] OBJECT-COMPUTER. [computadora-objeto] [SPECIAL-NAMES.] [nombre.] [CURRENCY SIGN IS literal.] [DECIMAL-POINT IS COMMA.] Environment Division • Sintaxis secciones de control de archivos: INPUT-OUTPUT SECTION. FILE-CONTROL. [ entradas SELECT ... sintaxis en las siguientes láminas ] [I-O-CONTROL. SAME RECORD SORT AREA FOR nom-arch-1 {nom-arch-2} ... SORT-MERGE Environment Division • Cláusula SELECT archivos secuenciales SELECT [OPTIONAL] nombre-archivo ASSIGN TO nom-arch-ext RESERVE entero AREA AREAS [[ ORGANIZATION IS] SEQUENTIAL] [ACCESS MODE IS SEQUENTIAL] [FILE STATUS IS nombre-dato] • Ejemplo: …… INPUT-OUTPUT SECTION. …… FILE-CONTROL. …… SELECT OPTIONAL ENTRADA ASSIGN TO ARCHENT …… ORGANIZATION IS SEQUENTIAL …… ACCESS MODE IS SEQUENTIAL …… FILE STATUS IS ST-ENTRADA. …… …… SELECT REPORTE ASSIGN TO ARCHREP. Environment Division • Cláusula SELECT archivos relativos SELECT [OPTIONAL] nombre-archivo ASSIGN TO nom-arch-ext [RESERVE entero [AREA] AREAS]] [[ORGANIZATION IS] RELATIVE] ACCESS MODE IS [SEQUENTIAL] [RANDOM] [DYNAMIC] [RELATIVE KEY IS nombre-dato] [FILE STATUS IS nombre-dato] • Ejemplos: …… INPUT-OUTPUT SECTION. …… FILE-CONTROL. …… SELECT MOVTOS ASSIGN TO ARCHMOV …… ORGANIZATION IS RELATIVE …… ACCESS MODE IS SEQUENTIAL …… FILE STATUS IS ST-MOVTOS. …… …… SELECT MAECTA ASSIGN TO ARCHCTAS …… ORGANIZATION IS RELATIVE …… ACCESS MODE IS RANDOM …… RELATIVE KEY IS CTA-LLAVE …… FILE STATUS IS ST-MAECTA. Environment Division • Cláusula SELECT archivos secuencial indexado SELECT [OPTIONAL] nombre-archivo ASSIGN TO nom-arch-ext [RESERVE entero [AREA] [AREAS]] [[ORGANIZATION IS] INDEXED] ACCESS MODE IS [SEQUENTIAL] [RANDOM] [DYNAMIC] [RECORD KEY IS nombre-dato] [ALTERNATE RECORD KEY IS nombre-dato WITH DUPLICATES] [FILE STATUS IS nombre-dato] • Ejemplos: …… INPUT-OUTPUT SECTION. …… FILE-CONTROL. …… SELECT MOVTOS ASSIGN TO ARCHMOV …… ORGANIZATION IS INDEXED …… ACCESS MODE IS SEQUENTIAL …… FILE STATUS IS ST-MOVTOS. …… …… SELECT MAECTA ASSIGN TO ARCHCTAS …… ORGANIZATION IS INDEXED …… ACCESS MODE IS DYNAMIC …… RECORD KEY IS CTA-LLAVE …… ALTERNATE RECORD KEY IS CTA-CENREG …… WITH DUPLICATES …… FILE STATUS IS ST-MAECTA. Data Division • Definición de: – Estructuras de archivos – Variables utilizadas en el programa – Áreas de trabajo • FILE SECTION. Descripción de características de cada unos de los archivos definidos en SELECT y sus estructuras • WORKING WORKING--STORAGE SECTION. Definición de variables y áreas de trabajo • LINKAGE SECTION. Definición de datos compartidos con otros programas o subprogramas Esquema de programa Cobol …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… IDENTIFICATION DIVISION. PROGRAM-ID. PROGRAMEJEMPLO1. AUTHOR. INTERSOFTWARE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBMSOURCEIBM-390. OBJECTOBJECT -COMPUTER. IBMIBM-390. INPUT-OUTPUT SECTION. INPUTFILE-CONTROL. FILESELECT ENTRADA ASSIGN TO ARCHENT. SELECT REPORTE ASSIGN TO ARCHREP. DATA DIVISION. FILE SECTION. FD ENTRADA …… …… …… FD REPORTE …… …… …… Data Division • FILE SECTION sintaxis: FD nombre-archivo BLOCK CONTAINS [entero TO] entero RECORDS CHARACTERS CONTAINS entero CHARACTERS RECORD IS VARYING IN SIZE [[FROM entero][TO entero] CHARACTERS] [DEPENDING ON nombre-dato] CONTAINS entero TO entero CHARACTERS LABEL DATA RECORD IS RECORDS ARE STANDARD OMITTED RECORD IS RECORDS ARE {nombre-dato} ... Definición de registros de datos • Descripción de campos – Estructuras con base a números de nivel • Del 01 al 49 • Nivel 77 reservado para áreas de trabajo (en desuso) • Nivel 88 asigna nombre a diferentes valores de un campo – FILLER • Palabra reservada para indicar porciones de datos no referenciados – CLAUSULAS • PICTURE. Define el tipo de dato X(10) 9(06) A(20) alfanumérico de 10 posiciones numérico de 6 posiciones alfabético DE 20 posiciones Definición de registros de datos • Cláusulas – PICTURE. Uso de decimales • 9(15)V99 • 99V99999 • 9(02)v9(05) 17 dígitos de los cuales 2 son decimales 7 dígitos de los cuales 5 son decimales mismo formato que el anterior – PICTURE. Uso de signo • S9(15)V99 17 dígitos, 2 decimales con signo • Ejercicio. – Defina el siguiente formato de registro: REGISTRO--EMPLEADO REGISTRO NOMBRE DIRECCION NUM--EMPLEADO NUM Alfanumérico 40 Alfanumérico 40 Numérico 10 – ¿Que longitud tiene REGISTRO-EMPLEADO? Definición de registros de datos • Definición de grupos de datos REGISTRO--EMPLEADO REGISTRO NOMBRE DIRECCION NUM--EMPLEADO NUM FECHA DD MM AAAA • Ejercicio. – Haga la definición de la estructura de datos del esquema anterior si DD y MM son de 2 posiciones numéricas y AAAA es de 4 posiciones numéricas – ¿Qué longitud tiene REGISTRO-EMPLEADO? – ¿Qué longitud tiene FECHA? Definición de registros de datos • Cláusula VALUE – Utilizada para asignar valores iniciales a una variable 02 CONTADOR-PAGINAS PIC 9(03) VALUE 1. 02 CLAVE-BANCO PIC X(10) VALUE „INTERSOFTWARE ‟. – Se puede usar en combinación con constantes figurativas 02 FILLER 02 TOTAL-CARGOS 02 RAYA PIC X(20) PIC 9(15)V99 PIC X(132) VALUE SPACES VALUE ZEROS VALUE ALL „-‟. Edición de datos numéricos • Supresión de ceros – Si utilizamos PIC 999V99 y el contenido del campo es 1.55 – Al imprimir el campo aparecerá: 00155 – Preferimos que aparezca 1.55, para esto utilizamos el carácter “Z”, ejemplo: PIC ZZ9.99 • Comas y puntos decimales – Tenemos un campo con formato PIC 9(05)V99 – Y contenido 14525.55, al imprimir aparece: 1452555 – Para que aparezcan separadores de miles y punto decimal utilizamos PIC ZZ,ZZ9.99 – Al imprimir aparece: 14,525.55 Edición de datos numéricos • Notación europea – En Europa se utiliza como punto decimal la “,” y como separador de miles “.” – Es necesario definir en la cláusula SPECIAL-NAMES la frase: DECIMAL POINT IS COMMA – Y como máscara de edición: ZZ.ZZ9,99 – Al imprimir aparecerá: 14.525,55 • Justificación de datos. JUSTIFIED determina si el dato será almacenado en el campo justificado a la derecha (RIGTH) o a la izquierda (LEFT). El default para datos alfanuméricos es LEFT, para numéricos es RIGTH Redefinición de datos • Cláusula REDEFINES – Proporciona otro nombre o descripción a un dato previamente definido – Cuando queremos que el datos sea tratado como alfanumérico, lo referimos como CAMPO-ALFA – Cuando queremos que sea tratado como numérico, referimos a CAMPO-NUM, ejemplo: 01 FECHA-N PIC 9(6). 01 FECHA-R REDEFINES FECHA-N. 03 AA PIC 99. 03 MM PIC 99. 03 DD PIC 99. Formato de datos • Es dado por la cláusula USAGE – Es opcional e indica el tipo de formato que tendrá el campo – DISPLAY. Es asignado a los campos alfabético, alfanumérico, numérico y editado – Para los campos numéricos existen • COMPUTATIONAL o COMP. Formato binario puro. PIC S9(05) COMP ocupa 2 bytes PIC S9(09) COMP ocupa 4 bytes • COMPUTACIONAL-1 y 2 son utilizados en operaciones de punto flotante, no vistos en éste curso • COMPUTATIONAL-3. Empacado decimal, almacena 2 dígitos por cada byte, el último semi-byte ocupa el signo Justificación de datos • Definido por la cláusula JUSTIFIED – Determina si el dato será almacenado en el campo justificado a la derecha (RIGTH) o a la izquierda (LEFT). – El default para datos alfanuméricos es LEFT, para numéricos es RIGTH – Ejemplo: 02 FILLER PIC X(20) VALUE „INTERSOFTWARE‟ JUSTIFIED LEFT. 02 FILLER PIC X(20) VALUE „INTERSOFTWARE‟ JUST RIGTH. Definición de arreglos • Mediante la cláusula OCCURS. Define ocurrencias de un campo ya sea grupal o simple • Especifica cuántos elementos tiene un arreglo • Por ejemplo, si queremos definir los meses del año 01 01 TABLATABLA -M 02 FILLER 02 FILLER 02 FILLER … … 02 FILLER 02 FILLER TABLA-MESES TABLA02 TABTAB-MES PIC X(03) VALUE ‘ENE’. PIC X(03) VALUE ‘FEB’. PIC X(03) VALUE ‘MAR’. … … … PIC X(03) VALUE ‘NOV’. PIC X(03) VALUE ‘DIC’. REDEFINES TABLATABLA-M. OCCURS 12 PIC X(03). Ejercicios. • Defina los encabezados del layout de reporte que le proporcionará su instructor • Defina la IDENTIFICATION DIVISION, ENVIRONMENT DIVISION Y DATA DIVISION hasta FILE SECTION, para un programa típico que utilice 2 archivos de entrada y un archivo de salida para reporte de 132 posiciones • Los archivos de entrada son: – MAECTAS con longitud de 130 posiciones – MOVCTAS con longitud de 50 posiciones • Genere un miembro de su librería DSRN0XX.PO.FONTS por cada ejercicio elaborado Procedure Division • • • • Describe la lógica y operaciones del programa Arreglo con base a párrafos y/o secciones Debe iniciar con un nombre de párrafo Párrafos en el área A, deben terminar con punto (.) FORMATO: FORMATO: [PROCEDURE DIVISION [USING {nombre-de {nombrede-dato}...] • Formato general para verbos Cobol 000000 -NOMBRE NOMBRE-PARRAFO. [[oración]... oración ... ] Procedure Division • A continuación se describe la sintaxis de los verbos Cobol ACCEPT ACCEPT identificador identificador [FROM nombre-nemónico] FROM • Ejemplo: ACCEPT WS-FECHA FROM DATE DATE DAY DAY-OF-WEEK TIME Operaciones aritméticas • • • • • ADD SUBTRAC MULTIPLY DIVIDE COMPUTE OPERACIONES LÓGICAS • IF • EVALUATE • SEARCH OPERACIONES DE PROCESO • MOVE • PERFORM MANEJO DE ARCHIVOS • • • • • OPEN CLOSE READ WRITE REWRITE Procedure Division ADD identificador literal ... TO {identificador [ROUNDED]} ... [ON SIZE ERROR intrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-ADD] ADD identificador ... TO identificador literal GIVING {identificador [ROUNDED]}... ON SIZE ERROR instrucción imperativa] NOT ON SIZE ERROR instrucción imperativa] END-ADD] • Ejemplo: ADD 1 TO WS-CONREN ADD 1 TO WS-LEIMAE WS-LEIMOV WS-LEITAL ADD WS-CARGO TO WS-TOTSAL GIVING WS-TOTCTA. Procedure Division ADD CORRESPONDING CORR identificador TO identificador [ROUNDED] [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-ADD] • Ejemplo: ... ... ... 01 TOTALES-MENSUALES. 05 TOT-CARGOS 05 TOT-ABONOS 01 TOTALES-ANUALES. 05 TOT-CARGOS 05 TOT-ABONOS ... .. ... PIC S9(11)V99. PIC S9(11)V99. PIC S9(11)V99. PIC S9(11)V99. ADD CORR TOTALES-MENSUALES TO TOTALES-ANUALES. Procedure Division • Nunca utilizar: ALTER {nombre-de-procedimiento TO[PROCCED TO] nombre-de- procedimiento} • Call • Utilizado en el manejo de subprogramas • Los datos a pasar al subprograma se definen en WORKINGSTORAGE SECTION • Ejemplo: CALL ‘CALCULO’ USING DATO-ENTRADA DATO-RESPUESTA. Procedure Division • Compute – Utilizado para la ejecución de operaciones aritméticas – Sintaxis: COMPUTE {identificador [ROUNDED]}... = expresión-aritmética [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-COMPUTE] • Ejemplo: COMPUTE WS-IVA = (WS-COMISION-A + COMISION-B + COMISION-C) * .15 ROUNDED Procedure Division • Continue – Da continuidad a las oraciones de Cobol sin perder la lógica – Ejemplo: IF ENTENT-TIPOPAG = ‘EFEC’ CONTINUE ELSE … … … ENDEND -IF Procedure Division • Delete – Elimina los registros de un archivo – Sintaxis: DELETE nombre-de-archivo RECORD [INVALID KEY instrucción-imperativa] [NOT INVALID KEY instricción-imperativa] [END-DELETE] Procedure Division DISPLAY identificador ...{UPON nombre-nemónico}[WITH NO ADVANCING] literal DIVIDE identificador literal INTO {identificador [ROUNDED]} ... [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-DIVIDE] DIVIDE identificador Literal INTO identificador literal GIVING {identificador [ROUNDED]} ... [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-DIVIDE] Procedure Division DIVIDE identificador Literal BY identificador literal GIVING {identificador [ROUNDED]} ... [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-DIVIDE] DIVIDE identificador INTO identificador GIVING {identificador [ROUNDED]} ... literal literal REMAINDER identificador [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción imperativa] [END-DIVIDE] Procedure Division • Ejemplo de DIVIDE DIVIDE DIVISOR INTO DIVIDENDO GIVING COCIENTE ROUNDED ON SIZE ERROR PERFORM 800-OVFLOW-DIVIDE END-DIVIDE DIVIDE 4 END-DIVIDE INTO WS-AA GIVING WS-COCIENTE REMAINDER WS-RESIDUO Procedure Division • EVALUATE – Puede evitar el uso indiscriminado de IF anidado – Debido a lo complejo de su sintaxis, se proporcionan ejemplos claros: EVALUATE TRUE WHEN ENTER PERFORM WHEN PF2 PERFORM WHEN PF3 PERFORM WHEN PF4 PERFORM WHEN PF5 PERFORM WHEN OTHER PERFORM ENE-EVALUATE. 10000-TRATA-ENTER 20000-PROCESA-BAJA 30000-REGRESA-MENU 40000-PROCESA-ALTA 50000-PROCESA-ENLACE 60000-TECLA-INVALIDA Procedure Division • EVALUATE ejemplos: EVALUATE TRUE WHEN ENTER PERFORM WHEN PF2 PERFORM WHEN PF3 PERFORM WHEN OTHER PERFORM ENE-EVALUATE 10000-TRATA-ENTER 20000-PROCESA-BAJA 30000-REGRESA-MENU 40000-TECLA-INVALIDA EVALUATE CANT > 1000 ALSO TIPO-DTO ALSO CLIESP WHEN TRUE ALSO ‘3’ ALSO ‘N’ PERFORM 31-MAXIMO-DTO-3 WHEN FALSE ALSO ‘3’ ALSO ‘N’ PEFORM 32-PROCESO-DTO-3 WHEN TRUE ALSO ‘2’ ALSO ‘N’ PERFORM 33-MAXIMO-DTO-3 WHEN FALSE ALSO ‘2’ ALSO ‘N’ PEFORM 34-PROCESO-DTO-2 WHEN TRUE ALSO ‘1’ ALSO ‘N’ PERFORM 35-PROCESO-DTO-1 WHEN ANY ALSO ANY ALSO ‘S’ PERFORM 36-DESC-ESPECIALES WHEN OTHER TRUE ALSO ‘2’ ALSO ‘N’ PERFORM 37-SIN-DESCUENTOS [END-EVALUATE] Procedure Division • MOVE sintaxis y ejemplos MOVE identificador Literal MOVE CORRESPONDING CORR TO {identificador} identificador ... ... ... 01 REG-MOV. 05 CUENTA 05 TOT-CARGOS 05 TOT-ABONOS 01 REG-EDOCTA. O5 CUENTA 05 FECHA-PROCESO 05 NUMERO-MOVS 05 TOT-CARGOS 05 TOT-ABONOS ... .. ... MOVE CORR REG-MOV MOVE FECHA-PROCESO TO identificador PIC X(18). PIC S9(11)V99. PIC S9(11)V99. PIC X(18). PIC X(10). PIC S9(05) COMP. PIC S9(11)V99. PIC S9(11)V99. TO REG-EDOCTA. TO MAE-FECHA-OPER. Procedure Division • MULTIPLY MULTIPLY Sintaxis y ejemplo identificador BY {identificador [GIVING identificador] [ROUNDED identificador] ... [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-MULTIPLY] ... ... ... ... ... ... MULTIPLY TOT-CARGOS OF REG-EDOCTA BY WS-TASAINT GIVING WS-INTERES ROUNDED. Procedure Division • OPEN. Apertura de archivos INPUT OUTPUT {nombre-de-archivo [WITH NO REWIND]} ... {nombre-de-archivo [WITH NO REWIND]} ... OPEN ... I-O EXTEND {nombre-de-archivo} ... {nombre-de-archivo} ... • Ejemplo: OPEN INPUT MOVTOS I-O MAECTA OUTPUT REPORTE Procedure Division • PERFORM. Ejecución de un párrafo ya sea en forma única, consecutiva o iterativa PERFORM nombre-de-procedimiento [Instrucción-imperativa PERFORM PERFORM TIMES BEFORE AFTER THRU nombre-de-procedimiento [Instrucción-imperativa nombre-de-procedimiento WITH TEST nombre-de-procedimiento END-PERFORM] nombre-de-procedimiento identificador integer entero THRU THRU UNTIL condición [Instrucción-imperativa END-PERFORM] END-PERFORM] nombre-de-procedimiento Procedure Division • PERFORM PERFORM nombre-de-procedimiento THROUGH THRU nombre-de-procedimiento WITH TEST BEFORE AFTER VARYING identificador nombre-de-índice FROM identificador nombre-de-índice literal BY identificador literal UNTIL condición AFTER identificador literal FROM identificador nombre-de-índice literal BY identificador literal UNTIL condición [instrucción-imperativa END-PERFORM] Procedure Division • READ. Lectura de archivos READ nombre-de-archivo [NEXT] RECORD [INTO identificador] [AT END instrucción-imperativa] [NOT AT END instrucción-imperativa] [END-READ] READ nombre-de-archivo [INVALID KEY RECORD [INTO identificador] instrucción-imperativa] [NOT INVALID KEY instrucción-imperativa] [END-READ] • Ejemplos: READ FOLIOS AT END MOVE 1 TO SW-FIN-FOLIOS. READ MOVTOS NEXT RECORD INTO WS-REG-MOVTOS AT END MOVE 1 TO SW-FIN-MOVTOS. READ MAECTA INTO WS-REG-MAECTA INVALID KEY PERFORM 980-CUENTA-NO-EXISTE END-READ Procedure Division • REWRITE. Regraba (Actualiza) registros de un archivo REWRITE nombre-de-registro [FROM identificador] REWRITE nombre-de-registro [FROM [INVALID KEY identificador] instrucción-imperativa] [NOT INVALID KEY instrucción-imperativa] [END-REWRITE] • Ejemplos: REWRITE REG-FOLIOS. REWRITE REG-MOVTOS FROM WS-REG-MOVTOS INVALID KEY PERFORM 900-DUPLICADO-MOVS. REWRITE REG-MAECTA FROM WS-REG-MAECTA INVALID KEY PERFORM 970-CUENTA-DUPLICADA END-REWRITE Procedure Division • SEARCH. Busca un valor determinado en un arreglo • Sintaxis: SEARCH identificador [AT END WHEN identificador nombre-de-índice instrucción-imperativa] condición VARYING instrucción-imperativa NEXT SENTENCE ... [END-SEARCH] • Ejemplo: WORKING-STORAGE SECTION. 01 TAB-VTAS. 02 ELEM-VEND OCCURS 25 INDEXED BY INDICE. 03 COD-VEND PIC 9(2). 03 CANTIDAD PIC S9(7) COMP-3. SET INDICE TO 1. SEARCH ELEM-VEND AT END MOVE 1 TO NO-EXISTE WHEN COD-VEND(INDICE) = W-CODVEND ADD IMPOR-IN TO CANTIDAD(INDICE). Procedure Division • SEARCH ALL. Para búsquedas en tablas muy grandes y de principio a fin • Efectúa búsqueda binaria • Ejemplo: 01 TABLA. 02 ELEMENTO OCCURS 100 TIMES ASCENDING KEY IS CLAVE INDEXED BY IND. 03 CLAVE PIC 99. 03 ACUM PIC S9(5) COMP-3. … … … … … … … … … … … … … … SEARCH ALL ELEMENTO AT END MOVE ‘NO’ TO ENCONTRADO WHEN CLAVE = W-NUMERO-1 MOVE ACUM(IND) TO ACUM-SALIDA. Procedure Division • SET. Inicialización de índices e indicadores SET {nombre-de-índice} SET {nombre-nemónico} ... UP BY DOWN BY ... SET {nombre-de-condición} ... TO TO identificador entero ON OFF TRUE • Ejemplos: SET FIN-ARCH TO TRUE SET FIN-CURSOR TO TRUE SET INDICE TO 1 SET INDICE UP BY 1 ... Procedure Division • START. Posiciona cursor de lectura de archivos indexados en un valor determinado IS EQUAL TO IS = IS GREATER THAN START nombre-archivo KEY IS > nombre-de-dato IS NOT LESS THAN IS NOT < IS GRATER THAN OR EQUAL TO IS > = [INVALID KEY instrucción-imperativa] [NOT INVALID KEY instrucción-imperativa] [END-START] • Ejemplo: START MAECTA KEY IS >= CTA-NOMBRE INVALID KEY MOVE ‘1’ TO WS-INEX END-START. Procedure Division • STRING. Construye una string y la deja en un campo receptor desde varios campos • Ejemplo: NOMBRE J A V I E R APE-PAT R A M I R E Z APE-MAT B U E N O STRING NOMBRE DELIMITED BY ‘ ‘ ‘ ‘ APE-PAT DELIMITED BY ‘ ‘ ‘ ‘ APE-MAT DELIMITED BY ‘ ‘ WITH POINTER WS-CONTADOR-CAR NOMBRE-COMPLETO J A V I E R DELIMITED BY SIZE DELIMITED BY SIZE INTO NOMBRE-COMPLETO R AM I R E Z B U E N O Procedure Division • SUBTRACT. Substracción de valores o campos a una variable, sintaxis: SUBTRACT identificador literal ... FROM {identificador [ROUNDED]} GIVING {identificador [ROUNDED]}... [ON SIZE ERROR instrucción-imperativa] [NOT ON SIZE ERROR instrucción-imperativa] [END-SUBTRACT] SUBTRACT CORRESPONDING CORR [END-SUBTRACT] identificador FROM identificador [ROUNDED] Procedure Division • CONDICIONES CONDICION DE RELACION IS [NOT] GREATER THAN IS [NOT] > IS [NOT] LESS THAN Identificador IS [NOT] < identificador Literal IS [NOT] EQUAL TO literal Expresión-aritmética IS [NOT] = expresión-aritmética Nombre-de-índice IS GRATER THAN OR EQUAL TO nombre-de-índice IS > = IS LESS THAN OR EQUAL TO IS < = Procedure Division • CONDICIONES CONDICION DE CLASE: NUMERIC ALPHABETIC Identificador IS [NOT] ALPHABETIC-LOWER ALPHABETIC-UPER Nombre-de-clase CONDICION DE SIGNO: POSITIVE Expresión aritmética IS [NOT] NEGATIVE ZERO PROGRAMACIÓN ESTRUCTURADA • Problemas en los sistemas – – – – – – – – – – Costo muy elevado en el desarrollo Toman mucho tiempo para terminarse Su mantenimiento es muy costoso No son comprensibles con facilidad No son modificables con facilidad Susceptible de contener errores/fallas No cumplen con las expectativas de los usuarios Sumamente complejos No suficientemente depurados Costosos en su operación Programación Estructurada • • • • • • Hacia sistemas más comprensibles Programas auto documentados Bien estructurados Programas bien legibles Lógica sencilla y clara Archivos con información ordenada en forma lógica Confiabilidad • Mínimo número de fallas • Manejar de manera apropiada información válida y nono-válida • Detectar errores en su diseño • Facilidad de rastreo Programación Estructurada • Objetivos – – – – – Establecer una metodología de diseño Uso de lógicas sencillas Lógicas comprensibles Programas fáciles de modificar Hacer un programa correcto y asegurarnos que es correcto – En suma: Lograr que la estructura del programa modele la estructura natural del problema Técnicas de diseño • Estructuras de control de procesos – Determinan el flujo de la información durante la ejecución del programa – Este flujo debe ser simple y comprensible a simple vista • Estructuras de registros de datos – Basadas en agrupamiento de datos – Modularización de datos – Simplifican la identificación de datos Estructuras Control procesos • Estructuras válidas • SEQUENCE – – – – – – IF – THEN – ELSE CASE WHILE – DO REPEAT – UNTIL LOOP – EXIT – IF TERMINACION ANORMAL Estructuras de control • Codificación con Cobol – SEQUENCE PROCESO-A FORMATO: Proceso-A Proceso-B PROCESO-B Sequence EJEMPLO 1 RA = A RB = B RC = C MOVE ENT-CAMPO-A TO SAL-CAMPO-A MOVE ENT-CAMPO-B TO SAL-CAMPO-B MOVE ENT-CAMPO-C TO SAL-CAMPO-C Sequence Eemplo 2 GENERAR DESC. ISR GENERAR DESC. IMSS PERFORM 100-GENERA-DESC-ISR PERFORM 200-GENERA-DESC-IMSS IF – THEN – ELSE CONDICION PROCESO-C SI PROCESO-D FORMATO CASO 1 FORMATO CASO 2 IF condición Proceso-a END-IF IF condición Proceso-b ELSE Proceso-c END-IF IF-THEN-ELSE Calcular el salario mensual (SM) de un Obrero o empleado a partir de su salario Base (SB). Para obreros el SB es semanal y Debe multiplicarse por 4.345, para Empleados es quincenal y debe Multiplicarse por 2 EJEMPLO 1 OBRERO ? SM = 2 * SB CODIFICACION: IF ENT-TIPO-EMP = „O‟ COMPUTE WS-SAL-MENSUAL ROUNDED = ENT-SAL-BASE * 4.345 ELSE COMPUTE WS-SAL-MENSUAL ROUNDED = ENT-SAL-BASE * 2 END-IF SI SM = 4.345 * SB IF-THEN-ELSE Generar descuento de ISR y descuento De IMSS sólo a los Obreros Ejemplo ES OBRERO ? SI GENERAR DESCUENTO ISR GENERAR DESCUENTO IMSS CODIFICACION: IF ENT-TIPO-EMP = „O‟ PERFORM 100-GENERA-DESC-ISR PERFORM 200-GENERA-DESC-IMSS END-IF CASE CONDICION 1 PROCESO 1 CONDICION 2 PROCESO 2 CONDICION 3 PROCESO 3 FORMATO EVALUATE TRUE WHEN condición-1 Proceso-1 WHEN condición-2 Proceso-2 WHEN Condición-n Proceso-n WHEN OTHER Proceso-n END-EVALUATE CASE Ejemplo OTHER Mes = 1,3,5,7,8,10,12 DM = 31 Mes = 4,6,9,11 AÑO BISIESTO? SI DM = 30 DM = 28 DM = 29 Obtener los días totales que tiene el mes de acuerdo al número de mes CASE Codificación Ejemplo 1 EVALUATE TRUE WHEN WSWS-MES = 1 OR 3 OR 5 OR 7 OR 8 OR 10 OR 12 MOVE 31 TO WSWS-DIA WHEN WSWS-MES = 4 OR 6 OR 9 OR 11 MOVE 30 TO WSWS-DIA WHEN OTHER DIVIDE WSWS-ANIO BY 4 GIVING WSWS-RESUL REMAINDER WSWS-ANIO ANIO--BISIESTO IF WSWS-ANIO ANIO--BISIESTO = 0 MOVE 29 TO WSWS-DIA ELSE MOVE 28 TO WSWS-DIA END--IF END END--EVALUATE END CASE EJEMPLO 2 Calcular ISR forma A si salario base es igual al mínimo Calcular ISR forma B si salario base es mayor al mínimo y menor o igual al mínimo mas 500 Calcular ISR forma C si salario base es mayor a salario mínimo mas 500 OTHER S <= SS-MINIMO Calcula ISR forma „A‟ CODIFICACION: EVALUATE TRUE WHEN ENT-SAL-BASE < = WS-SAL-MINIMO PERFORM 110-CALC-ISR-A WHEN ENT-SAL-BASE < = WS-SAL-MINIMO + 500 PERFORM 110-CALC-ISR-B WHEN OTHER PERFORM 110-CALC-ISR-C END-EVALUATE. S<= S-MINIMO+500 Calcula ISR forma „B‟ Calcula ISR forma „C‟ WHILE DO SI CONDICION PROCESO-E FORMATO PERFORM UNTIL condición Proceso--e Proceso END--PERFORM END WHILE DO Ejemplo 1 Buscar la empresa 031 de una tabla en memoria N = Número de elementos en la tabla I = Índice de la tabla EMP = Número de empresa I=1 I > N “o” EMP( I ) = 031 I=I+1 CODIFICACION SET WS-I TO 1 PERFORM UNTIL (WS-I) > WS-NUM-ELEM OR (WS-ID-EMP (WS-I) = „O31‟ ) SET WS-I UP BY 1 END-PERFORM SI WHILE DO Ejemplo 2 SI FIN ? SI Calcular el salario Mensual para Todos los trabajadores Se tiene el primer Registro leído ES OBRERO? SM = 4.3445 * SB SM = 2 * SB REPORTA SM LEE REGISTRO WHILE DO Codificación Ejemplo 2 PERFORM UNTIL WSWS-FIN FIN--ENT = „1‟ IF ENTENT-TIPO TIPO--EMP = „O‟ COMPUTE WSWS-SAL SAL--MENSUAL ROUNDED = ENT--SAL ENT SAL--BASE * 4.3445 ELSE COMPUTE WSWS-SAL SAL--MENSUAL ROUNDED = ENT--SAL ENT SAL--BASE * 2 END--IF END PERFORM 400400-REPORTA REPORTA--SALARIO PERFORM 500500-LEE LEE--EMP END--PERFORM. END REPEAT UNTIL PROCESO-F CONDICION SI FORMATO PERFORM TEST AFTER UNTIL condición Proceso-f END-PERFORM REPEAT UNTIL Ejemplo LEE TRABAJADOR ¿Es fin o es empleado? SI CODIFICACION PERFORM TEST AFTER UNTIL (WS-FIN-ENT = „1‟) OR ENT-OBRERO-EMP = „E‟ PERFORM 500-LEE-ENT END-PERFORM LOOP – EXIT – IF FORMATO proceso-g PERFORM UNTIL condición Proceso-h Proceso-g END-PERFORM PROCESO-G CONDICION PROCESO-H SI LOOP – EXIT - IF Ejemplo PROCESO-G CONDICION CODIFICACION PROCESO-H PERFORM 500-LEE-REGISTRO PERFORM UNTIL WS-FIN = „1‟ PERFORM 060-LISTA-REGISTRO PERFORM 500-LEE-REGISTRO END-PERFORM SI Terminación Anormal SI CONDICION MENSAJE CODIFICACION IF condición excepción DISPLAY WS-PROG „mensaje descriptivo‟ PERFORM 980-ABORTA END-IF ABORTA Terminación Anormal - Ejemplo ¿ID leí < ID ant? SI ARCHIVO MAL CLASIFICADO CODIFICACION IF ENT-ID-LEI < WS-ID-ANT DISPLAY WS-PROG „ARCH. DE MOVIMIENTOS‟ „FUERA DE SECUENCIA (ASC)‟ DISPLAY „iD. ANT.....‟ WS-ID-ANT DISPLAY „ID. LEI……„ ENT-ID-LEI PERFORM 980-ABORTA END-IF ABORTA Indentación • Codificación de un proceso o parte de un proceso alineado 4 columnas a la derecha de la alineación base • Pretende hacer visible la lógica • Todos los procesos dentro de un IFIF-THEN THEN--ELSE, WHILE--DO, REPEATWHILE REPEAT-UNTIL, LOOPLOOP-EXIT EXIT--IF y CASE, se indentan a partir de la alineación base • (Observe la indentación de los ejemplos presentados) • Si una instrucción no cabe en una línea, su continuación se indentará 4 columnas o más de la alineación base de la instrucción. Indentación PROCEDURE DIVISION. 000000 -CONTROL. *--* PROCESO GENERAL DEL PROGRAMA *--PERFORM 010010-INICIO INICIO-PROGRAMA PERFORM 100100-PROCESO PROCESO-PROGRAMA PERFORM 990990-TERMINA TERMINA-PROGRAMA STOP RUN. *--* INICIO DE PROGRAMA *--010010 -INICIO INICIO-PROGRAMA. PERFORM 011011-ABRE ABRE-ENTRADA IF WSWS-FILE FILE-STATUS NOT = 0 PERFORM 980980-ABORTA ENDEND -IF. . . . . . . . . . . . . Modularidad • Dividir el programa en varios grupos de instrucciones llamadas módulos • La instrucciones de Cobol PERFORM, es “Ejecuta Módulo” • Un módulo consta de varias instrucciones, algunas de las cuales pueden a su vez, ser PERFORM • El programa se procesa, ejecutando el primero de los módulos (módulo de Control del Programa) • Un módulo puede ser llamado a ejecución desde uno o varios módulos (ejecución recursiva). Modularidad • Características: – Cada módulo debe tener una sola función – La función de cada módulo debe ser completa – La división en módulos debe ser de acuerdo a la estructura lógica del problema a resolver – La división en módulos debe aislar los efectos de posibles modificaciones al programa – Un módulo debe ser de un tamaño que sea fácilmente comprensible – Si la función es muy extensa se subdivide en sub-funciones, la función de módulo original no se altera Modularidad • ... Características: – La definición de cada módulo del programa debe especificar claramente: • Nombre del módulo • Cuál es la función que realizará el módulo • Cuál es su interfaz externa con otros módulos (Qué espera recibir de entrada y qué regresa como salida) • Ejemplo jemplo:: Módulo: Función: Entrada: Salida: Valida fecha. Verificar que una fecha sea válida. Fecha en formato estándar. Indicador de fecha válida o inválida Arbol de Módulos • Diagrama para representar la jerarquía de los módulos • Cada módulo se representa como un rectángulo y tiene conectados hacia abajo los módulos que dependen de él exclusivamente • En la parte inferior se representan sin estar conectados hacia arriba los módulos compartidos Ejemplo: CONTROL 000 INICIO PROCESA POLIZA 010 CARGA TABLAS 011 TERMINA 100 ALTA CAMBIO 110 120 990 BAJA 130 PROCESA ALTA 110 VALIDA 111 ESCRIBE MAESTRO 600 CALCULA 112 ESCRIBE REPORTE 610 LEE MOVIMIENTO 500 SUMA 113 LEE MAESTRO 510 ABORTA 980 CIFRAS CONTROL 990 Estructuras de datos • Agrupaciones de datos con una cierta organización y objetivo • Modularizaciones de datos • Las Estructuras de Datos son muy diversas. Algunas de las más comunes en problemas típicos para aplicaciones administrativas son: Identidades, Acumuladores, Tablas y Encabezados • Simplifican la referencia a datos • Permiten organizar los datos por grupos Identidades • Es una Estructura de Datos que agrupa todos los campos necesarios para identificar un registro en sus distintos niveles. • Se usan para identificar uno o varios registros de un archivo, verificar la clasificación de un archivo, hacer cortes de control, etc Identidades • Ejemplo: – Se tiene un archivo con los siguientes datos: Organización, Grupo, Sociedad, Empresa, Planta, Departamento y otra información corporativa – Obtener las identidades: • Llave de lectura: Organización, Grupo, Sociedad, Empresa, Planta y Departamento • Departamento: Organización, Grupo, Sociedad, Empresa, Planta y Departamento • Empresa: Organización, Grupo, Sociedad y Empresa • Grupo: Organización, Grupo y Sociedad Identidades • Solución ID-Lectura ID-Departamento ID-Empresa ID-Grupo ORGAN GRUPO X XX SOC XX EMPR PLANTA XXX XXX DEPART X(4) Identidades • Para verificar la clasificación o mover el valor HighHigh-value, se usa el campo IDID-Leí (nos interesa la identidad sin su conjunto, sin saber qué es exactamente) • Para hacer cortes se usan los campos IDID-Grupo, IDIDEmpresa, IDID-Departamento, IDID-Lectura • Ventajas de la Estructura de Datos IDENTIDAD: • Facilidad de manejo • Facilidad de modificación (añadir o eliminar un nivel de corte es fácil) Acumuladores • Es una Estructura de Datos que agrupa todos los campos requeridos para acumular valores en un nivel de corte. • La ventaja de ésta estructura está en ver los campos como una unidad y no en distintos campos. (En la mente tenemos un solo concepto, por ejemplo: Acumuladores de Empresa) Ejemplo: Conjunto-Oper-Emp. SALARIOS CTO-EQUIPO CTO-PREST S9(7)V99 S9(7)V99 S9(7)V99 • CTO-SERMED CTO-ENERGIA CTO-TOTAL S9(7)V99 S9(7)V99 S9(7)V99 En el diseño de lógica de inicialización y acumulación se hace referencia a Conjunto-Oper-Emp. aún cuando en realidad implique los 6 acumuladores Tablas • Es una Estructura de datos que agrupa una repetición de campos, y las variables requeridas para controlar dicha repetición. Ejemplo: Fact-Recup ID-Cve-Riesgo Se repite hasta Maximo “Elem” Veces XX XX XXX S9V99 S9V99 I(índice). Es utilizado para accesar la tabla EXI(X). Switch para detectar existencia de algún elemento buscado en la tabla Núm-Elem (s9(9)) Elemento perteneciente a la tabla Máx-Elem (S9(9), Valor 500) Elementos que tiene la tabla Tablas • Ventajas de la estructura: – Ver todo el conjunto como una unidad – Facilidad de manejo – Facilidad de modificación (ejemplo: Aumentar o disminuir la capacidad de la tabla) Ejercicios Ejercicio 1. Estructuras de control • Diagrame las estructuras de control apropiadas para manejar cada una de los procesos siguientes: – Calcular el salario devengado en un mes por un obrero o empleado. Los obreros tienen el salario base por semana y se les paga cada semana, los meses de Marzo, Julio, Octubre y Diciembre tienen 5 semanas y todos los demás sólo 4. Los empleados tiene el salario base por quincena. – Abortar la ejecución si la fecha de movimiento es mayor que año 2007 y mes 10. – Copia de todos los registros de un archivo a otro Ejercicios • Ejercicio 2. Generar la estructura de Identidades, acumuladores y tablas que requiere un programa típico que utilice el siguiente registro de entrada CAMPO CARACTERISTICA Grupo Empresa Planta Departamento X(6) Número de trab. Clave ob/emp X Ordinario Tiempo extra doble Tiempo extra triple (sin uso) XX XXX XXX X(6) S9(9)V99 COMPCOMP-3 S9(9)V99 COMPCOMP-3 S9(9)V99 COMPCOMP-3 X(41) Continúa en la página siguiente POSICIONES 01-02 0103--05 03 06--08 06 09--14 09 15--20 15 21 22--27 22 28--33 28 34--39 34 40--41 40 Ejercicios • Ejercicio 2... – Se requiere hacer corte por: • • • • Grupo Empresa Planta Departamento – Obtener totales por: • • • • • Total de número de empleados Salario ordinario Tiempo extra doble Tiempo extra triple De cada rubro, por departamento, Planta, Empresa, Grupo y Total general Ejercicios • Elabore el código de Cobol de los siguientes ejercicios – Genere al código de Cobol para almacenar totales de cargos, abonos y saldo en un programa típico, con capacidad para 13 enteros, 2 decimales y signo – Genere el código de Cobol para definir una tabla de claves de movimiento con 20 elementos y los siguientes campos: Clave mov. – 2 posiciones, Indicador cargo/abono – 1 posición, Descripción – 15 posiciones Reportes y cortes de control • Proceso secuencial simple – Proceso secuencial de un archivo, desde el primer hasta el último registro • • • • • Función inicial del proceso Función LEER REGISTRO WHILE – DO HAYAN REGISTROS END DO Función final del proceso Diagrama del Proceso INICIO FUNCION INICIAL LEER REGISTRO FIN REGS? PROCESAR REGISTRO LEER REGISTRO FUNCION FINAL TERMINA SI Proceso Secuencial Simple Código Fuente IDENTIFICATION DIVISION. PROGRAMPROGRAM -ID. PROGSEC. REMARKS. PROGRAMA EJEMPLO DE PROCESO SECUENCIAL SIMPLE. --- --- ----- --- --ENVIRONMENT DIVISION. --- --- ----- --- --INPUTINPUT -OUTPUT SECTION. FILEFILE -CONTROL. SELECT ARCHARCH-ENT ASSIGN TO POLIZAS. SELECT REPORTE ASSIGN TO REPORTE. DATA DIVISION. FILEFILE -SECTION. FD ARCH-ENT. ARCH--- --- ----- --- --- Proceso Secuencial Simple WORKING-STORAGE SECTION. WORKING--- --- ----- --- --PROCEDURE DIVISION. PROCESOPROCESO -PRINCIPAL. PERFORM 010010-FUNCION FUNCION-INICIAL PERFORM 030030-PROCESAR PROCESAR-REGISTRO UNTIL SWSW-FIN FIN-ARCH = ‘1’ PERFORM 100100-TERMINA STOP RUN. 010-FUNCION 010FUNCION-INICIAL. * Inicializa variables * Abrir archivos PERFORM 020020-LEE LEE-REGISTRO 020020 -LEE LEE-REGISTRO. --- --- ----- --- --030030 -PROCESAR PROCESAR-REGISTRO. * Mover CamposCampos-registro a CamposCampos-reporte * Sumar CamposCampos-registro a Totales Totales-reporte ..... ..... ..... ..... ..... Proceso Secuencial Simple IF WS WS-CONREN > 70 PERFORM 500500-IMPRIME IMPRIME-ENCAB ENDEND -IF WRITE REGREG-REPORTE FROM LINEALINEA-DETALLE AFTER 1 ADD 1 TO WW-CONREN PERFORM 020020-LEE LEE-REGISTRO. 100-TERMINA. 100* Mover totales totales-reporte a CamposCampos-reporte * Imprimir totales en reporte * Desplegar totales y cifras de control * Cerrar archivos Proceso secuencial con cortes • Proceso de un archivo con grupos de registros que tienen la misma llave – Función inicial del proceso – Función LEER REGISTRO – Función inicial de un grupo (incluye función mover LLAVE DE GRUPO A ANTERIOR) – WHILE – DO MIENTRAS HAYA REGISTROS – IF-THEN Comparación contra llave anterior – FUNCION PROCESAR CORTE (INCLUYE FUNCION MOVER LLAVE A ANTERIOR) – ELSE – FUNCION PROCESAR REGISTRO LEIDO – FUNCION LEER REGISTRO – ENDIF – ENDDO – FUNCION FINAL DE UN GRUPO – FUNCION FINAL DEL PROCESO Diagrama del proceso en la página siguiente. Proceso secuencial con cortes INICIO FUNCION INICIAL LEER REGISTRO SI FIN REGS? FUNCION INICIAL DE GRUPO SI LLR <> LLG PROCESAR REG. LEIDO LEER REGISTRO FUNCION FINAL GPO LLR= Llave de registro LLG= Llave grupo FUNCION FINAL PROCESO TERMINA Proceso secuencial con cortes Código fuente IDENTIFICATION DIVISION. PROGRAMPROGRAM -ID. PROGSEC. REMARKS. PROGRAMA EJEMPLO DE PROCESO SECUENCIAL CON CORTES. --- --- ----- --- --ENVIRONMENT DIVISION. --- --- ----- --- --INPUTINPUT -OUTPUT SECTION. FILEFILE -CONTROL. SELECT ARCHARCH-ENT ASSIGN TO POLIZAS. SELECT REPORTE ASSIGN TO REPORTE. DATA DIVISION. FILE SECTION. FD ARCH-ENT ARCH--- --- ----- --- --WORKINGWORKING -STORAGE SECTION. --- --- ----- --- --- Proceso secuencial con cortes PROCEDURE DIVISION. PROCESOPROCESO -PRINCIPAL. PERFORM 010010-FUNCION FUNCION-INICIAL PERFORM 030030-PROCESO UNTIL SWSW-FIN FIN-ARCH = ‘1’ PERFORM 100100-TERMINA STOP RUN. 010010 -FUNCION FUNCION-INICIAL. * Inicializa variables * Abrir archivos PERFORM 020020-LEE LEE-REGISTRO * Mover llavellave-reg a llavellave-ant 020020 -LEE LEE-REGISTRO. --- --- ----- --- --030030 -PROCESO. IF LLAVE LLAVE-REG NOT EQUAL LLAVELLAVE-ANT PERFORM 040040-PROCESA PROCESA-CORTE ELSE * Mover CamposCampos-registro a CamposCampos-reporte * Sumar CamposCampos-registro a TotalesTotales-grupo ..... ..... ..... ..... ..... Proceso secuencial con cortes IF WS WS-CONREN > 70 PERFORM 500500-IMPRIME IMPRIME-ENCAB ENDEND -IF WRITE REGREG-REPORTE FROM LÍNEALÍNEA-DETALLE AFTER 1 ADD 1 TO WW-CONREN PERFORM 020020-LEE LEE-REGISTRO. 040-PROCESA 040PROCESA-CORTE. * Mueve CamposCampos-totales a CamposCampos-corte * Imprime corte Imprime * Inicializa CamposCampos-totales * Mover llavellave-reg a llavellave-ant 100-TERMINA. 100* Mover TotalesTotales-grupo a CamposCampos-reporte * Imprimir TotalesTotales-grupo en reporte * Mover TotalesTotales-generales a CamposCampos-reporte * Imprimir TotalesTotales-generales en reporte * Desplegar totales y cifras de control * Cerrar archivos Cortes Múltiples • Procesar un solo archivo con grupos de registros que tienen dos niveles de llave 1. FUNCION INICIAL DEL PROCESO 2. FUNCION LEER REGISTRO 3. FUNCION INICIAL (INCLUYE MOVER LLAVE DEL GRUPO MAYOR Y MENOR A ANTERIOR) 4. WHILE – DO MIENTRAS HAYAN REGISTROS 5. IF-THEN Comparación contra llave mayor anterior 6. FUNCION PROCESAR CORTE LLAVE MAYOR 7. FUNCION PROCESAR CORTE LLAVE MENOR 8. ELSE 9. IF-THEN Comparación contra llave menor anterior 10. FUNCION PROCESAR CORTE LLAVE MENOR 11. END.IF 12. END-IF Cortes Múltiples... 13. 14. 15. 16. 17. 18. • FUNCION PROCESAR REGISTRO LEIDO FUNCION LEER REGISTRO ENDDO FUNCION FINAL DEL GRUPO MENOR FUNCION FINAL DEL GRUPO MAYOR FUNCION FINAL DEL PROCESO Diagrama del proceso en la página siguiente Cortes Múltiples Múltiples.. .. INICIO FUNCION INICIAL LEER REGISTRO SI FUNCION FINAL GRUPO MAYOR FIN REGS? FUNCION INICIALGRUPO MAYOR SI LMR <> LMG FUNCION FINAL GRUPO MENOR SI FUNCION INICIAL GRUPO MENOR LMR<>LMG or LNR<>LNG Sig. página Cortes Múltiples Múltiples.. .. Viene de la página anterior PROCESAR REG. LEIDO LEER REGISTRO FUNCION FINAL PROCESO TERMINA Proceso secuencial match entre dos archivos • Procesar un archivo maestro en paralelo con su archivo de movimientos ordenado por la misma llave 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 FUNCION INICIAL DEL PROCESO FUNCION LEER REGISTRO DEL ARCHIVO MAESTRO FUNCION LEER REGISTRO DEL ARCHIVO DE MOVIMIENTOS WHILE – DO HAYAN REGISTROS EN EL ARCHIVO MAESTRO Y EN EL DE MOVIMIENTOS . IF LLAVE DEL ARCHIVO MAESTRO ES IGUAL A LLAVE ARCHIVO MOVIMIENTOS THEN . . FUNCION PROCESO INICIAL DE UN MAESTRO CON MOVIMIENTOS . . WHILE – DO MIENTRAS HAYA REGISTROS DE MOVIMIENTOS Y LLAVE REGISTRO MAESTRO SEA IGUAL A LLAVE REGISTRO MOVIMIENTOS . . . FUNCION PROCESAR REGISTRO DE MOVIMIENTOS . . . FUNCION LEER REGISTRO DE MOVIMIENTOS . . ENDDO . . FUNCION PROCESO FINAL DE UN MAESTRO CON MOVIMIENTOS (TOTALES Y/O REESCRIBIR REGISTRO MAESTRO PARA ACTUALIZARLO) . . FUNCION LEER REGISTRO DEL MAESTRO . ELSE . . IF LLAVE DEL REGISTRO MAESTRO ES MENOR A LLAVE REGISTRO DE MOVIMIENTOS . . . FUNCION PROCESAR MAESTRO SIN MOVIMIENTOS . . . FUNCION LEER REGISTRO DEL MAESTRO Proceso secuencial match entre dos archivos • Continúa 17 18 19 20 21 22 23 24 . . ELSE . . . (*1)FUNCION PROCESO DE UN GRUPO DE MOVIMIENTOS SIN MAESTRO . . END-IF. . END-IF. ENDDO WHILE – DO HAYAN REGISTROS DE MOVIMIENTOS . (*)FUNCION PROCESO DE UN GRUPO DE MOVIMIENTOS SIN MAESTRO ENDDO 25 26 27 28 29 WHILE – DO HAYAN REGISTROS EN MAESTRO . . . FUNCION PROCESAR MAESTRO SIN MOVIMIENTOS . . . FUNCION LEER REGISTRO DEL MAESTRO ENDDO FUNCION FINAL DEL PROCESO (*1) LA FUNCION PROCESO DE UN GRUPO DE MOVIMIENTOS SIN MAESTRO CONSISTE DE: 30 31 32 33 34 35 FUNCION PROCESO INICIAL DE GRUPO DE MOVIMIENTOS SIN MAESTRO WHILE – DO HAYAN REGISTROS DE MOVIMIENTOS Y LA LLAVE DEL REGISTRO DE MOVIMIENTOS SEA IGUAL A LA LLAVE DEL PRIMER MOVIMIENTO DEL GRUPO . FUNCION PROCESAR REGISTRO DE MOVIMIENTOS . FUNCION LEER REGISTRO DE MOVIMIENTOS ENDDO FUNCION PROCESO FINAL DE UN GRUPO DE MOVIMIENTOS SIN MAESTRO Proceso directo y actualización • Aplicación de movimientos desordenados contra un maestro indexado 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 FUNCION INICIAL DEL PROCESO FUNCION LEER REGISTRO DE MOVIMIENTO WHILE – DO HAYAN REGISTROS DE MOVIMIENTOS . FUNCION VALIDAR MOVIMIENTO . IF MOVIMIENTO VALIDO THEN . . FUNCION LEER REGISTRO CORRESPONDIENTE DEL ARCHIVO MAESTRO . . IF REGISTRO CORRESPONDIENTE DEL MAESTRO EXISTE THEN . . . FUNCION ACTUALIZAR MAESTRO CON SU MOVIMIENTO . . ELSE . . . FUNCION PROCESAR MOVIMIENTO SIN MAESTRO . . END-IF . ELSE . . FUNCION PROCESAR MOVIMIENTO INVALIDO . END-IF . FUNCION LEER REGISTRO DE MOVIMIENTO ENDDO FUNCION FINAL DEL PROCESO Manejo de arreglo unidimensional (tabla) Meses del año MES DESCRIPCION Codificación Cobol de la tabla 01 01 ENERO 02 FEBRERO 03 MARZO 04 ABRIL 05 MAYO 06 JUNIO 07 JULIO 01 08 AGOSTO 09 SEPTIEMBRE 10 OCTUBRE 11 NOVIEMBRE 12 DICIEMBRE • TABLA-MESES. 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER 05 FILLER TAB-MESES 05 ELE-MES PIC PIC PIC PIC PIC PIC PIC PIC PIC PIC PIC PIC REDEFINES OCCURS X(10) VALUE ‘ENERO’. X(10) VALUE ‘FEBRERO’. X(10) VALUE ‘MARZO’. X(10) VALUE ‘ABRIL’. X(10) VALUE ‘MAYO’. X(10) VALUE ‘JUNIO’. X(10) VALUE ‘JULIO’. X(10) VALUE ‘AGOSTO’. X(10) VALUE ‘SEPTIEMBRE’. X(10) VALUE ‘OCTUBRE’. X(10) VALUE ‘NOVIEMBRE’. X(10) VALUE ‘DICIEMBRE’. TABLA-MESES. 12 PIC X(10). Mover mes en el encabezado o fecha editada MOVE ELE-MES(W-MES) TO E01-MES. MOVE ELE-MES(W-MES) TO E01-MES-FECHA. Manejo de arreglo bidimensional (tabla) • Totales CONCEPTO U.MERCADO CHEQU ES CHCHDEVUELTOS TOTTOTCHEQUES SUC. 01 150.00 25.30 175.30 SUC. 02 2,750.00 245.00 2,995.00 SUC. 03 48.00 0.00 48.00 SUC. 04 230.00 26.50 256.50 ...... SUC 98 1,400.00 34.50 1434.50 GENERAL 4,578.00 331.30 4,909.30 • Codificación Cobol de la tabla TABLA-TOTALES. 05 SUCURSALES 10 CONCEPTOS 15 W-CHEQUES OCCURS 99. OCCURS 03. PIC S9(13)V99. Manejo de arreglo bidimensional (tabla) • Suma a totales IF ENT ENT-CVE CVE-CHEQUE = ‘D’ ADD ENTENT-IMP IMP-CHEQUE CHEQUE-DEV TO W W-CHEQUES W-CHEQUES ELSE ADD ENTENT-IMP IMP-CHEQUE TO WW-CHEQUES W-CHEQUES ENDEND -IF • (W(W -SUCURSAL, 02) (W-SUCURSAL, 03) (W- (W(W -SUCURSAL, 01) (W-SUCURSAL, 03) (W- Impresión de totales PERFORM VARYING IND FROM 1 BY 1 UNTIL IND > 98 MOVE IND TO DET-TOT-SUCURSAL MOVE W-CHEQUES (IND, 1) TO DET-TOT-CHEQUES ADD W-CHEQUES (IND, 1) TO W-CHEQUES (99, 1) MOVE W-CHEQUES (IND, 2) TO DET-TOT-CHEQUES-DEV ADD W-CHEQUES (IND, 2) TO W-CHEQUES (99, 2) MOVE W-CHEQUES (IND, 3) TO DET-TOT-CHEQUES-TOT ADD W-CHEQUES (IND, 3) TO W-CHEQUES (99, 3) END-PERFORM MOVE ‘TOTAL GENERAL’ TO DET-TEX-TOTAL MOVE W-CHEQUES (99, 1) TO DET-TOT-CHEQUES MOVE W-CHEQUES (99, 2) TO DET-TOT-CHEQUES-DEV MOVE W-CHEQUES (99, 3) TO DET-TOT-CHEQUES-TOT Manejo de arreglo tridimensional • Planeación Financiera (Estado de Resultados Corporativo) EMPRESA 3 EMPRESA 2 EMPRESA 1 PERIODO CONCEPTO VENTAS COSTO VENTAS UTILIDAD BRUTA G. OPERACIÓN G.ADMON. UTILIDAD NETA • 2007 5,698.45 4,526.70 1,171.75 300.00 200.00 671.75 2008 2009 (+12%) (+9%) 6,381.76 5,069.90 1,311.86 336.00 224.00 751.86 Codificación Cobol del arreglo 01 ARREGLO. 05 CONCEPTOS 10 PERIODOS 15 EMPRESAS 20 WW-ELEM OCCURS 06. OCCURS 03. OCCURS 03. PIC S9(13)V99. 6,956.12 5,526.19 1,429.93 366.24 244.16 819.53 Manejo de arreglo tridimensional • Rutina de carga inicial de cédula 300300 -CARGA CARGA-CEDULA CEDULA-ARREGLO. MOVE WSWS-VENTAS TO WW-ELEM(1, 1, 1) MOVE WSWS-COSVEN TO WW-ELEM(2, 1, 1) * CALCULA UTILIDAD BRUTA COMPUTE WW-ELEM(3, 1, 1) = WSWS-ELEM(1, 1, 1) – WS WS-ELEM(2, 1, 1) MOVE WSWS-GASOPR TO WW-ELEM(4, 1, 1) MOVE WSWS-GASADM TO WW-ELEM(5, 1, 1) * CALCULA UTILIDAD NETA COMPUTE WW-ELEM(6, 1, 1) = WSWS-ELEM(3, 1, 1) – WSWS-ELEM(4, 1, 1) WSWS -ELEM(5, 1, 1) • Rutina de cálculo futuro 310310 -PROYECCION. PERFORM VARYING INDIND-PER FROM 2 BY 1 UNTIL IND-PER IND> 3 AFTER IND-EMP FROM 2 BY 1 INDUNTIL IND-EMP IND> 3 AFTER IND-CON FROM 1 BY 1 INDUNTIL IND-CON IND> 6 IF INDIND-PER = 2 MOVE 1.12 TO WW-INFL ELSE MOVE 1.09 TO WW-INFL ENDEND -IF COMPUTE WW-ELEM (IND(IND-CON, INDIND-PER, INDIND-EMP) = W-ELEM (IND(IND-CON, INDIND-PER, INDIND-EMP) * W W-INFL ENDEND -PERFORM. NOTA: ESTA RUTINA SE DEBERA EJECUTAR POR CADA EMPRESA, EN EL PERIODO BASE QUE ES EL AÑO 2000. FIN DE MODULO Derechos de autor • Este producto has sido elaborado por • Jorge Godínez Rodríguez. • Derechos reservados – Prohibida su reproducción parcial o total 128