Estructuración de Reportes en COBOL: Definición de Variables
Clase 4 de 10 • Curso Práctico de COBOL
Para efectuar cualquier reporte en COBOL es necesario indicarle explícitamente toda la estructura que necesitamos definir, razón por la cual no solo estaremos definiendo las variables y los tipos de datos a los que estas pertenezcan, sino que también “maquetaremos” el reporte, esto significa que vamos a generar:
- Los títulos y subtítulos.
- Los encabezados.
- Y mostraremos la información detallada y en el orden que especifiquemos dentro del programa.
Una vez concluida esta “maquetación” realizaremos el código con el que vamos a escribir en el reporte de salida, estos puntos que hemos descrito previamente.
Los componentes que conforman la sección de variables
- Switches.
- Áreas de trabajo (los campos del archivo de entrada separados y referenciando al contenido del archivo de entrada).
- Campos que conforman el título del reporte.
- Campos que conforman el subtítulo del reporte.
- Campos que definen los nombres de las columnas del reporte.
- Campos que contendrán la información y el detalle de los registros una vez que hayan sido procesados en nuestro programa.
- Campos que conforman los pies de página del reporte, (generalmente contienen el total de los registros procesados durante la ejecución del programa).
- Definición de los campos de la linkage section (con la cual recibiremos datos externos, para este reporte recibiremos la fecha de procesamiento del reporte a través del JCL).
Switches
Los switches contienen un conjunto de valores especificados por el programador. Se comportan como valores Booleanos, es decir, que solo pueden contener 2 valores (apagado o encendido; cero o uno; verdadero o falso, si o no, blanco o negro; ya sabes por donde voy 😃 ). Dichos valores son definidos con una numeración a nivel 77, conteniendo a nivel 88 el valor que pueden contener una vez cumplida la condición. Para nuestro reporte vamos a definir el switch del siguiente modo:
77 WSS-FIN PIC X(03) VALUE ' '. 88 WSS-SI VALUE 'FIN'.
Es importante definir con claridad el nombre del switch, en este que vemos arriba sabemos que se trata de un switch que, cuando sea modificado en su valor, contendrá el valor FIN, lo que indica que hemos llegado al término del procesamiento que hayamos efectuado.
Áreas de trabajo
Aquí definimos los campos que hacen referencia al contenido del archivo de entrada.
01 WSV-AREAS-TRABAJO. 05 WSV-REG-ALUMNOS. 10 WSV-BOLETA-ALU PIC 9(04). 10 WSV-NOMBRE-ALU PIC X(25). 10 WSV-PROM-ALUMN PIC 99V9. 10 WSV-ALUMN-BEC PIC 9(01). 10 WSV-BECA-ALUMN PIC 9(07)V99. 05 WSV-ALUMNOS-LEI PIC 9(05) VALUE ZEROS. 05 WSV-ALUMN-IMP PIC 9(05) VALUE ZEROS. 05 WSV-TOT-MONT-BEC PIC 9(09)V99 VALUE ZEROS.
Cada uno de los campos que conforman los registros se especifican con la numeración a nivel 10. Veamos en el siguiente recuadro el mapeo de los campos en el archivo de entrada al programa COBOL y la correspondencia con la definición de las variables:
----+----1----+----2----+----3----+----4----+----5 ***************************** TOP OF DATA ******** 0021JOSE GANIMEDEZ MONTES 8561000236800 0000100 0850JIMENA HERNANDEZ GONZALEZ7200000000000 0000200 **************************** BOTTOM OF DATA ****** 10 WSV-BOLETA-ALU PIC 9(04). 10 WSV-NOMBRE-ALU PIC X(25). 10 WSV-PROM-ALUMN PIC 99V9. 10 WSV-ALUMN-BEC PIC 9(01). 10 WSV-BECA-ALUMN PIC 9(07)V99.
- El campo WSV-BOLETA-ALU es de tipo numérico y tiene una longitud de 4 posiciones, este campo va de la columna 1 a la columna 4.
- El campo WSV-NOMBRE-ALU es de tipo alfanumérico y tiene una longitud de 25 posiciones, este campo va de la columna 5 a la columna 29.
- El campo WSV-PROM-ALUMN es de tipo numérico y tiene una longitud de 2 dígitos enteros y un decimal, separado por un punto virtual, este campo va de la columna 30 a la columna 32.
- El campo WSV-ALUMN-BEC es de tipo numérico y tiene una longitud de 1 dígito, este campo sólo abarca la columna 33.
- El campo WSV-BECA-ALUMN es de tipo numérico y tiene una longitud de 7 dígitos enteros y dos decimales, separado por un punto virtual, este campo va de la columna 34 a la columna 42.
Describamos la funcionalidad de los últimos 3 campos contenidos en este bloque:
-
El campo WSV-ALUMNOS-LEI contendrá el acumulado de registros leídos y que serán escritos en los pies de página del reporte.
-
El campo WSV-ALUMN-IMP contendrá el acumulado de registros impresos y que serán escritos en los pies de página del reporte.
-
El campo WSV-TOT-MONT-BEC contendrá el acumulado de registros pertenecientes al monto de las becas de los estudiantes en el archivo de entrada y que será escritos en los pies de página del reporte.
Campos que conforman el título del reporte
Es necesario definir la estructura que contendrá el reporte, para que este sea fácilmente visualizado y comprendido por el área de negocio que va a hacer uso de dicha información, el reporte que vamos a estructurar contendrá la estructura de los títulos y encabezados como se muestran:
1 10 20 30 40 50 60 70 80 +---+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ UNIVERSIDAD PLATZI FECHA: 07/04/2021 CONTROL DE ALUMNOS BECADOS PAGINA: 1
La definición de los campos del nombre del reporte la describimos a continuación:
01 WSC-TIT-1. 05 FILLER PIC X(30) VALUE SPACES. 05 WSC-T1 PIC X(18) VALUE 'UNIVERSIDAD PLATZI'. 05 FILLER PIC X(32) VALUE SPACES.
Como nuestro reporte va a contener una longitud fija de 80 caracteres, la suma de cada uno de los campos definidos dentro de la constante WSC-TIT-1 será igual a 80.
-
El campo FILLER es de tipo alfanumérico y tiene una longitud de 30 posiciones, este campo va de la columna 1 a la columna 30.
-
El campo WSC-T1 es de tipo alfanumérico y tiene una longitud de 18 posiciones, este campo va de la columna 31 a la columna 48.
-
El segundo campo FILLER es de tipo alfanumérico y tiene una longitud de 32 posiciones, este campo va de la columna 49 a la columna 80.
Campos que conforman el subtítulo del reporte
01 WSC-TIT-2. 05 FILLER PIC X(08) VALUE ' FECHA: '. 05 WSC-TIT-2-DIA PIC 9(02). 05 FILLER PIC X(01) VALUE '/'. 05 WSC-TIT-2-MES PIC 9(02). 05 FILLER PIC X(01) VALUE '/'. 05 WSC-TIT-2-ANIO PIC 9(04). 05 FILLER PIC X(08) VALUE SPACES. 05 WSC-TITU-2 PIC X(26) VALUE 'CONTROL DE ALUMNOS BECADOS'. 05 FILLER PIC X(14) VALUE SPACES. 05 FILLER PIC X(08) VALUE 'PAGINA: '. 05 WSC-TIT-2-PAGINA PIC ZZ9. 05 FILLER PIC X(03) VALUE SPACES.
- El campo FILLER es de tipo alfanumérico y tiene una longitud de 8 posiciones, este campo va de la columna 1 a la columna 8 y contiene el valor constante de FECHA:.
- El campo WSC-TIT-2-DIA es de tipo numérico y tiene una longitud de 2 dígitos, este campo va de la columna 9 a la columna 10 y contiene el valor del día de procesamiento.
- El segundo campo FILLER es de tipo alfanumérico y tiene una longitud de 1 posición, este campo se encuentra en la columna 11 y contiene el valor '/'.
- El campo WSC-TIT-2-MES es de tipo numérico y tiene una longitud de 2 dígitos, este campo va de la columna 12 a la columna 13 y contiene el valor del mes de procesamiento.
- El tercer campo FILLER es de tipo alfanumérico y tiene una longitud de 1 posición, este campo se encuentra en la columna 14 y contiene el valor '/'.
- El campo WSC-TIT-2-ANIO es de tipo numérico y tiene una longitud de 4 dígitos, este campo va de la columna 15 a la columna 18 y contiene el valor del año de procesamiento.
- El cuarto campo FILLER es de tipo alfanumérico y tiene una longitud de 8 posiciones, este campo va de la columna 19 a la columna 26.
- El campo WSC-TITU-2 es de tipo alfanumérico y tiene una longitud de 26 posiciones, este campo va de la columna 27 a la columna 52.
- El quinto campo FILLER es de tipo alfanumérico y tiene una longitud de 14 posiciones, este campo va de la columna 53 a la columna 66.
- El sexto campo FILLER es de tipo alfanumérico y tiene una longitud de 8 posiciones, este campo va de la columna 67 a la columna 74.
- El campo WSC-TIT-2-PAGINA es de tipo numérico (máscara) y tiene una longitud de 3 posiciones, este campo va de la columna 75 a la columna 77.
- El séptimo campo FILLER es de tipo alfanumérico y tiene una longitud de 3 posiciones, este campo va de la columna 78 a la columna 80.
Campos que definen los nombres de las columnas del reporte
La estructura del detalle del reporte será como sigue:
1 10 20 30 40 50 60 70 80 +---+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ ------------------------------------------------------------------------------ BOLETA NOMBRE PROMEDIO BECADO MONTO DE BECA -------- ------------------------- -------- ------ -------------- 21 JOSE GANIMEDEZ MONTES 85.6 SI 2,368.00 850 JIMENA HERNANDEZ GONZALEZ 72.0 NO 0.00 ------------------------------------------------------------------------------
En el siguiente apartado definimos las constantes que determinan los nombres de las columnas:
01 WSC-GUIONES. 05 FILLER PIC X(01). 05 FILLER PIC X(78) VALUE ALL '-'. 05 FILLER PIC X(01) VALUE SPACES. 01 WSC-COL-DETA-1. 05 FILLER PIC X(03) VALUE SPACES. 05 FILLER PIC X(06) VALUE 'BOLETA'. 05 FILLER PIC X(12) VALUE SPACES. 05 FILLER PIC X(06) VALUE 'NOMBRE'. 05 FILLER PIC X(13) VALUE SPACES. 05 FILLER PIC X(08) VALUE 'PROMEDIO'. 05 FILLER PIC X(04) VALUE SPACES. 05 FILLER PIC X(06) VALUE 'BECADO'. 05 FILLER PIC X(08) VALUE SPACES. 05 FILLER PIC X(13) VALUE 'MONTO DE BECA'. 05 FILLER PIC X(01) VALUE SPACES. 01 WSC-GUION-DETA. 05 FILLER PIC X(01) VALUE SPACES. 05 FILLER PIC X(08) VALUE '--------'. 05 FILLER PIC X(04) VALUE SPACES. 05 FILLER PIC X(25) VALUE '-------------------------'. 05 FILLER PIC X(02) VALUE SPACES. 05 FILLER PIC X(08) VALUE '--------'. 05 FILLER PIC X(04) VALUE SPACES. 05 FILLER PIC X(06) VALUE '------'. 05 FILLER PIC X(07) VALUE SPACES. 05 FILLER PIC X(14) VALUE '--------------'.
- El campo padre WSC-GUIONES contiene 3 campos hijos definidos como FILLER, los cuales despliegan guiones - en el reporte; el campo es de tipo alfanumérico y la longitud sumada de los campos hijos es de 80 posiciones.
- El campo WSC-COL-DETA-1 contiene varios campos hijos definidos como FILLER de tipo alfanumérico, cuya longitud sumada es de 80 posiciones. Estos campos, como se observa en la estructura, son los nombre de las columnas.
- El campo WSC-GUION-DETA contiene varios campos hijos definidos como FILLER de tipo alfanumérico, la suma de los campos hijos le otorga el valor de 80 posiciones al campo padre, mismo espacio que será definido en el reporte. Estos despliegan los guiones de la parte inferior de la estructura.
Campos que contendrán la información y el detalle de los registros una vez que hayan sido procesados en nuestro programa
Ahora veamos la definición y el valor de los campos que recibirán los datos una vez que han sido procesados por nuestro programa:
01 WSV-DETALLE. 05 FILLER PIC X(04) VALUE SPACES. 05 WSV-DET-BOLETA PIC ZZZZ9. 05 FILLER PIC X(04) VALUE SPACES. 05 WSV-DET-NOMBRE PIC X(25). 05 FILLER PIC X(06) VALUE SPACES. 05 WSV-DET-PROMEDIO PIC ZZ.9. 05 FILLER PIC X(06) VALUE SPACES. 05 WSV-DET-BECADO PIC X(02). 05 FILLER PIC X(11) VALUE SPACES. 05 WSV-DET-BECA PIC Z,ZZZ,ZZ9.99.
-
El campo padre WSV-DETALLE contiene 10 campos hijos.
-
El campo WSV-DET-BOLETA es de tipo numérico (máscara) y tiene una longitud de 5 posiciones, este campo va de la columna 5 a la columna 9. Muestra el número de boleta.
-
El campo WSV-DET-NOMBRE es de tipo alfanumérico y tiene una longitud de 25 posiciones, este campo va de la columna 14 a la columna 38. Muestra el nombre del estudiante.
-
El campo WSV-DET-PROMEDIO es de tipo numérico (máscara) y tiene una longitud de 4 posiciones, este campo va de la columna 45 a la columna 48. Muestra el promedio del estudiante.
-
El campo WSV-DET-BECADO es de tipo alfanumérico y tiene una longitud de 2 posiciones, este campo va de la columna 55 a la columna 56. Muestra si el estudiante está becado o no.
-
El campo WSV-DET-BECA es de tipo numérico (máscara) y tiene una longitud de 12 posiciones, este campo va de la columna 68 a la columna 79. Muestra el valor o monto de beca que recibe el estudiante.
-
Todos los campos FILLER van a contener espacios, con el fin de formatear el contenido dentro del reporte
Campos que conforman los pies de página del reporte
Como punto final del reporte, tenemos los totales de los registros procesados en el programa, hablemos de ellos:
01 WSV-DETALLE-LEIDOS. 05 FILLER PIC X(01). 05 FILLER PIC X(29) VALUE 'TOTAL DE ALUMNOS LEIDOS : '. 05 WSV-TOT-LEIDOS PIC ZZ,ZZ9. 05 FILLER PIC X(44) VALUE SPACES. 01 WSV-DETALLE-IMPRESOS. 05 FILLER PIC X(01). 05 FILLER PIC X(29) VALUE 'TOTAL DE ALUMNOS IMPRESOS : '. 05 WSV-TOT-IMPRESOS PIC ZZ,ZZ9. 05 FILLER PIC X(44) VALUE SPACES. 01 WSV-DETALLE-SALARIOS. 05 FILLER PIC X(01). 05 FILLER PIC X(35) VALUE 'MONTO TOTAL DESTINADO A BECAS :'. 05 FILLER PIC X(30) VALUE SPACES. 05 WSV-DET-BECA2 PIC $$$,$$$,$$9.99.
- El campo padre WSV-DETALLE-LEIDOS contiene campos hijos definidos a nivel 05. Los campos FILLER sirven para ocupar espacios, y para mostrar la etiqueta en el reporte con la leyenda 'TOTAL DE ALUMNOS LEIDOS : ’. Y el campo llamado WSV-TOT-LEIDOS de tipo numérico (máscara) y longitud 6 posiciones muestra el valor total de registros leídos provenientes del archivo de entrada.
- El campo padre WSV-DETALLE-IMPRESOS contiene campos hijos definidos a nivel 05. Los campos FILLER sirven para ocupar espacios, y para mostrar la etiqueta en el reporte con la leyenda 'TOTAL DE ALUMNOS IMPRESOS : ’. Y el campo llamado WSV-TOT-IMPRESOS de tipo numérico (máscara) y longitud 6 posiciones muestra el valor total de registros impresos en el reporte provenientes del archivo de entrada.
- El campo padre WSV-DETALLE-SALARIOS contiene campos hijos definidos a nivel 05. Los campos FILLER sirven para ocupar espacios, y para mostrar la etiqueta en el reporte con la leyenda ‘MONTO TOTAL DESTINADO A BECAS :’. Y el campo llamado WSV-DET-BECA2 de tipo numérico (máscara) y longitud 14 posiciones, muestra el valor total de las becas destinadas a los estudiantes.
Campos de linkage section
El siguiente apartado que veremos es la sección de enlace o LINKAGE SECTION. Esta sección describe los datos que son recibidos desde otro programa, en este caso, del JCL. Estos datos no son recibidos de manera automática por nuestro programa COBOL, sino que la LINKAGE SECTION hace referencia a la dirección en memoria donde el JCL está enviando los datos como parámetro. La LINKAGE SECTION debe codificarse inmediatamente antes que la PROCEDURE DIVISION. Y la manera en que recibimos los datos, siempre debe corresponder al campo definido dentro de la sección de enlace, como veremos a continuación.
En el JCL tenemos definido el parámetro así:
PARM='29032021'
Y en la LINKAGE SECTION de nuestro programa COBOL los campos con los que recibiremos la fecha los hemos definido del siguiente modo:
01 LK-FECHA. 05 FILLER PIC X(02). 05 LK-DIA PIC 9(02). 05 LK-MES PIC 9(02). 05 LK-ANIO PIC 9(04).
- Siempre que aceptemos mediante la LINKAGE-SECTION datos provenientes de un programa externo, definimos un campo FILLER de tipo alfanumérico y de longitud 2 posiciones, este tiene la función de direccionar a la memoria donde los datos del parámetro están siendo alojados.
- El campo LK-DIA, de tipo numérico y de longitud 2 posiciones, contiene el valor del parámetro que el JCL de ejecución envió. Estamos recibiendo el valor 29, al cual le dimos la correspondencia del día de procesamiento del reporte.
- Los campos LK-MES de tipo numérico y de longitud 2 posiciones, contiene el valor del parámetro que el JCL de ejecución envió. Estamos recibiendo el valor 03, al cual le dimos la correspondencia del mes de procesamiento del reporte.
- Los campos LK-ANIO de tipo numérico y de longitud 2 posiciones, contiene el valor del parámetro que el JCL de ejecución envió. Estamos recibiendo el valor 2021, al cual le dimos la correspondencia del año de procesamiento del reporte.
Siempre podrás volver a esta clase para revisar cualquier duda que tengas sobre la estructura del reporte que “cobra vida” gracias a la definición de todas estas variables. Y ahora que hemos profundizado en esto, pasemos a la siguiente clase para crear los procedimientos de nuestro programa. ¡Te veo allá!