Manual de programacion Cobol

106
Introducción La orientación del curso / manual la enfocaré a mi entorno de trabajo, es decir RM bajo UNIX, pero como os he dicho antes, no hay muchas diferencias. Al pensar en Cobol como lenguaje de programación debemos de tener presente que nos referimos a un lenguaje dedicado a gestión de datos con una magnífica transportabilidad entre los distintos sistemas, yo he ejecutado el mismo programa en MS-DOS y UNIX sin modificar ni una linea de código y copiando solo el objeto. Si se le llaman lenguajes de programación, es porque realmente se consideran como cualquier idioma, es decir tiene su gramática, sus verbos, sus frases, sus párrafos y el cobol además tiene una gran similitud con el inglés, ya que todo su entorno está sacado de éste idioma. Cobol además es un lenguaje estructurado y sus partes se diferencias claramente en Divisiones. Estas son 4, son obligatorias y cada una de ellas tiene una misión diferente dentro de cada programa como veremos a continuación. El programa cobol se escribe secuencialmente en líneas de 80 caracteres o menos con la siguiente división: La parte (1) comprende las columnas de la 1 a la 6 ambas inclusive y se utiliza para numerar las líneas, aunque hoy en día prácticamente no se utilizan. La parte (2) comprende la columna 7 y en ella podemos encontrar, un guión (-) que nos indica que esta línea es continuación de la anterior pero que por su tamaño ocupa mas de una línea, un asteristo (*) que nos indica que el texto que viene a continuación es un comentario y por lo tanto que el compilador lo ignore, o bien puede servir dependiendo de los compiladores para indicaciones del debug. La parte (3) se le llama Area A comprende las columnas 8 a 11 ambas inclusive y aquí es donde se escriben los nombre de las divisiones, de las secciones, de los párrafos, los indicadores de FD (File Description) y los niveles de variables 01 y 77. La parte (4) llamada Area B comprende desde la columna 12 a la 72 y en ellas se incluirán todas las instrucciones del programa, las lineas de las secciones y los niveles de variables mayores a 01. La parte (5) de la columna 73 a la 80 no se utiliza y por lo tanto es ignorada por el compilador. El punto es un signo de vital importancia en cobol ya que nos indica el final de una linea, en el han de terminar todas las secciones, divisiones y párrafos. Si al final de una linea el compilador no encuentra el punto, interpretará que la instrucción continúa hasta que aparezca el punto de fin de linea.

description

Manual de Programacion Cobol.

Transcript of Manual de programacion Cobol

Introduccin

Introduccin

La orientacin del curso / manual la enfocar a mi entorno de trabajo, es decir RM bajo UNIX, pero como os he dicho antes, no hay muchas diferencias.

Al pensar en Cobol como lenguaje de programacin debemos de tener presente que nos referimos a un lenguaje dedicado a gestin de datos con una magnfica transportabilidad entre los distintos sistemas, yo he ejecutado el mismo programa en MS-DOS y UNIX sin modificar ni una linea de cdigo y copiando solo el objeto.

Si se le llaman lenguajes de programacin, es porque realmente se consideran como cualquier idioma, es decir tiene su gramtica, sus verbos, sus frases, sus prrafos y el cobol adems tiene una gran similitud con el ingls, ya que todo su entorno est sacado de ste idioma. Cobol adems es un lenguaje estructurado y sus partes se diferencias claramente en Divisiones. Estas son 4, son obligatorias y cada una de ellas tiene una misin diferente dentro de cada programa como veremos a continuacin.

El programa cobol se escribe secuencialmente en lneas de 80 caracteres o menos con la siguiente divisin:

La parte (1) comprende las columnas de la 1 a la 6 ambas inclusive y se utiliza para numerar las lneas, aunque hoy en da prcticamente no se utilizan.

La parte (2) comprende la columna 7 y en ella podemos encontrar, un guin (-) que nos indica que esta lnea es continuacin de la anterior pero que por su tamao ocupa mas de una lnea, un asteristo (*) que nos indica que el texto que viene a continuacin es un comentario y por lo tanto que el compilador lo ignore, o bien puede servir dependiendo de los compiladores para indicaciones del debug.

La parte (3) se le llama Area A comprende las columnas 8 a 11 ambas inclusive y aqu es donde se escriben los nombre de las divisiones, de las secciones, de los prrafos, los indicadores de FD (File Description) y los niveles de variables 01 y 77.

La parte (4) llamada Area B comprende desde la columna 12 a la 72 y en ellas se incluirn todas las instrucciones del programa, las lineas de las secciones y los niveles de variables mayores a 01.

La parte (5) de la columna 73 a la 80 no se utiliza y por lo tanto es ignorada por el compilador.

El punto es un signo de vital importancia en cobol ya que nos indica el final de una linea, en el han de terminar todas las secciones, divisiones y prrafos. Si al final de una linea el compilador no encuentra el punto, interpretar que la instruccin contina hasta que aparezca el punto de fin de linea.

Al igual que en otros lenguajes, el cobol dispone de palabras reservadas que no debemos de utilizar como nombres de variables o de prrafos, adems stos no deben de exceder de 30 caracteres (depende del compilador).

Las variables y constantes que se pueden utilizar son numricas, alfabticas o alfanumricas. Las numricas al contrario de la mayora de los lenguajes actuales o las bases de datos no miden su tamao por bytes sino por dgitos, es decir, que una variable de 6 dgitos podr contener nmeros desde 0 hasta 999999 si es de valor absoluto o incluyendo los negativos si lleva signo. Para las alfanumricas en cambio no hay cambio alguna y su tamao viene indicado por el nmero de caracteres que ocupa.Existen adems en cobol unas variables que vienen con un valor propio y que se pueden utilizar libremente, tambin llamadas Constantes Figurativas, como ZERO, SPACE, LOW-VALUES, HIGH-VALUES, etc...

Quisiera respetar para todo el manual las mismas pautas, color Amarillo para las palabras reservadas cobol, subrayado para las obligatorias, en cursiva los comentarios y en normal el resto.

Nota final:Es obvio que cada manual estar orientado a la manera de trabajar de quien lo escribe, con ello quiero decir que habr cosas que no explicar mucho o incluso otras que omitir porque yo no las haya utilizado nunca.Una explicacin perfectamente detallada deber venir en los manuales de cada uno de los compiladores que del lenguaje Cobol existen hoy en dia.Espero que podais comprender sto, eso si, os puedo asegurar que todos mis programas utilizan solo lo que aqui voy a exponer y ninguno nunca me ha dado ningn problema.Identification Division

(312 palabras totales en este texto)(9373 Lecturas)

Esta es la primera linea de todo programa Cobol e identifica a la primera divisin donde se especifica el nombre del programa, el del autor y dems datos, su sintaxis sera la siguiente:

IDENTIFICATION DIVISION.PROGRAM-IDNombre del programa. AUTHOR Nombre del autor.INSTALLATION Lugar donde est instalado.DATE-WRITTEN Fecha de creacin.DATE-COMPILED Fecha de compilacin.REMARKSComentarios.Vemos que el nico prrafo obligatorio adems del nombre de divisin es el que hace referencia al nombre del programa, los dems nombre de autor, lugar de instalacin, fechas de creacin y compilacin y comentarios son opcionales, eso si, si se incluyen se deben de poner cumpliendo las normas.

Podemos incluir adems todos los comentarios o explicaciones que creamos oportunas incluyendo en la columna 7 un asterisco (*) que nos indica que el compilador har caso omiso de lo que venga a continuacin, por ejemplo.

* /////// Este programa es para hacer algo ///////* // atencin a la seccin de la fecha ////Ejemplo:IDENTIFICATION DIVISION.PROGRAM-ID. MANCLI.AUTHOR. ANDRES MONTES.INSTALLATION. WWW.REMARKS. Programa para mantenimiento de fichero de clientes.

Nota final:Poco mas podemos decir de sta division, obviamente las dems no son tan pequeas, sin embargo posee dos de las lineas mas importantes de cualquier programa cobol.

Environment Division

pgina(s) : 1/2(1905 palabras totales en este texto)(8452 Lecturas)

Es la segunda division por orden de aparicin, y en ella se especifican, el ordenador donde se escribi y se ejecutar el programa, asi como la relacion entre los ficheros a utilizar con sus correspondencias externas, es decir con los dispositivos a los que har referencia el programa objeto cuando vaya a establecer comunicacin con dicho fichero.

Diremos antes de continuar que en los primeros cobol haba muchas partes que eran obligatorias en cada programa, pero hoy en dia, por ejemplo, sta divisin ya no es obligatoria, asi como ninguna de sus partes. Su sintaxis sera la siguiente:

ENVIRONMENT DIVISION.CONFIGURATION SECTION.SOURCE-COMPUTER. Ordenador donde se escribi el fuente.OBJECT-COMPUTER. Ordenador donde se ejecuta el objeto.SPECIAL-NAMES. Cambiar valores para constantes del lenguaje, pueden variar en cada compilador.Como se aprecia en su sintaxis, sta segunda division se divide a su vez en dos secciones, que se describen a continuacion:

CONFIGURATION SECTION: Donde describimos los tipos de ordenadores en que se escribio y se ejecutar el programa, o bien el nombre del compilador y asignacin de valores a ciertas constantes utilizadas por el compilador, estos valores se introducen en sus respectivas lineas como se ve arriba.

Para la linea de SPECIAL-NAMES el uso mas habitual es el de cambiar el punto decimal usado por los ingleses por la coma y asi poder especificar los puntos para los miles, su formato sera el siguiente:

SPECIAL-NAMES.DECIMAL-POINT IS COMMA.

Tambin podriamos cambiar el valor del smbolo de la moneda con:

CURRENCY SIGN IS literal , suele ser un solo caracter y no puede coincidir con ninguno de los que usamos para definir las variables, es decir ni A,ni Z,ni 9,ni -,ni +,ni X, etc...

O hacer que todas las letras introducidas sean maysculas o minsculas o que no haya diferencias entre ambas con la clausula ALPHABET.

INPUT-OUTPUT SECION: Es la siguiente seccin dentro de la Environment, donde se especificarn todos los ficheros que vamos a utilizar, su tipo, su modo de acceso asi como el medio en que estarn, esta seccin solo ser obligatoria cuando vayamos a utilizar ficheros. Esta tiene dos prrafos FILE-CONTROL e I-O-CONTROL.

123456789012

A B

INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT [OPTIONAL] Nombre-de-archivoASSIGN TO Tipo-de-dispositivo ORGANIZATION IS Tipo de organizacionACCESS MODE IS Mode de acceso al ficheroRECORD KEY IS Clave del registroALTERNATE RECORD KEY IS Claves alternativas registroWITH DUPLICATESFILE STATUS IS Variable de estado del fichero.

Vamos a explicar cada una de las clusulas que encontramos dentro de la Input-Output Section.

Clusula SELECT es aqui donde especificamos el nombre lgico que va a tener el fichero dentro del programa, suele ser una palabra que identifique lo mas claro posible el contenido del fichero, por ejemplo ARTICULOS, PROVEEDORES, CLIENTES.

Clusula OPTIONAL si indicamos esta opcin al hacer un OPEN I-O, si el archivo no existe, se crea. Con lo cual nos evitamos tener que abrirlo como OUTPUT y cerrarlo, antes de poder utilizarlo por primera vez.

Clusula ASSIGN aqui especificamos el tipo de dispositivo, si es una impresora PRINTER, si es un fichero sobre el que vamos a grabar RANDOM o DISC, se pueden utilizar otros como INPUT, INPUT-OUTPUT, CASSETTE, MAGNETIC-TAPE, pero sin duda los mas utilizados son los dos primeros para identificar si el fichero utilizar una salida impresa o se utilizar sobre disco. Para identificar ficheros utilizados para clasificar utilizaremos SORT.

Clusula ORGANIZATION aqui indicamos la organizacin de los registros de nuestro fichero, podr ser SEQUENTIAL, RELATIVE o INDEXED, si nuestro archivo fuera secuencial se podran emitir sta clausula asi como las restantes.De sta organizacin se deriva el formato del fichero, SEQUENTIAL si los registros se graban secuencialmente conforme se dan entrada sin importar si estn o no repetidos, un ejemplo claro son los archivos de impresora, todos los listados son secuenciales.RELATIVE, si cada registro es identificado por un valor entero con su posicin relativa (practicamente no se utiliza).INDEXED es la mas utilizada e identifica a ficheros que sus registros son accesibles mediante una clave unica e irrepetible o por varias que pueden estar duplicadas, cualquier fichero de mantenimiento, por ejemplo de ARTICULOS, podra ser INDEXED, y cada cdigo ser nico para cada artculo y con el nos iremos a su posicin y podremos ver todos los demas datos que hagan referencia al registro.Existe tambin para los archivos de texto, tipo AUTOEXEC.BAT la posibilidad de asignarlos directamente especificando LINE SEQUENTIAL en sta clausula.

Clusula ACCESS MODE indica el modo de acceso al fichero, puede ser SEQUENTIAL, RANDOM o DYNAMIC, si no se especifica ninguno o si el fichero es SEQUENTIAL entiende que el modo ser SEQUENTIAL.RANDOM indica que accederemos a el aleatoriamente por su clave y DYNAMIC (la mas utilizada) con la que podremos acceder al fichero en el modo que queramos dentro del programa, unas veces secuencialmente, si nos interesa, otras veces por su clave.

Clusula RECORD KEY se utiliza solo si el fichero es indexado y en el decimos cual es el nombre de la clave por la cual accederemos a los registros. Esta deber ser alfanmerica y tendr que estar especificada en la FD del fichero. Si el archivo fuera RELATIVE, esta clausula se sustituira por RELATIVE KEY e indicar el nmero de registro del fichero, deber estar declarado en la WORKING-STORAGE SECTION como una variable numrica sin signo.

Clusula ALTERNATE RECORD KEY solo para ficheros indexados e identifican una o mas claves alternadas para nuestros registros, por ejemplo en un fichero de clientes cuya clave principal sera el cdigo, podramos asignar como clave alternativa el NIF, y podramos acceder a el por las dos claves, bien por cdigo o bien por NIF, ser tambin alfanumrico y deber tambin estar declarado en la FD. Si aparece WITH DUPLICATES, indica que sta clave alternativa pudiera estar duplicada, por ejemplo si hubieramos escogido como clave alternada adems del NIF, el Nombre del cliente, podra darse el caso de que dos clientes tuvieran el mismo nombre.

Clusula FILE STATUS aqui damos un nombre de una variable que especificaremos en la WORKING como un campo alfanumrico de dos caracteres donde el programa depositar el cdigo de error que ocurra en el fichero, dependiendo del valor nosotros podremos operar o hacer alguna accin en concreto.

El prrafo I-O CONTROL se utiliza par indicarle al programa cuantos archivos van a utilizar el mismo area de memoria para trabajar, os puedo decir poco mas de ste prrafo porque yo no lo he utilizado nunca (lo que no quiere decir que no sea til).

Ejemplo:ENVIRONMENT DIVISION.CONFIGURATION SECTION.SOURCE-COMPUTER. RMCOBOL.OBJECT-COMPUTER. RMCOBOL.SPECIAL-NAMES. DECIMAL-POINT IS COMMA.INPUT-OUTPUT SECTION.FILE-CONTROL.

SELECT CLIENTES ASSIGN TO RANDOM "C:DATOSCLIENTES.DAT" ORGANIZATION INDEXEDACCESS DYNAMIC RECORD KEY KEY-CLIENTE ALTERNATE RECORD KEY-CLIENTE1 FILE STATUS STACLI.SELECT IMPRESORA ASSIGN TO PRINT "PRINTER".

Hemos declarado el archivo CLIENTES como indexado con dos claves, una principal KEY-CLIENTE y otra alternativa KEY-CLIENTE1 y hemos asignado una variable para guardar los posibles cdigos de error para cuando operemos con ste fichero STACLI. Al indicarle el acceso dinmico le decimos que una vez dentro del programa podremos acceder al fichero secuencialmente o bien directacmente al registro que queramos por cualquiera de las claves.

Como el fichero IMPRESORA es secuencial no es necesario ninguna aclaracin, al darle el nombre PRINTER cojer la impresora que tengamos por defecto, si le damos cualquier otro nombre que no identificara a ninguna impresora, el resultado sera grabar todo lo que debera salir por la impresora en un archivo con ese nombre.

Nota final:

Creo que es una de las partes mas interesantes de la programacin cobol y que cuando he utilizado alguno de stos nuevos lenguajes orientados a objetos y que utilizan bases de datos, siempre he echado en falta. Para mi siempre es grato dirigirme a la Environment de cualquier programa y saber con exactitud todos los ficheros que se van a utilizar en ese programa.

Apreciar que para cada especificacin de fichero en la Select solo se pone el punto al final de todas las clausulas del prrafo.

Al asignar la impresora, si asignamos el nombre PRINTER, ste hace referencia a la impresora por defecto pero tambien podramos utilizar un nombre para especificar una impresora de red, por ejemplo, si en nuestra red existe una impresora que esta en PENTIUMHPLASER, podemos identificar un nombre en el Autoexec.bat para asignar ese valor a una variable de entorno como: IMPRE="PENTIUMHPLASER" y luego en el programa especificar como nombre de dispositivo de la impresora IMPRE, SELECT IMPRESORA ASSIGN TO PRINT IMPRE.

En realidad haciendo sto ltimo podemos asignar cualquier archivo que est en cualquier direccin de la red, ya que el nombre que damos es lgico y su asignacin la podemos definir con una variable de entorno donde queramos.

Data Division

pgina(s) : 1/4(5050 palabras totales en este texto)(7560 Lecturas)

Es la tercera division por orden de aparicin, y es donde se declaran absolutamente todos los nombres de campos, registros, variables, es decir donde nombramos cada dato que vayamos a utilizar en nuestro programa. Para almacenar todos estos nombres de datos, sta DIVISION se divide en varias secciones, cada una de ellas orientada a un tipo de datos diferente.

FILE SECTION. Aqui describiremos todos los campos que componen los registros de todos los archivos que vayamos a utilizar, que previamente habremos declarado en la INPUT-OUTPUT SECTION dentro de la ENVIRONMENT DIVISION.

WORKING-STORAGE SECTION. En ella declararemos todas las variables no referentes a archivos, pero que durante la ejecucin del programa vayamos a utilizar.

LINKAGE SECTION. Esta es la seccin donde se registrarn las variables que nos servirn para enlazar el programa principal con el que llamemos mediante la orden CALL.

COMMUNICATION SECTION. (No la he utilizado nunca).

SCREEN SECTION. En sta seccin podremos describir los atributos y campos a utilizar en las pantallas.

Al igual que en la anterior DIVISION ninguna de sus partes es obligatoria, pero si vamos a utilizar alguna variable, aunque solo sea una, tendremos que incluirla en la WORKING-STORAGE SECTION y esto nos obligar tambien a definir la DATA DIVISION. Pasemos a continuacin a explicar mas a fondo cada una de ellas.

FILE SECTION.En esta seccin describiremos los campos que van a componer el registro de cada uno de los archivos con los que vamos a trabajar, sta sera su sintaxis: FD Nombre del fichero.BLOCK CONTAINS Numero de registros por bloque RECORDSRECORD CONTAINS Nmero de caracteres por registro CHARACTERS LABEL RECORD Etiqueta de registro DATA RECORD Nombre del registro.Vamos a explicar un poco mas detalladamente cada clusula de la FILE SECTION. Quiero dejar claro que sta es mas amplia, pero que como en el resto del manual voy a explicar lo que creo que es mas importante y en definitiva lo que mas se utiliza.

Clusula FD nombre del fichero que previamente habiamos descrito en la clusula SELECT de la INPUT-OUTPUT SECTION en la ENVIRONMENT DIVISION.

Clusula BLOCK CONTAINS cuando queremos que por cada bloque en disco se graben mas de un registro, aqui especificamos el nmero de ellos que va a contener cada bloque, (512, 1024), si no se especifica se supone que cada registro va a ocupar un bloque de memoria, o bien ser el propio compilador el que haga el clculo mas apropiado.

Clusula RECORD CONTAINS el nmero de caracteres que tiene el registro sumando todos sus campos, puede ser fija o variable. Si es fija utilizamos un valor y si es variable un rango desde hasta, si no se espicifica ser el propio compilador quien la determine.

Clusula LABEL RECORD puede tener dos valores STANDARD u OMITTED , el primer caso indica que cada vez que se accede a un registro el compilador har las comprobaciones estandares descritas por el propio compilador y en el segundo stas sern omitidas. Para el caso de los ficheros de datos en disco se suele poner STANDARD y cuando el fichero es de impresora se indica OMITTED.

Clusula DATA RECORD debido a que un mismo fichero puede tener varias descripciones de registro, aqui indicamos los nombre de stas que debern estar descritas a nivel 01. Normalmente no se utiliza y casi siempre se suele utilizar una sola descripcin por fichero, por lo que no suele aparecer en casi ningn programa.

A continuacin vendra la descripcin de todos los campos que comprenden el registro, pero antes de ver sto es aconsejable tener claro como se define una variable con todas sus opciones ya que a fin de cuentas, los campos de un registro no son mas que eso, variables, con la nica condicin de que al formar parte de un registro la informacin que contiene nos identifica los datos que se guardarn en el medio en que est el fichero (disco, impresora).

Antes de seguir adelante quisiera decir que siendo el cobol un lenguaje orientado casi exclusivamente al manejo de ficheros de datos, es sin duda, sta parte que hemos visto la mas importante. Un buen anlisis de los ficheros a utilizar antes de empezar es fundamental y nos evitar muchos calentamientos de cabeza, tener claro cuales van a ser sus claves tanto la principal como las alternativas, definir bien todos sus campos y dejar espacio libre para un posible aumento de datos. Esto lo digo porque si creamos un fichero con 80 caracteres por registro y al cabo de un tiempo debemos de introducir un nuevo campo que no habiamos preveido, tendremos que modificar toda su estructura rehaciendo el fichero y recompilando todos los programas a los que afecte, si en cambio dejamos un poco de espacio nos evitaremos la reestructuracin del archivo, sto se consigue utilizando el nombre de variable FILLER como veremos un poco mas abajo.

WORKING-STORAGE SECTION.LINKAGE SECTION.COMMUNICATION SECTIONSCREEN SECTIONPara la WORKING y la LINKAGE las normas son las mismas, asi que las veremos conjuntamente. Las otras dos secciones, COMMUNICATION y SCREEN no las veremos en el manual.

Nmero de Nivel ...... Nombre de campo ...... PIC, VALUE, REDEFINES, OCCURS, JUST, SIGN, SYNC.

Cada campo declarado debe de llevar un nmero de nivel que le informe al compilador del tipo de campo que es:

El nivel 01, identifica la primera entrada de un registro o la primera entrada de un campo que se va a subdividir.El nivel 77, identifica a una variable que no se va a subdividir y que no forma parte de ningn registro.El nivel 88, identifica los posibles valores condicionales de una variable previamente definida.Los niveles 02 al 49 indicarn las distintas subdivisiones de un campo cuya primera entrada ha sido definida a nivel 01. Los niveles 01 y 77 debern de ir siempre en el Area A (Col 8) el resto es independiente.

A continuacin pondremos el nombre del campo, que no podr ser ninguna palabra cobol ni llevar ningn carcter extrao, principalmente se utilizarn letras y nmeros o guiones. Es posible que algn campo que definamos nunca vaya a ser usado por el programa pero si en cambio es necesario que exista para que nos reserve el espacio, le llamaremos FILLER.

Y finalmente podrn venir una serie de clusulas como:

PICTURE / PIC esta palabra es la que utilizamos para identificar el tipo de datos que va a contener la variable. Los posible valores son:

DE CAMPOS.9 - Para campos numricos.A - Para campos alfabticos.X - Para campos alfanumricos.S - Indica variable con signo.V - Indica punto decimal.

DE EDICIN.$ - Representa la aparicin del signo $ delante del campo numrico.. - Indica separacin de miles., - Indica punto decimal. (estas dos pueden variar segn hayamos especificado en SPECIAL-NAMES DECIMAL-POINT IS COMMA).Z - Representa un espacio para el 0 a la izquierda en campos numricos.* - Igual pero se cambia el 0 por *.B - Indica un espacio en blanco.- + - Indican la aparicin del signo correspondiente.

Puede haber mas pero los mas utilizados son los que se han comentado.

Para indicar la longitud del campo se puede repetir el smbolo tantas veces como longitud tenga o expresarla entre parntesis, es decir para definir una variable alfanumrica de 10 caracteres se pondra:PIC X(10) o PIC XXXXXXXXXX. Los valores S y V solo pueden aparecer una vez por cada variable.

A continuacion vamos a ver un ejemplo de todo lo que hemos explicado para que se vaya quedando claro.

WORKING-STORAGE SECTION.01 DOMICILIO.02 TIPO PIC XX.02 NOMBRE PIC X(20).02 NUMERO PIC 9(4).

Fijaros que hemos definido 4 variables, la primera no tiene PIC, por que indica que est subdividida en las 3 restantes. La segunda "TIPO" nos dice que es una variable alfanmerica y que puede contener 2 caracteres como mximo, la utilizariamos para guardar el tipo de calle, avenida, paseo, plaza, etc.. Para la tercera "NOMBRE" va a ser tambin alfanumrica pero con una longitud mxima de 20 caracteres y nos servir para guardar el nombre de la calle, plaza, avenida, etc y la ltima "NUMERO" indica una variable numrica de 4 dgitos, que quiere decir que puede contener valores entre 0 y 9999.

Observad que en Cobol no se guardan las varables numricas por bytes como ocurre con todos los lenguajes actuales sino por nmero de dgitos, con ello quizs desaprovechamos mas la memoria pero en cambio tenemos un control mejor del dato que puede contener nuestra variable.

Si TIPO fuera "AV", NOMBRE "DE LOS DESAMPARADOS " y NUMERO "15", si nos refiriramos a la variable DOMICILIO sta tendra el siguiente valor:"AVDE LOS DESAMPARADOS 0015".

Vamos a ver algunos ejemplos mas de variables posibles:

WORKING-STORAGE SECTION.77 FECHA PIC 9(8).77 FECHA-EDIT PIC ZZ/ZZ/ZZZZ.77 IMPORTE PIC S9(8)V99.77 IMPORTE-EDIT PIC ZZ.ZZZ.ZZZ,ZZ-.01 ESTADO PIC 9.88 SOLTERO VALUE 1.88 CASADO VALUE 2.88 DIVORCIADO VALUE 3.

Suponiendo que el valor de FECHA es 01111998 (1 Nov de 1998) y FECHA-EDIT es el mismo, ste ltimo se representara: 01/11/1998.Si IMPORTE es 12815V37 en negativo e IMPORTE-EDIT el mismo, ste se representara: 12.815,37-.

VALUE esta palabra a continuacin del PIC indica el valor inicial que contendr la variable hasta que ste sea modificado. Por ejemplo podemos definir una variable:

WORKING-STORAGE SECTION.01 RAYA PIC X(10) VALUE "----------".01 MINOMBRE PIC X(30) VALUE "ANDRES MONTES".

Asi tendremos una variable llamada RAYA que contiene 10 guiones y otra llamada MINOMBRE que contiene eso, mi nombre, si os fijais con sta clusula convertimos cualquier variable en una constante. En cualquier momento del programa podremos cambiar ese valor. Para las variables numricas es conveniente ponerlas siempre con VALUE 0 para que al empezar cada programa estemos seguros de que no nos arrastra ningn valor. Normalmente al ejecutar un programa se ponen todas las variables a 0, pero si ese programa ha sido llamado desde otro no pasar eso, por eso no viene mal inicializarlas todas a 0.

REDEFINES esta clusula se utiliza para dar mas de un nombre y formato a un mismo campo. Este debe de ir a continuacin del nombre de campo y antes del nombre del campo a que hace referencia, deben de estar en el mismo nivel y uno a continuacin del otro en el orden de declaraciones.

WORKING-STORAGE SECTION.01 DIAS PIC X(21) VALUE "LUNMARMIEJUEVIESABDOM".01 TADIA REDEFINES DIAS.02 DIA PIC XXX OCCURS 7 TIMES.

He incluido la clusula OCCURS para que sea vea un ejemplo prctico, aunque todava no lo he explicado, pero como veis a partir de ste momento DIAS y TADIA tendrn siempre el mismo valor pero con diferente nombre y formato de datos.

OCCURS esta clusula es la que se utiliza para declarar tablas. Una tabla es un conjunto de elementos con un mismo tipo y longitud que se denominan con el mismo nombre y se diferencian por un subndice. No se puede especificar en niveles 01, 77 88. Puede tener varios formatos:

WORKING-STORAGE SECTION.01 NUMERO-DIAS PIC 99.01 TABLA.02 DIA PIC XXX OCCURS 7 TIMES.02 MES PIC 99 OCCURS 28 TO 31 DEPENDING NUMERO-DIAS.02 OTRA PIC X(5) OCCURS 5 INDEXED BY IN-OTRA.

En la primera "DIA" indico que esa tabla va a tener 7 elementos que llamaremos DIA (nn) y entre parntesis el orden dentro de la tabla. Si hubiramos guardado en sta tabla las 3 primeras letras de cada dia de la semana, para obtener el valor del lunes pediriamos DIA (1), para el del Jueves DIA (4) y para el del domingo DIA (7).

En la segunda "MES" le indicamos que los elementos de la tabla pueden variar dependiendo del valor de la variable "NUMERO-DIAS" que ha de estar definida antes de la tabla y siempre dentro de los mrgenes de 28 y 31.

En la tercera le indicamos adems que la variable IN-OTRA va a ser la encargada de dirigirnos por los elementos de la tabla, sta variable no puede estar definida antes.

JUST la justificacin de los valores de los campos suele ser a la izda. para los alfanumricos y a la derecha para los numricos, si en cambio queremos cambiar este orden tendremos que incluir sta clusula.

WORKING-STORAGE SECTION.01 NOMBRE PIC X(10).01 NOMBRE1 PIC X(10) JUST RIGHT.

Si le diramos el mismo valor a las dos variables "ANDRES", la primera nos dara "ANDRES" y la segunda "ANDRES", la diferencia, su justificacin.

USAGE con sta clusula determinamos el formato en que se guarda el contenido de las variables (numricas, ya que las alfanumricas siempre ocuparn un byte por cada caracter). Con todos los campos se puede operar (obviamente) pero solo los que se definan como DISPLAY sern editables directamente. Tiene varias posibilidades:

DISPLAY, es la forma por defecto e indica que cada dgito ocupar un byte, es la que se toma por defecto y la que memoria ocupa.

BINARY, COMP-1, COMP-3, COMP-6, son diferentes formas de compactacin de los datos. COMP-6 (la mas usual) guarda dos dgitos en cada byte, COMP-3 es igual pero admite signo el cual ira en los cuatro ltimos bites del ltimo byte. Las restantes formas se utilizan menos.

WORKING-STORAGE SECTION.01 IMPORTE PIC 9(8). Ocupa 8 bytes uno por cada dgito.01 FECHA PIC 9(8) COMP-6. Ocupa 4 bytes, uno cada 2 dgitos.01 PRECIO PIC S9(8)V99 COMP-3. Ocupa 6 bytes, uno para los dos decimales, cuatro para la parte entera y uno para el signo.

Cuando el tamao es impar el signo no ocupa ya que comparte byte con el ltimo dgito, el punto decimal tampoco ocupa espacio, ya que solo indica su posicin. Estas tres formas que he utilizado son las mas comunes, yo por ejemplo como las capacidades de los ordenadores son tan grandes ahora, cuando defino las variables en la WORKING nunca utilizo ninguna compactacin es decir no utilizo la clusula USAGE (que por cierto y como habreis visto se puede omitir) y por defecto toma DISPLAY (un byte por caracter).

LINKAGE SECTION. En sta seccin se declaran las variables de igual forma solo que las que aqui declaremos nos van a servir de enlace para pasar informacin a otro programa que ser llamado por el principal.

Ejemplo:DATA DIVISION.FILE SECTION.

FDCLIENTES BLOCK CONTAINS 4 RECORDSRECORD CONTAINS 128 CHARACTERSLABEL RECORD STANDARD.01 REG-CLIENTE.02 KEY-CLIENTE.r03 CLICOD rPIC 9(4) COMP-6. 02CLINOMPIC X(30). 02CLIDIR PIC X(30).02CLIPOBPIC X(20). 02CLIPRO PIC X(20). 02CLINIF PIC X(9). 02FILLER PIC X(17).

FD IMPRESORA LABEL RECORD OMITTED.01 LINEA PIC X(132).WORKING-STORAGE SECTION.01 TABLA. 02 FILLER PIC X(12) VALUE "LUNMARMIEJUE" . 02 FILLER PIC X(9) VALUE "VIESABDOM" .01 TABLAIDA REDEFINES TABLA. 02 ELEDIA PIC XXX OCCURS 7 TIMES.01 FECHA PIC 9(8).01 IMPORTE PIC S9(8)V99.01 VALORES. 02 UNO PIC 99 VALUE 0. 02 DOS PIC 9(6) 02 TRES PIC 9(4)V99.01 LINPA. 02 LIMPOR PIC ZZ.ZZZ.ZZZ,ZZ-.

Como veis he diseado el fichero CLIENTES para que cada bloque de 512 Kb, ocupe 4 registros, dejando 17 caracteres (FILLER), para una posible ampliacin del registro.

En la descripcin del archivo IMPRESORA se declara una variable a nivel 01 que hace referencia al total del registro para luego ir moviendo a ste campo el valor de lo que queramos imprimir.

En la WORKING se han declarado algunos campos con distintos formatos, fijaros en la tabla que gracias al REDEFINES hemos llenado con las tres primeras iniciales de cada dia, asi al referirnos a la variable ELDIA (2) su contenido ser "MAR".

Nota final:La DATA DIVISION nos sirve para tener todas nuestras variables bien definidas, ya sean independientes o que formen parte de algn fichero para poder operar con ellas en la PROCEDURE DIVISION. Me acuerdo de cuando empezamos a estudiar que para otros lenguajes no era necesaria la declaracin de variables previamente y en cambio ahora en la mayora de los lenguajes se exige que se declaren, eso significa que el Cobol no iba mal encaminado.

Tenemos que tener siempre muy claro que con cualquier campo podemos hacer lo que queramos, por ejemplo si en un registro de 120 caracteres nosotros en un programa solo vamos a utilizar los 40 primeros podemos definir todo lo restante como un campo FILLER y listo o viceversa si un campo de un registro lo tenemos definido como alfanumrico de 30 en un programa necesitamos los 10 primeros caracteres por un lado y los veinte restantes por otro, puese nada se subdivide para ese programa y no pasa nada.

Espero que haya quedado por lo menos medio clara la explicacin de sta tercera DIVISION, evidentemente con la prctica es con lo que mas vamos a aprender siempre claro est que tengamos al menos unas nociones mnimas.

Tenemos que tener en cuenta que como en todos los lenguajes, ya sean de programacin o de habla (espaol, ingls, frances) son muchas las opciones que nos ofrecen pero al final siempre utilizamos las que mas nos gustan o las que consideramos mas tiles.

Una cosa que considero importante es dar a las variables un nombre un poco lgico que nos recuerde su contenido, por ejemplo si queremos guardar la fecha, pues llamarla FECHA, si queremos guardar el N.I.F. del gerente, NIFGEREN, etc ...

Procedure Division

(2025 palabras totales en este texto)(6084 Lecturas)

Bien, hemos llegado a la ltima divisin que existe un los programas Cobol, en ella encontramos todos los procesos necesarios para que el programa funcione, que haga para la que fue concebido.Todo sto se realiza con instrucciones (ordenes, verbos, comandos, etc..), que se explican en otros captulos del manual. Cada uno de ellos con un formato y una solucin que resolver.

A continuacin vamos a explicar su formato y algunas consideraciones generales aparte de las propias instrucciones:

PROCEDURE DIVISION (USING Variable, Variable ...).DECLARATIVES.Nombre-seccionSECTION.USE AFTER ERROR PROCEDURE ON tipo.Nombre-parrafo.Sentencias......END DECLARATIVES.Nombre-seccion SECTION.Nombre-parrafo.Sentencias......

Este sera a groso modo el formato general de una Procedure, pero incluso se puede omitir si en un programa no vamos a realizar ningn proceso (es obvio que siempre lo realizaremos, pero se podra omitir). Vamos a explicar un poco su formato:

PROCEDURE DIVISION (USING Variable, Variable ...).Cuando especificamos USING en la linea de PROCEDURE DIVISION , despus deberemos de dar los nombres de variables que hayamos definido en la LINKAGE SECTION, para compartir en el programa, lo que nos indicar que ste ha sido llamado por otro programa y que esas variables traern un valor procedente del programa llamador, que a su vez utiliz la instruccin CALL con las mismas variables.

DECLARATIVES, es una seccin dentro de la PROCEDURE que nos va a servir para controlar los posibles errores en cuanto al manejo de ficheros se refiere. La linea de DECLARATIVES, (si se va a utilizar) deber de ir siempre a continuacin de la linea de PROCEDURE DIVISION . Despues de subdivira en tantas secciones como opciones de error tengamos, stas pueden ser definidas por archivo o bien forma de apertura, es decir podremos controlar los errores que nos lleguen de un fichero en concreto o de todos aquellos que hayan sido abiertos de de igual forma, sto se especifica en la linea USER AFTER ERROR PROCEDURE ON tipo, pudiendo ser tipo, el nombre del archivo o su modo de apertura (INPUT, OUTPUT, I-O , EXTEND. A continuacin iran los prrafos con sus respectivas instrucciones a realizar en caso de error.Se pondran tantos prrafos y secciones como quisieramos controlar, siempre teniendo en cuenta que sta se acaba cuando se indique END DECLARATIVES.Si no quisieramos utilizar sta seccin, podriamos de igual manera controlar los errores en nuestro programa preguntando siempre por la variable de error de cada fichero que se defini como FILE STATUS en la FILE-CONTROL.

Nombre-seccion SECTION, a partir de aqui incluiremos todas las instucciones necesarias para la correcta ejecucin del programa.

Ya sabemos que Cobol es un lenguaje estructurado, pues bien no pensemos que la Procedure va a ser un caos de instrucciones escritas secuencialmente, no, en ella podremos definir tantas Secciones (SECTION) y Prrafos como queramos para organizar mejor las instrucciones y para delimitar acciones concretas, eso si siempre se ejecutarn secuencialmente, excepto cuando encuentre algn verbo de bifurcacin como GO, PERFORM que haciendo referencia a esos nombres de prrafo harn que se rompa la secuencia lgica de ejecucin.

En las comparaciones que hagamos podremos utilizar los siguientes formatos:

MAYOR QUE

[(NOT) GREATER]

[(NOT) >]

MENOR QUE

[(NOT) LESS]

[(NOT) 400000MOVE ' ' TO OPEND-PERFORMEND-PERFORMEND-PERFORMDISPLAY 'FINALIZADO' LINE 22ACCEPT OPSTOP RUN.PIDENOMBRE.DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20ACCEPT NOMBRE LINE 20 COL 30 PROMPT.PIDEAPELLIDO.DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21ACCEPT APELLIDO LINE 21 COL 30 PROMPTDISPLAY SPACES LINE 20 SIZE 70DISPLAY SPACES LINE 21 SIZE 70....

Nota: En el ejemplo como vis, despus de aceptar el nombre y el apellido construimos una frase y la guardamos en la variablen SALUDO utilizando el comando STRING. A continuacin y para mantener los mismos ejemplos de toda la seccin hacemos que aparezca en pantalla el SALUDO 5 veces, (dependiendo del valor de LI, que como dijimos antes sera para 10, 11, 12, 13 y 14).

Pero ahora hemos intercalado dos PERFORM dentro de ste, el primero para que nos muestre el mensaje letra a letra y el segundo para hacer de retardo y as conseguir un efecto como si escribiramos el SALUDO con una mquina de escribir.

Como pdeis observar el nico punto de toda la secuencia se haya en el STOP RUN. El hecho de mantener los mrgenes izquierdos, es para dar mas claridad a la programacin y conseguir que sta sea lo mas estructurada posible.

AUN HAY MAS

Pues s, podemos desarrollar an mas la instruccin incluyendo dos nuevos elementos.

EJECUTANDO ANTES O DESPUES

En primer lugar, por defecto el contenido del PERFORM se ejecuta despus de hacer la comprobacin de la condicin que precede a UNTIL , pero podemos hacer que sta se realice antes.

PERFORM WITH TEST [AFTER - BEFORE ] VARYING variable FROM nmero, variableBY nmero, valorUNTIL condicinsentenciasEND-PERFORMCon la opcin TEST BEFORE, que es la opcin por defecto se comprueba primero la condicin y si se cumple se ejcuta el resto, con lo cual es posible que las sentencias no se ejecuten ninguna vez, si al comenzar ya est rota la condicin.

Con la opcin TEST AFTER, se ejecutan las sentencias antes de comprobar la condicin, con lo cual las sentencias se van a ejecutar al menos en una ocasin, incluso aunque entremos en el PERFORM con la condicin rota.

AUMENTANDO LAS CONDICIONES

Efectivamente adems de la primera condicin podemos incrementar el nmero de condiciones para que se cumplan los requisitos y as ejecutar las sentencias. Esto lo conseguimos incluyendo mas clusulas precedidas de AFTER.

PERFORM WITH TEST [AFTER - BEFORE ] VARYING variableFROM nmero, variable BY nmero, valor UNTIL condicinAFTER variable FROM nmero, variable BY nmero, valor UNTIL condicinsentenciasAFTER ......END-PERFORMAl aplicar este formato cuando se cumpla la primera condicin pasar el control al AFTER y comprobar de nuevo la condicin que precede al siguiente UNTIL segn los valores especificados en la lnea que contiene AFTER. Adems podemos ir incrementando el nmero de condiciones a nuestro antojo, consiguiendo de ste modo hacer unos anidamientos y un desarrollo mas completo de la sentencia, obteniendo por consiguiente unos niveles de perfeccionamiento muy altos.

RESUMIENDO

Una mayor utilizacin de PERFORM sin duda traer un uso menor de la declaracin GO y con ello conseguimos una programacin estructurada. Las ventajas de la programacin estructurada las quiero explicar en un apartado dentro de sta misma seccin de Manuales, una vez explique las sentenicas GO e IF, que sern la siguiente aportacin al manual.

En esa nueva seccin se ver un caso mas prctico y real de utilizacin de PERFORM con uso de lecturas de ficheros y dems experiencias cotidianas en el mundo de la programacin en el mbito de la gestin.

Cdigos de Error

(1871 palabras totales en este texto)(2751 Lecturas)

Son muchos los errores que se pueden producir en tiempo de ejecucin cuando trabajamos con archivos, a continuacin dar una explicacin de los mas comunes. Todos stos errores los podemos obtener si definimos FILE STATUS en la FILE-CONTROL, y actuar consecuentemente, por ejemplo yo siempre cuando abro los ficheros al principio de cada programa compruebo que el error sea 00, es decir que todo est bien para continuar, sino automaticamente saco una ventanita con el error que se ha producido y el nombre del fichero para que mis usuarios me lo comuniquen y poder solucionarlo, pero no dejo que se siga ejecutando el programa, con lo que se evitarn problemas posteriores que podran resultar peores. De todas formas una vez que est el programa verificado y comprobado, y que todos los archivos se corresponden con su descripcin en la FD, los errores que nos puede dar son los relativos a claves duplicadas o inexistentes, o a errores del sistema.

Los errores se representan como 2 digitos para el error que pueden ir seguidos de una coma y otros 2 dgitos para indicar la naturaleza del error.

ERROREXPLICACION

00Operacin satisfactoria, todo bien.

10Cuando se ha llegado al final del fichero y se quiere seguir leyendo.

22Se intenta copiar un registro con una clave ya existente.

23Cuando se hace un acceso directo a un registro inexistente.

24No hay espacio en disco para realizar la operacin.

30Es un error grave de entrada/salida, suele ser ajeno a Cobol y mas concreto en cuanto a configuracin del sistema operativo sobre el que se est ejecutando, para solucionarlo deberemos prestar atencin a los dos dgitos seguientes al error.

34Igual que el 24 por falta de espacio en disco.

35El archivo al que hace referencia no existe.

39La organizacin del fichero que se quiere abrir no coincide con su organizacin real interna. Suele pasar cuando se modifica una FD y el fichero continua siendo el mismo.

41Cuando intentamos abrir un archivo que ya est abierto.

42Si intentamos cerrar un archivo que no esta abierto.

43Cuando se quiere borrar o reescribir un registro en un fichero abierto con acceso secuencial.

47Se quiere realizar alguna operacin que no corresponde con el modo de acceder al fichero. Si queremos hacer un READ o un START en un archivo que no ha sido abierto como INPUT o como I-O.

48Igual que el anterior, pero para el caso de querer escribir en un fichero que no esta abierto o no est abierto como I-O, OUTPUT o EXTEND.

49Cuando queremos borrar o reescribir en un fichero que no ha sido abierto como I-O o el fichero no est abierto.

90Cuando COBOL recibe un mensaje irreconocible, suele estar ocasionado por incompatibilidad entre los accesos a los ficheros, su forma de apertura y su modo de acceso.

91Igual que el 42.

92Cuando intentamos leer, escribir, borrar, reescribir sobre un archivo no abierto.

93El archivo est en conflicto con otro usuario.

94Igual que el 39, tiene muchisimas vertientes dependiendo de los dos digitos siguientes que acompaan al error.

98Echate a temblar (perdonad por la expresin), grave error interno en la estructura del fichero, generalmente se suelen provocar cuando hay un corte electrico o una salida brusca del programa y algn fichero indexado se ha quedado abierto, lo que suele ocurrir es problema de correspondencia entre claves y datos, se recomienda hacerle un recovery (RM/COBOL) o el que corresponda a cada compilador para rehacer las claves. Si despus de todo sigue dando errores .......?En algunos casos, es posible que ste error se deba a un problema fsico del disco, en ese caso tambin ser conveniente copiarlo en otro sitio "fsico".

99Al borrar, leer o reescribir un registro que est siendo bloqueado por otro usuario.

A pesar de todos stos errores con algunos de ellos podriamos seguir trabajando, pero siempre es mejor corregirlos antes de que pasen a mayores.

Para evitar bloqueos en los registros cuando trabajamos con varios usuarios accediendo a los mismos registros, es convenientoe tener en cuenta los modos de apertura de los ficheros, ya que abrindolos en INPUT nunca habr problema de bloqueo.

Ventanas

pgina(s) : 1/2(2437 palabras totales en este texto)(2385 Lecturas)

Que son y para que sirven las "ventanas" en cobol ?.Este nombre del que estamos tan acostumbrados a oir y que parece que es propiedad de Microsoft, tiene otras y muy diversas utilidades. Una ventana es en realidad una porcin virtual de la pantalla, la cual podremos definir con unas caractersticas propias de tamao, color, etc ...

Hasta que stas aparecieron, cada vez que queriamos sobreponer una informacin a la que tenamos en pantalla, la construiamos encima y despus, debiamos de volver a pintar la que estuviera debajo. Con el uso de las ventanas sto ya no es necesario. Os pondr un ejemplo:

Supongamos que tenemos un mantenimiento de clientes, el cual nos ocupa toda la pantalla, y vamos a introducir la provincia. Si en ste momento quisieramos mostrarle una tabla con todas las opciones posibles, era necesario dibujarla encima y una vez seleccionada la provincia adecuada, volver a pintar la pantalla de mantenimiento que habamos dejado debajo. Pues bien con el uso de las ventanas, sto ya no es necesario, porque lo que hacemos es crear una ventana (una pantalla virtual) de las dimensiones que queramos, trabajamos todo lo que queramos con ella y cuando no nos haga falta, la cerramos y lo que haba debajo en la pantalla "principal" quedar como estaba. Espero que me hayais entendido, para poder seguir explicando su utilizacin.

Yo conozco el uso en Acucobol y RM/Cobol, por lo que la explicacin ir orientada a stos dos compiladores, si alguien conoce la de otros, le animo a que me facilite la explicacin.

Debemos de tener en cuenta que aunque la sintaxis sea diferente en cada uno de los compiladores, la funcionalidad, el uso y la idea, son las mismas. Antes de pasar a la explicacin tendremos que tener en cuenta:

Podremos tener tantas ventanas abiertas como queramos.

El control siempre estar sobre la ventana activa, no podremos trabajar desde una ventana en otra.

La linea 1 y la columna 1 correspondern a la esquina superior izquierda de la ventana y no a la de la pantalla.

Las caractersticas de la ventana se darn en el momento de su creacin y sern, ttulo, posicin del ttulo, borde, color, tamao, etc ....

VENTANAS EN RM/COBOL.

En RM/Cobol, todas las caractersticas se dan mediante unas variables definidas en la WORKING, stas son las siguientes. Por supuesto le puedes poner el nombre que quieras a las variables, ya que lo que al final vamos a conseguir es darle una variable con longitud 80 y una sentencia para que la ventana se dibuje.

01 WCB. 03 WINCAB PIC 999 BINARY VALUE 0. 03 WINLIN PIC 999 BINARY. 03 WINCOL PIC 999 BINARY. 03 WINLOC PIC X VALUE "S".* (S-W) 03 WINBORST PIC X VALUE "Y". * (Y-N) 03 WINBORTI PIC 9 VALUE 2. 03 WINBORCH PIC X. 03 WINLLE PIC X. * (Y-N) 03 WINLLECH PIC X. 03 WINTITSI PIC X VALUE "T".* (T-B) 03 WINTITPO PIC X VALUE "C".* (C-L-R) 03 WINTITLO PIC 999 BINARY. 03 WINTIT PIC X(64).

Explicacin de las variables: (de las importantes).

WCB: Aqu se guardar toda la informacin para luego dibujar la ventana, podeis ponerle el nombre que querais, tanto a sta como al resto.WINLIN: Nmero de lineas que va a tener la ventana.WINCOL: Nmero de columnas que va a tener la ventana.WINBORST: (Y)ES (N)O, si va a tener o no, borde.WINBORTI: Tipo de borde, hay cuatro tipos distintos.WINTITSI: (T)OP (B)UTTON, posicin del ttulo, arriba o abajo.WINTITPO: (C)ENTER (L)EFT (R)IGHT, justificacin del ttulo.WINTITLO: Longitud en caracteres del ttulo.WINTIT: Ttulo de la ventana.

La sentencia que utilizamos para crearla es DISPLAY, pero con unos matices distintos como vamos a ver a continuacin.

Primero moveramos los valores adecuados a las variables y luego la sentencia, veamos como quedara:

MOVE 10 TO WINLIN. MOVE 40 TO WINCOL. MOVE " PROBANDO VENTANAS " TO WINTIT. MOVE 19 TO WINTITLO. DISPLAY WCB LINE 3 COL 3 LOW ERASE CONTROL "WINDOW-CREATE".

* asi creariamos la ventana, los otros valores de las variables se* pueden asignar con values, porque normalmente no cambian.* A partir de ste momento, todo lo que hagamos, se har sobre* sta ventana. Para cerrarla utilizariamos sta sentencia.

DISPLAY WCB CONTROL "WINDOW-REMOVE".

Si quisieramos abrir mas ventanas, en vez de displayar directamente la variable WCB, sta la guardariamos en una tabla por ejemplo:

WORKING-STORAGE SECTION. 01 VENTANAS. 02 WIN PIC X(80) OCCURS 10 TIMES. ... ... PROCEDURE DIVISION. ... ... MOVE 10 TO WINLIN. MOVE 40 TO WINCOL. MOVE " PROBANDO VENTANAS " TO WINTIT. MOVE 19 TO WINTITLO. MOVE WCB TO WIN (1). DISPLAY WIN (1) LINE 3 COL 3 LOW ERASE CONTROL "WINDOW-CREATE". MOVE 1 TO WINLIN. MOVE 30 TO WINCOL. MOVE SPACES TO WINTIT MOVE 0 TO WINTITLO. MOVE WCB TO WIN (2). DISPLAY WIN (2) LINE 5 COL 10 LOW ERASE CONTROL "WINDOW-CREATE".

* Cuando usamos mas de una ventana, deberemos de ir* cerrndolas segn la ltima que se abri.

DISPLAY WIN (2) CONTROL "WINDOW-REMOVE". DISPLAY WIN (1) CONTROL "WINDOW-REMOVE".

VENTANAS EN ACUCOBOL.

Para dibujar una ventana en Acucobol, todo se realizar desde la Procedure y solo ser necesario incluir en la WORKING una variable de PIC X(10), que nos servir principalmente para tener varias ventanas abiertas y saber sobre cual actuamos. Esto se consigue con una implementacin de la sentencia DISPLAY, que vamos a explicar a continuacin.

WORKING-STORAGE SECTION. 01 VENTANAS. 02 WIN PIC X(10) OCCURS 10 TIMES. ... ... PROCEDURE DIVISION. ... ... DISPLAY WINDOW LINE 3 COL 3 LOW ERASE SIZE 40 LINES 10 BOXED SHADOW TOP CENTERED TITLE " PROBANDO " POP-UP AREA WIN (1).

* Para cerrarla, utilizaremos la siguiente instruccin.

CLOSE WINDOW WIN (1).

Aqui, la gran diferencia, es que al no utilizar variables, los valores se le dan en la propia sentencia, y la explicacin de cada uno sera:SIZE: Nmero de columnas de la ventana.LINES: Nmero de lneas de la ventana.BOXED: Indicamos que lleva borde.SHADOW: Indicamos que lleva efecto de sombra.TOP: Posicin del ttulo. (TOP-BOTTOM)CENTERED: Justificacin del ttulo. (CENTERED, LEFT, RIGHT).POP-UP AREA: donde se guarda la ventana.

La sentencia DISPLAY WINDOW, en Acucobol, es mucho mas extensa, incluyendo sobre todo una muy buena aplicacin de los colores, tanto para el fondo como para el primer plano.

RESUMIENDO

Ya veis, que aunque cambie un poco la sintaxis, el fin es exactamente el mismo, disponer de una parte de la pantalla con autonoma propia.

Solo espero que despus de stas explicaciones seais capaces de aprovechar todas las ventajas que nos puede proporcionar el trabajar con ventanas. Yo siempre las he utilizado, eso si, tampoco deberemos de hacer de un programa cobol, una serie de ventanas, hay que utilizarlas cuando realmente las necesitemos. Recordad que:

El control solo ser sobre la ventana activa.Una vez abierta una ventana, sta tendr el control, hasta que se cierre.Por supuesto, todas la variables que utilicemos sern portables entre ventanas, ya que en realidad estaremos en el mismo programa.

Palabras Reservadas

(14660 palabras totales en este texto)(2329 Lecturas)

Las palabras reservadas del Cobol, son aquellas que el propio compilador utiliza y por lo tanto no podemos utilizar como variables en nuestros programas. Estas han ido avanzando con el paso de los tiempos y cada compilador incluso, incluyendo nuevas. Aqu voy a poner una lista de la cantidad mayor que pueda.SELECCIONA LA LETRA, PARA IR DIRECTAMENTE O AVANZA POR LA PAGINA

ABCDEFGHIJKLMNOPQRSTUVWZOtras

A

ACCEPTACCESSADD

ADDRESSADVANCINGAFTER

ALLALPHABETALPHABETIC

ALPHABETIC-LOWERALPHABETIC-UPPERAPHANUMERIC

ALPHANUMERIC-EDITEDALSOALTER

ALTERNATEANDANY

APPLYAREAREA

AREASASCENDINGASSIGN

ATAUTHORAUTO

AUTO-SKIPAUTOMATICAUTOTERMINATE

B

BACKGROUNDBACKGROUND-COLORBACKGROUND-HIGH

BACKGROUND-LOWBACKWARDBEEP

BEFOREBELLBIND

BINARYBLANKBLINK

BLINKINGBLOCKBOLD

BOTTOMBY

C

CALLCANCELCD

CFCHCHARACTER

CHARACTERSCLASSCLOSE

COBOLCODECODE-SET

COLCOLLATINGCOLUMN

COMMACOMMUNICATIONCOMP

COMP-1COMP-2COMP-3

COMP-4COMP-6COMPUTATIONAL

COMPUTATIONAL-1COMPUTATIONAL-2COMPUTATIONAL-3

COMPUTATIONAL-4COMPUTECONFIGURATION

CONSOLECONTAINS CONTENT

CONTINUECONTROLCONTROLS

CONVERSIONCONVERTCONVERTING

COPYCORRCORRESPONDING

COUNTCRTCURRENCY

CURSOR

D

DATADATEDATE-COMPILED

DATE-WRITTENDAYDAY-OF-WEEK

DEDEBUGDEBUGGING

DECIMAL-POINTDECLARATIVESDEFAULT

DELETEDELIMITEDDELIMITER

DEPENDINGDESCENDINGDESTINATION

DETAILDISABLEDISPLAY

DIVIDEDIVISIONDRAWN

DUPLICATESDYNAMIC

E

ECHOEGIELSE

EMIEMPTY-CHECKENABLED

ENDEND-ACCEPTEND-ADD

END-CALLEND-COMPUTEEND-DELETE

END-DIVIDEEND-EVALUATEQEND-IF

END-MULTIPLYEND-OF-PAGEEND-PERFORM

END-READEND-RECEIVEEND-RETURN

END-REWRITEEND-SEARCHEND-START

END-STRINGEND-SUBTRACTEND-UNSTRING

END-WRITEENTERENVIRONMENT

EOLEOPEOS

EQUALERASEERROR

ESCAPEESIEVALUATE

EVERYEXCEPTIONEXCLUSIVE

EXITEXTENDEXTERNAL

F

FALSEFDFILE

FILE-CONTROLFILE-IDFILE-PREFIX

FILLERFINALFIRST

FOOTINGFORFOREGROUND-COLOR

FOREGROUND-COLOURFROMFULL

G

GENERATEGIVINGGLOBAL

GOGOBACKGREATER

GRIDGROUP

H

HEADINGHIGHHIGH-BALUE

HIGH-VALUESHIGHLIGHT

I

I-OI-O CONTROLIDENTIFICATION

IFININDEX

INDEXEDINDICATEINITIAL

INITIALIZEINPUTINPUT-OUTPUT

INSPECTINSTALLATIONINTO

INVALIDIS

J

JUSTJUSTIFIED

K

KEY

L

LABELLASTLEADING

LEFTLEFTLINELENGTH

LENGTH-CHECKLESSLIMIT

LIMITSLINAGELINGAKE-COUNTER

LINESLINKAGELOCK

LOCK-HOLDINGLOWLOW-VALUE

LOW-VALUESLOWLIGHT

M

MEMORYMERGEMODE

MODULESMOVEMULTIPLE

MULTIPLY

N

NATIVENEGATIVENEXT

NONO-ECHONOT

NUMBERNUMERICNUMERIC-EDITED

O

OBJECT-COMPUTEROCCURSOF

OFFOMITTEDON

OPENOPTIONALOR

ORDERORGANIZATIONOTHER

OTHERSOUTPUTOVERFLOW

OVERLINE

P

PACKED-DECIMALPADDINGPGE

PAGE-COUNTERPERFORMPIC

PICTUREPLUSPOINTER

POSPOSITIONPOSITIVE

PREVIOUSPRINT-CONTROLPRINTING

PROCEDUREPROCEDURESPROCEED

PROGRAMPROGRAM-IDPROMPT

PROTECTEDPURGE

Q

QUEUEQUOTEQUOTES

R

RANDOMRDREAD

READERSRECEIVERECORD

RECORDINGRECORDSREDEFINES

REELREFERENCEREFERENCES

RELATIVERELEASEREMAINDER

REMOVALRENAMESREPLACE

REPLACINGREQUIREDREPORT

REPORTINGREPORTSRERUN

RESERVERETURNRETUNRNIN

RETURN-CODERETURN-UNSIGNEDREVERSE

REVERSE-VIDEOREVERSEDREWIND

REWRITERFRH

RIGHTROLLBACKRUN

S

SAMESCREENSD

SEARCHSECTIONSECURE

SECURITYSEGMENTSEGMENT-LIMIT

SELECTSENDSENTENCE

SEPARATESEQUENCESEQUENTIAL

SETSIGNSIZE

SORTSORT-MERGESOURCE

SOURCE-COMPUTERSPACESPACES

SPECIAL-NAMESSTANDARDSTART

STATUSSTOPSTRING

SUBTRACTSUPPRESSSYMBOLIC

SYNCSYCHRONIZED

T

TABTALLYNGTAPE

TERMINALTERMINATETEST

TEXTTHANTHEN

THROUGHTHRUTIME

TIMESTOTOP

TRAILINGTRUE

U

UNDERLINEUNDERLINEDUNIT

UNLOCKUNSTRINGUNTIL

UPUPDATEUPDATES

UPONUSAGEUSE

USING

V

VALUEVALUESVARYING

W

WHENWITHWORDS

WORKING-STORAGEWRITEWRITERS

Z

ZEROZEROSZEROES

Adems de todas stas palabras, cada compilador ha ido incorporando nuevas a su lista, debido principalmente a la incorporacin de aspectos destinados a la programacin grfica. Entre ellos podemos citar algunos de los nuevos incorporados por Acucobol:

ATTRIBUTEAUTO-MINIMIZEAUTO-RESIZE

BOXBOXEDCCOL

CELLCELLSCENTERED

COLOR COLOURCSIZE

CYCLEDESTROYDOUBLE

DOWNENCRYPTIONEND-DISPLAY

EVENTFEXTERNAL-FORMFILE-PREFIX

FLOAT FLOATINGFONT

GRAPHICALHANDLEHEIGHT

HELP-IDICONID

IDENTIFIEDINQUIRELINK

LOWERMANUALMENU

MESSAGEMODALMODELESS

MODIFYNULLNULL

OBJECTONLYOVERLAPPED

PARAGRAPHPOP-UPPRIORITY

PROPERTYRESIZABLESCROLL

SHADOWSTYLESYSTEM

SYSTEM-INFOTABLETERMINAL-INFO

THREADTITLETITLE-BAR

TOOL-BARTRANSACTIONUPPER

VISIBLEWAITWIDTH

WINDOWWRAP

Disculpad, por si alguna se me ha olvidado.

Clasificando (Sort)

(4685 palabras totales en este texto)(1761 Lecturas)

La clasificacin, no cabe duda que es una opcin muy interesante en segn que programas o aplicaciones. El uso de tener varias claves alternadas sobre todo de nuestros archivos histricos nos evita tener que hacerlo muy a menudo, pero sobre todo con el uso de los ficheros maestros, es muy comn el desar clasificar por cualquiera de los campos de los que dispone el fichero.

Para realizar estas clasificaciones, nuestro Cobol tambin dispone de lo suficiente. Podemos clasificar por todos los campos que deseemos, as como escoger el orden que queramos para cada uno de ellos. Todo esto queda englobado en la sentencia SORT, pero esta depende de muchas mas cosas.

No voy a explicar a fondo todo el funcionamiento de SORT, entre otras cosas, porque yo mismo no lo utilizo mucho, pero empecemos a despejar dudas.

Lo primero que necesitamos es un archivo sobre el que volcar nuestra clasificacin y que adems utilizar el propio SORT para hacer las clasificaciones. Este fichero se define en la FILE-CONTROL como cualquier otro fichero solo que haciendo ver al compilador que se va a tratar de un archivo SORT y a continuacin se define su estructura en la FILE SECTION.

Para el ejemplo nos basaremos en el fichero de la Agenda que hemos visto en la seccin "Programando".El fichero de clasificacin se llamar ORDEN y solo contendr los campos por los que deseemos clasificar.

ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT AGENDA ASSIGN TO RANDOM "AGENDA.DAT"ORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY KEYAGE.SELECT ORDEN ASSIGN TO SORT.DATA DIVISION.FILE SECTION.FD AGENDA LABEL RECORD STANDARD.01 REGAGE.02 KEYAGE.03 AGECOD PIC 9(4).02 AGENOM PIC X(30).02 AGEDOM PIC X(30).02 AGEPOS PIC 9(5).02 AGEPOB PIC X(20).02 AGEPRO PIC X(15).02 AGETEL PIC X(20).02 AGEMOV PIC X(20).02 AGEMAI PIC X(30).02 AGEWEB PIC X(40).

SD ORDEN.01 REGORD.02 ORDNOM PIC X(30).02 ORDPOB PIC X(30).02 ORDPRO PIC X(30).

Notad que hemos sustituido FD (File Descrition) por SD (Sort Description) para nuestro fichero de clasificacin y que solo hemos incluido en ste fichero tres campos, los que nosotros hemos escogido para hacer las clasificaciones. Este archivo puede tener todos los campos que se desee, incluso otros que no estn en el fichero a clasificar. Adems el orden en que figuren no tiene importancia ni significa nada a la hora de clasificar. Con la SD solo indicamos los campos que va a tener el fichero.

A partir de aqu, nuestro programa puede continuar normalmente hasta llegar al momento en que deseemos clasificar y para ello vamos a ver un poco como es la sintaxis de una sentencia SORT.

Formato 1: Este formato se utiliza para clasificar un archivo y guardar el contenido del fichero clasificado en otro archivo. Esta opcin no se suele utilizar ya que tiene pocas posibilidades. Tendramos un fichero en el que se basara SORT para clasificar, un fichero maestro del que leeriamos para clasificar y el resultado lo guardara en otro fichero.

SORT fichero_de_clasificacion (ON ASCENDING KEY) campo(ON DESCENDING KEY) campoUSING fichero a clasificarGIVING fichero que quedar clasificado

Formato 2: Este formato es mas utilizado ya que el control de la clasificacin lo hacemos nosotros tanto antes como despus.

SORT fichero_de_clasificacion (ON ASCENDING KEY) campo(ON DESCENDING KEY) campoINPUT PROCEDURE que_hacemos antesOUTPUT PROCEDURE que hacemos despues Fichero_de_clasificacion: hace referencia al fichero que hemos definido como SORT.

campo: hace referencia a cualquiera de los campos de dicho fichero que hemos definido, podremos poner tantos como deseemos y en el orden que queramos.

que hacemos antes: indica el proceso que obligaremos al compilador a realizar antes de clasificar. Podemos indicar varios parrafos como hariamos con un PERFORM indicando THRU o bien utilizar una SECTION.

que hacemos despues: indicaremos que hacer una vez el fichero est clasificado. Igual que antes podremos indicar un prrafo o varios o utilizar una SECTION.

Veamos a continuacin un ejemplo con nuestro programa.

WORKING-STORAGE SECTION.01 LINEA.02 LNOM PIC X(30)BB.02 LPOB PIC X(20)BB.02 LPRO PIC X(12).01 OP PIC X....PROCEDURE DIVISION.INICIO.SORT ORDENON ASCENDING ORDPOBON DESCENDING ORDNOMINPUT PROCEDURE CARGAROUTPUT PROCEDURE SALIDA.STOP RUN.

CARGAR SECTION.INI-CAR.OPEN INPUT AGENDA.LEER.READ AGENDA NEXT RECORD AT END GO FIN-CAR.MOVE AGENOM TO ORDNOM.MOVE AGEPOB TO ORDPOB.MOVE AGEPRO TO ORDPRO.RELEASE REGORD.GO LEER.FIN-CAR.CLOSE AGENDA.EXIT.

SALIDA SECTION.INI-SAL.RETURN ORDEN AT END GO FIN-SAL.MOVE ORDNOM TO LNOM.MOVE ORDPOB TO LPOB.MOVE ORDPRO TO LPRO.DISPLAY LINEA LINE 20.ACCEPT OP LINE 21.GO INI-SAL.FIN-SAL.EXIT.

Antes de seguir, habris notado que se han incluido dos nuevas sentencias, RELEASE y RETURN. Bien, estas instrucciones son las que utiliza Cobol para grabar y leer en los ficheros de SORT. El funcionamiento es el mismo, es decir RELEASE, lo que hace es introducir los datos en el fichero y RETURN los extrae. Adems si os habis dado cuenta, el fichero de clasificacin no es necesario abrirlo ni cerrarlo.

En este caso hemos clasificado ascendentemente por poblacion y a su vez descendientemente por nombre. Podramos haber utilizado cualquier otra forma o haber clasificado por los tres campos o solo por uno.

En la seccin dedicada a la INPUT PROCEDURE simplemente hemos cargado el fichero de clasificacin, pero a la vez podramos haber discriminado registros del maestro y haber creado otros campos nuevos para clasificar. Aunque si bien es lo mas lgico a realizar.

En la seccin dedicada a la OUTPUT PROCEDURE, lo que hacemos es sacar por pantalla apoyndonos en la variable LINEA, el contenido del fichero una vez clasificado, pero igualmente podramos haber hecho cualquier cosa. Tened en cuenta que una vez aqu nuestro fichero ORDEN queda clasificado y por lo tanto podemos hacer lo que deseemos.

Tablas

pgina(s) : 1/3(17674 palabras totales en este texto)(2377 Lecturas)

El uso de tablas en Cobol es algo muy frecuente y por eso he decidido crear un apartado especfico para hablar de ellas. En el captulo de la DATA DIVISION, dentro de los manuales, podris encontrar una explicacin de cada comando o clusula que veamos de aqu en adelante.

En primer lugar daremos una definicin de ellas. Una tabla es un conjunto de elementos con un mismo tipo y longitud que se denominan con el mismo nombre y se diferencian por un subndice. Todo lo que voy a explicar aqu, se har desde lo ms bsico. Con un ejemplo lo vamos a ver mas claro:

Imaginamos que queremos tener la informacin de cuantas personas entran a un museo cada da de la semana. Si como mximo entran al da mas o menos 1.000 personas deberamos declarar siete variables de la siguiente manera:

01 LUNES01 MARTES01 MIERCOLES01 JUEVES01 VIERNES01 SABADO 01 DOMINGOPIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).PIC 9(4).

Para introducir datos aqu podramos hacer:

MOVE 200 TO LUNES.MOVE 430 TO MARTES.MOVE 136 TO MIERCOLES.MOVE 525 TO JUEVES.MOVE 380 TO VIERNES.MOVE 1910 TO SABADO.MOVE 2300 TO DOMINGO.

Fijaros que todas son del mismo tipo (numricas) y del mismo tamao (4), por lo tanto cumplen el requisito para crear una tabla, as que vamos a sustituir todo lo anterior haciendo uso de una tabla.

01 DIASEMANA.02 VISITAS PIC 9(4) OCCURS 7 TIMES.

Ahora tendremos una nica variable donde guardar los datos y se llamar VISITAS. Para introducir los datos lo haramos refirindonos con un subndice a cada uno de sus elementos, siete en este caso, porque siete son los das de la semana. Lo ms lgico ser respetar el orden de los das, es decir 1 para el Lunes, 2 para el Martes, etc ...

MOVE 200 TO VISITAS (1).MOVE 430 TO VISITAS (2).MOVE 136 TO VISITAS (3).MOVE 525 TO VISITAS (4).MOVE 380 TO VISITAS (5).MOVE 1910 TO VISITAS (6).MOVE 2300 TO VISITAS (7).

El resultado es el mismo, pero solo hemos tenido que declarar una variable. Por supuesto el nmero que hace referencia al subndice puede ser a su vez una variable, como veremos un poco mas abajo.

Cobol tambin posee la capacidad de crear una tabla y rellenarla a su vez utilizando la WORKING-STORAGE SECTION . Para ello primero declaramos los valores en una variable y gracias a la clusula REDEFINES, hacemos que su valor se cargue en la tabla. Eso no quiere decir que su valor no se pueda cambiar, pero al iniciar el programa, la tabla contendr esos valores. Para seguir con el ejemplo crearemos una con los das de la semana.

01 TABLADIAS.02 FILLER02 FILLER02 FILLER02 FILLER02 FILLER02 FILLER02 FILLER01 TABLADEDIAS02 ELDIA PIC X(10) VALUE "LUNES ".PIC X(10) VALUE "MARTES ".PIC X(10) VALUE "MIERCOLES ".PIC X(10) VALUE "JUEVES ".PIC X(10) VALUE "VIERNES ".PIC X(10) VALUE "SABADO ".PIC X(10) VALUE "DOMINGO ".REDEFINES TABLADIAS.PIC X(10) OCCURS 7 TIMES.

Ya tenemos cargada la tabla con los das de la semana respetando tambin el orden que hemos indicado anteriormente.

Ahora mostraremos las visitas de cada da utilizando las tablas y refirindonos a los elementos de la tabla con valores variables. Vamos a pedir que nos diga el da de la semana para el cual quiere saber las visitas que hubo:

WORKING-STORAGE SECTION.01 DIA PIC 9.01 LVISITAS PIC Z.ZZ9....PROCEDURE DIVISION....PEDIR.DISPLAY "INTRODUZCA DIA PARA VER SUS VISITAS"LINE 4 COL 20.ACCEPT DIA LINE 4 COL 50 PROMPT LOW.IF DIA < 1 OR DIA > 7 GO PEDIR.DISPLAY "EL " LINE 10 COL 20.DISPLAY ELDIA (DIA) LINE 10 COL 23.DISPLAY "HUBO " LINE 10 COL 33.MOVE VISITAS (DIA) TO LVISITAS.DISPLAY LVISITAS LINE 10 COL 38.DISPLAY "VISITAS." LINE 10 COL 44.

Al introducir, por ejemplo el valor 3 el resultado hubiera sido:

EL MIERCOLES HUBO 136 VISITAS.

VARIAS DIMENSIONES O NIVELES

Todas las que hemos visto son de una dimensin, pero se pueden definir demas niveles y convertirlas en matrices. Por ejemplo ahora vamos a diferenciar en la tabla, adems del nmero de visitas, si han sido hombres o mujeres, para ello creamos una nueva dimensin quedando la tabla de la siguiente manera:

01 DIASEMANA.02 GENERO03 VISITASOCCURS 2 TIMES.PIC 9(4) OCCURS 7 TIMES.

Como veis nuestra tabla contiene dos clusulas OCCURS, con ello hemos conseguido crear una matriz de 2 x 7, ahora la variable VISITAS tendr 14 elementos. Para dirigirnos a ellos utilizaremos dos subndices. En nuestro caso al diferenciar el gnero, identificaremos con el valor 1 a los hombres y con el 2 a las mujeres. Veamos como rellenamos la tabla ahora:

MOVE 110 TO VISITAS (1, 1) MOVE 90 TO VISITAS (2, 1). MOVE 130 TO VISITAS (1, 2) MOVE 300 TO VISITAS (2, 2). MOVE 100 TO VISITAS (1, 3) MOVE 36 TO VISITAS (2, 3). MOVE 250 TO VISITAS (1, 4) MOVE 225 TO VISITAS (2, 4). MOVE 190 TO VISITAS (1, 5) MOVE 190 TO VISITAS (2, 5). MOVE 1000 TO VISITAS (1, 6) MOVE 910 TO VISITAS (2, 6). MOVE 1100 TO VISITAS (1, 7) MOVE 1200 TO VISITAS (2, 7).

Por supuesto al igual que antes los subndices pueden ser sustituidos por variables. Por ejemplo, sabiendo los datos anteriores vamos a sumar todas las mujeres que entraron en la semana y todos los hombres y vamos a averiguar cual fue el da de mayor visitas y el da de menor asistencia.

WORKING-STORAGE SECTION.01 DIA PIC 9.01 LVISITAS PIC Z.ZZ9.01 MAYOR PIC 9(4) VALUE 0.01 MENOR PIC 9(4) VALUE 9999.01 DIAMAYOR PIC 9.01 DIAMENOR PIC 9.01 TOTAL PIC 9(4).01 HOMBRES PIC 9(4).01 MUJERES PIC 9(4)....PROCEDURE DIVISION....MOVE 0 TO DIA.MIRAR.ADD 1 TO DIA IF DIA > 7 GO FIN.ADD VISITAS (1, DIA) TO HOMBRES.ADD VISITAS (2, DIA) TO MUJERES.COMPUTE TOTAL = VISITAS (1, DIA) + VISITAS (2, DIA).IF TOTAL > MAYOR MOVE TOTAL TO MAYOR MOVE DIA TO DIAMAYOR.IF TOTAL < MENOR MOVE TOTAL TO MENORMOVE DIA TO DIAMENOR.GO MIRAR.FIN.DISPLAY "TOTAL HOMBRES " LINE 10 COL 10 ERASE.MOVE HOMBRES TO LVISITAS. DISPLAY LVISITAS LINE 10 COL 35.

DISPLAY "TOTAL MUJERES " LINE 11 COL 10.MOVE MUJERES TO LVISITAS. DISPLAY LVISITAS LINE 11 COL 35.

DISPLAY "----------------------------------" LINE 12 COL 10.DISPLAY "TOTAL VISITAS " LINE 13 COL 10.COMPUTE LVISITAS = HOMBRES + MUJERES.DISPLAY LVISITAS LINE 13 COL 35.DISPLAY "----------------------------------" LINE 14 COL 10.

DISPLAY "DIA MAYOR " LINE 15 COL 10.DISPLAY TSEM (DIAMAYOR) LINE 15 COL 22.MOVE MAYOR TO LVISITAS. DISPLAY LVISITAS LINE 15 COL 35.

DISPLAY "DIA MENOR" LINE 17 COL 10.DISPLAY TSEM (DIAMENOR) LINE 17 COL 22.MOVE MENOR TO LVISITAS. DISPLAY LVISITAS LINE 17 COL 35.ACCEPT OP LINE 20....

LLENANDO TABLAS

Ahora imaginamos que los datos de la tabla de visitas, en vez de asignarlos con un MOVE como hemos hecho en los ejemplos anteriores, los vamos a pedir mediante ACCEPT en un programa. Vamos a hacer un pequeo programa para que veais como quedara:

WORKING-STORAGE SECTION.01 DIASEMANA.02 GENERO OCCURS 2 TIMES.03 VISITA PIC 9(4) OCCURS 7 TIMES.01 SUB1 PIC 9.01 SUB2 PIC 9.01 OP PIC X.01 LGENERO PIC X(7)....PROCEDURE DIVISION.INICIO.DISPLAY "CAPTURA DE DATOS" LINE 2 COL 10 ERASE.MOVE 0 TO SUB1 SUB2.METER.ADD 1 TO SUB2 IF SUB2 > 7 GO FIN.MOVE 0 TO SUB1.METER1.ADD 1 TO SUB1 IF SUB1 > 2 GO METER.IF SUB1 = 1 MOVE "HOMBRES" TO LGENERO ELSEMOVE "MUJERES" TO LGENERO.DISPLAY "VISITAS DE " LINE 10 COL 10.DISPLAY LGENERO LINE 10 COL 21.DISPLAY "EL DIA" LINE 10 COL 29.DISPLAY TSEM (SUB2) LINE 10 COL 37.ACCEPT VISITAS (SUB1, SUB2) LINE 10 COL 50.GO METER1.FIN.DISPLAY "PROCESO DE CAPTURA FINALIZADO"LINE 20 COL 20.ACCEPT OP LINE 20 COL 1....

Ahora podramos incluir el cdigo anterior y que nos calcule el da de mayor y menor visitas y la suma por gneros.

BUSCANDO EN TABLAS

Para buscar en las tablas existe un comando propio llamado SEARCH, que veremos al final del captulo, pero ahora vamos a hacer una busqueda por subndices normal para encontrar alguno o varios elementos que cumplan una determinada condicin. Por ejemplo, siguiendo con nuestra tabla (es un poco pequea, pero podra ser todo lo grande que quisieramos, siempre que no desbordaramos la memoria del ordenador o la capacidad del compilador), vamos a buscar los das en los que la afluencia es mayor de 1.000 personas, para saber si es necesario contratar a mas personal para esos das.

Pero para complicar un poco mas el asunto, vamos a meter dichos das en otra tabla y as aprendemos a trabajar con mas de una tabla a la vez.

WORKING-STORAGE SECTION.01 DIASEMANA.02 GENERO OCCURS 2 TIMES.03 VISITA PIC 9(4) OCCURS 7 TIMES.01 TABLA1000.02 ELEMENTOS1000 OCCURS 7 TIMES.02 DIA1000 PIC 9.02 VISITAS1000 PIC 9(4).01 SUB1 PIC 9.01 SUB2 PIC 9.01 SUB3 PIC 9.01 TOPE PIC 9.01 OP PIC X.01 LGENERO PIC X(7)....PROCEDURE DIVISION.INICIO.DISPLAY "BUSCANDO DIAS DE MAS DE 1000 VISITAS" LINE 2 COL 10 ERASE.MOVE 0 TO SUB1 SUB2.BUSCAR.ADD 1 TO SUB1 IF SUB1 > 7 GO MOSTRAR.COMPUTE TOTAL = VISITAS (1, SUB1) + VISITAS (2,SUB1).IF TOTAL > 1000ADD 1 TO SUB2 MOVE SUB1 TO DIA1000 (SUB2)MOVE TOTAL TO VISITAS1000 (SUB2).GO BUSCAR.MOSTRAR.MOVE SUB2 TO TOPE MOVE 0 TO SUB2.MOSTRAR1.ADD 1 TO SUB2 IF SUB2 > TOPE GO FIN.DISPLAY "EL " LINE 10 COL 29.MOVE DIA1000 (SUB2) TO SUB3.DISPLAY TSEM (SUB3) LINE 10 COL 37.DISPLAY VISITAS1000 (SUB2) LINE 10 COL 50.GO MOSTRAR1.FIN.DISPLAY "PROCESO DE BUSQUEDA FINALIZADO"LINE 20 COL 20.ACCEPT OP LINE 20 COL 1....

MAS TABLAS

Voy a poner algunos ejemplos de definicin de tablas mas complicados que los expuestos en los ejemplos.

01 TABLA.02 TRABAJADORES03 NOMBRE03 NIF 03 SALARIO05 BRUTO05 NETO05 GASTOS07 GASTOOCCURS 100 TIMES.PIC X(30).PIC X(10).OCCURS 12 TIMES.PIC S9(8).PIC S9(8).OCCURS 10 TIMES.PIC S9(8).

Los valores para esta tabla sera:

100 TRABAJADORES de los que tendramos NOMBRE y NIF referidos como NOMBRE (X) y NIF (X).

A su vez tendramos un salario por mes (12). Descritos con dos variables BRUTO Y NETO a los que nos referiramos como BRUTO (CLIENTE, MES) y NETO (CLIENTE, MES).

Y tambin 10 tipos de gastos por cliente y mes referidos como GASTO (CLIENTE, MES, TIPO).

Como vis se puede complicar cuanto se quiera:

- Para saber el nombre del trabajador nmero 49: DISPLAY NOMBRE (49).- Para saber el Nif del trabajador 20: DISPLAY NIF (20).- Para saber el bruto de Mayo del trabajador 15: DISPLAY BRUTO (15, 5).- Para saber el neto del trabajador 90 del mes de Noviembre: DISPLAY NETO (90, 11).- Para saber el gasto nmero 3 del mes de Febrero del trabajador 10:DISPLAY GASTO (10, 2, 3).

TABLAS DE LONGITUD VARIABLE.

Podemos definir tambin una tabla con un nmero de elementos variable, dependiendo del valor de una variable. Su definicin sera as:

01 MES01 SEMANA.02 VISTAS PIC 99.

PIC 9(4) OCCURS 28 TO 31 DEPENDING OF MES.

INDEXACION.

Adems podemos asignar una variable por la cual nos referiremos a cada elemento, esto se hace aadiendo a la lnea que contiene la clusula OCCURS, la palabra INDEXED seguida del nombre de variable que deseemos. La ventaja es que no hay que definirla en la WORKING. En nuestro ejemplo le pondremos de nombre DIA y quedara asi:

01 DIASEMANA.02 VISITAS PIC 9(4) OCCURS 7 TIMES INDEXED DIA.

La gran ventaja de utilizar este mtodo, es que no hay que definir esa variable, no hay que controlar los rangos y adems el valor no se alterar ya que no utilizaremos esa variable para nada mas.

Para dar valor a ste tipo de variables hay que utilizar la sentencia SET, ya que no se pueden utilizar los comandos normales ni declaraciones aritmticas, con el siguiente formato:

SET DIA TO 1. Da el valor 1 al ndice 1.SET DIA UP 3. Suma 3 al valor del ndice.SET DIA DOWN 2. Resta 1 al valor del ndice 2.

Adems tambin utilizamos la indexacin para hacer busquedas en las tablas mediante la sentencia SEARCH.

Antes hemos visto como buscar utilizando un contador y unos IF para verificar lo que buscamos. Pero Cobol tiene una sentencia especfica para buscar un valor en una tabla. Esta sentencia se llama SEARCH.

Si imaginamos una tabla de trabajadores y queremos encontrar la posicin en concreto que ocupa uno o saber si existe en la tabla haremos lo siguiente:

01 TABLA.02 TRABAJADORES OCCURS 100 TIMES INDEXED BY SUB1.03 NOMBRE PIC X(30).03 NIF PIC X(10)....PROCEDURE DIVISION....BUSCAR.SET SUB1 TO 1.SEARCH ELEMENTOS AT END GO NOEXISWHEN NOMBRE (SUB1) = "ANDRES MONTES"GO EXISTE.NOEXIS.DISPLAY "TRABAJADOR INEXISTENTE" LINE 1.GO FIN.EXIS.DISPLAY "EL NIF DEL TRABAJADOR ES ." LINE 2.DISPLAY NIF (SUB1) LINE 2 COL 30....

Primero inicializamos la variable de indexacin para que empiece por el elemento 1, pero podiamos haber escogido el valor que quisieramos, si le hubieramos dado uno fuera de rango, simplemente la instruccin hubiera saltado al prrafo NOEXIS indicado en el AT END.

La sentencia SEARCH a continuacin crea un bucle hasta que se cumpla la condicin dada. Si no la encuentra realiza la instruccin que haya despues de AT END. Podemos poner todas las condiciones con WHEN que queramos y se irn ejecutanto en el orden en que se hayan puesto.

Tambin existe la posibilidad de hacer una busqueda total de la tabla con la clusula ALL en la sentencia SEARCH, se denomina busqueda binaria.

Esta frmula es mas utilizada en tablas mas grandes. Aqu no hay que preocuparse por el valor del subndice, el comando se encarga de todo. Pero solo podremos poner una condicin WHEN y adems el elemento de la tabla por el que se busque debe de estar clasificado y especificado en la WORKING con la opcin ASCENDING o DESCENDING. Veamos un ejemplo:

01 TABLA.02 TRABAJADORES OCCURS 100 TIMES ASCENDING KEY NOMBREINDEXED BY SUB1.03 NOMBRE PIC X(30).03 NIF PIC X(10)....PROCEDURE DIVISION....BUSCAR.SEARCH ALL ELEMENTOS AT END GO NOEXISWHEN NOMBRE (SUB1) = "ANDRES MONTES"GO EXISTE.NOEXIS.DISPLAY "TRABAJADOR INEXISTENTE" LINE 1.GO FIN.EXIS.DISPLAY "EL NIF DEL TRABAJADOR ES ." LINE 2.DISPLAY NIF (SUB1) LINE 2 COL 30....

La diferencia en cuanto a programacin es mnima, pero el sistema tarda menos en la busqueda y no tenemos que tener en cuenta el inicializar el contador. Por el contrario es necesario tener ordenada nuestra tabla y esto a veces no sea tan rentable.

Obviamente cada una de stas formas de buscar en Tablas son opciones que ofrece el lenguaje Cobol. Supongo que como en todo lo que se buscaba al principio era limitar los tiempos de respuesta, puesto que las mquinas eran muy pequeas y tenan pocos rendimientos, de ah que sta orden se haya visto inalterada desde el principio.

Cada uno puede utilizar la forma que mejor se le de, la que mejor entienda o la que mejor haga su cometido.

Seguramente se podra haber hablado mucho mas de tablas, pero lo importante y lo que pretenda con ste captulo, era que comprendirais el porque de una tabla y su uso mas frecuente.

Ficheros (I)

(6262 palabras totales en este texto)(2604 Lecturas)

Cuando adquirimos un compilador de Cobol, sin darnos cuenta a la vez estamos obteniendo un completo administrador de ficheros, algo que con otros lenguajes tienes que implementar con bases de datos u otras herramientas externas.

No voy a entrar en la polmica de que es mejor, si ficheros Cobol o Bases de datos, pero la experiencia me permite decir que la fiabilidad, seguridad y potencia de los ficheros es perfecta para nuestras aplicaciones de gestin.

La gran potencia sin duda, viene dada por los archivos indexados y ser sobre ellos sobre los que gire prcticamente todo el tema, adems con longitud fija. Los secuenciales se utilizan para la impresin y para determinados procesos de exportacin de datos, pero cada uno es libre de utilizar el tipo de fichero que desee.

En la seccin de Instrucciones relativas a ficheros tengo una pequea explicacin sobre lo que es un fichero y una clave y la voy a repetir aqu, porque nos viene muy bien para comprender perfectamente como se comportan.

Que es un fichero? Podramos definir un fichero como un conjunto de registros, pero estaramos mas o menos igual. Si comparsemos un fichero de cobol con nuestra vieja agenda de telfonos, para cada amigo tendramos los mismos datos, es decir, nombre, telfono, direccin, etc ... cada uno de esos datos es lo que llamamos campo y el conjunto de todos esos campos para cada amigo sera un registro. Ahora podemos comprender mejor que un fichero o archivo es un conjunto de registros, como una agenda es un conjunto de datos de amigos.

Que es una clave? Una clave, es un campo de nuestra agenda que nos sirve para identificar a cada amigo, en la agenda normal la clave podra ser la lengeta con la letra del abecedario correspondiente a los apellidos del amigo. Informticamente es mas completa y con ella podremos identificar a cada uno de ellos, por ejemplo con su nombre o su telfono o un cdigo que le asignemos nosotros personalmente.

Algunos tipos de ficheros indexados, dividen el fichero en dos archivos fsicos, uno para las claves y otro para los datos, otros en cambio lo guardan todo en uno mismo, pero eso no significa que no lo haga igual, sino que al usuario solo le muestra un fichero fsico, que puede resultar mas cmodo.

Cuando se graba un nuevo registro, ste se ordena automticamente en orden ascendente por la clave principal. Luego podremos modificar tantas veces como deseemos los datos, pero la clave nunca se podr alterar. Si queremos cambiar la clave, tendremos que borrar el registro y grabar otro con la clave deseada. De esa manera Cobol se asegura el perfecto funcionamiento de su sistema de ndices.

La parte de ndices es como una tabla con las posiciones de memoria de los datos que le corresponden. Si el fichero est abierto en modo I-O y se produce una salida brusca del programa o un corte de luz, puede ocurrir que esa informacin sobre los datos que corresponden a cada ndice se alteren y de ah el famoso y terrible error 98. Por eso yo siempre aconsejo tener nuestro fichero abierto solo como Input y abrirlo como I-O solo en el preciso momento de grabar o borrar su contenido.

Lo realmente importante para Cobol cuando crea un fichero, es el tamao del registro y el de la clave en bytes. El resto le da igual, incluso la estructura se puede definir de maneras totalmente diferentes.Para Cobol, si generamos un fichero con un registro de 128 posiciones, eso es lo que guarda, si nosotros le indicamos que el nombre ocupa 40 y comienza en la posicin 18 perfecto, pero si la prxima vez le indicamos otra estructura el tambin la aceptar.

Un ejemplo, antes de entrar mas en materia:

ENVIRONMENT DIVISION.INPUT-OUTPUT SECTION.FILE-CONTROL.SELECT FICHERO ASSIGN TO RANDOM "FICHERO.DAT"ORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY KEYAGE.DATA DIVISION.FILE SECTION.FD FICHERO LABEL RECORD STANDARD.01 REGAGE.02 KEYAGE.03 CAMPOCODIGO PIC 9(4).02 CAMPONOMBRE PIC X(30).02 CAMPOPOBLACION PIC X(20).

Suponemos que CAMPONOMBRE = 'UN NOMBRE CUALQUIERA'CAMPOCODIGO = 1001CAMPOPOBLACION = 'UNA LOCALIDAD'

Ahora en otro programa cambiamos la estrutura a por ejemplo:

FD FICHERO LABEL RECORD STANDARD.01 REGAGE.02 KEYAGE.03 CAMPOCLAVE1 PIC 999.03 CAMPOCLAVE2 PIC 9.02 CAMPODATO1 PIC X(10).02 CAMPODATO2 PIC X(15).02 CAMPODATO3 PIC X(25).

Como veis, los tamaos son igual la clave sigue teniendo 4 y el registro 54 pero la estructura ha cambiado. Si ahora le decimos que nos displaye el mismo registro obtendramos lo siguiente:CAMPOCLAVE1 = 100CAMPOCLAVE2 = 1CAMPODATO1 = 'UN NOMBRE '.CAMPODATO2 = 'CUALQUIERA '.CAMPODATO3 = ' UNA LOCALIDAD'.

He puesto este ejemplo, porque muchas veces aprendemos las cosas tan literalmente que pensamos que cambiar algo puede provocar errores.

CLAVES ALTERNATIVAS

Las claves alternativas, nos dan la posibilidad de acceder al fichero indexado por mas de un ndice, con lo que la rapidez de acceso se incrementa muchsimo.

Por que son necesarias ?

Imaginemos un fichero de ventas, cuya clave es el nmero de factura, pero en su registro tambin guardamos la fecha, el cliente, el artculo, etc ..... Si ahora quisieramos listar todos los registros de ventas relativos a un solo clientes y no existieran las claves alternativas, tendramos que leer todo el fichero para saber de que cliente es cada factura e imprimir solo esos registros.

Pues bien, con este tipo de claves lo que hacemos es posicionarnos directamente en el cliente en concreto y leer secuencialmente por esa clave, con lo cual tendremos una relacin de todas sus facturas directamente hasta que el cliente cambie. En los ejemplos que pondr en esta seccin intentar que se vea todo esto.

En la actualidad, las claves alternativas se definen de manera diferente y no hacen la informacin redundante, es decir, antes, si crebamos una clave alternativa, haba que implementar en el registro dicha clave, con lo que repetiamos los datos y hacamos el registro de mayor longitud. Hoy en da eso no es necesario y las claves se pueden definir en la propia SELECT con lo cual evitamos la repeticin de campos, espacio y adems ganamos en comodidad, sencillez y comprensin.

Veamos que es lo que he dicho:

ANTES:

SELECT FICHERO ASSIGN TO RANDOM 'FICHERO.DATORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY CLAVE ALTERNATE RECORD KEY CLAVE1 WITH DUPLICATESFILE STATUS STA-FICHERO.

FD FICHERO LABEL RECORD STANDARD.01 REG-FICHERO.02 CLAVE.03 CODIGO PIC 9(5).02 NOMBRE PIC X(30).02 DOMICILIO PIC X(30).02 POBLACION PIC X(20).02 CLAVE1.03 NOMBRE1 PIC X(30).

Fijaros como tenemos que repetir dos campos, ocupando mas espacio y teniendo siempre cuidado de que ambos estn actualizados a la vez.

AHORA:

SELECT FICHERO ASSIGN TO RANDOM 'FICHERO.DATORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY CODIGOALTERNATE RECORD KEY NOMBRE WITH DUPLICATESFILE STATUS STA-FICHERO.

FD FICHERO LABEL RECORD STANDARD.01 REG-FICHERO.02 CODIGO PIC 9(5).02 NOMBRE PIC X(30).02 DOMICILIO PIC X(30).02 POBLACION PIC X(20).

Todo es mucho mas claro, la definicin de los ficheros se asemeja mas a los relativos y en la SELECT es donde se describen las claves. Si la clave fuera compuesta, es decir con mas de un campo, haramos lo siguiente:

RECORD KEY CLAVE = CODIGO, NOMBRE

Si tuvieramos que hacer un START nos dirigiriamos por la palabra CLAVE, como ese conjunto de campos.

Aqu termina la primera parte del tema. Antes de continuar, es necesario tener claro todo lo aqu expuesto e igualmente si alguien tiene alguna queja o comentario al respecto que me lo haga llegar.

Siempre me gusta recordaros que yo soy un programador mas, al igual que vosotros y por lo tanto, con las mismas dudas, inquietudes y meteduras de pata.

Continuar...

Ficheros (II)

pgina(s) : 1/3(1615 palabras totales en este texto)(1620 Lecturas)

Cuando empezamos a trabajar con ficheros, a veces se nos plantean muchas dudas sobre el hecho de tener que leer de mas de un fichero a la vez.Son muchas las preguntas que me habis planteado sobre este tema, as que aqu, en esta segunda parte dedicada a los ficheros voy a intentar que quede resuelta con un ejemplo prctico.

La situacinVamos a utilizar un fichero de albaranes que a su vez integra una tabla.Dos ficheros maestros, clientes y productos.Un fichero de impresora.

Que vamos a hacer?Vamos a leer secuencialmente el fichero de albaranes. Al mismo tiempo vamos a extraer el nombre del cliente y adems vamos a actualizar las existencias de los productos.Tambin vamos a ir generando una lnea de impresora por cada albarn con el importe total del mismo.

Lo primero que hacemos es iniciar nuestro programa con las dos divisiones primeras, donde indicamos el nombre del programa y los ficheros con los que vamos a trabajar.

Empezamos con nuestro programa:

IDENTIFICATION DIVISION.PROGRAM-ID. FICHEROS.ENVIRONMENT DIVISION.CONFIGURATION SECTION.SPECIAL-NAMES. DECIMAL-POINT IS COMMA.INPUT-OUTPUT SECTION.FILE-CONTROL.

SELECT ALBARANES ASSIGN TO RANDOM "ALBARANES.DAT"ORGANIZATION INDEXED ACCESS DYNAMICRECORD KEY ALB-NUMEROFILE STATUS STA-ALBA.

SELECT CLIENTES ASSIGN TO RANDOM "CLIENTES.DAT"ORGANIZATION INDEXED ACCESS RANDOMRECORD KEY CLI-CODIGOFILE STATUS STA-CLIEN.

SELECT PRODUCTOS ASSIGN TO RANDOM "PRODUCTOS.DAT"ORGANIZATION INDEXED ACCESS RANDOMRECORD KEY PRO-CODIGOFILE STATUS STA-PRODU.

SELECT IMPRE ASSIGN TO PRINT "PRINTER1".

Como veis al archivo de albaranes le hemos indicado un acceso dinmico porque lo vamos a leer secuencialmente, mientras que a los ficheros maestros un acceso directo, ya que los vamos a acceder por su cdigo.A continuacin describimos los campos de cada uno de los ficheros.

DATA DIVISION.FILE SECTION.FD ALBARANES LABEL RECORD STANDARD.01 REGALBA.

02 ALB-NUMERO PIC 9(6).02 ALB-FECHA PIC 9(8).02 ALB-CLIENTE PIC 9(4).02 ALB-ELEMENTOS OCCURS 10 TIMES.

03 ALB-PRODUCTO PIC 9(4).03 ALB-CANTIDAD PIC 9(6)V99.03 ALB-PRECIO PIC 9(6)V99.

FD CLIENTES LABEL RECORD STANDARD.01 REGCLIEN.

02 CLI-CODIGO PIC 9(4).02 CLI-NOMBRE PIC X(40).02 CLI-DOMICILIO PIC X(40).02 CLI-POBLACION PIC X(30).02 CLI-PROVINCIA PIC X(20).02 CLI-NIF PIC X(10).

FD PRODUCTOS LABEL RECORD STANDARD.01 REGPRODU.

02 PRO-CODIGO PIC 9(4).02 PRO-NOMBRE PIC X(40).02 PRO-EXISTENCIAS PIC S9(6)V99.02 PRO-PROVEEDOR PIC 9(4).02 PRO-UNIMEDIDA PIC X(20).

FD IMPRE LABEL RECORD OMITTED.01 LINEA PIC X(80).

En cuanto a las variables que vamos a utilizar:Las de estado de cada fichero.Contadores para la tabla, las lneas y los albaranes leidos.Las lneas de nuestro listado.

WORKING-STORAGE SECTION.01 ESTADOS.

02 STA-ALBA PIC XX.02 STA-CLIEN PIC XX.02 STA-PRODU PIC XX.

01 CONTA1 PIC 9(6).01 CONTALIN PIC 9(6).01 CONTA PIC 9(6).01 FINFIC PIC X.01 TOTAL PIC S9(8)V99.01 TOLINEA PIC S9(8)V99.01 TOALBA PIC S9(8)V99.

01 LIN-01.

02 FILLER PIC X(66) VALUE 'LISTADO DE ALBARANES'.02 FILLER PIC X(10) VALUE 'HOJA .. '.02 L-HOJA PIC ZZZZ.

01 LIN-02.

02 FILLER PIC X(9) VALUE 'ALBARAN'.02 FILLER PIC X(12) VALUE ' FECHA'.02 FILLER PIC X(46) VALUE 'CLIENTE'.02 FILLER PIC X(13) VALUE 'IMPORTE'.

01 RAYA PIC X(80) VALUE ALL '='.01 DETALLE.

02 L-ALBARAN PIC ZZZ.ZZZBB.02 L-FECHA PIC ZZ/ZZ/ZZZZBB.02 L-CLIENTE PIC ZZZZB.02 L-NOMCLI PIC X(40)B.02 L-IMPORTE PIC ZZ.ZZZ.ZZ9,99.

Ahora es el momento de la programacin, de que todo salga tal y como hemos planteado.Voy a ir incluyendo lneas de comentario para que la explicacin quede mas detallada. En pocas palabras leemos, actualizamos, listamos, terminamos.

PROCEDURE DIVISION.INICIO.

Abrimos los ficheros cada uno en su modo adecuado, imprimimos la cabecera del listado e inicializamos las variables.

OPEN INPUT ALBARANES CLIENTES I-O PRODUCTOS EXTEND IMPREPERFORM CABECERAMOVE ' ' TO FINFIC MOVE 0 TO TOTAL CONTA

Iniciamos el bucle de lectura hasta que se cumpla la condicin de fin de fichero y movemos campos del fichero a variables de la lnea de impresin.

PERFORM UNTIL FINFIC = 'S'

READ ALBARANES NEXT RECORD AT END MOVE 'S' TO FINFICNOT AT ENDMOVE ALB-CODIGO TO L-ALBARANMOVE ALB-FECHA TO L-FECHA

Nos preparamos para leer clientes, tomamos su nombre y si no existe ponemos una aclaracin.

MOVE ALB-CLIENTE TO CLI-CODREAD CLIENTES INVALID KEY MOVE 'NO EXISTE EL CLIENTE' TO CLI-NOMBREEND-READMOVE CLI-NOMBRE TO L-NOMCLI

Comenzamos otro bucle interno para acceder a los elementos de la tabla que contiene los productos, la cantidad y el precio del albarn. Adems sumamos sus importes para totalizar el albaran. Tambin, si el producto existe le quitamos la cantidad vendida de sus existencias y regrabamos.

MOVE 0 TO TOALBAPERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL CONTA1 > 10

IF ALB-PRODUCTO (CONTA1) > 0

MOVE ALB-PRODUCTO TO PRO-CODIGOREAD PRODUCTO INVALID KEY

DISPLAY 'PRODUCTO NO ENCONTRADO, NO SE ACTUALIZA'NOT INVAL