¡Curso COBOL. ¡Ya es posible aprender COBOL desde casa. Se trata del videocurso en español más completo existente sobre COBOL en toda la red, con explicaciones muy pormenorizadas y detalladas de su sintaxis. Yo empecé trabajando como programador en mainframes MVS y eché de menos este tipo de curso cuando empecé; jamás lo encontré. Es el curso que todo aquel que en su momento nos iniciamos en COBOL quisiéramos haber podido tener a nuestro alcance; en vez de tener que ir de web en web buscando pedazos de información de manera casi desesperada. Espero que el esfuerzo de ¡meses. que he podido condensar en este curso os sea de muchísimo provecho.
¡Curso COBOL. ¡Ya es posible aprender COBOL desde casa. Se trata del videocurso en español más completo existente sobre COBOL en toda la red, con explicaciones muy pormenorizadas y detalladas de su sintaxis. Yo empecé trabajando como programador en mainframes MVS y eché de menos este tipo de curso cuando empecé; jamás lo encontré. Es el curso que todo aquel que en su momento nos iniciamos en COBOL quisiéramos haber podido tener a nuestro alcance; en vez de tener que ir de web en web buscando pedazos de información de manera casi desesperada. Espero que el esfuerzo de ¡meses. que he podido condensar en este curso os sea de muchísimo provecho.
Breve descripción de contenidos
En este curso os enseño, antes de comenzar, a instalaros un Mainframe MVS en vuestro propio PC para programar en él con total normalidad. Veremos a un nivel básico qué es y cómo funciona un Host, nos adentraremos en el TSO y en su gestión ISPF y os enseñaré a moveros con soltura en este sistema operativo, así como los comandos básicos de edición y gestión de ficheros y miembros.
Tras esto, estaremos en disposición de empezar a desarrollar los primeros programas en lenguaje COBOL y sus ejecutables JCL. Abundaremos, paso a paso, en los diferentes tipos de programas COBOL que podemos codificar, todo ello haciendo ejemplos continuamente: comenzaremos por el típico programa "Hola Mundo" e iremos complicando paulatinamente el código de nuestros programas hasta abarcar prácticamente todo el lenguaje de programación.
Asimismo, veremos cómo editar y manipular diferentes tipos de ficheros desde JCL, aprendiendo a utilizar las utilities más populares de este lenguaje. Por supuesto, haremos ejemplos continuamente para ver "en vivo" su funcionamiento. Todo esto nos permitirá empezar a codificar otro tipo de programas COBOL: serán programas que utilizan ficheros, ya sea en su entrada o en su salida.
Notas de interés para l@s alumn@s: Si enéis cualquier duda o sugerencia relacionada con el curso, podéis poneros en contacto conmigo a través de mensaje privado Udemy O a través del correo Gmail siguiente: adria.dgbcn
Debido al enorme tiempo que me conlleva hacer este tipo de cursos, no puedo ofertarlos de manera gratuita. Sin embargo, pese a no existir ningún curso similar en la red, he decidido poner el precio más bajo posible, aunque su valor real es muchísimo mayor (más de 50 clases, asesoramiento al alumnado por email, materiales descargables...). Creo que, aunque podamos tener una situación económica complicada, todos nos hemos gastado algunos euros en ir al cine o comprar una nueva camiseta para el verano; por ello, gastar unos pocos euros en un curso tan completo no lo veo descabellado.
En cualquier caso, como siempre existen situaciones excepcionales, si alguien de verdad necesita poder realizar el curso y no dispone de los medios económicos, que se ponga en contacto conmigo y concederé acceso totalmente gratuito. Mi intención es que todo aquel que esté interesado pueda registrarse y completar el curso. Además, me encanta poder compartir conocimientos con los demás y no me gustaría que motivos de índole económica puedan sesgar las oportunidades de personas que tengan especial necesidad.
Mis más sinceras gracias a tod@s. ¡Disfrutad el curso.
MODIFICACION DE CONTENIDOS: debido a la enorme extensión que está teniendo el curso (más de 60 clases, decenas de horas de video) he decidido no introducir aquí también el uso de DB2/SQL. Se verá cómo manejar una base de datos desde el Mainframe y la sintaxis COBOL necesaria para ello en otro curso que desarrollaré en el futuro.
En esta primera clase introductoria os hago un breve recorrido histórico en el universo del COBOL, por lo que hablar de IBM y su evolución será una parada obligada. Os explico también la utilidad y situación actual de este lenguaje en la actualidad; pese a ser uno de los primeros lenguajes de programación que existieron, sigue teniendo una elevadísima explotación en la actualidad ya que se trata de un entorno muy estable y seguro. Todos las grandes empresas multinacionales del mundo, la banca, las empreasas aseguradoras, crediticias, etc, utilizan estos sistemas.
Breve repaso de los contenidos que trataremos a lo largo del curso. Comenzaremos, como no puede ser de otra manera, con una guía de instalación pormenorizada del entorno. Continuaremos dando los primeros pasos en el TSO, esto es, aprendiendo a utilizar el sistema de navegación de menús ISPF característico. Con estos conocimientos adquiridos, comenzaremos a desarrollar programas batch sencillos que iremos complicando paulatinamente. Posteriormente introduiremos el tratamiento de tablas mediente el gestor DB2 y aprenderemos a crear programas COBOL con accesos a base de datos (sentencias SQL embebidas). Crearemos ejecutables JCL y compilaremos y probaremos los programas creados.
En esta sección repasamos y explicamos la evolución de las arquitecturas mainframe, desde el primer sistema operativo típico, esto es, MVS, hasta las z-Arquitecturas actuales. El objetivo no es ser un experto en estas arquitecturas, sino más bien comprender la idea básica de su funcionamiento y conseguir que no os perdáis entre un océano de siglas diferentes que iremos utilizando y nombrando como parte de la jerga a lo largo de todo el curso.
El primer paso para instalar el entorno de trabajo es descargar un emulador. En esta clase os guío en la instalación del emulador hércules (http://www.hercules-390.org/)
La descarga del AD/CD (imagen del sistema operativo Z/OS) depende completamente de redes P2P. Es ilegal distribuir software sin licencia; por este motivo, no os puedo adjuntar los discos (ficheros .cckd). Una vez los tengáis, debéis guardarlos en la carpeta ZOS110 de Hércules.
Asimismo, os adjunto el fichero de configuración del emulador. ¡Ojo! Deberéis cambiar la extensión .txt a .cnf para que os funcione!
Por último, necesitamos instalar la consola (terminal) de acceso al TSO. Por ejemplo, podéis descargarla de https://www.tombrennansoftware.com/index.html. Una vez instalada, os ayudo a configurar su conexión a Hércules (mediente el parámetro CNSLPORT) y aprenderemos a crear sesiones de trabajo.
¡Ya tenemos todo el entorno instalado! Ahora ingresaremos por primera vez en el MVS; para ello, debemos hacer IPL y esperar a que se cargue el NIP y el AD/CD. Dado que estamos en un entorno emulado, necesitaremos dos sesiones: una para la consola del emulador y otra para ingresar en el TSO. Entraremos con el usuario genérico IBMUSER.
Igual de importante que abrir es cerrar el entorno ordenadamente. Si cerramos "a lo burro", la próxima vez que ingresemos en el sistema podemos tener errores graves que impidan el correcto funcionamiento del entorno; por tanto, ¡nunca cerréis sin seguir el procedimiento estándar que aquí os explico!
Es el momento de aprender las funcionalidades básicas de gestión de miembros en ISPF.
Aquí vemos cómo crear librerías y miembros en librerías desde las opciones de menú ISPF. Asimismo, os explico cómo copiar, mover, renombrar, etc librerías y miembros.
Explicamos los principales tipos de registros con que podemos definir un DataSet (DS, set de datos, librería; son sinónimos): F, V, FB, VB y U.
Explico también los diferentes tipos de DS que existen en MVS, ya que al ser un sistema operativo basado en librerías, es imprescindible conocer los principales tipos y cuándo utilizar cada una, así como la manera de crearlas:
Ficheros PS (secuenciales)
Ficheros PDS (particionados)
Ficheros PDSE (extendidos)
Ficheros VSAM (indexados)
Ficheros GDG (generacionales)
Explicaré también los principales parámetros (memoria principal y secundaria, BLK, LRECL, ...) y cómo optimizar el tamaño del bloque de registros (aunque por defecto el sistema SMS, salvo en algunos casos, lo optimiza automáticamente).
Comenzaremos a aprender algunas de las estructuras y sintaxis básicas del lenguaje COBOL, así como constantes figurativas, indicadores, operadores relacionales y operadores lógicos.
Os introduzco también las divisiones y secciones de las que consta cualquier programa COBOL, explicando algunas de sus principales características:
Identification Division: área de identificación del programa
Environment Division: área de definición de dispositivos de ejecución y control de ficheros E/S.
Data Division: área de definición de las estructuras de datos.
Procedure Division: área para la secuencia de operaciones que resuelven el algoritmo.
Creamos nuestro primer programa COBOL: un típico "Hola Mundo". El objetivo es que, a ejecutarlo, nos aparezca el mensaje por pantalla y, durante el camino, aprender los siguientes conceptos básicos:
Programación Estructurada: sentencia PERFORM
Instrucciones básicas MOVE, DISPLAY.
Definición y uso de variables de trabajo: números de nivel.
Crearemos nuestro primer JCL, necesario para, al submitirlo, generar el loadmodule del fuente (es decir, el ejecutable). De esta necesidad, aprenderemos:
La sintaxis básica de un JCL: JOBLIB, EXEC, DSN, DISP...
Submitir un JCL y ver el resultado en el SDSF (spool)
Aprender a movernos en el ST del SDSF: ver compilaciones, enmendar errores de codificación, etc.
Aprendemos a ejecutar el loadmodule generado en la clase anterior usando la sentencia CALL. También hacemos unas pequeñas modificaciones sobre el código fuente para conseguir ver el resultado de manera centrada en la pantalla y, de paso, os enseño cómo ver la salida en el SDSF, arreglar errores de compilación, concatenar varias variables en un DISPLAY y ejecutar el loadmodule desde la librería de objetos que nos hemos creado.
Breve repaso de Programación Estructurada, con los diferentes tipos de estructuras y ejemplos de cada caso.
Para evitar la ruptura del método de programación estructurada, queda TERMINANTEMENTE PROHIBIDO hacer uso de la sintaxis GO TO. Es una posibilidad que los compiladores admiten, pero su uso indiscriminado y abusivo es algo a evitar. De hecho, en pocas empresas está permitido su uso! En su sustitución, mejor utilizar siempre sentencias PERFORM convenientemente adaptadas para el objetivo (podemos romper la ejecución y forzar el final del programa a través de la activación de un switch, por ejemplo --> Moraleja: nunca uséis la sentencia GO TO !).
Creamos un programa que es capaz de mostrar la fecha y la hora de ejecución por pantalla. Nos sirve para repasar las divisiones en que se estructura cualquier programa COBOL, aprender a definir estructuras de datos en la Data Division (variables, literales, campos numéricos y alfanuméricos, campos simples, campos compuestos...), practicar la sintaxis aprendida en el "Hola Mundo" y aprender algunas cosas más.
En particular, aprenderemos la sentencia ACCEPT y su sintaxis para adquirir datos externos al programa (datos de sistema).
Modificaremos el programa anterior para que, entre otras cosas, muestre el día de la semana o el mes sin espacios al final, que hace que quede "fea" la apariencia del mensaje. Para ello, haremos uso de:
Sentencias INSPECT TALLYING / REPLACING.
Bucles PERFORM UNTIL.
Cláusula REDEFINES en la declaración de variables.
Enfrentarnos por primera vez al uso de arrays en lenguaje COBOL: OCCURS.
Sentencia COMPUTE para la realización de cálculos aritméticos.
En esta clase elaboramos un programa que lee un listado con los días de la semana por SYSIN.
En esta clase elaboramos los JCL necesarios para ejecutar el programa creado en la clase 18.
Optamos por separar la creación del objeto linkeditado de la propia ejecución del si del programa; para ello, separamos todo el proceso necesario en dos JCLs:
- Job de creación del linkeditado (mediante llamada a utilitdad IGYWCL de IBM).
- Job de GO ("ejecución") del programa.
Con esto evitamos al sistema tener que volver a crear el objeto cada vez que queramos ejecutar; ¡es un sinsentido crearla y destruirla con cada ejecución!
Cambiamos la salida del programa, guardándo el resultado en un fichero en vez de dejarlo en el spool.
Para ello, es necesario modificar la SYSOUT del JCL de GO.
En esta clase reutilizamos el programa de la clase anterior (listado días de la semana) para implementar una búsqueda de un día en concreto, que también le pasamos por SYSIN, en el listado.
Esto nos permitirá introducir las variables booleanas, muy utilizadas en Cobol a modo de apagadores/encendedores de eventos (switches), Se trata, por cierto, de un elemento muy típico de la programación estructurada.
En esta clase introducimos algunos conceptos básicos sobre cómo realizar operaciones arimtéticas en COBOL: sumas (ADD), restas (SUBTRACT), divisiones (DIVIDE), operaciones matemáticas más elaboradas (sentencia COMPUTE) y controlar los posibles errores mediante el mandado ON SIZE ERROR.
Link con el acceso a la web del Ministerio del Interior del Gobierno de España:
http://www.interior.gob.es/web/servicios-al-ciudadano/dni/calculo-del-digito-de-control-del-nif-nie
Breve introducción a la artimética modular básica para comprender el funcionamiento la función Cobol FUNCTION MOD(A B). El uso de esta función nos permite ahorrar gran cantidad de código a la hora de calcular dígitos faltantes en un DNI, la letra de un DNI, los dígitos de control de un número de cuenta, etc.
En la diapositiva, como comento en la clase, hay erratas en los ejemplos de módulo 3 y módulo 4. Os pidos disculpas y espero que haya quedado aclarado.
En esta clase rehacemos el programa el cálculo de la letra de un DNI usando la función de cálculo modular FUNCTION MOD en vez de la setencia DIVIDE.
En esta clase desarrollamos un algoritmo que comprueba si un número de cuenta (código IBAN) es correcto o no.
Esto nos va a permitir introducir el método de búsquedas binarias en tablas (internas) de programas COBOL haciendo uso de la sentencia SEARCH. Como se explica en el vídeo, ésta es su sintaxis:
SEARCH variable1
[AT END sentenciaEnd]
WHEN condicion
sentencia1 (ó NEXT SENTENCE)
[END-SEARCH]
Adjunto abajo el documento de la Asociación Española de Banca que explica cómo comprobar si un IBAN es correcto.
Preguntas en modo TEST sobre los conceptos de codificación COBOL aprendidos hasta el momento.
En esta clase introductoria establecemos las bases de conocimiento básicas el control de trabajos en un Mainframe. En particular, nos referiremos al subsistema de control de trabajos del MVS, el JES.
Tomando como ejemplo algunos de los JCL que ya hemos hecho para poder ejecutar nuestros COBOLs de la sección anterior, nos iniciamos en la sintaxis básica del Lenguaje JCL.
Comenzamos a entrar en el detalle de la sintaxis de las intrucciones JCL y su estructura:
ESTRUCTURA: un JCL siempre debe comenzar por una (y sólo una) sentencia de cabecera JOB. Tras la cabecera, pueden haber N sentencias EXEC. Asimismo, por cada fichero utilizado, debe usarse una sentencia DD, necesaria para describir los ficheros con los que se va a trabajar.
COMANDOS: cada sentencia JCL posee parámetros de palabra clave. Veremos algunos de los más importantes: CLASS, MSGCLASS, NOTIFY, TIME, REGION, PRTY, TYPRUN, PARM, DISP, DCB... pero no todos, porque la lista es interminable.
PD: en caso de programas COBOL con ficheros (siguiente Sección del curso), la sentencia DD identifica el fichero lógico definido en la SELECT del batch con su fichero físico JCL. Como veremos, es fundamental que tengan el mismo nombre, ya que, de lo contrario, ¡el programa no encontrará el fichero!
Para poner en práctica lo aprendido en las primeras clases de la sección, vamos a crear un primer JCL básico que sea capaz de sacar un mensaje "Hola Mundo!" por pantalla (desde el spool). Para ello, utilizaremos el comando delimitador DL=$$, una técnica poco conocida en JCL (ya que no es este tipo de montaje el uso habitual de un job) pero muy sencilla y potente.
Para ello utilizaremos la utilidad IEBGENER de JCL predefinida en el MVS (podéis verla en la librería SYS1.LINKLIB). No os preocupéis por ella: en el siguiente capítulo la explico con todo lujo de detalle.
La utilidad IEBGENER realiza varias funciones y vamos a aprender a utilizarlas en este capítulo:
Crear una copia de un SDS o de miembro(s) de un PDS.
Crear un PDS, o miembro(s) de un PDS, a partir de un SDS.
Añadir miembros a un PDS.
Generar un output editado de un fichero, ya sea secuencial o particionado.
Modificar las longitudes de registro (LRECL) de un fichero.
Por si acaso: SDS significa sequential data-set (es decir, fichero secuencial, DSORG=PS). Análogamente, PDS son las siglas de partitioned data-set (es decir, fichero particionado, DSORG=PS).
Nos enfrentamos ahora a la utilidad IEBCOPY, fundamental para manipular ficheros PDS. Sus funciones son:
Copiar de un PDS a otro PDS o a un SDS.
Copiar de uno o varios SDS a un PDS.
Mergear ("unir") varios PDS en un único PDS.
Comprimir un PDS (básicamente, lo copiamos sobre sí mismo).
Reemplazar o renombrar miembros de un PDS.
Para poder ejecutar alguna de estas acciones, la definición de la SYSIN va a ser fundamental:
Parámetro COPY, para copiar un PDS:
OUTDD: indica el fichero de output.
INDD: indica el/los fichero/s de input.
COPY OUTDD=nombreDD
INDD=(nombreDD,(nombreDD,R),…)
Parámetro SELECT, donde especificamos los nombres de los miembros de los ficheros de entrada que se van a copiar (por supuesto, no estamos forzados a copiarlos todos!).
Parámetro EXCLUDE: donde especificamos los nombres de los miembros que se excluirán del copiado.
Una utilidad poco conocida y sencilla muy similares a las anteriores es IEBCOMPR. Su utilidad radica en la comparación de ficheros, ya sean PDS o SDS. Deberemos indicarle el tipo de ficheros a comparar por SYSIN.
Devuelve un código de retorno 0 cuando los ficheros son iguales; 8 cuando no lo son.
Esta utilidad lista los directorios de un PDS o bien los contenidos de la tabla de un volumen (VTOC):
LISTPDS lista el directorio del PDS, donde pueden observarse los miembros del fichero.
LISVTOC lista la VTOC completa de un volumen en un disco (o parte de la misma). El formato por defecto es DUMP (hexadecimal), pero forzando FORMAT saca un listado legible.
Esta utilidad es bastante peculiar porque no hace nada en particular: es un comodín.
A nivel de sistema, lo que hace es saltar al registro 14 del procesador (Branch Register 14), donde está... la dirección de retorno del Master Scheduler. Es decir: la ejecución del IEFBR14 hace que devuelva el control al planificador del sistema (ir y automáticamente, volver, sin hacer nada). Entonces, ¿para qué diantres sirve?
Pues resulta que en un entorno MVS nos podemos aprovechar su potencial para, por ejemplo, crear un fichero en un paso y no queremos que haga nada más.
Como ya hemos visto, en JCL no es posible definir sentencias DD sin ficha EXEC: precisamente IEFBR14 viene a suplir esta carencia, ya que creando pasos de tipo EXEC PGM=IEFBR14 vamos a borrar o catalogar ficheros!
La utilidad IDCAMS tiene varias funciones:
Definir y borrar ficheros VSAM.
Copiar un fichero en otro.
Listar catálogos.
Imprimir ficheros.
Transferir ficheros de un sistema a otro.
Veremos algunas de ellas en esta clase.
Primera toma de contacto con la manipulación directa de ficheros, en particular, de la sentencia directa SORT desde el CMD del TSO. Esto nos permite visualizar de manera directa el efecto de ejecución de una sentencia de ordenación. Estas mismas sentencias las programaremos en los siguientes capítulos en trabajos JCL.
Se trata de la sentencia SORT más sencilla de todas: copiar un fichero en otro tal y como se lee desde la entrada.
La sentencia SORT FIELDS=(inicio, longitud, tipo, orden) nos permite indicar por qué campos queremos ordenar un fichero. Dichos campos son especificados en la sentencia de la siguiente manera:
Posición de inicio
Longitud del campo
Tipo de campo (binario BI, decimal ZD, empaquetado PD, carácteres CH...)
Tipo de ordenación: ascendente (A) o descendente (D).
La sentencia INCLUDE COND=(inicio, longitud, tipo, operador comparación, valor) nos permite incluir en el fichero de salida únicamente los registros que cumplen la condición especificada. Se trata de una sintaxis muy similar a la vista en la clase anterior, con la salvedad de que ahora, además, hemos de ligar las diferentes condiciones con operadores lógicos, que pueden ser AND o OR.
Asimismo, la sentencia OMIT COND nos permite excluir aquellos registros que cumplan la condición especificada. Huelga decir que tiene el mismo formato que la sentencia de inclusión.
En este capítulo veremos cómo dividir un fichero de entrada en varios ficheros de salida utilizando la sentencia OUTFILE junto con FNAMES. Por supuesto, podremos tener N ficheros de salida, cada uno de ellos con un nombre exclusivo y por tanto diferente al resto.
La sentencia OUTREC FIELDS=(posición, longitud) sirve para formatear el registro de salida de un fichero al ejecutar un SORT, algo muy utilizado en la generación de interfases o comunicación de datos entre una empresa y ciertos organismos públicos (Hacienda, DGT, Juzgados) o privados (listados de morosidad, datos médicos, etc). En efecto, suele ser habitual no querer el mismo formato a la salida que el recibido por la entrada.
Asimismo, la sentencia INREC FIELDS nos permite formatear los registros antes de ordenarlos. Es poco utilizada por motivos obvios. Por supuesto, tiene el mismo formato que la sentencia OUTREC FIELDS.
En este capítulo abundamos en la edición de campos numéricos utilizando OUTREC. En particular, veremos cómo podemos editar mediante la sentencia EDIT=(...), especificar el signo de una cantidad positiva o negativa al principio o al final de la misma mediante la sentencia SIGNS=(...), ajustar la longitud de salida utilizando la sentencia LENGTH y convertir campos utilizando la sintaxis formato_origen,TO=formato_destino.
La sentencia SUM FIELDS=(posición inicio campo, longitud, tipo) nos permite sumar los valores del campo que comienza en la posición indicada y que ocupa los bytes indicados. Por supuesto, sólo se pueden sumar campos numéricos, empaquetados o decimales, de lo contrario se obtendrá un abend en la ejecución del JCL.
La sentencia SUM FIELDS=NONE sirve para elimina registros duplicados: ¡este es un truco muy, muy utilizado!
En este capítulo nos introducimos brevemente en las ejecuciones condicionales de pasos en trabajos JCL, prestando especial interés en su sintaxis básica.
Los ficheros generacionales (GDG, Generation Data Group) son ficheros que constan de un grupo de archivos que están funcional y cronológicamente relacionados entre sí (¡no son ficheros VSAM!).
Su utilización es frecuente en cualquier empresa y/o mainframe, así que he considerado explicar brevemente cómo JCL es capaz de trabajar con ellos. En particular, vamos a ver cómo crear, modificar, copiar y borrar GDGs desde el lenguaje de control de trabajos.
En esta clase nos adentramos en cómo tratar desde los fuentes COBOL ficheros de entrada y salida (E/S). Os explico los tipos de organización que puede tener un fichero, su relación con las organizaciones de la instalación y los posibles modos de acceso.
Veremos cómo codificar la sección de entrada y salida: la INPUT-OUTPUT SECTION. En particular, explico con detalle la sintaxis y utilidad del párrafo FILE-CONTROL, formado exclusivamente por sentencias SELECT, viendo con detalle su formato:
Cláusula ASSIGN
Cláusula ORGANIZATION
Cláusula ACCESS
Cláusula RECORD KEY
Cláusula FILE STATUS
Asimismo, explico la FILE SECTION o sección de ficheros de un programa COBOL, necesaria para describir la información referente a los ficheros utilizados:
FD, nombre del fichero
Cláusula LABEL RECORD
Cláusula RECORDING MODE
Cláusula BLOCK CONTAINS
Cláusula RECORD CONTAINS
Para realizar operaciones sobre ficheros en un programa COBOL, es necesario, además de definirlos como hemos visto en la clase anterior, abrirlos en la propia WORKING-STORAGE SECTION. Por ello, en esta clase tomando un ejemplo ya hecho os explico la sentencia OPEN y sus posibles formatos. Algunos de ellos son:
OPEN INPUT fichero REVERSED WITH NO REWIND
OPEN I-O fichero WITH LOCK...
OPEN EXTEND fichero
...
Una vez aperturado el fichero, ya podremos leer/grabar/borrar/updatear etc sobre él.
Por último, al acabar las operaciones, es necesario cerrar el/los ficheros aperturados. Para ello utilizamos la sentencia CLOSE. Es importante no olvidarnos nunca de cerrar los ficheros, ya que aunque la primera ejecución del programa sería satisfactoria, la segunda y posteriores no lo serían porque al intentar abrir un fichero que ya está abierto (pues no ha sido cerrado) obtenemos un FILE-STATUS = 41.
Lectura de un fichero secuencial mediante la sentencia READ.
PD: en muchos programas COBOL es usual ver cómo el programador inicializa el registro del fichero antes de ejecutar la(s) lectura(s), pero es inútil. Por eso no lo he hecho en el ejemplo y, aunque toca el buffer, recomiendo no hacerlo nunca.
Sobre el programa de la clase anterior, añadimos en el fichero un nuevo campo "salario" de tipo numérico. A la hora de mostrar campos numéricos, es muy frecuente querer editarlos. Por ejemplo, al extender cheques, si la cantidad son 1.200€ y el campo acepta un PIC S9(9), sería poco seguro que la cantidad esté escrita de la forma "_____1200€", ya que alguien podría escribir ¡nueves por delante! Una posible solución sería rellenar con asteriscos, "*****1200€". Esto se consigue con la máscara PIC ********9.
En los recursos adjuntos a esta clase os dejo un documento con una colección amplia de máscaras COBOL y el resultado que generan.
En esta clase os explico cómo grabar ficheros (secuenciales) de salida en un batch que contiene como entrada otro PS. Para ello, es preciso utilizar la sentenci WRITE reg-FICHERO INTO datos.
¡Corrección! En la clase anterior el fuente con nombre PBC1N08 contiene el código del PBC1N07 y viceversa. La generación accidental de este cruce nos provocaba la compilación del código del programa anterior en el nuevo objeto.
En esta brevísima clase recompilamos el objeto correcto y visualizamos el PS de salida con el contenido indicado en el fuente.
No podemos borrar registros de un fichero secuencial utilizando la sentencia DELETE. Esta sentencia existe, pero sólo es utilizable con ficheros cuya organización es indexada o relativa (y además debe estar abierto en modo I-O).
La llamada a subprogramas/rutinas ("módulos aplicativos") desde un programa "principal" (main-program) se consiguen mediante la sentencia CALL. Veremos que hay dos tipos principales de llamadas, estáticas y dinámicas. En la mayoría de empresas, están prohibidos los programas con llamadas estáticas a módulos; ¡es mucho mejor hacer las llamadas dinámicas!
Básicamente, esto es debido a que en una llamada estática la linkedición del main necesita que exista disponibilidad del módulo, aumentando así el tiempo de linkedición. Además, el módulo pasa a formar parte del load, aumentando por tanto su tamaño en memoria...¡aunque no se use! Si la llamada se especifica de manera dinámica, el módulo sólo se carga en memoria si se usa, con lo que el SO puede gestionar con más eficiencia la memoria (no usa espacio en disco duplicado como en las llamadas estáticas).
Ejecución del módulo de traducción de euros a pesetas con algunas cantidades de ejemplo
Código fuente de todos los JCLs desarrollados durante el curso.
Objetos (linkediciones) de todos las compilaciones de fuentes COBOL desarrollados durante el curso.
Ficheros generados durante el curso.
Examen Final. Consta de 10 preguntas tipo test. La mitad más una de preguntas contestadas correctamente implica la obtención del aprobado y el consiguiente certificado de finalización del curso.
OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.
Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.
Find this site helpful? Tell a friend about us.
We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.
Your purchases help us maintain our catalog and keep our servers humming without ads.
Thank you for supporting OpenCourser.