Martes 24 septiembre 2019
Nif
Nombre
copy RALUMN1B Apellidos
Colegio
Notas(6)
COPY
FPRACT16 AREACOM2
FPRACT15
COPY RCOLEGIO
dos programas, UNO LLAMANTE y otro llamado al que se le pasan datos de
entrada que ocurren 6 veces con el numero total de alumnos por asignaturas, sumar las notas y hacer
la media (comprobar que el divisor no es cero)
ENTRADA OCCURS 6
CT-Alumnos
AC-Notas
salida cod-retorno
88 ok value 0
88 a-cero value 1
Media-asig occurs 6 (media de las 6)
Media total
llamar al módulo, de forma estática desde FPRACT16, por cada registro leído no llama al modulo,
calcula por colegio las medias por asignaturas de ese colegio
COPY RCOLEGIO, que contiene:
Colegio
Asignatura OCCURS 6
CT-Alumnos
AC-NOTAS
MEDIA-ASIG
MEDIA-COLEGIO
en la working tendré una tabla de 2 dimensiones, tengo distintos colegios, y DPRACT16 saca notas
medias por asignaturas y por colegios, leo una sola vez y voy guardando las notas en una tabla
Asig1 Asig2 Asig3 Asig6
Colegio1 Datos a CT-Alumnos CT-Alumnos
definir AC-Notas AC-Notas
CT-Alumnos
AC-Notas
CT-Alumnos
AC-Notas
Colegio99
Tb-colegios(1)
tabla del tipo siguiente en la WORKING-STORAGE-SECTION
01 TABLA-NOTAS
05 colegios occurs 99
10 Asignaturas occurs 6
15 CT-Alumnos
15 AC-Notas
leo un alumno de la columna 07 (el colegio es el indice) y se ha presentado a la asig2 y a la asig6,
sumo esas dos notas
la tabla inicializada a cero, cuando termino de leer los alumnos los tengo en la tabla. Desde esa tabla
llamo al módulo.
El modulo calcula las notas medias con los datos de la tabla y lo que me devuelve el módulo lo
escribo en el fichero de salida:
COPY RCOLEGIO
Colegio
Asignatura OCCURS 6
CT-Alumnos
AC-NOTAS
MEDIA-ASIG
MEDIA-COLEGIO, la suma de las notas dividido por los contadores, el fichero de entrada lo
cramos nosotros
primero hacemos el módulo a partir de
entrada occurs 6
CT-alumnos-asig
Ac-notas-asig
salida
cod-retorno
88 ok value 0
88 todo-a-cero value 1 (LAS SEIS ASIGNATURAS, no puede calcular nada)
Media-asig occurs 6 (media de las 6)
Media-total
la media total la suma de las notas (ac-notas) dividido entre los alumnos presentados(contadores)
P390FALUMNOS.NOTAS es mi fichero de entrada
Para borrar contenido de un fich, con dd en la prim línea y dd en la ult linea
IDENTIFICATION DIVISION.
PROGRAM-ID. DPRACT15.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CN-CONSTANTES.
05 CN-CONSTANTES-NUMERICAS.
10 CN-1 PIC 9 VALUE 1.
10 CN-6 PIC 9 VALUE 6.
01 CT-CONTADORES.
05 CT-NOTA-CERO PIC 9.
01 AC-ACUMULADORES.
05 AC-ALUMNOS PIC 9(5).
05 AC-NOTAS PIC 9(6).
01 IN-INDICES.
05 IN-IND PIC 9.
LINKAGE SECTION.
COPY AREACOM2.
PROCEDURE DIVISION USING AREA-COMUNICACIONES-MOD.
PERFORM 1000-INICIO
PERFORM 2000-PROCESO
VARYING IN-IND FROM CN-1 BY CN-1
UNTIL IN-IND > CN-6
PERFORM 3000-FIN
GOBACK
.
1000-INICIO.
INITIALIZE DATOS-SALIDA-MOD
CT-CONTADORES
AC-ACUMULADORES
.
2000-PROCESO.
IF CT-ALUMNOS-ASIG(IN-IND) = ZERO THEN
ADD CN-1 TO CT-NOTA-CERO
ELSE
COMPUTE NOTA-MEDIA-ASIG(IN-IND) ROUNDED
= AC-NOTAS-ASIG(IN-IND)
/ CT-ALUMNOS-ASIG(IN-IND)
ADD AC-NOTAS-ASIG(IN-IND)
TO AC-NOTAS
ADD CT-ALUMNOS-ASIG(IN-IND)
TO AC-ALUMNOS
END-IF
.
3000-FIN.
IF CT-NOTA-CERO = CN-6 THEN
MOVE CN-1 TO COD-RETORNO-MOD
ELSE
COMPUTE NOTA-MEDIA-TOTAL ROUNDED
= AC-NOTAS
/ AC-ALUMNOS
END-IF
.
01 in-cole pic(3)
01 tb-tabla
05 tb-colegios occurs 99
10 tb-asig occurs 6
15 ct-alumn pic 9(5)
15 ac-notas pic 9(6)
Perform varying(in-cole) FROM 1 by 1 until in-cole >99
Move tb-colegios(in-cole) to DATOS-ENTRADA-MOD
CALL ‘DPRACT15’ USING
IF TODO-BIEN
Grabar colegios
End-if
End-perform
********************************************DPRACT16**************************
IDENTIFICATION DIVISION.
PROGRAM-ID. DPRACT16.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ALUMNOS ASSIGN ALUMNOS
FILE STATUS IS FS-ALUMNOS.
SELECT COLEGIOS ASSIGN COLEGIOS
FILE STATUS IS FS-COLEGIOS.
DATA DIVISION.
FILE SECTION.
FD ALUMNOS
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
LABEL RECORD IS STANDARD
DATA RECORD IS REG-ALUMNOS.
COPY RALUMN1B.
FD COLEGIOS
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
LABEL RECORD IS STANDARD
DATA RECORD IS REG-COLEGIOS.
COPY RCOLEGIO.
WORKING-STORAGE SECTION.
01 CONSTANTES.
05 CN-CONSTANTES-NUMERICAS.
10 CN-1 PIC 9 VALUE 1.
10 CN-6 PIC 9 VALUE 6.
10 CN-99 PIC 99 VALUE 99.
01 WK-CANCELACION.
05 WK-ERROR-ABRIR-ALUMNOS PIC X(31) VALUE
'ERROR ABRIR FICHERO "ALUMNOS" '.
05 WK-ERROR-ABRIR-COLEGIOS PIC X(31) VALUE
'ERROR ABRIR FICHERO "COLEGIOS" '.
05 WK-ERROR-LEER-ALUMNOS PIC X(30) VALUE
'ERROR LEER FICHERO "ALUMNOS" '.
05 WK-ERROR-ESCRIBIR-COLEGIOS PIC X(34) VALUE
'ERROR ESCRIBIR FICHERO "COLEGIOS" '.
05 WK-ERROR-CERRAR-ALUMNOS PIC X(32) VALUE
'ERROR CERRAR FICHERO "ALUMNOS" '.
05 WK-ERROR-CERRAR-COLEGIOS PIC X(32) VALUE
'ERROR CERRAR FICHERO "COLEGIOS" '.
01 FS-FILE-STATUS.
05 FS-ALUMNOS PIC XX.
88 FS-ALUMNOS-OK VALUE '00'.
88 FS-ALUMNOS-FIN VALUE '10'.
05 FS-COLEGIOS PIC XX.
88 FS-COLEGIOS-OK VALUE '00'.
88 FS-COLEGIOS-FIN VALUE '10'.
01 IN-INDICES.
05 IN-IND PIC 999.
05 IN-ASIG PIC 9.
01 TB-TABLAS.
05 TB-COLEGIOS OCCURS 99.
10 TB-ASIB OCCURS 6.
15 CT-ALUMNOS PIC 9(5).
15 AC-NOTAS PIC 9(6).
COPY AREACOM2.
PROCEDURE DIVISION.
PERFORM 1000-INICIO
PERFORM 2000-PROCESO
PERFORM 3000-FIN
STOP RUN
.
1000-INICIO.
PERFORM 1100-INIC-VARIABLES
PERFORM 1200-ABRIR-FICHEROS
.
1100-INIC-VARIABLES.
INITIALIZE TB-TABLAS
.
1200-ABRIR-FICHEROS.
OPEN INPUT ALUMNOS
OUTPUT COLEGIOS
IF FS-ALUMNOS-OK THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-ABRIR-ALUMNOS
FS-ALUMNOS
MOVE 33 TO RETURN-CODE
STOP RUN
END-IF
IF FS-COLEGIOS-OK THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-ABRIR-COLEGIOS
FS-COLEGIOS
MOVE 34 TO RETURN-CODE
STOP RUN
END-IF
.
2000-PROCESO.
PERFORM 9100-LEER-ALUMNO
PERFORM 2100-PROCESAR-ALUMNO
UNTIL FS-ALUMNOS-FIN
PERFORM 2200-PROCESAR-TABLA
VARYING IN-IND FROM CN-1 BY CN-1
UNTIL IN-IND IS GREATER THAN CN-99
.
2100-PROCESAR-ALUMNO.
PERFORM 2110-PROCESAR-NOTA
VARYING IN-IND FROM CN-1 BY CN-1
UNTIL IN-IND IS GREATER THAN CN-6
PERFORM 9100-LEER-ALUMNO
.
2110-PROCESAR-NOTA.
IF NOTA OF REG-ALUMNOS(IN-IND) IS ZERO THEN
CONTINUE
ELSE
ADD NOTA OF REG-ALUMNOS(IN-IND)
TO AC-NOTAS (COLEGIO OF REG-ALUMNOS, IN-IND)
ADD CN-1
TO CT-ALUMNOS (COLEGIO OF REG-ALUMNOS, IN-IND)
END-IF
.
2200-PROCESAR-TABLA.
MOVE TB-COLEGIOS(IN-IND)
TO DATOS-ENTRADA-MOD
CALL 'DPRACT15' USING AREA-COMUNICACIONES-MOD
IF TODO-BIEN THEN
MOVE IN-IND TO COD-COLEGIO OF REG-COLEGIOS
PERFORM VARYING IN-ASIG FROM CN-1 BY CN-1
UNTIL IN-ASIG IS GREATER THAN CN-6
MOVE CT-ALUMNOS-ASIG OF DATOS-ASIGNATURAS OF
DATOS-ENTRADA-MOD(IN-ASIG)
TO CT-ALUMNOS-ASIG OF DATOS-ASIGNATURAS OF
REG-COLEGIOS(IN-ASIG)
MOVE AC-NOTAS-ASIG OF DATOS-ASIGNATURAS OF
DATOS-ENTRADA-MOD(IN-ASIG)
TO AC-NOTAS-ASIG OF DATOS-ASIGNATURAS OF
REG-COLEGIOS(IN-ASIG)
MOVE NOTA-MEDIA-ASIG OF MEDIA-ASIGNATURAS OF
DATOS-SALIDA-MOD(IN-ASIG)
TO NOTA-MEDIA-ASIG OF DATOS-ASIGNATURAS OF
REG-COLEGIOS(IN-ASIG)
END-PERFORM
MOVE NOTA-MEDIA-TOTAL OF DATOS-SALIDA-MOD
TO NOTA-MEDIA-TOTAL OF REG-COLEGIOS
PERFORM 2210-ESCRIBIR-COLEGIOS
END-IF
.
2210-ESCRIBIR-COLEGIOS.
WRITE REG-COLEGIOS
IF FS-COLEGIOS-OK
THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-ESCRIBIR-COLEGIOS
FS-COLEGIOS
PERFORM 9900-CERRAR-FICHEROS
MOVE 35 TO RETURN-CODE
STOP RUN
END-IF
.
3000-FIN.
PERFORM 9900-CERRAR-FICHEROS
.
9100-LEER-ALUMNO.
READ ALUMNOS
IF FS-ALUMNOS-OK OR FS-ALUMNOS-FIN
THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-LEER-ALUMNOS
FS-ALUMNOS
PERFORM 9900-CERRAR-FICHEROS
MOVE 36 TO RETURN-CODE
STOP RUN
END-IF
.
9900-CERRAR-FICHEROS.
CLOSE ALUMNOS
COLEGIOS
IF FS-ALUMNOS-OK
THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-CERRAR-ALUMNOS
FS-ALUMNOS
MOVE 37 TO RETURN-CODE
END-IF
IF FS-COLEGIOS-OK
THEN
CONTINUE
ELSE
DISPLAY WK-ERROR-CERRAR-COLEGIOS
FS-COLEGIOS
MOVE 38 TO RETURN-CODE
END-IF
.
******************DPRACT15*********************************************
***************************** Top of Data ************************
IDENTIFICATION DIVISION.
PROGRAM-ID. DPRACT15.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CN-CONSTANTES.
05 CN-CONSTANTES-NUMERICAS.
10 CN-1 PIC 9 VALUE 1.
10 CN-6 PIC 9 VALUE 6.
01 CT-CONTADORES.
05 CT-NOTA-CERO PIC 9.
01 AC-ACUMULADORES.
05 AC-ALUMNOS PIC 9(5).
05 AC-NOTAS PIC 9(6).
01 IN-INDICES.
05 IN-IND PIC 9.
LINKAGE SECTION.
COPY AREACOM2.
PROCEDURE DIVISION USING AREA-COMUNICACIONES-MOD.
PERFORM 1000-INICIO
PERFORM 2000-PROCESO
VARYING IN-IND FROM CN-1 BY CN-1
UNTIL IN-IND > CN-6
PERFORM 3000-FIN
GOBACK
.
1000-INICIO.
INITIALIZE DATOS-SALIDA-MOD
CT-CONTADORES
AC-ACUMULADORES
.
2000-PROCESO.
IF CT-ALUMNOS-ASIG(IN-IND) = ZERO THEN
ADD CN-1 TO CT-NOTA-CERO
ELSE
COMPUTE NOTA-MEDIA-ASIG(IN-IND) ROUNDED
= AC-NOTAS-ASIG(IN-IND)
/ CT-ALUMNOS-ASIG(IN-IND)
ADD AC-NOTAS-ASIG(IN-IND)
TO AC-NOTAS
ADD CT-ALUMNOS-ASIG(IN-IND)
TO AC-ALUMNOS
END-IF
.
3000-FIN.
IF CT-NOTA-CERO = CN-6 THEN
MOVE CN-1 TO COD-RETORNO-MOD
ELSE
COMPUTE NOTA-MEDIA-TOTAL ROUNDED
= AC-NOTAS
/ AC-ALUMNOS
END-IF
.
*******************DCPMODUL*************************
//P390DMOD JOB CLASS=C,
// NOTIFY=&SYSUID,
// MSGLEVEL=(1,1)
//SCAN EXEC PGM=ISRLEMX,COND=(12,LE),
// PARM=('COB,DPRACT15,B,N, ,4, ,00,ENU,4,7',
// '1,/,SYSALLDA')
//*
//* INSERT A STEPLIB DD HERE IF ISRLEMX IS NOT IN YOUR SYSTEM LIBRARY
//*
//ISRLCODE DD DSN=CURSO.COBOL.FUENTES,DISP=SHR
// DD DSN=CURSO.COBOL.COPYS,DISP=SHR
//ISRLEXPD DD UNIT=SYSDA,DISP=(NEW,PASS),SPACE=(CYL,(2,2)),
// DSN=&&TEMP1
//ISRLMSG DD SYSOUT=(A)
//COBOL EXEC PGM=IGYCRCTL,REGION=640K,COND=(12,LE),
// PARM=(NOTERM,LIB,
// '')
//SYSPUNCH DD DUMMY
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(2,2))
//SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR
// DD DSN=CURSO.COBOL.FUENTES,DISP=SHR
// DD DSN=CURSO.COBOL.COPYS,DISP=SHR
//SYSIN DD DSN=CURSO.COBOL.FUENTES(DPRACT15),DISP=SHR
//SYSLIN DD DSN=CURSO.COBOL.OBJ(DPRACT15),
// DISP=OLD
//
******************DCOMPILA*******************************
//P390DCOB JOB NOTIFY=&SYSUID,
// MSGCLASS=V,
// CLASS=A
//*=====================================================
//*===AQUI DEBAJO SE COMPILA Y SE CREA EL EJECUTABLE
//*=====================================================
//PASOCOMP EXEC PGM=IGYCRCTL,REGION=2048K,
// PARM='LIB,OFFSET,XREF,FLAG(W,W),TEST(SYM)'
//SYSPRINT DD SYSOUT=*
//SYSLIB DD DSN=CURSO.COBOL.COPYS,DISP=SHR
//SYSLIN DD DSNAME=&OBJ,UNIT=SYSDA,
// DISP=(MOD,PASS),SPACE=(TRK,(3,3)),
// DCB=(BLKSIZE=3200)
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT6 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7 DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//* DEBAJO ================================ TU COBOL
//SYSIN DD DSN=CURSO.COBOL.FUENTES(DPRACT16),DISP=SHR
//* ARRIBA ================================ TU COBOL
//PASOLKED EXEC PGM=HEWL,COND=(5,LT,PASOCOMP),PARM=''
//SYSLIB DD DSN=CEE.SCEELKED,DISP=SHR
// DD DSN=CURSO.COBOL.LOAD,DISP=SHR
// DD DSN=CURSO.COBOL.OBJ,DISP=SHR
//SYSUT1 DD DSN=&SYSUT1,UNIT=SYSDA,SPACE=(1024,(200,20)),
// DCB=BLKSIZE=1024
//SYSPRINT DD SYSOUT=*
//SYSLIN DD DSN=&OBJ,DISP=(OLD,DELETE)
//SYSIN DD DUMMY
//* DEBAJO ================================ TU LOAD
//SYSLMOD DD DSNAME=CURSO.COBOL.LOAD(DPRACT16),DISP=SHR
**************JCL -> DPRACT16********************
***************************** Top of Data ************
//P390D016 JOB NOTIFY=&SYSUID,TIME=(0,30)
//JOBLIB DD DSN=CURSO.COBOL.LOAD,DISP=SHR
//****************************************************
//DPRACT16 EXEC PGM=DPRACT16
//SYSOUT DD SYSOUT=L
//ENTRADA DD DSN=P390D.ENTRADA.DPRACT16,DISP=SHR