Académique Documents
Professionnel Documents
Culture Documents
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
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 FILECONTROL e I-O-CONTROL.
123456789012
AB
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT [OPTIONAL] Nombre-de-archivo
ASSIGN TO Tipo-de-dispositivo
ORGANIZATION IS Tipo de organizacion
ACCESS MODE IS Mode de acceso al fichero
RECORD KEY IS Clave del registro
ALTERNATE RECORD KEY IS Claves alternativas registro
WITH DUPLICATES
FILE 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, INPUTOUTPUT, 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 WORKINGSTORAGE 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 INDEXED
ACCESS DYNAMIC RECORD KEY KEY-CLIENTE ALTERNATE RECORD KEYCLIENTE1 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:
WORKING-STORAGE SECTION.
LINKAGE SECTION.
COMMUNICATION SECTION
SCREEN SECTION
Para 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
segunda "
ANDRES", la diferencia, su justificacin.
" y la
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.
FD CLIENTES BLOCK CONTAINS 4 RECORDS
RECORD CONTAINS 128 CHARACTERS
LABEL RECORD STANDARD.
01 REG-CLIENTE.
02 KEY-CLIENTE.
r
02
02
02
02
02
02
03 CLICOD
rPIC 9(4) COMP-6.
CLINOM PIC X(30).
CLIDIR
PIC X(30).
CLIPOB PIC X(20).
CLIPRO PIC X(20).
CLINIF
PIC X(9).
FILLER
PIC X(17).
(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
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.
]
]
MENOR QUE
[ (NOT) LESS
[ (NOT) <
]
]
IGUAL QUE
Literal
Variable
[ (NOT) EQUAL
[ (NOT) =
]
]
Literal
Variable
]
]
]
]
Tambien podemos utilizar para las condiciones complejas los operandos lgicos, AND, OR y NOT segn
se requieran, todas las condicionea que incluyan AND han de ser correctas para que pase la condicin,
si se utiliza OR solo alguna de ellas ha de ser correcta, cuando se utilice NOT no podr ser correcta
para que la condicin sea vlida.
Instr. de Clculo
pgina(s) : 1/4
(4515 palabras totales en este texto)
(6226 Lecturas)
Debido a que el lenguaje Cobol fue concebido para la gestin de grandes cantidades de datos y a
resolver problemas de tipo comercial y de administracin, no se incluyeron dentro de sus
especificaciones verbos que nos puedieran ayudar a resolver clculos complejos como integrales,
trigonometra, raices cuadradas, etc..., sino simplemente las orientadas a los clculos bsicos, suma,
resta, multiplicacin y divisin que son las que vamos a ver a continuacin:
ADD , sta es la instruccin que utilizaremos para realizar sumas y tiene los siguientes formatos:
1.- ADD variable literal variable literal ... TO variable (ROUNDED) (ON SIZE ERROR )
instruccin
2.- ADD variable literal variable literal ...GIVING variable (ROUNDED) (ON SIZE ERROR )
instruccin
3.- ADD CORR variable TO variable (ROUNDED) ( ON SIZE ERROR) instruccin
Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING , y a
continuacin pondremos un ejemplo y su explicacin.
WORKING-STORAGE SECTION.
01 VALORES.
02 UNO PIC 99 VALUE 10.
02 DOS PIC 9(6) VALUE 280.
02 TRES PIC 9(4) VALUE 540.
01 OTROS
02 OTRO1 PIC 9.
02 DOS PIC 9(6) VALUE 110.
01 RESULTADO PIC S9(8) VALUE 10.
01 RESTO PIC 99.
PROCEDURE DIVISION.
INICIO.
Formato 1:
ADD UNO TRES 5 TO RESULTADO.
Se sumarn todas las variables o literales numricos (cifras) al valor de la
variable que se de a continuacin del TO, guardandose el resultado tambin en
sta ltima.Por tanto al realizar sta operacin el valor de la variable
RESULTADO, ser de: 10 (de la variable UNO) + 540 (de la variable TRES) + 5 +
10 (de Resultado) = 565.
Como veis UNO + TRES + 5 suman 555 pero sto se suma al valor que ya tena
la variable RESULTADO, con lo que la suma total es de 565.
Este formato se usa mucho para hacer de contador y hacer que una varable
aumente en uno su valor poniendo:
ADD 1 TO RESULTADO.
Formato 2:
ADD UNO TRES 5 GIVING RESULTADO.
En ste caso la variable RESULTADO tendr el valor de la suma de las variables
anteriores, sin tener en cuenta su valor inicial, es decir, ser de: 10 (de la
variable UNO) + 540 (de la variable TRES) + 5 = 555.
Formato 3:
ADD CORR VALORES TO OTROS.
Con ste formato conseguimos que las variables del campo compuesto VALORES
se sumen al valor de las variables con el mismo nombre del campo compuesto
OTROS, obteniendo como resultado: 280 (de la variable DOS del campo
VALORES) + 110 (de la variable DOS del campo OTROS) = 390.
Si hubiera coincidido alguna variable mas con el mismo nombre en ambos
campos tambin se hubiese sumado.
Nota: Como habreis podido apreciar pueden coexistir variables con el mismo
nombre pero nunca al nivel 01 o 77, es decir nunca como variables
independientes, pero si que formen parte de otra, aunque yo personalmente
nunca lo uso porque solo puede dar lugar a confusiones. Si de todas formas lo
utilizais, hay que tener en cuenta que para referirse a stas variables no solo
bastar con poner su nombre, sino que adems habr que especificar a que
campo pertenece con la palabra IN u OF . Esto se explicar con mas detalle
cuando veamos los verbos para manipular variables como MOVE.
SUBTRACT , sta es la instruccin que utilizaremos para realizar restas y tiene los siguientes
formatos:
1.- SUBTRACT variable literal variable literal ... FROM variable (ROUNDED) (ON SIZE ERROR )
instruccin
2.- SUBTRACT variable literal variable literal ... FROM variable literal GIVING variable
(ROUNDED) (ON SIZE ERROR) instruccin
3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON SIZE ERROR) instruccin
Para ver las explicaciones de cada uno de los formatos partiremos de la misma WORKING que hemos
utilizado con la instruccin ADD, poniendo a continuacin un ejemplo y su explicacin.
Formato 1:
SUBTRACT UNO TRES 5 FROM RESULTADO.
Se restarn todas las variables o literales numricos (cifras) del valor de la
variable que se de a continuacin del FROM, guardandose el resultado tambin
en sta ltima.
Por tanto al realizar sta operacin el valor de la variable RESULTADO, ser de:
-10 (de la variable UNO) - 540 (de la variable TRES) - 5 + 10 (de Resultado) =
-545.
Como veis se le han restado los valores de UNO, TRES y 5 que suman -555 pero
como RESULTADO vala +10, ste se suma y da un valor de -545.
Este formato lo podemos utilizar para hacer contadores en retroceso, poniendo:
SUBTRACT 1 FROM RESULTADO.
Formato 2:
SUBTRACT UNO 5 FROM TRES GIVING RESULTADO.
Aqu lo que conseguiremos ser restar el valor de la variable UNO y 5 del valor
de la variable TRES y el resultado guardarlo en la variable RESULTADO, sin tener
en cuenta su valor inicial, es decir, ser de: 540 (de la variable TRES) - 10 (de la
variable UNO) - 5 = 525.
Formato 3:
SUBTRACT CORR VALORES FROM OTROS.
Al igual que con la instruccin ADD, con ste formato conseguimos que las
variables del campo compuesto VALORES se resten al valor de las variables con
el mismo nombre del campo compuesto OTROS, obteniendo como resultado: 280
(de la variable DOS del campo VALORES) - 110 (de la variable DOS del campo
OTROS) = 170.
Si hubiera coincidido alguna variable mas con el mismo nombre en ambos
campos tambin se hubiese restado.
Nota: Tened en cuenta que al utilizar restas el signo puede ser negativo y si no
tenemos bien declarada la variable que va a contener el resultado, sta cojer su
valor absoluto.
MULTIPLY , sta es la instruccin que utilizaremos para realizar multiplicaciones y tiene los siguientes
formatos:
1.- MULTIPLY variable literal BY variable ( ROUNDED) (ON SIZE ERROR ) instruccin
2.- MULTIPLY variable literal BY variable literal GIVING variable (ROUNDED) (ON SIZE
ERROR ) instruccin
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD y SUBTRACT, veremos a
continuacin unos ejemplos y su explicacin.
Formato 1:
MULTIPLY 5 FROM RESULTADO.
Multiplica el nmero 5 por el valor de la variable RESULTADO, guardando en sta
misma el resultado de la operacin que ser: 5 x 10 (de la variable RESULTADO)
= 50.
Formato 2:
MULTIPLY 5 BY TRES GIVING RESULTADO.
Aqu multiplicaremos el nmero 5 por el valor de la variable TRES guardando el
resultado en la variable RESULTADO, sin tener en cuenta su valor inicial, es decir,
ser de: 5 x 540 (de la variable TRES) = 2700.
DIVIDE , sta es la instruccin que utilizaremos para realizar divisiones y tiene los siguientes
formatos:
1.- DIVIDE variable literal INTO variable (ROUNDED) (ON SIZE ERROR ) instruccin
2.- DIVIDE variable literal (BY INTO) variable literal GIVING variable (ROUNDED)
(REMAINDER ) variable (ON SIZE ERROR ) instruccin
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD, SUBTRACT y MULTIPLY,
veremos a continuacin unos ejemplos y su explicacin.
Formato 1:
DIVIDE 10 INTO TRES.
Divide el valor de la variable TRES entre el nmero 10, guardando el resultado en
la variable TRES: 540 (de la variable TRES) / 10 = 54.
Formato 2:
DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER RESTO.
Aqu dividiremos el valor del la variable TRES entre 7 guardando el resultado en
la variable RESULTADO, sin tener en cuenta su valor inicial, y adems el resto de
la operacin lo guardar en la variable RESTO, quedando as: 540 / 7 = 77, pero
como 7 x 77 son 539 el resto es 1 que ser el valor de RESTO. Si en vez de
utilizar INTO utilizamos BY cambia el orden de los operandos, es decir en vez de
dividir TRES entre 7 dividiramos 7 entre TRES.
La opcin REMAINDER no es obligatoria, todo depender del uso que queramos
hacer de la instruccin. La variable que ira a continuacin guardar el resto de la
divisin.
COMPUTE , con sta orden podemos realizar todos los clculos aritmticos posibles en una sola
instruccin, utilizando los operadores +(suma) -(resta) *(multiplicacin) /(divisin) **(potenciacin),
adems de utilizar parntesis para especificar mejor la operacin a realizar.
1.- COMPUTE variable (ROUNDED) = expresin aritmtica (ON SIZE ERROR) instruccin
Utilizando la misma WORKING que hemos utilizado anteriormente vamos a ver un ejemplo:
Formato 1:
COMPUTE RESULTADO = DOS OF VALORES * 16 / 100.
El valor de la variable RESULTADO ser de 44, obtenido despus de multiplicar
280 (de la variable DOS del grupo VALORES) x 16 y lo que de dividido entre 100.
En realidad si hacemos el clculo en una calculadora nos daremos cuenta que el
resultado exacto es 44,80 pero como la variable RESULTADO no la hemos
definido con decimales stos son depreciados por el compilador.
Puesto que la variable DOS pertenece a dos grupos de variables deberemos
especificar a que grupo pertenece (OF VALORES).
Debemos de tener en cuenta que siempre tienen preferencia los operadores que
vayan entre parntesis, a continuacin los de multiplicacin y divisin (*) y (/) y
por ltimo los de suma y resta (+) y (-) y el orden en que va a ir realizando las
operaciones ser de izquierda a derecha, por lo tanto:
COMPUTE RESULTADO = 2 + 3 * 5.
Esta operacin dara como resultado 3*5=15+2=17.
COMPUTE RESULTADO = (2 + 3) * 5.
En cambio sta otra dara: 2+3=5*5=25.
Espero que hayais notado la diferencia y la podais aplicar a vuestros casos en
concreto.
Para todas stas instrucciones de clculo que hemos visto la opcion ROUNDED significa lo mismo y
quiere decir que fuerza al redondeo del resultado para cada operacin y siempre teniendo en cuenta la
definicin de la variable que va a guardar ese resultado, por ejemplo si tras una operacin resulta
18,76 ste podra quedar como sigue:
Instr. de Archivos
pgina(s) : 1/5
(6114 palabras totales en este texto)
(6975 Lecturas)
Sin duda son las instrucciones mas importantes con las que cuenta el lenguaje Cobol, con ellas
tendremos la oportunidad de manipular toda la informacin contenida en nuestros archivos, es decir,
podremos abrir archivos, cerrarlos, leerlos, guardar informacin nueva o modificar datos existentes.
Todo sto lo haremos con las instrucciones que voy a explicar a continuacin.
Antes de empezar a explicar stas instrucciones me gustara que entendiseis bien algunos conceptos
como fichero, registro y campo, para que podais comprender mas claramente, la explicacin de todas
las instrucciones que se vern en sta seccin.
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.
OPEN, sta es la instruccin que utilizaremos para abrir un archivo, o lo que es lo mismo hacerlo
disponible para operar sobre el, obviamente ste archivo debe de haberse descrito en la Environment
y la Data segn se explic, su formato es el siguiente:
OPEN (EXCLUSIVE ) modo nombre de archivo ( WITH LOCK) (WITH NO REWIND)
Donde modo, indica como se abrir el archivo y puede tener los siguientes valores segn su
utilizacin:
INPUT, el archivo se abrir solo para lectura, es decir no podremos grabar ni modificar datos
del mismo.
I-O, el archivo se abrir como lectura y escritura, con lo cual tendremos acceso a toda la
informacin de dicho archivo para leerla, escirbirla, reescribirla o borrarla.
OUTPUT, el archico se abre solo para escritura, es el formato que se utiliza en los achivos de
impresin y secuenciales. Tiene la particularidad que crea el fichero nuevo cada vez que se
utiliza, por lo tanto hay que tener cuidado con archivos Indexados.
EXTEND, igual que el anterior pero no crea el archivo, sino que la informacin se va aadiendo
a la ya existente. Se utiliza para archivos secuenciales.
Las opciones EXCLUSIVE y WITH LOCK, nos indica cuando trabajamos en multipuesto que ste archivo
estar bloqueado, es decir que no estar disponible para otros usuarios. El hecho de que existan dos
opciones para lo mismo es por compatibilidad con versiones anteriores.
La opcin WITH NO REWIND, se utiliza cuando utilizamos archivos de cinta, para que no la rebobine al
abrirla.
...
PROCEDURE DIVISION.
INICIO.
READ, es la instruccin que utilizamos para leer registros de un archivo, debe de estar abierto. Con
ella conseguimos que los datos referentes al registro accedido queden en la descripcin de dicho
fichero, es decir, conseguimos que los campos declarados en la FD, tengan el valor correspondiente al
registro leido.
La sentencia READ, se utiliza para leer ficheros secuanciales o indexados, o para leer indexados de
manera secuencial, por lo que su sintaxis tiene dos formatos principales.
Formato para leer ficheros de manera secuncial. (Indexados o secuenciales)
READ nombre de archivo ( NEXT/PREVIOUS RECORD) ( INTO descripcin) (AT END / NO AT
END sentencia) END-READ
nombre de archivo corresponder a algn archivo abierto anteriormente.
La opcin NEXT RECORD, indica que se va a leer el siguiente registro y es la que se toma por defecto,
ya que, cuando estamos leyendo un archivo de forma secuencial, ste leer registros uno tras otro,
hasta llegar al final.
La opcin PREVIOUS RECORD leera el registro anterior. Esta opcin es la nica que no es vlida para
ficheros secuenciales de ste formato.
La opcin INTO, indica cual de las descripciones de registro que hayamos podido declarar ser la que
almacene los datos del registro leido. Tenemos que tener en cuenta que Cobol nos permite mantener
mas de una descripcin de registro para un mismo archivo. Si tuvieramos mas de una, sta sera la
opcin para indicarle cual es la que queremos utilizar en sta lectura.
La sentencia que va despus de AT END , indica que debe de hacer el programa al llegar al final del
fichero. Puede ser cualquier orden de cobol, pero es evidente que si volvemos a leer una vez llegado al
final, producir un error.
...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
LECTURA.
READ ARTICULOS NEXT RECORD AT END GO CERRAR.
...
...
...
GO LECTURA.
CERRAR.
CLOSE ARTICULOS.
...
Nota: Si bien este formato nos sirve para leer cualquier tipo de archivo de
manera secuencial, en el caso de que el archivo fuera secuencial, ste solo se
podra leer as.
Existen muchas ocasiones en que un archivo indexado nos interesa leerlo de
manera secuencial. Si lo hicieramos ste sera su formato, adems en ste caso
podriamos leerlo tanto del principio al final con la opcin NEXT, como del final al
principio con la opcin PREVIOUS.
Para poder leer un fichero indexado de manera secuencial, deberemos de haber
especificado en la SELECT, que su acceso va a ser DYNAMIC o SEQUENTIAL.
Las opciones que se repiten con con el formato anterior tienen el mismo formtato y producen el
mismo resultado.
La opcin KEY, indica por que clave se va a leer el fichero, siempre que ste tenga mas de una.
La sentencia despus de INVALID KEY se utiliza para ejecutar una accin cuando se intenta acceder a
un registro que no existe. En el caso de utilizar NOT INVALID KEY sera al contrario, es decir cuando el
registro existe.
...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
LECTURA.
MOVE 100 TO CLAVE-ARTICULO.
READ ARTICULOS INVALID KEY GO ERROR.
...
...
...
GO LECTURA.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
Nota: Sin duda la forma mas usual de acceder a un registro ser por su clave.
Asi por ejemplo para acceder a un fichero de poblaciones cuya clave fuera su
cdigo postal, dando cualquier cdigo accederiamos a ese registro en concreto.
La accin que hagamos despus de un INVALID KEY, depender del contexto en
que se encuentre, podremos volver a solicitar otra clave, permitir crear un
registro, etc ..
WRITE, con sta instruccin se consigue grabar la informacin contenida en ese momento en los
campos del registro de un fichero. Es decir, si introducimos una ficha nueva en la agenda con los datos
de un nuevo amigo, sta instruccin ser la que nos sirva para almacenar en el fichero los datos. A
partir de ese momento estarn disponibles tantas veces como queramos para leerla. Y por supuesto el
fichero debe de estar abierto como OUTPUT o I-O.
WRITE nombre de registro ( FROM descripcin) ( INVALID KEY / NOT INVALID KEY sentencia)
END-WRITE
La opcin FROM, indica con cual de las descripciones de registro que hayamos podido declarar se
graben los datos en el fichero. Hay que sealar que sta descripcin puede estar definida en la
WORKING, y lo que nos ahorra en realidad es mover los datos de esa descripcin que hemos usado
como "temporal" a la autntica descripcin del registro.
Las clusulas de INVALID KEY y NOT INVALID KEY, tienen la misma funcin dada en la instruccin
READ. Solo que aqui, INVALID KEY , se producira cuando al grabar el registro, ste ya existiese o
hubiera algn error por el cual no se pudieran grabar los datos.
...
PROCEDURE DIVISION.
INICIO.
Adems de ste formato, existe para sta instruccin otro muy comn. Y es el que utilizamos para
enviar datos a la impresora, es decir para listar, para imprimir.
Es en ste caso, donde se hace indispensable el uso de mas de una descripcin por registro. Porque?
Sencillo, definiremos nuestro fichero con un registro de tamao igual al ancho de nuestro listado, y
luego en la WORKING, describiremos el formato de cada una de las lineas que utilizaremos en la
impresin. Quiero hacer un ejemplo mas extenso para ste caso, que ser muy utilizado y distinto en
su filosofa al resto.
WRITE nombre de registro ( FROM descripcin) ( AFTER nmero de lineas)(PAGE) END-WRITE
Adems para ste formato tendremos la clusula AFTER, en la cual indicamos el nmero de lineas que
debe de avanzar la impresora antes de escribir, o bien que lo haga directamente al principio de la
siguiente pgina, poniendo AFTER PAGE. Existen algunas otras clusulas, pero no las vamos a ver aqu
por ser poco usadas.
IDENTIFICATION DIVISION.
PROGRAM-ID. LISTADO.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IMPRESORA ASSIGN TO PRINT "LPT1".
DATA DIVISION.
FILE SECTION.
FD IMPRESORA LABEL RECORD OMITTED.
01 REG-IMPRE PIC X(80).
WORKING-STORAGE SECTION.
01 LINEA1.
02 FILLER PIC X(30) VALUE SPACES.
02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 1".
01 LINEA2.
02 FILLER PIC X(30) VALUE SPACES.
02 FILLER PIC X(20) VALUE "ESTA ES LA LINEA 2".
...
...
PROCEDURE DIVISION.
INICIO.
OPEN OUTPUT IMPRESORA
ESCRIBIR.
WRITE REG-IMPRE FROM LINEA1 AFTER PAGE.
WRITE REG-IMPRE FROM LINEA2 AFTER 2.
...
...
CERRAR.
CLOSE IMPRESORA.
...
Nota: Como podeis ver, hemos definido el registro como REG-IMPRE, pero al
escribir sobre el fichero impresora utilizamos las descripciones de LINEA1 y
LINEA2, de sta manera conseguimos que se impriman las dos lineas en una
impresora conectado al puerto LPT1 y que antes de escribir la primera linea, salte
a una pgina en blanco.
REWRITE, sta instruccin se utiliza para regrabar datos de un registro ya existente. Toda la sintaxis
es exactamente igual que la explicada en WRITE.
REWRITE nombre de registro ( FROM descripcin) ( INVALID KEY / NOT INVALID KEY sentencia)
END-REWRITE
Todas las opciones igual que en WRITE. Por lo que en el ejemplo vamos a ver ambos casos juntos.
...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
LECTURA.
MOVE 100 TO CLAVE-ARTICULO.
MOVE "ANDRES MONTES" TO NOMBRE.
WRITE REGISTRO-ARTICULO INVALID KEY GO ERROR.
MOVE "OTRO NOMBRE" TO NOMBRE.
REWRITE REGISTRO-ARTICULO INVALID KEY GO ERROR.
...
...
GO CERRAR.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
Nota: Podemos decir que sta sentencia es la que utilizaremos para modificar el
contenido de cualquier registro, pero eso si, nunca podremos alterar la clave,
solo los campos que no formen parte de la clave principal.
Si quisieramos modificar cualquiera de los campos clave de un registro,
deberamos crear uno nuevo con el mismo contenido pero con la clave que ahora
queramos y luego borrar el que tenamos.
DELETE, instruccin para borrar un registro de un fichero. La explicacin es corta, pero tiene pocos
mas matices, lo que conseguimos es borrar todos los datos de un registro. Su sintaxix es la siguiente:
DELETE nombre de fichero ( INVALID KEY / NOT INVALID KEY sentencia) END-DELETE
Las nicas clusulas INVALID y NOT INVALID KEY, se usan exactamente igual que en las dems
relativas a ficheros, es decir ejecutar la sentencia que pongamos a continuacin cuando una de las
condiciones se cumpla, que la clave exista o que no exista.
Si nos fijamos vemos que la gran diferencia est en que aqu la orden hace referencia al nombre del
fichero y no al del registro, como en las instrucciones anteriores.
...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
LECTURA.
MOVE 100 TO CLAVE-ARTICULO.
READ ARTICULOS INVALID KEY GO ERROR.
DELETE ARTICULOS INVALID KEY GO ERROR.
...
...
GO CERRAR.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
...
Nota: Obviamente para borrar un registro, primero hemos de tenerlo en
memoria, por eso en el ejemplo lo he leido primero.
START, sta instruccin es de suma importancia en el tratamiento de ficheros, y nos sirve para
posicionarnos en cualquier parte del mismo, para una lectura mas rpida. Si imaginamos un fichero
con 10.000 clientes, clasificados por cdigo, para ver todos los que cuyo cdigo es mayor a 9.000,
tendramos que leernos el fichero secuencialmente hasta llegar al sitio correcto, en cambio con sta
orden, podremos colocarnos en la posicin del fichero que queramos dentro de unas normas, que
veremos a continuacin.
START nombre de fichero KEY (expresin) nombre de clave ( INVALID KEY / NOT INVALID KEY
sentencia) END-START
Las nicas clusulas INVALID y NOT INVALID KEY, se usan exactamente igual que en las dems
relativas a ficheros, es decir ejecutar la sentencia que pongamos a continuacin cuando una de las
condiciones se cumpla, que la clave exista o que no exista.
Si nos fijamos vemos que la gran diferencia est en que aqu la orden hace referencia al nombre del
fichero y no al del registro, como en las instrucciones anteriores.
La expresin a la que se hace referencia en la sintaxis, pueden ser las siguientes:
...
PROCEDURE DIVISION.
INICIO.
OPEN I-O ARTICULOS.
COLOCAR.
MOVE 100 TO CLAVE-ARTICULO.
START ARTICULOS KEY NOT LESS KEY CLAVE-ARTICULOS
INVALID KEY GO ERROR.
LECTURA.
READ ARTICULOS NEXT RECORD AT END GO CERRAR.
...
GO LECTURA.
ERROR.
...
...
GO CERRAR.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
...
Nota: Aqui empezariamos a leer el ficher artculos desde la clave que no sea
menor que 100, es decir de 100 en adelante. Fijaros como luego la lectura se
hace en otro prrafo diferente, ya que sino, siempre estariamos haciendo el
START. Recordad que con sta instruccin SOLO nos situamos en un sitio
determinado del fichero, a partir de ah podremos operar como queramos.
RESUMIENDO
En la programacin estructurada es conveniente sustituir el punto como final de una instruccin por la
clusula END-....... para cada instruccin. De esta manera conservamos la estructura y no obligamos
con el punto a finalizar ninguna instruccin o bucle en el que estemos metidos.
Una vez vistas todas las intrucciones relativas a ficheros, quiero dejar bien claro su utilizacin.
Tendremos siempre en cuenta que cuando leemos, realmente le damos el valor del registro que hemos
leido a los campos o variables que lo componen. Que cuando grabamos o regrabamos, le estamos
dando el valor de las variables en ese momento al registro para que se grabe en disco y cuando
borramos, estamos quitando fisicamente del disco esa informacin.
He realizado un temtico dedicado integramente al uso de ficheros, podis echarle un vistazo por si os
han quedado dudas.
Instr. de Pantalla
pgina(s) : 1/3
(5792 palabras totales en este texto)
(6313 Lecturas)
Sin duda alguna e independientemente del lenguaje de programacin escogido, las instrucciones que
mas se suelen utilizar, sern las que hagan uso de la pantalla, ya sea como salida o entrada de
informacin.
Para la programacin en Windows, pondr la informacin en la Seccin "Programando en Windows".
Vamos a utilizar sta seccin para hacer un anlisis profundo de dichas instrucciones.
ACCEPT, es la instruccin que usaremos para la entrada de datos. Aunque su sintaxis principal nunca
ha variado, sta ha sido una de las instrucciones que mas clusulas se le han ido aadiendo, incluso
diferentes segn el compilador, aqu vamos a explicar las comunes y principales.
Aunque la forma mas usual de utilizarla, es para aceptar datos por el teclado, tambin es posible
utilizarla para "cogerlos" tambin del sistema, para aceptar valores de variables de entorno definidas
previamente a nivel de sistema o para aceptar pantallas completas definidas en la SCREEN-SECTION.
Adems siguen aumentando sus posibilidades. Veamos sus formatos principales:
Formato para aceptar datos del sistema o variables de entorno.
ACCEPT variable FROM (DATE, DAY, DAY-OF-WEEK, TIME, CENTURY-DATE, CENTURY-DAY,
ESCAPE-KEY, ENVIRONMENT variable de entorno)
Segn la opcin escogida, as ser el valor que contendr la variable usada, una vez completada la
sentencia. Veamos cada una de las opciones:
DATE, devuelve la fecha en formato AAMMDD, por lo que la variable debe de estar definida con
PIC 9(6).
CENTUY-DATE, igual que DATE, pero acepta la fecha con 8 dgitos en formato SSAAMMDD.
Definir con PIC 9(8).
DAY, devuelve el ao y el da del ao en que estamos con el formato AADDD, siendo el valor 1,
para el 1 de Enero y as sucesivamente. Debe de estar definida con PIC 9(5).
CENTURY-DAY, igual que DAY, pero acepta 4 dgitos para el ao, quedando el formato
AAAADDD. Definir con PIC 9(7).
DAY-OF-WEEK, devuelve un dgito que indica el da de la semana, siendo 1 el Lunes, 2 el
Martes, ... Aqu, la variable debe de estar definida como PIC 9.
TIME, devuelve la hora con formato HHMMSSMM, la variable debe de estar como PIC 9(8).
ESCAPE-KEY, devuelve el cdigo de la tecla de excepcin pulsada, debe de estar definida con
PIC 99 y segn el compilador los valores pueden ser distintos, pero los bsicos suelen ser los
mismos, por ejemplo: ENTER=13, FLECHA ARRIBA=52, FLECHA-ABAJO=53 y las teclas de
funcin desde F01 hasta F8 tomaran los valores del 1 al 8, TAB=9.
ENVIRONMENT "Variable de entorno" , nos devuelve el valor que dicha variable tenga
asignado, normalmente stas variables se asignan en el fichero de configuracin del
compilador o desde una variable del sistema. Puede ser muy til para darle capacidades a
usuarios diferentes por ejemplo. Tener en cuenta que la variable de entorno debe de ir entre
comillas para que sea reconocida.
La definicin de la variable que he dado, no es fija, pero si la mas conveniente, es decir para guardar
el dia de la semana, he indicado una variable con PIC 9, pero podamos haber escogido PIC 9(8), lo
que pasa, es que no tendra mucho sentido malgastar espacio, cuando sabemos con seguridad, que el
dato posible es de 1 a 7, y por lo tanto de PIC 9.
Adems de todas stas opciones, cada compilador ha ido incorporando las que ha creido conveniente y
por ejemplo con algunas de las nuevas es posible saber informacin sobre el sistema sobre el que
trabajamos, el terminal, la lnea, etc ....
...
WORKING-STORAGE SECTION.
77 DIA PIC 9.
77 FECHA PIC 9(6).
77 FECHA8 PIC 9(8).
...
PROCEDURE DIVISION.
INICIO.
ACCEPT DIA FROM DAY-OF-WEEK.
ACCEPT FECHA FROM DATE.
ACCEPT FECHA8 FROM CENTURY-DATE.
...
Nota: Si usarames ste programa el da 1 de Julio de 1.999, el valor de las
variables sera:
FECHA=990701.
FECHA8=19990701
DIA=4.
El 4 nos indicara que el da de la semana sera Jueves.
ERASE EOL, (ACCEPT Y DISPLAY) le indicamos que borre la lnea sobre la que estamos desde
la posicin del ACCEPT.
ERASE EOS, (ACCEPT Y DISPLAY) le indicamos que borre toda la pgina desde la posicin de
la lnea en la que estamos.
PROMPT carcter, (ACCEPT) conseguimos que rellene con algn carcter especfico o por
defecto el cursor bajo (_) la longitud del campo que vamos a aceptar. Es bastante til ya que
el usuario puede ver claramente la longitud del campo.
ECHO, (ACCEPT) con sta clusula hacemos que vuelva a "pintar" el contenido del campo
despus de aceptado. Es decir si le hemos puesto PROMPT ECHO, mientras se acepta saldrn
los guiones bajos para indicar el tamao pero al salir del campo se volver a displayar y stos
guiones desaparecern.
REVERSE, (ACCEPT Y DISPLAY) conseguimos que el campo que aceptamos se vea en video
inverso, si normalmente es blanco sobre negro, se har negro sobre blanco, y si tenemos
otros colores, pues en su color inverso.
SIZE variable, constante numrica, (ACCEPT) variamos el tamao de la variable que tenamos
declarado. Por ejemplo si definimos una variable con PIC X(40) y le indicamos al aceptarla
SIZE 10, solo aceptar 10 caracteres para esa variable.
CONVERT, (ACCEPT Y DISPLAY) con sta clusula conseguimos que si estamos aceptando un
campo numrico o alfabtico, e introducimos un valor no aplicable, lo ignore. Por ejemplo si
introducimos una letra en un campo numrico ser ignorada si CONVERT aparece.
UPDATE, (ACCEPT) hace que el valor actual del campo aparezca y al aceptar podamos
modificar sobre su contenido actual. Es muy aconsejable cuando estamos modificando datos.
CONTROL tipo de control, (ACCEPT Y DISPLAY) sta clusula es bastante amplia y en ella
podemos atribuir otras opciones como caracteres grficos, colores, etc.. Su uso puede variar
segn los compiladores. Mas abajo encontrareis mas informacin.
ON EXCEPTION variable instruccin (ACCEPT) si al aceptar el campo introducimos una de las
teclas que causa excepcin, es decir que no es reconocida dentro de la tabla de caracteres
admitida, el valor de la tecla se guardar en la variable que definamos y a continuacin
podremos realizar una instruccin. Por ejemplo si estamos aceptando un campo con PIC X(40)
y cuando estamos metiendo su valor pulsamos la tecla escape, si tenemos sta clusula
puesta la variable tomar el valor 27 (correspondiente a la tecla escape) y a continuacin se
ejecutara la instruccin que hubiramos puesto. Pero todo esto se ve mejor con los ejemplos
que a continuacin voy a indicar. Decir que la variable debe de estar definida con PIC 9 COMP1.
UPPER, LOWER, (ACCEPT) con stas opciones obligamos a que el valor del campo aceptado
est en Maysculas (UPPER ) o Minsculas (LOWER).
COLOR, (ACCEPT y DISPLAY) clusula propia de Acucobol con la que conseguimos aceptar el
campo con un determinado color dependiendo de una tabla para asignacin de colores.
REQUIRED, (ACCEPT) con sta opcin obligamos al usuario a que no deje el campo en blanco
e introduzca cualquier dato.
FULL, (ACCEPT) obligamos a que una vez empecemos a introducir un campo, este no se
acepte hasta que est completo, es decir si aceptamos una variable con PIC X(30), mientras
no introduzcamos los 30 caracteres no nos dejar seguir.
Color
Letra Fondo
Negro
32
Azul
64
Verde
96
Celeste
128
Rojo
160
Morado
192
Observaciones
Para conseguir los colores, debemos de
sumar las dos cantidades
correspondientes a la letra y al fondo,
por ejemplo si queremos el fondo blanco
y la letra azul, el valor que se le debera
de asigna a la clusula COLOR ser de
258 (256 fondo blanco + 2 letra azul).
Marrn
224
Blanco
256
TIPOS DE CONTROL. Voy a explicar algunos de los atributos que se pueden utilizar cuando la frase
CONTROL se especifica en ACCEPT o DISPLAY. El formato es el siguiente:
CONTROL "FCOLOR=color, .............".
FCOLOR, color de primer plano, utilizaremos los nombres de los colores (white, black, red,
blue, green, magenta, brown y cyan).
BCOLOR, color de fondo y la gama de colores igual que la anterior.
DISPLAY, es la instruccin que usaremos como salida de datos en pantalla. Con ella mostraremos
cualquier texto, cualquier variable, cualquier constante o cualquier valor, en resumidas es la
instruccin para que aparezca lo que sea en pantalla. Las clusulas asociadas a esta instruccin son
practicamente las mismas que hemos visto para ACCEPT, con lo que solo las indicar, su explicacin la
obtendris arriba. De todas maneras sta instruccin est siendo implementada en muchos mas
campos, por determinados compiladores y no sera justo pensar que su nica funcin es la que voy a
explicar aqu, lo que si es cierto es que sta es la comn a todos los compiladores. Mas abajo hablar
un poco de todo esto que os digo y de su futuro.
DISPLAY variable, literal CLAUSULAS ...
LINE, COL, SIZE, HIGH, LOW, REVERSE, BEEP, BLINK, ERASE. Todos funcionan igual que
con la sentencia ACCEPT.
TIPOS DE CONTROL. Adems de los vistos en ACCEPT y DISPLAY podemos utilizar otros:
CONTROL "FCOLOR=color, .............".
FCOLOR, igual que en ACCEPT.
BCOLOR, igual que en ACCEPT.
GRAPHICS, segn una tabla es posible utilizar caracteres semigrficos en cualquier sistema.
Cuando programamos en MS-DOS, estos caracteres se pueden asignar muy facilmente pero al
trabajar con sistemas UNIX-LINUX, gracias a sta clusula podemos conseguir esos
carcteres. Existe una tabla para asignar los valores, por ejemplo la "q" nos da la linea
horizontal (Alt+196 (-)) con la que se forman los cuadros, la "m" nos da la vertical (Alt+179
()) Aqui no se ven bien.
WINDOW-CREATE, WINDOW-REMOVE, En RM/Cobol, tambin se utiliza para crear y borrar
las pantallas virtuales con las que Cobol puede trabajar, pero para ver su uso, os podeis ir a la
seccin que existe especfica para ello en TEMATICOS.
...
WORKING-STORAGE SECTION.
77 NOMBRE PIC X(30).
...
PROCEDURE DIVISION.
INICIO.
DISPLAY " " LINE 1 ERASE CONTROL "FCOLOR=BLUE, BCOLOR=WHITE".
DISPLAY "INTRODUZCA EL NOMBRE" LINE 10 COL 10 REVERSE.
ACCEPT NOMBRE LINE 10 COL 34 PROMPT LOW ECHO.
...
Nota: Una cosa a tener en cuenta tanto con FCOLOR, como con BCOLOR, es que
los colores que tomen seguirn activos hasta encontrar otra orden que los
cambie, por eso al comenzar con esa primera linea conseguimos que toda la
pantalla se muestre blanca y el texto en azul para todo el programa, hasta que
se encuentre el compilador con otra linea que lo cambie. O sea que no ser
necesario seguir incluyendo la clusula CONTROL, en todos los ACCEPT y
DISPLAY que vayamos a utilizar mientras queramos mantener ste formato.
DISPLAY nombre de pantalla CLAUSULAS ..., podemos mostrar una pantalla completa que
previamente hayamos definido en la SCREEN SECTION.
DISPLAY WINDOW CLAUSULAS ... , en Acucobol se utiliza para crear las ventanas virtuales con las
que Cobol puede trabajar, pero para ver su uso, os podeis ir a la seccin que existe especfica para ello
TEMATICOS.
DISPLAY LINE CLAUSULAS ..., conseguimos dibujar una lnea vertical u horizontal donde le
indiquemos con las clusulas correspondientes. (No todos los compiladores), se incorporan adems
stas clusulas:
DISPLAY BOX CLAUSULAS ..., igual a la anterior per conseguimos dibujar un cuadro, muy til, pero
no todos los compiladores lo tienen implementado. Se incorporan adems stas clusulas:
Instr. de Variables
pgina(s) : 1/5
(5707 palabras totales en este texto)
(6013 Lecturas)
Dar cabida en esta seccin a la explicacin de todas las instrucciones que hacen referencia a las
variables y sus valores. Como todas, este grupo de instrucciones tiene su vital importancia en la
programacin y son usadas habitualmente.
MOVE, es la instruccin que usaremos para enviar datos de una variable a otra u otras.
Lo que en realidad hace es que la una variable adquiera un valor determinado, ya sea procedente de
otra variable o bien desde un valor fijo o constante.
Estos son los dos formatos que posee:
Formato 1:
MOVE variable, valor TOvariable, variable, variable, ....
Con el primer formato las variables que siguen al TO tomarn el dato de la variable o del valor
que le preceden. De todo se ver al final una serie de ejemplos bien detallados.
Siempre tendremos una serie de normas o restricciones para asegurarnos de que los valores
han pasado correctamente.
Si adems el campo al que se mueven los datos es de edicin, al hacer el paso del valor, este a su
vez se formatear con la edicin declarada en la WORKING.
Si son alfanumricos la alineacin se efectuar a la izquierda a menos que se haya especificado en
la WORKING, al definirla, una justificacin a la derecha (JUST RIGHT). Al igual que en los numricos si
es mas pequeo se perdern los caracteres que no quepan y si es mas grande el resto ir relleno de
espacios en blanco.
...
WORKING-STORAGE SECTION.
77 NUMERO1 PIC 9(6).
77 NUMERO2 PIC 9(8)V99.
77 NUMERO3 PIC ZZZ.ZZZ,ZZ.
77 TEXTO1
PIC X(15) VALUE "LENGUAJE COBOL".
77 TEXTO2
PIC X(10).
77 TEXTO3
PIC X(20) JUST RIGHT.
...
PROCEDURE DIVISION.
INICIO.
MOVE 1536 TO NUMERO1.
MOVE NUMERO1 TO NUMERO2 NUMERO3.
MOVE TEXTO1 TO TEXTO2 TEXTO3.
...
Nota: Despus de aplicar estas sentencias, ste sera el resultado:
NUMERO1=001536
NUMERO2=0000153600 (La coma decimal es virtual)
NUMERO3= 1.536,00
TEXTO1=LENGUAJE COBOL
TEXTO2=LENGUAJE C
TEXTO3=
LENGUAJE COBOL
Formato 2:
INITIALIZE, se utiliza para inicializar variables segn su descripcin, es decir pondr a ceros todas
las variables numricas o de edicin y a espacios en blanco las alfabticas y alfanumricas. No
funciona con campos definidos como FILLER, (evidente). Y puede ser muy til para inicializar tablas
completamente cuando nos referimos al nivel mas alto de la misma.
...
WORKING-STORAGE SECTION.
77 TEXTO PIC X(10) VALUE "HOLA MUNDO".
77 NUMERO PIC 9(8) VALUE "12345678".
...
PROCEDURE DIVISION.
INICIO.
INITIALIZE TEXTO NUMERO.
...
INSPECT, esta sentencia se utiliza para contar, reemplazar o contar y reemplazar caracteres o grupos
de caracteres dentro de un campo. Se puede contar las veces que aparece un caracter, o cambiar
todos esos caracteres por otros, etc ...
Esta instruccin tiene formatos diferentes segn lo que se desee hacer, as que vamos a ver cada uno
de ellos por separado.
Formato 1:
INSPECT campo1
TALLYING variable1 FOR ( CHARACTERS)
(( BEFORE/AFTER) INITIAL) Cadena1
(ALL)(LEADING) Cadena2 ...
(Se puede repetir de nuevo)
Este formato es el utilizado para contar el nmero de veces que aparece Identificador1 en el campo1 y
guardar el valor en la variable1 que previamente hayamos definido en la WORKING.
CHARACTERS, indica que cuente todos los caracteres del campo incluso los espacios
en blanco.
ALL, indica que tiene que buscar en todos los caracteres del campo, la cadena
especificada en Cadena2.
LEADING, indica que tiene que buscar la cadena especificada en Cadena2, pero solo
hasta que encontremos uno diferente, si nada mas empezar es diferente el resultado
sera directamente 0.
BEFORE INITIAL, busca solo hasta que aparezca la cadena especificada como
Cadena1.
AFTER INITIAL, empieza a buscar justo despus de la cadena especificada en
Cadena1.
Veamos unos ejemplos para salir de dudas. Primero vamos a definir una WORKING-STORAGE.
...
WORKING-STORAGE SECTION.
77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".
77 CONTA PIC 9(8).
...
PROCEDURE DIVISION.
INICIO.
INSPECT TEXTO TALLYING CONTA FOR CHARACTERS.
...
El valor de conta ser de 15 que son los caracteres que tiene la variable TEXTO.
INSPECT TEXTO TALLYING CONTA FOR ALL "A".
...
El valor de conta ser de 2 que son las veces que aparece la letra A en la
variable TEXTO.
INSPECT TEXTO TALLYING CONTA FOR LEADING "A".
...
El valor de conta ser de 0 porque no aparece ninguna A en el primer carcter
de la variable TEXTO.
INSPECT TEXTO TALLYING CONTA FOR ALL "A"
BEFORE INITIAL "N".
...
El valor de conta ser de 1 que son las veces que aparece la letra A en la
variable TEXTO hasta la aparicin del caracter N.
INSPECT TEXTO TALLYING CONTA FOR ALL "A"
AFTER INITIAL "G".
...
El valor de conta ser de 1 que son las veces que aparece la letra A en la
variable TEXTO, empezando a contar desde el caracter G.
Formato 2:
INSPECT campo1
REPLACING variable1 CHARACTERS BY Cambio1
(( BEFORE/AFTER) INITIAL)Cadena1
(ALL)(LEADING)( FIRST) Cadena2...
(Se puede repetir de nuevo)
Con este formato podemos cambiar caracteres de Campo1, su funcionamiento es igual que el anterior
formato solo que en vez de contar reemplaza. Se ha incluido solo FIRST, que indicara que solo se
reemplazara la primera vez que coincidieran las condiciones. El tamao de la sustitucin debe de ser
igual al tamao sustituido, ya que la variable campo1 no puede cambiar su tamao.
...
WORKING-STORAGE SECTION.
77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".
77 CONTA PIC 9(8).
...
PROCEDURE DIVISION.
INICIO.
INSPECT TEXTO REPLACING CHARACTERS BY "H".
...
El valor de TEXTO ser "HHHHHHHHHHHHHHH", es decir cambia todos los
caracteres por el caracter H.
INSPECT TEXTO REPLACING ALL "A" BY "I".
...
El valor de TEXTO ser "PIGINI DE COBOL", es decir ha cambiado todas las A
por I.
...
Complicando un poco mas, el valor de TEXTO despues de la sentencia INSPECT
ser PAGI--TOPETOPA, es decir se cambia todas las PA por -- pero empezando a
buscar a partir de la primera letra G y justo hasta la letra T.
MOVE "PAGIPATOPETOPA" TO TEXTO.
INSPECT TEXTO TALLYING CONTA FOR ALL "PA"
REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP".
...
Aqu hemos mezclado ambos formatos y el resultado es el siguiente. El valor de
CONTA es 3 que son las veces que aparece la cadena PA en TEXTO y despus se
ejecuta el REPLACING y el resultado da que TEXTO vale PAGIPATOPEPOPA, ya
que ha cambiado todos los TO por PO pero despus de la cadena OP.
Formato 3:
INSPECT campo1
CONVERTING Identificador1 TO Identificador2
(( BEFORE/AFTER) INITIAL) Cadena1 ...
Con este formato convertimos los caracteres que se especifiquen en identificador1 por los que
pongamos en identificador2, respetando el orden.
Veamos algunos ejemplos, se suele utilizar mucho para que al aceptar un campo nos de igual se ha
sido introducido en maysculas o en minsculas ya que lo convertiriamos a alguno de los formatos.
...
WORKING-STORAGE SECTION.
77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL".
...
PROCEDURE DIVISION.
INICIO.
INSPECT TEXTO CONVERTING "AO"TO "12".
...
El valor de TEXTO ser "P1GIN1 DE C2B2L", convertir todas las A por 1 y todas
las O por 2.
INSPECT TEXTO CONVERTING
"
ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO
"abcdefghijklmnopqrstuvwxyz".
...
El valor de TEXTO ser "pagina de cobol" ya que ha convertido todas las letras
maysculas por minsculas.
Para finalizar con el comando INSPECT, decir que es un comando muy particular y cada uno deber
decidir en cada momento y con que situaciones utilizarlo.
STRING, se utiliza para unir o concatenar campos o partes de estos y el resultado almacenarlo en
otro campo. En la unin se pueden incluir tanto variables como literales o constantes de texto.
STRING campo1, literal1
DELIMITED BY (campo2, literal2)(SIZE)
INTO Campo3
(WITH POINTER Identificador1)
( ON OVERFLOW Sentencia1)
( NOT ON OVERFLOW Sentencia2)
DELIMITED BY, indica hasta donde vamos a "coger" del campo para concatenar sin contar ese caracter o
cadena que se especifique en campo2 o literal2, es decir si tenemos un campo con un valor = "HOLA" y
especificamos DELIMITED BY "L" a la hora de la concatenacin nos hubiera cogido solo el HO, ya que al
encontrarse la primera L hubiera parado.
SIZE, indica que se pasar todo el contenido del campo1 o literal1 sin limitaciones.
INTO, con esto indicamos en que variable se guardar el resultado, campo3.
WITH POINTER, si incluimos esta clusula el valor de identificador1 ser en la posicin en que empezar a
contener datos la variable que recibe el STRING. Ese identificador1 debe estar definido como binario. Por defecto
el valor es 1.
ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la concatenacin, por ejemplo si
se especifica Identificador1 con un valor superior al tamao del Campo3.
Vamos a ver unos ejemplos y adems vamos a comparar como se hubiera hecho utilizando la Working
si no existiera el STRING.
...
WORKING-STORAGE SECTION.
01 LAFECHA.
02 FILLER PIC X(7) VALUE "HOY ES ".
02 LDIA PIC Z9.
02 FILLER PIC X(4) VALUE " DE ".
02 LMES PIC X(10).
02 FILLER PIC X(4) VALUE "DE ".
02 LANIO PIC 9999.
01 FECHA.
02 DIA PIC 99 VALUE 22.
02 MES PIC 99 VALUE 06.
02 ANIO PIC 9999 VALUE 2001.
01 CONSTRING PIC X(40).
01 TABLAMES.
02 FILLER PIC X(30) VALUE "ENERO
FEBRERO MARZO
".
02 FILLER PIC X(30) VALUE "ABRIL
MAYO
JUNIO
".
02 FILLER PIC X(30) VALUE "JULIO
AGOSTO SEPTIEMBRE".
02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ".
01 LATABLA REDEFINES TABLAMES.
02 TMES PIC X(10) OCCURS 12 TIMES.
01 PUNTO PIC 9(4) BINARY.
...
PROCEDURE DIVISION.
INICIO.
MOVE DIA TO LDIA.
MOVE TMES (MES) TO LMES.
MOVE ANIO TO LANIO.
STRING "HOY ES " DIA " DE " TMES (MES) " DE " ANIO
DELIMITED BY SIZE INTO CONSTRING.
...
El valor de LAFECHA sera: HOY ES 22 DE JUNIO
DE 2001.
DE 2001.
Fijaros que el resultado es el mismo pero en cambio gracias a STRING no hemos tenido que
definir ninguna linea en la WORKING ni tampoco tener que mover campos de unas variables a
otras.
La clusula DELIMITED BY se ha puesto al final porque dicha clusula se aplica a todos los
campos que la preceden, si hubieramos querido coger otra limitacin para un campo en
concreto habra que haberlo especificado, por ejemplo vamos a afinar mas el ejemplo y
conseguir que entre el mes JUNIO y el DE no exista mas que un espacio. En el ejemplo
anterior ha unido los 10 caracteres que tiene la variable TMES.
STRING "HOY ES " DIA " DE " DELIMITED BY SIZE
TMES (MES) DELIMITED BY " "
" DE " ANIO DELIMITED BY SIZE INTO CONSTRING.
El valor que tendr ahora CONSTRING ser el siguiente:
HOY ES 22 DE JUNIO DE 2001.
Como veis la diferencia est en los espacios que le sobran al mes, que al poner DELIMITED BY
" " los ha evitado porque solo ha concatenado hasta que ha encontrado el primer caracter en
blanco.
MOVE 4 TO PUNTO.
STRING "HOY ES " DIA " DE " DELIMITED BY SIZE
TMES (MES) DELIMITED BY " "
" DE " ANIO DELIMITED BY SIZE INTO CONSTRING
WITH POINTER PUNTO.
El valor que tendr ahora CONSTRING ser el siguiente:
HOY ES 22 DE JUNIO DE 2001.
Es decir habr empezado a concatenar a partir de la posicin 4 del campo CONSTRING. Si el
valor de CONSTRING previamente era espacios habra dejado 3 espacios en blanco y si
hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera.
UNSTRING, hace exactamente lo contrario de que hemos visto que haca STRING, es decir divide el
contenido de un campo en otros.
UNSTRING campo1, literal1
DELIMITED BY (campo2, literal2)(ALL)
OR (campo2, literal2)(ALL)
(Se puede repetir de nuevo)
INTO Campo3, Campo4, ....
( DELIMITER Identificador1)
( COUNT Identificador2)
(Se puede repetir de nuevo)
(WITH POINTER Identificador3)
(TALLYING Identificador4)
( ON OVERFLOW Sentencia1)
( NOT ON OVERFLOW Sentencia2)
DELIMITED BY, indica el lmite hasta donde vamos cogiendo el campo1 para partirlo. Igual que
en STRING, solo que con la funcin a la inversa.
OR, es igual que DELIMITED y se utiliza si hay varios delimitadores sobre los que buscar.
INTO, indica en que campo o campos se guardar la informacin que vaya fragmentando.
DELIMITER, va a contener en cada caso el elemento separador, si hemos incluido en
DELIMITED varios, Identificador1 guardar el carcter que de los elegidos ha sido el causante
de la fragmentacin.
COUNT, cuenta el nmero de caracteres incluidos en la fragmentacin.
DELIMITER y COUNT, se podrn usar si se ha especificado DELIMITED. Podemos usar tantos
DELIMITER y COUNT como campos se vayan a crear en la fragmentacin.
TALLYING, si especificamos esta opcin la instruccin nos guardar en Identificador4 el
nmero de campos que se han utilizado en la fragmentacin.
POINTER, indica desde que posicin va a ser examinado el campo que desea desfragmentar,
por defecto su valor es 1, es decir desde el primer caracter.
ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la operacin.
NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin.
Vamos a hacer lo contrario de antes y conseguir una fecha numrica de una frase con la fecha:
...
WORKING-STORAGE SECTION.
01 LAFECHA PIC X(30) VALUE "HOY ES 22 DE JUNIO DE 2001".
01 FECHA.
02 DIA PIC 99.
02 MES PIC 99.
02 ANIO PIC 9999.
01 CONSTRING PIC X(40).
01 TABLAMES.
02 FILLER PIC X(30) VALUE "ENERO
FEBRERO MARZO
".
02 FILLER PIC X(30) VALUE "ABRIL
MAYO
JUNIO
".
02 FILLER PIC X(30) VALUE "JULIO
AGOSTO SEPTIEMBRE".
02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ".
01 LATABLA REDEFINES TABLAMES.
02 TMES PIC X(10) OCCURS 12 TIMES.
01 CONTA PIC 99.
01 PALABRAS PIC 99.
01 LETRAS PIC 99.
01 TEXTOS.
02 TEXTO1 PIC X(20).
02 TEXTO2 PIC X(20).
02 TEXTO3 PIC X(20).
02 TEXTO4 PIC X(20).
02 ELMES PIC X(10).
...
PROCEDURE DIVISION.
INICIO.
UNSTRING LAFECHA DELIMITED BY " "
INTO TEXTO1 TEXTO2 DIA TEXTO3
ELMES COUNT LETRAS TEXTO4 ANIO.
PERFORM VARYING CONTA FROM 1 BY 1
UNTIL ELMES = TMES (CONTA) OR CONTA = 12
TALLYING PALABRAS
END-PERFORM
...
TEXTO1 = HOY
TEXTO2 = ES
TEXTO3 = DE
TEXTO4 = DE
ELMES = JUNIO
DIA = 22
ANIO = 2001
FECHA = 22062001
LETRAS = 5
PALABRAS = 7
Instruccin Perform
pgina(s) : 1/4
(8338 palabras totales en este texto)
(5161 Lecturas)
Creo que por mritos propios esta instruccin se merece un apartado para ella sola. Es una instruccin
que nos permite tranferir el control a otro u otros procedimientos o bien realizar una serie de
sentencias dentro de ella misma mientras se cumplan las condiciones que le hayamos indicado. Es la
instruccin mas importante tanto por su variedad de formatos, como por el nmero de veces que se
suele usar dentro de un programa, adems nos puede hacer mucho mas sencillo el realizar una
programacin estructurada.
Cuando decimos que un programa est estructurado, no cabe duda que es debido al uso de sta
instruccin. Pero creo que lo importante no es tanto hablar de ella, sino comenzar a explicarla.
Empecemos a ver sus formatos desde el mas simple al mas complicado: Siempre debis de tener en
cuenta que los ejemplos son solo para aclarar la explicacin, nunca los tomis como programas
completos y con una lgica aplastante.
Formato 1: Con este formato transferimos el control del programa a un prrafo, cuando ste termine
vuelve el control a la instruccin que sigue al PERFORM .
PERFORM nombre_parrafo
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(30).
01 OP PIC X.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE.
DISPLAY 'HOLA ' LINE 10.
DISPLAY NOMBRE LINE 10 COL 6.
ACCEPT OP LINE 20.
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
...
Nota: Simplemente hemos hecho que el programa salte a un prrafo que lo
ejecute y que vuelva el control a la secuencia.
Formato 2: Una extensin del anterior es indicarle que ejecute mas de un prrafo, especificando el
inicio y el fin.
PERFORM nombre_parrafo THRU nombre_parrafo
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP PIC X.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
DISPLAY 'HOLA ' LINE 10.
DISPLAY NOMBRE LINE 10 COL 6.
DISPLAY APELLIDO LINE 10 COL 20.
ACCEPT OP LINE 20.
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
...
Nota: En este caso PIDENOMBRE y PIDEAPELLIDO van seguidos, pero al poner el
THRU lo que conseguimos es que el control no se devuelva hasta llegar al prrafo
indicado despus del THRU. Es decir que entre PIDENOMBRE y PIDEAPELLIDO
podr haber cinco prrados mas y todos ellos se hubieran ejecutado.
Formato 3: Seguimos ampliando las capacidades, ahora conseguimos que el PERFORM se realice
tantas veces como se indique en el nmero o variable que va delante de TIMES.
PERFORM nombre_parrafo THRU nombre_parrafo nmero-variable TIMES
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP
PIC X.
01 LI
PIC 99 VALUE 10.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
PERFORM SALUDAR 3 TIMES.
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
SALUDAR.
ADD 1 TO LI.
DISPLAY 'HOLA ' LINE LI.
DISPLAY NOMBRE LINE LI COL 6.
DISPLAY APELLIDO LINE LI COL 20.
ACCEPT OP LINE 20.
...
Nota: Ahora hemos conseguido que el saludo nos lo muestre 3 veces. Por
supuesto THRU y TIMES pueden ir perfectamente juntos. Ya os he dicho al
principio que los ejemplos pueden no ser muy lgicos, pero si hacen la funcin de
explicacin.
Formato 4: Igual que el antrior formato solo que el nmero de veces que se ejecute depender de
una condicin y no de un nmero fijo.
PERFORM nombre_parrafo THRU nombre_parrafoUNTIL condicin
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP
PIC X.
01 LI
PIC 99 VALUE 10.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
PERFORM SALUDAR UNTIL LI = 15.
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
SALUDAR.
ADD 1 TO LI.
DISPLAY 'HOLA ' LINE LI.
DISPLAY NOMBRE LINE LI COL 6.
DISPLAY APELLIDO LINE LI COL 20.
ACCEPT OP LINE 20.
...
Nota: En este caso el compilador comprueba antes de iniciar el PERFORM que la
condicin no se cumple para ejecutarla, en el momento que se cumpla salta a la
siguiente instruccin. En el ejemplo ejecutar el PERFORM hasta que la variable
LI alcance el valor 15.
PRIMERA CONCLUSION
En los dos primeros formatos, como podris comprobar a menos que sean instrucciones que se vayan
a llamar desde nuestro programa en mas de una ocasin, stas podan haber ido en el lugar del
PERFORM, es decir las instrucciones una detrs de otra y evitar el PERFORM.
Hasta ahora se ha explicado una manera de utilizar la sentencia PERFORM en la que el control pasa a
otro lugar del programa. Como vis el STOP RUN est antes de los prrafos que han sido llamados con
los PERFORM lo cual indica que stos no se ejecutarn sino es precisamente por los PERFORM.
Si bien con esto conseguimos una estructuracin para nuestro programa la instruccin PERFORM nos
permite un mayor grado de estructura incluyendo las sentencias de los prrafos llamados dentro de la
propia sentencia PERFORM.
Para ello hay que tener en cuenta que la utilizacin del punto en las instrucciones dara lugar al fin de
la instruccin y nos dara errores, por ello, para finalizar la instruccin nos basamos en END-PERFORM.
Veamos un ejemplo de ello con los dos ltimos formatos explicados anteriormente.
PERFORM nmero-variable TIMES
sentencias
END-PERFORM
PERFORM UNTIL condicin
sentencias
END-PERFORM
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP
PIC X.
01 LI
PIC 99 VALUE 10.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
PERFORM 3 TIMES
ADD 1 TO LI
DISPLAY 'HOLA ' LINE LI
DISPLAY NOMBRE LINE LI COL 6
DISPLAY APELLIDO LINE LI COL 20
ACCEPT OP LINE 20
END-PERFORM
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
...
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP
PIC X.
01 LI
PIC 99 VALUE 10.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
PERFORM UNTIL LI = 15
ADD 1 TO LI
DISPLAY 'HOLA ' LINE LI
DISPLAY NOMBRE LINE LI COL 6
DISPLAY APELLIDO LINE LI COL 20
ACCEPT OP LINE 20
END-PERFORM
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
...
Nota: Esta es una manera mas lgica de utilizar el PERFORM en estos formatos,
como ves se consigue una visin muy clara de lo que estamos haciendo y no
hay saltos de secuencia innecesarios. Por supuesto el COBOL permite cualquier
modalidad de uso y siempre funcionara igual. Como veis no puede haber puntos
entre el PERFORM y el END-PERFORM puesto que eso hara terminar con error la
sentencia.
Formato 5: En esta ocasin utilizaremos el PERFORM basndonos en un valor inicial el cual podremos
y aumentar o disminuir y terminar cuando se cumpla una condicin. No se si me he liado un poco con
la explicacin pero lo que conseguimos es ahorrarnos varias instrucciones y resumirlas en una sola,
para que lo comprendis veamos su formato y un ejemplo. Como he explicado anteriormente
podemos hacer que el PERFORM invoque a uno o varios prrafos o bien incluir el conjunto de
sentencias entre PERFORM y END-PERFORM.
En el ejemplo veremos este ltimo caso, porque creo que es mas aconsejable.
PERFORM VARYING variable FROM nmero, variable BY nmero, valor UNTIL condicin
sentencias
END-PERFORM
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 OP
PIC X.
01 LI
PIC 99.
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE.
PERFORM PIDENOMBRE THRU PIDEAPELLIDO.
PERFORM VARYING LI FROM 10 BY 1 UNTIL LI = 15
DISPLAY 'HOLA ' LINE LI
DISPLAY NOMBRE LINE LI COL 6
DISPLAY APELLIDO LINE LI COL 20
ACCEPT OP LINE 20
END-PERFORM
STOP RUN.
PIDENOMBRE.
DISPLAY 'INTRODUZCA EL NOMBRE ..' LINE 20.
ACCEPT NOMBRE LINE 20 COL 30 PROMPT.
PIDEAPELLIDO.
DISPLAY 'INTRODUZCA EL APELLIDO ..' LINE 21.
ACCEPT APELLIDO LINE 21 COL 30 PROMPT.
DISPLAY SPACES LINE 20 SIZE 70.
DISPLAY SPACES LINE 21 SIZE 70.
...
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 condicin
sentencias
END-PERFORM
Con 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 variable FROM nmero, variable BY nmero,
valor UNTIL condicin
AFTER variable FROM nmero, variable BY nmero, valor UNTIL condicin
sentencias
AFTER ......
END-PERFORM
Al 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.
ERROR
EXPLICACION
00
10
22
23
24
30
34
35
39
41
42
43
47
48
49
90
91
92
93
94
98
99
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)
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:
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.
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
ACCEPT
A
ACCESS
ADD
Otras
ADDRESS
ALL
ALPHABETIC-LOWER
ALPHANUMERIC-EDITED
ALTERNATE
APPLY
AREAS
AT
AUTO-SKIP
ADVANCING
ALPHABET
ALPHABETIC-UPPER
ALSO
AND
ARE
ASCENDING
AUTHOR
AUTOMATIC
AFTER
ALPHABETIC
APHANUMERIC
ALTER
ANY
AREA
ASSIGN
AUTO
AUTOTERMINATE
BACKGROUND
BACKGROUND-LOW
BEFORE
BINARY
BLINKING
BOTTOM
B
BACKGROUND-COLOR
BACKWARD
BELL
BLANK
BLOCK
BY
BACKGROUND-HIGH
BEEP
BIND
BLINK
BOLD
CALL
CF
CHARACTERS
COBOL
COL
COMMA
COMP-1
COMP-4
COMPUTATIONAL-1
COMPUTATIONAL-4
CONSOLE
CONTINUE
CONVERSION
COPY
COUNT
CURSOR
C
CANCEL
CH
CLASS
CODE
COLLATING
COMMUNICATION
COMP-2
COMP-6
COMPUTATIONAL-2
COMPUTE
CONTAINS
CONTROL
CONVERT
CORR
CRT
DATA
DATE-WRITTEN
DE
DECIMAL-POINT
DELETE
DEPENDING
DETAIL
DIVIDE
DUPLICATES
D
DATE
DAY
DEBUG
DECLARATIVES
DELIMITED
DESCENDING
DISABLE
DIVISION
DYNAMIC
ECHO
EMI
END
E
EGI
EMPTY-CHECK
END-ACCEPT
CD
CHARACTER
CLOSE
CODE-SET
COLUMN
COMP
COMP-3
COMPUTATIONAL
COMPUTATIONAL-3
CONFIGURATION
CONTENT
CONTROLS
CONVERTING
CORRESPONDING
CURRENCY
DATE-COMPILED
DAY-OF-WEEK
DEBUGGING
DEFAULT
DELIMITER
DESTINATION
DISPLAY
DRAWN
ELSE
ENABLED
END-ADD
END-CALL
END-DIVIDE
END-MULTIPLY
END-READ
END-REWRITE
END-STRING
END-WRITE
EOL
EQUAL
ESCAPE
EVERY
EXIT
END-COMPUTE
END-EVALUATEQ
END-OF-PAGE
END-RECEIVE
END-SEARCH
END-SUBTRACT
ENTER
EOP
ERASE
ESI
EXCEPTION
EXTEND
FALSE
FILE-CONTROL
FILLER
FOOTING
FOREGROUND-COLOUR
F
FD
FILE-ID
FINAL
FOR
FROM
GENERATE
GO
GRID
G
GIVING
GOBACK
GROUP
END-DELETE
END-IF
END-PERFORM
END-RETURN
END-START
END-UNSTRING
ENVIRONMENT
EOS
ERROR
EVALUATE
EXCLUSIVE
EXTERNAL
FILE
FILE-PREFIX
FIRST
FOREGROUND-COLOR
FULL
GLOBAL
GREATER
HEADING
HIGH-VALUES
H
HIGH
HIGHLIGHT
HIGH-BALUE
I-O
IF
INDEXED
INITIALIZE
INSPECT
INVALID
I
I-O CONTROL
IN
INDICATE
INPUT
INSTALLATION
IS
IDENTIFICATION
INDEX
INITIAL
INPUT-OUTPUT
INTO
JUST
J
JUSTIFIED
K
KEY
LABEL
LEFT
LENGTH-CHECK
LIMITS
LINES
LOCK-HOLDING
L
LAST
LEFTLINE
LESS
LINAGE
LINKAGE
LOW
LEADING
LENGTH
LIMIT
LINGAKE-COUNTER
LOCK
LOW-VALUE
LOW-VALUES
MEMORY
MODULES
MULTIPLY
NATIVE
NO
NUMBER
OBJECT-COMPUTER
OFF
OPEN
ORDER
OTHERS
OVERLINE
PACKED-DECIMAL
PAGE-COUNTER
PICTURE
POS
PREVIOUS
PROCEDURE
PROGRAM
PROTECTED
QUEUE
RANDOM
READERS
RECORDING
REEL
RELATIVE
REMOVAL
REPLACING
REPORTING
RESERVE
RETURN-CODE
REVERSE-VIDEO
REWRITE
RIGHT
SAME
LOWLIGHT
M
MERGE
MOVE
N
NEGATIVE
NO-ECHO
NUMERIC
O
OCCURS
OMITTED
OPTIONAL
ORGANIZATION
OUTPUT
P
PADDING
PERFORM
PLUS
POSITION
PRINT-CONTROL
PROCEDURES
PROGRAM-ID
PURGE
Q
QUOTE
R
RD
RECEIVE
RECORDS
REFERENCE
RELEASE
RENAMES
REQUIRED
REPORTS
RETURN
RETURN-UNSIGNED
REVERSED
RF
ROLLBACK
S
SCREEN
MODE
MULTIPLE
NEXT
NOT
NUMERIC-EDITED
OF
ON
OR
OTHER
OVERFLOW
PGE
PIC
POINTER
POSITIVE
PRINTING
PROCEED
PROMPT
QUOTES
READ
RECORD
REDEFINES
REFERENCES
REMAINDER
REPLACE
REPORT
RERUN
RETUNRNIN
REVERSE
REWIND
RH
RUN
SD
SEARCH
SECURITY
SELECT
SEPARATE
SET
SORT
SOURCE-COMPUTER
SPECIAL-NAMES
STATUS
SUBTRACT
SYNC
SECTION
SEGMENT
SEND
SEQUENCE
SIGN
SORT-MERGE
SPACE
STANDARD
STOP
SUPPRESS
SYCHRONIZED
TAB
TERMINAL
TEXT
THROUGH
TIMES
TRAILING
T
TALLYNG
TERMINATE
THAN
THRU
TO
TRUE
SECURE
SEGMENT-LIMIT
SENTENCE
SEQUENTIAL
SIZE
SOURCE
SPACES
START
STRING
SYMBOLIC
TAPE
TEST
THEN
TIME
TOP
U
UNDERLINED
UNSTRING
UPDATE
USAGE
UNIT
UNTIL
UPDATES
USE
VALUE
V
VALUES
VARYING
WHEN
WORKING-STORAGE
W
WITH
WRITE
WORDS
WRITERS
ZERO
Z
ZEROS
ZEROES
UNDERLINE
UNLOCK
UP
UPON
USING
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:
ATTRIBUTE
BOX
CELL
COLOR
CYCLE
DOWN
EVENT
FLOAT
GRAPHICAL
AUTO-MINIMIZE
BOXED
CELLS
COLOUR
DESTROY
ENCRYPTION
FEXTERNAL-FORM
FLOATING
HANDLE
AUTO-RESIZE
CCOL
CENTERED
CSIZE
DOUBLE
END-DISPLAY
FILE-PREFIX
FONT
HEIGHT
HELP-ID
IDENTIFIED
LOWER
MESSAGE
MODIFY
OBJECT
PARAGRAPH
PROPERTY
SHADOW
SYSTEM-INFO
THREAD
TOOL-BAR
VISIBLE
WINDOW
Disculpad, por si alguna se me ha olvidado.
ICON
INQUIRE
MANUAL
MODAL
NULL
ONLY
POP-UP
RESIZABLE
STYLE
TABLE
TITLE
TRANSACTION
WAIT
WRAP
ID
LINK
MENU
MODELESS
NULL
OVERLAPPED
PRIORITY
SCROLL
SYSTEM
TERMINAL-INFO
TITLE-BAR
UPPER
WIDTH
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 DYNAMIC
RECORD 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) campo
USING fichero a clasificar
GIVING 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) campo
INPUT PROCEDURE que_hacemos antes
OUTPUT PROCEDURE que hacemos despues
ON DESCENDING ORDNOM
INPUT PROCEDURE CARGAR
OUTPUT 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 LUNES
PIC 9(4).
01 MARTES
PIC 9(4).
01 MIERCOLES
PIC 9(4).
01 JUEVES
PIC 9(4).
01 VIERNES
PIC 9(4).
01 SABADO
PIC 9(4).
01 DOMINGO
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
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
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 FILLER
PIC X(10) VALUE "LUNES
".
02 FILLER
PIC X(10) VALUE "MARTES
".
02 FILLER
PIC X(10) VALUE "MIERCOLES ".
02 FILLER
PIC X(10) VALUE "JUEVES
".
02 FILLER
PIC X(10) VALUE "VIERNES ".
02 FILLER
PIC X(10) VALUE "SABADO
".
02 FILLER
PIC X(10) VALUE "DOMINGO ".
01 TABLADEDIAS REDEFINES TABLADIAS.
02 ELDIA
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.
OCCURS 2 TIMES.
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 MENOR
MOVE 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 "----------------------------------"
...
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 ELSE
MOVE "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 > 1000
ADD 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 TRABAJADORES
03 NOMBRE
03 NIF
03 SALARIO
05 BRUTO
05 NETO
05 GASTOS
07 GASTO
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).
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.
...
PROCEDURE DIVISION.
...
BUSCAR.
SET SUB1 TO 1.
SEARCH ELEMENTOS AT END GO NOEXIS
WHEN 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
03 NOMBRE
03 NIF
...
PROCEDURE DIVISION.
...
BUSCAR.
SEARCH ALL ELEMENTOS AT END GO NOEXIS
WHEN 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)
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 DYNAMIC
RECORD 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 = 1001
CAMPOPOBLACION = '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 = 100
CAMPOCLAVE2 = 1
CAMPODATO1 = '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.
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 situacin
Vamos 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 DYNAMIC
RECORD KEY ALB-NUMERO
FILE STATUS STA-ALBA.
SELECT CLIENTES ASSIGN TO RANDOM "CLIENTES.DAT"
ORGANIZATION INDEXED ACCESS RANDOM
RECORD KEY CLI-CODIGO
FILE STATUS STA-CLIEN.
SELECT PRODUCTOS ASSIGN TO RANDOM "PRODUCTOS.DAT"
ORGANIZATION INDEXED ACCESS RANDOM
RECORD KEY PRO-CODIGO
FILE 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.
PIC
PIC
PIC
PIC
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 IMPRE
PERFORM CABECERA
MOVE ' ' 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 FINFIC
NOT AT END
MOVE ALB-CODIGO TO L-ALBARAN
MOVE 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-COD
READ CLIENTES INVALID KEY MOVE 'NO EXISTE EL CLIENTE' TO CLI-NOMBRE
END-READ
MOVE 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 TOALBA
PERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL CONTA1 > 10
IF ALB-PRODUCTO (CONTA1) > 0
MOVE ALB-PRODUCTO TO PRO-CODIGO
READ PRODUCTO INVALID KEY
DISPLAY 'PRODUCTO NO ENCONTRADO, NO SE
ACTUALIZA'
NOT INVALID KEY
SUBTRACT ALB-CANTIDAD FROM PRO-EXISTENCIAS
REWRITE REGPRODU INVALID KEY DISPLAY 'ERROR'
END-REWRITE
END-READ
COMPUTE TOLINEA ROUNDED = ALB-CANTIDAD * ALBPRECIO
COMPUTE TOALBA ROUNDED = TOALBA + TOLINEA
END-IF
END-PERFORM
Al totalizar el albaran imprimimos la linea correspondiente y comprobamos que no
hemos llegado al final de la pgina. El salto lo realizaremos despues de imprimir 54
lneas.
MOVE TO-ALBA TO L-IMPORTE
COMPUTE TOTAL ROUNDED = TOTAL + TOALBA
MOVE 0 TO TOALBA
WRITE LINEA FROM DETALLE AFTER 1
ADD 1 TO CONTALIN ADD 1 TO CONTA
IF CONTALIN > 54 WRITE LINEA FROM RAYA AFTER 1
PERFORM CABECERA
END-IF
END-READ
END-PERFORM
Una vez terminado el bucle de lectura. Imprimimos una lnea con los totales acumulados,
cerramos los ficheros y terminamos el programa.
WRITE LINEA FROM RAYA AFTER 1
MOVE CONTA TO L-ALBARAN
MOVE 0 TO L-FECHA L-CLIENTE
MOVE 'TOTAL GENERAL' TO L-NOMCLI
MOVE TOTAL TO L-IMPORTE
WRITE LINEA FROM DETALLE AFTER 1
WRITE LINEA FROM RAYA AFTER 1
CLOSE PRODUCTOS ALBARANES CLIENTES IMPRE
STOP RUN.
Este prrafo es el que utilizamos para escribir la cabecera, tanto al principio como cada vez que
llenamos una pgina.
CABECERA.
MOVE 0 TO CONTALIN ADD 1 TO HOJA MOVE HOJA TO LHOJA
WRITE LINEA FROM LIN-01 AFTER PAGE
WRITE LINEA FROM RAYA AFTER 2
WRITE LINEA FROM LIN-02 AFTER 1
WRITE LINEA FROM RAYA AFTER 1.
Creo que con este pequeo programa de ejemplo, podis comprender el funcionamiento de los
ficheros.
Como habis visto, hemos leido secuencialmente, hemos accedido directamente por cdigo, hemos
impreso lneas en una impresora y adems hemos ido actualizando un fichero, con lo que todos los
procesos que se pueden dar (mas o menos) han quedado reflejados.
Me gustara comentar el tema de la apertura de ficheros.
Un archivo abierto como INPUT jams tendr exclusividad y podr ser accedido por todos los usuarios
que lo utilicen sin ningn problema de bloqueos. En cambio al abrirlo como I-O podemos tener
problemas de bloqueos y adems si se va la luz en ese momento o se apaga bruscamente el PC
podemos llegar a ocasionar el estatus 98 y tener verdaderos problemas para recuperar el fichero.
Mi consejo particular, que es el que uso desde hace muchos aos y jams he tenido un problema ni de
bloqueos ni de errores de ficheros, es abrir siempre el fichero como INPUT y solo en los momentos
necesarios abrirlos como I-O. Nunca abrais los ficheros nada mas empezar el programa como I-O, no
es necesario y en muchos casos solo nos va a traer problemas, al igual que habr programas en los
que no sea necesario tener un fichero abierto siempre y solo abrirlo cuando lo vayamos a utilizar.
Os repito que estos consejos son los que la experiencia me ha ido enseando y hoy en da con los
equipos informticos que existen, la posible prdida de tiempo en abrir y cerrar ficheros, pasa
totalmente inadvertida para nosotros.
Para ver lo que os he explicado antes de una manera mas fcil, os pongo un ejemplo:
Empezamos nuestro programa y hacemos un:
OPEN INPUT FICHERO
...
...
el programa sigue su curso, pero si en algn momento necesitamos Borrar, Grabar o Regrabar
algn registro, entonces actuamos as:
...
CLOSE FICHERO OPEN I-O FICHERO
REWRITE REGISTRO INVALID KEY DISPLAY 'ERROR'
END-REWRITE
Ficheros (III)
pgina(s) : 1/2
(1089 palabras totales en este texto)
(1172 Lecturas)
Que Cobol tiene muchas cosas buenas, no hace falta decirlo, pero su facilidad para trabajar con datos
y por lo tanto con ficheros, es sencillamente increible.
Increible hasta el punto que podemos trabajar con un fichero, antes incluso de saber como se llama y
donde se encuentra.
Lo mas lgico y mas utilizado es asignar previamente una localizacin y nombre para nuestro fichero
en la SELECT, por ejemplo:
SELECT VENTAS ASSIGN TO RANDOM "VENTAS.DAT"
ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY CLA-VENTAS
FILE STATUS STA-VENTAS.
SELECT COMPRAS ASSIGN TO RANDOM "C:DATOSCOMPRAS.DAT"
ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY CLA-VENTAS
FILE STATUS STA-VENTAS.
Ya sabis que la extensin de nuestros ficheros es indiferente para Cobol, pero siempre nos ayudar a
nosotros mismos a distinguir los archivos de datos de otro tipo de archivos.
Por eso generalmente se les suele poner la extensin .DAT.
Bien, ambas formas son correctas para designar los ficheros con los que vamos a trabajar en nuestra
aplicacin. Pero, que pasa si el nombre dependiera de alguna condicin o debiera cumplir alguna
regla ?.
En estos casos solo tendremos que asignar el fichero a una variable que definiremos en la WORKINGSTORAGE SECTION. A esa variable le podremos dar los varlores que queramos para conformar
nuestro nombre. Por supuesto, antes de abrir el fichero, esa variable debe de contener alguna
informacin, de lo contrario nos dara error, simplemente porque no podra abrir un fichero sin
nombre.
Para ver un ejemplo, os voy a explicar como trabajo yo personalmente. En mi empresa cada cambio
de campaa (ao de trabajo) los datos se copian y se empieza todo desde 0. A los ficheros les cambio
el nombre, de tal forma que para las ventas, por ejemplo, tengo varios archivos que se llaman:
ventas.dat (actual)
vent0102.dat (campaa 2001/2002)
vent0001.dat (campaa 2000/2001)
vent9900.dat (campaa 1999/2000)
... y asi sucesivamente, todos los aos que tenga.
Por lo tanto el programa que utilizo es el mismo al igual que la SELECT y la FD, porque en realidad
solo utilizo un fichero lgico, pero con varios ficheros fsicos. Os explico una tarea comn en cualquier
programa que trabaje con varios ficheros.
Primero defino la SELECT para dicho fichero:
SELECT VENTAS ASSIGN TO RANDOM FILVEN
ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY KEYVEN
ALTERNATE RECORD KEYVEN1 FILE STATUS STAVEN.
Como veis ahora no hay un nombre fijo asignado, sino que la referencia se hace a una variable
llamada FILVEN. Para guardar los nombres de los distintos ficheros utilizo una tabla. Lo siguiente es
definirlo todo en la WORKING:
...
WORKING-STORAGE SECTION.
01 FILVEN PIC X(20).
01 CUAL PIC 9 VALUE 1.
...
01 TABLAVENTAS.
02 FILLER PIC X(20) VALUE "ventas.dat"
02 FILLER PIC X(20) VALUE "vent0102.dat"
02 FILLER PIC X(20) VALUE "vent0001.dat"
02 FILLER PIC X(20) VALUE "vent9900.dat"
END-PERFORM
CLOSE TRASPASO CLIENTES
STOP RUN.
El separador entre campos ha sido el carcter 124, que se obtiene pulsando AltGr+1, pero tambin
podemos definirlo como hexadecimal como PIC X VALUE '7C'.
Si lo que deseamos es mandar le enviamos el valor hexadecimal 9, para ello definimos una variable en
la WORKING, por ejemplo:
01 TABU PIC X VALUE H"09".
Y luego le enviamos esa variable a los campos de separacin. Como vis el nombre del fichero de
traspaso se ha formado a partir de la fecha del sistema, con lo que si lo hubieramos ejecutado hoy, el
nombre del fichero resultante, hubiera sido: MAR03-28.TXT.
Con ste captulo doy por terminada la seccin dedicada a los ficheros, espero que como siempre os
digo, os sirva y os ayude a comprender mejor el funcionamiento de los ficheros en Cobol.