Cobol
Cobol
Al pensar en Cobol como lenguaje de programación debemos de tener presente que nos
referimos a un lenguaje dedicado a gestión de datos con una magnífica transportabilidad
entre los distintos sistemas, yo he ejecutado el mismo programa en MS-DOS y UNIX
sin modificar ni una linea de código y copiando solo el objeto.
La parte (2) comprende la columna 7 y en ella podemos encontrar, un guión (-) que nos
indica que esta línea es continuación de la anterior pero que por su tamaño ocupa mas
de una línea, un asteristo (*) que nos indica que el texto que viene a continuación es un
comentario y por lo tanto que el compilador lo ignore, o bien puede servir dependiendo
de los compiladores para indicaciones del debug.
La parte (3) se le llama Area A comprende las columnas 8 a 11 ambas inclusive y aquí
es donde se escriben los nombre de las divisiones, de las secciones, de los párrafos, los
indicadores de FD (File Description) y los niveles de variables 01 y 77.
Quisiera respetar para todo el manual las mismas pautas, color Amarillo para las
palabras reservadas cobol, subrayado para las obligatorias, en cursiva los comentarios y
en normal el resto.
Nota final:
Es obvio que cada manual estará orientado a la manera de trabajar de quien lo escribe,
con ello quiero decir que habrá cosas que no explicaré mucho o incluso otras que
omitiré porque yo no las haya utilizado nunca.
Una explicación perfectamente detallada deberá venir en los manuales de cada uno de
los compiladores que del lenguaje Cobol existen hoy en dia.
Espero que podais comprender ésto, eso si, os puedo asegurar que todos mis programas
utilizan solo lo que aqui voy a exponer y ninguno nunca me ha dado ningún problema.
Identification Division
Esta es la primera linea de todo programa Cobol e identifica a la primera división donde
se especifica el nombre del programa, el del autor y demás datos, su sintaxis sería la
siguiente:
IDENTIFICATION DIVISION.
PROGRAM-IDNombre del programa.
AUTHOR Nombre del autor.
INSTALLATION Lugar donde está instalado.
DATE-WRITTEN Fecha de creación.
DATE-COMPILED Fecha de compilación.
REMARKSComentarios.
Vemos que el único párrafo obligatorio además del nombre de división es el que hace
referencia al nombre del programa, los demás nombre de autor, lugar de instalación,
fechas de creación y compilación y comentarios son opcionales, eso si, si se incluyen se
deben de poner cumpliendo las normas.
Podemos incluir además 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 continuación, por ejemplo.
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 demás no son tan pequeñas,
sin embargo posee dos de las lineas mas importantes de cualquier programa cobol.
Environment Division
página(s) : 1/2
(1905 palabras totales en este texto)
(91185 Lecturas)
Diremos antes de continuar que en los primeros cobol había muchas partes que eran
obligatorias en cada programa, pero hoy en dia, por ejemplo, ésta división ya no es
obligatoria, asi como ninguna de sus partes. Su sintaxis sería 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 asignación de
valores a ciertas constantes utilizadas por el compilador, estos valores se introducen en
sus respectivas lineas como se ve arriba.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
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 mayúsculas o minúsculas o que no haya
diferencias entre ambas con la clausula ALPHABET.
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 cláusulas que encontramos dentro de la Input-Output
Section.
Cláusula SELECT es aqui donde especificamos el nombre lógico 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.
Cláusula 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 sería el código, podríamos asignar como clave alternativa el NIF, y
podríamos acceder a el por las dos claves, bien por código o bien por NIF, será también
alfanumérico y deberá también 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 además del NIF, el Nombre del cliente,
podría darse el caso de que dos clientes tuvieran el mismo nombre.
Cláusula FILE STATUS aqui damos un nombre de una variable que especificaremos en
la WORKING como un campo alfanumérico de dos caracteres donde el programa
depositará el código de error que ocurra en el fichero, dependiendo del valor nosotros
podremos operar o hacer alguna acción en concreto.
El párrafo 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
párrafo 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:[Link]" ORGANIZATION
INDEXED
ACCESS DYNAMIC RECORD KEY KEY-CLIENTE
ALTERNATE RECORD KEY-CLIENTE1 FILE STATUS
STACLI.
SELECT IMPRESORA ASSIGN TO PRINT "PRINTER".
Nota final:
Creo que es una de las partes mas interesantes de la programación 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 especificación de fichero en la Select solo se pone el punto al
final de todas las clausulas del párrafo.
En realidad haciendo ésto último podemos asignar cualquier archivo que esté en
cualquier dirección de la red, ya que el nombre que damos es lógico y su asignación la
podemos definir con una variable de entorno donde queramos.
Data Division
página(s) : 1/4
(5050 palabras totales en este texto)
(80583 Lecturas)
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 ejecución del programa vayamos a
utilizar.
LINKAGE SECTION. Esta es la sección donde se registrarán las variables que
nos servirán para enlazar el programa principal con el que llamemos mediante la
orden CALL.
COMMUNICATION SECTION. (No la he utilizado nunca).
SCREEN SECTION. En ésta sección podremos describir los atributos y
campos a utilizar en las pantallas.
Cláusula BLOCK CONTAINS cuando queremos que por cada bloque en disco se
graben mas de un registro, aqui especificamos el número de ellos que va a contener cada
bloque, (512, 1024), si no se especifica se supone que cada registro va a ocupar un
bloque de memoria, o bien será el propio compilador el que haga el cálculo mas
apropiado.
Cláusula DATA RECORD debido a que un mismo fichero puede tener varias
descripciones de registro, aqui indicamos los nombre de éstas que deberán estar
descritas a nivel 01. Normalmente no se utiliza y casi siempre se suele utilizar una sola
descripción por fichero, por lo que no suele aparecer en casi ningún programa.
Antes de seguir adelante quisiera decir que siendo el cobol un lenguaje orientado casi
exclusivamente al manejo de ficheros de datos, es sin duda, ésta parte que hemos visto
la mas importante. Un buen análisis de los ficheros a utilizar antes de empezar es
fundamental y nos evitará muchos calentamientos de cabeza, tener claro cuales van a
ser sus claves tanto la principal como las alternativas, definir bien todos sus campos y
dejar espacio libre para un posible aumento de datos. Esto lo digo porque si creamos un
fichero con 80 caracteres por registro y al cabo de un tiempo debemos de introducir un
nuevo campo que no habiamos preveido, tendremos que modificar toda su estructura
rehaciendo el fichero y recompilando todos los programas a los que afecte, si en cambio
dejamos un poco de espacio nos evitaremos la reestructuración del archivo, ésto se
consigue utilizando el nombre de variable FILLER como veremos un poco mas abajo.
Data Division
página(s) : 2/4
(5050 palabras totales en este texto)
(80583 Lecturas)
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.
Número de Nivel ...... Nombre de campo ...... PIC, VALUE, REDEFINES, OCCURS,
JUST, SIGN, SYNC.
Cada campo declarado debe de llevar un número de nivel que le informe al compilador
del tipo de campo que es:
A continuación pondremos el nombre del campo, que no podrá ser ninguna palabra
cobol ni llevar ningún carácter extraño, principalmente se utilizarán letras y números o
guiones. Es posible que algún 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.
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 numéricos.
A - Para campos alfabéticos.
X - Para campos alfanuméricos.
S - Indica variable con signo.
V - Indica punto decimal.
DE EDICIÓN.
$ - Representa la aparición del signo $ delante del campo numérico.
. - Indica separación de miles.
, - Indica punto decimal. (estas dos pueden variar según hayamos especificado en
SPECIAL-NAMES DECIMAL-POINT IS COMMA).
Z - Representa un espacio para el 0 a la izquierda en campos numéricos.
* - Igual pero se cambia el 0 por *.
B - Indica un espacio en blanco.
- ó + - Indican la aparición 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 símbolo tantas veces como
longitud tenga o expresarla entre paréntesis, es decir para definir una variable
alfanumérica de 10 caracteres se pondría:
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
alfanúmerica y que puede contener 2 caracteres como máximo, la utilizariamos para
guardar el tipo de calle, avenida, paseo, plaza, etc.. Para la tercera "NOMBRE" va a ser
también alfanumérica pero con una longitud máxima de 20 caracteres y nos servirá para
guardar el nombre de la calle, plaza, avenida, etc y la última "NUMERO" indica una
variable numérica de 4 dígitos, que quiere decir que puede contener valores entre 0 y
9999.
Observad que en Cobol no se guardan las varables numéricas por bytes como ocurre con
todos los lenguajes actuales sino por número de dígitos, con ello quizás
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 refiriéramos a la variable DOMICILIO ésta tendría el siguiente valor:"AVDE LOS
DESAMPARADOS 0015".
Data Division
página(s) : 3/4
(5050 palabras totales en este texto)
(80583 Lecturas)
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 [Link],ZZ-.
01 ESTADO PIC 9.
88 SOLTERO VALUE 1.
88 CASADO VALUE 2.
88 DIVORCIADO VALUE 3.
VALUE esta palabra a continuación 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 cláusula convertimos
cualquier variable en una constante. En cualquier momento del programa podremos
cambiar ese valor. Para las variables numéricas es conveniente ponerlas siempre con
VALUE 0 para que al empezar cada programa estemos seguros de que no nos arrastra
ningún 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 cláusula se utiliza para dar mas de un nombre y formato a un mismo
campo. Este debe de ir a continuación del nombre de campo y antes del nombre del
campo a que hace referencia, deben de estar en el mismo nivel y uno a continuación 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 cláusula OCCURS para que sea vea un ejemplo práctico, aunque todavía
no lo he explicado, pero como veis a partir de éste momento DIAS y TADIA tendrán
siempre el mismo valor pero con diferente nombre y formato de datos.
OCCURS esta cláusula 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 subíndice. 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 paréntesis el orden dentro de la tabla. Si hubiéramos 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).
JUST la justificación de los valores de los campos suele ser a la izda. para los
alfanuméricos y a la derecha para los numéricos, si en cambio queremos cambiar este
orden tendremos que incluir ésta cláusula.
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(10).
01 NOMBRE1 PIC X(10) JUST RIGHT.
Si le diéramos el mismo valor a las dos variables "ANDRES", la primera nos daría
"ANDRES " y la segunda " ANDRES", la diferencia, su justificación.
USAGE con ésta cláusula determinamos el formato en que se guarda el contenido de las
variables (numéricas, ya que las alfanuméricas siempre ocuparán un byte por cada
caracter). Con todos los campos se puede operar (obviamente) pero solo los que se
definan como DISPLAY serán editables directamente. Tiene varias posibilidades:
DISPLAY, es la forma por defecto e indica que cada dígito 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
compactación de los datos. COMP-6 (la mas usual) guarda dos dígitos en cada
byte, COMP-3 es igual pero admite signo el cual iría 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 dígito.
01 FECHA PIC 9(8) COMP-6. Ocupa 4 bytes, uno cada 2 dígitos.
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 tamaño es impar el signo no ocupa ya que comparte byte con el último dígito,
el punto decimal tampoco ocupa espacio, ya que solo indica su posición. 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 compactación es decir no utilizo la cláusula USAGE (que por
cierto y como habreis visto se puede omitir) y por defecto toma DISPLAY (un byte por
caracter).
Data Division
página(s) : 4/4
(5050 palabras totales en este texto)
(80583 Lecturas)
LINKAGE SECTION. En ésta sección se declaran las variables de igual forma solo
que las que aqui declaremos nos van a servir de enlace para pasar información a otro
programa que será llamado por el principal.
Ejemplo:
DATA DIVISION.
FILE SECTION.
Nota final:
La DATA DIVISION nos sirve para tener todas nuestras variables bien definidas, ya
sean independientes o que formen parte de algún fichero para poder operar con ellas en
la PROCEDURE DIVISION. Me acuerdo de cuando empezamos a estudiar que para
otros lenguajes no era necesaria la declaración de variables previamente y en cambio
ahora en la mayoría de los lenguajes se exige que se declaren, eso significa que el Cobol
no iba mal encaminado.
Tenemos que tener siempre muy claro que con cualquier campo podemos hacer lo que
queramos, por ejemplo si en un registro de 120 caracteres nosotros en un programa solo
vamos a utilizar los 40 primeros podemos definir todo lo restante como un campo
FILLER y listo o viceversa si un campo de un registro lo tenemos definido como
alfanumérico de 30 en un programa necesitamos los 10 primeros caracteres por un lado
y los veinte restantes por otro, puese nada se subdivide para ese programa y no pasa
nada.
Espero que haya quedado por lo menos medio clara la explicación de ésta tercera
DIVISION, evidentemente con la práctica es con lo que mas vamos a aprender siempre
claro está que tengamos al menos unas nociones mínimas.
Tenemos que tener en cuenta que como en todos los lenguajes, ya sean de programación
o de habla (español, inglés, 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 lógico 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 división 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 capítulos del manual. Cada uno de ellos con un formato y una solución
que resolver.
Este sería a groso modo el formato general de una Procedure, pero incluso se puede
omitir si en un programa no vamos a realizar ningún proceso (es obvio que siempre lo
realizaremos, pero se podría omitir). Vamos a explicar un poco su formato:
MAYOR QUE
[ (NOT) GREATER ]
[ (NOT) > ]
MENOR QUE
[ (NOT) LESS ]
[ (NOT) < ]
IGUAL QUE
Literal [ (NOT) EQUAL ] Literal
Variable [ (NOT) = ] Variable
MAYOR O IGUAL QUE
[ GREATER OR EQUAL ]
[= ]
MENOR O IGUAL QUE
[ LESS OR EQUAL ]
[ <= ]
Si se especifica (NOT ) se da a entender lo contrario de la comparación, con lo que no
mayor que puede ser igual que menor o igual que.
Tambien podemos utilizar para las condiciones complejas los operandos lógicos, AND,
OR y NOT según se requieran, todas las condicionea que incluyan AND han de ser
correctas para que pase la condición, si se utiliza OR solo alguna de ellas ha de ser
correcta, cuando se utilice NOT no podrá ser correcta para que la condición sea válida.
Instr. de Cálculo
página(s) : 1/4
(4515 palabras totales en este texto)
(66180 Lecturas)
Debido a que el lenguaje Cobol fue concebido para la gestión de grandes cantidades de
datos y a resolver problemas de tipo comercial y de administración, no se incluyeron
dentro de sus especificaciones verbos que nos puedieran ayudar a resolver cálculos
complejos como integrales, trigonometría, raices cuadradas, etc..., sino simplemente las
orientadas a los cálculos básicos, suma, resta, multiplicación y división que son las que
vamos a ver a continuación:
ADD , ésta es la instrucción que utilizaremos para realizar sumas y tiene los siguientes
formatos:
1.- ADD variable ó literal variable ó literal ... TO variable (ROUNDED) (ON SIZE
ERROR ) instrucción
2.- ADD variable ó literal variable ó literal ...GIVING variable (ROUNDED) (ON
SIZE ERROR ) instrucción
Para ver las explicaciones de cada uno de los formatos partiremos de la misma
WORKING , y a continuación pondremos un ejemplo y su explicación.
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 sumarán todas las variables o literales numéricos (cifras) al valor
de la variable que se de a continuación del TO, guardandose el
resultado también en ésta ú[Link] tanto al realizar ésta operación
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 tenía 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.
Formato 3:
ADD CORR VALORES TO OTROS.
página(s) : 2/4
(4515 palabras totales en este texto)
(66180 Lecturas)
SUBTRACT , ésta es la instrucción que utilizaremos para realizar restas y tiene los
siguientes formatos:
1.- SUBTRACT variable ó literal variable ó literal ... FROM variable (ROUNDED)
(ON SIZE ERROR ) instrucción
2.- SUBTRACT variable ó literal variable ó literal ... FROM variable ó literal
GIVING variable (ROUNDED) (ON SIZE ERROR) instrucción
3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON SIZE ERROR)
instrucción
Para ver las explicaciones de cada uno de los formatos partiremos de la misma
WORKING que hemos utilizado con la instrucción ADD, poniendo a continuación un
ejemplo y su explicación.
Formato 1:
SUBTRACT UNO TRES 5 FROM RESULTADO.
Formato 2:
SUBTRACT UNO 5 FROM TRES GIVING RESULTADO.
Formato 3:
SUBTRACT CORR VALORES FROM OTROS.
Instr. de Cálculo
página(s) : 2/4
(4515 palabras totales en este texto)
(66180 Lecturas)
SUBTRACT , ésta es la instrucción que utilizaremos para realizar restas y tiene los
siguientes formatos:
1.- SUBTRACT variable ó literal variable ó literal ... FROM variable (ROUNDED)
(ON SIZE ERROR ) instrucción
2.- SUBTRACT variable ó literal variable ó literal ... FROM variable ó literal
GIVING variable (ROUNDED) (ON SIZE ERROR) instrucción
3.- SUBTRACT CORR variable FROM variable (ROUNDED) (ON SIZE ERROR)
instrucción
Para ver las explicaciones de cada uno de los formatos partiremos de la misma
WORKING que hemos utilizado con la instrucción ADD, poniendo a continuación un
ejemplo y su explicación.
Formato 1:
SUBTRACT UNO TRES 5 FROM RESULTADO.
Formato 2:
SUBTRACT UNO 5 FROM TRES GIVING RESULTADO.
Formato 3:
SUBTRACT CORR VALORES FROM OTROS.
Instr. de Cálculo
página(s) : 3/4
(4515 palabras totales en este texto)
(66180 Lecturas)
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD y
SUBTRACT, veremos a continuación unos ejemplos y su explicación.
Formato 1:
MULTIPLY 5 BY RESULTADO.
Formato 2:
MULTIPLY 5 BY TRES GIVING RESULTADO.
DIVIDE , ésta es la instrucción que utilizaremos para realizar divisiones y tiene los
siguientes formatos:
1.- DIVIDE variable ó literal INTO variable (ROUNDED) (ON SIZE ERROR )
instrucción
2.- DIVIDE variable ó literal (BY ó INTO) variable ó literal GIVING variable
(ROUNDED) (REMAINDER ) variable (ON SIZE ERROR ) instrucción
Utilizando la misma WORKING que hemos utilizado con las instrucciones ADD,
SUBTRACT y MULTIPLY, veremos a continuación unos ejemplos y su explicación.
Formato 1:
DIVIDE 10 INTO TRES.
Formato 2:
DIVIDE 7 INTO TRES GIVING RESULTADO REMAINDER
RESTO.
Instr. de Cálculo
página(s) : 4/4
(4515 palabras totales en este texto)
(66180 Lecturas)
COMPUTE , con ésta orden podemos realizar todos los cálculos aritméticos posibles
en una sola instrucción, utilizando los operadores +(suma) -(resta) *(multiplicación)
/(división) **(potenciación), además de utilizar paréntesis para especificar mejor la
operación a realizar.
Formato 1:
COMPUTE RESULTADO = DOS OF VALORES * 16 / 100.
Para todas éstas instrucciones de cálculo que hemos visto la opcion ROUNDED
significa lo mismo y quiere decir que fuerza al redondeo del resultado para cada
operación y siempre teniendo en cuenta la definición de la variable que va a guardar ese
resultado, por ejemplo si tras una operación resulta 18,76 éste podría quedar como
sigue:
Igual ocurre con la frase ON SIZE ERROR instrucción, que propiciará que se ejecute la
instrucción que pongamos a continuación cuando se produzca un desbordamiento del
campo que va a acoger el resultado, por ejemplo si el resultado de una operación es
8.976.400 y la variable la hemos definido con PIC 9(6) y hemos especificado dicha
opción se ejecutará la instrucción especificada.
Instr. de Archivos
página(s) : 1/5
(6114 palabras totales en este texto)
(69186 Lecturas)
Sin duda son las instrucciones mas importantes con las que cuenta el lenguaje Cobol,
con ellas tendremos la oportunidad de manipular toda la información contenida en
nuestros archivos, es decir, podremos abrir archivos, cerrarlos, leerlos, guardar
información nueva o modificar datos existentes. Todo ésto lo haremos con las
instrucciones que voy a explicar a continuación.
¿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 podría ser la lengüeta con
la letra del abecedario correspondiente a los apellidos del amigo.
Informáticamente es mas completa y con ella podremos identificar a cada uno de
ellos, por ejemplo con su nombre o su teléfono o un código que le asignemos
nosotros personalmente.
Donde modo, indica como se abrirá el archivo y puede tener los siguientes valores
según su utilización:
La opción WITH NO REWIND, se utiliza cuando utilizamos archivos de cinta, para que
no la rebobine al abrirla.
...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
OPEN I-O CLIENTES
OPEN EXTEND IMPRE.
CREAR-ARCHIVO.
OPEN OUTPUT TRABAJO CLOSE TRABAJO.
...
Instr. de Archivos
página(s) : 2/5
(6114 palabras totales en este texto)
(69186 Lecturas)
Las opciones WITH LOCK y WITH NO REWIND , tienen la misma explicación que la
vista en la orden OPEN.
...
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ARTICULOS.
OPEN I-O CLIENTES
OPEN EXTEND IMPRE.
...
...
...
CERRAR.
CLOSE ARTICULOS CLIENTES IMPRE.
...
READ, es la instrucción 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
descripción 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.
La opción PREVIOUS RECORD leería el registro anterior. Esta opción es la única que
no es válida para ficheros secuenciales de éste formato.
La opción 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 descripción de registro para un mismo
archivo. Si tuvieramos mas de una, ésta sería la opción para indicarle cual es la que
queremos utilizar en ésta lectura.
...
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 podría leer así.
Instr. de Archivos
página(s) : 3/5
(6114 palabras totales en este texto)
(69186 Lecturas)
Las opciones que se repiten con con el formato anterior tienen el mismo formtato y
producen el mismo resultado.
La opción KEY, indica por que clave se va a leer el fichero, siempre que éste tenga mas
de una.
La sentencia después de INVALID KEY se utiliza para ejecutar una acción cuando se
intenta acceder a un registro que no existe. En el caso de utilizar NOT INVALID KEY
sería 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 código postal, dando cualquier código
accederiamos a ese registro en concreto.
La opción FROM, indica con cual de las descripciones de registro que hayamos podido
declarar se graben los datos en el fichero. Hay que señalar que ésta descripción puede
estar definida en la WORKING, y lo que nos ahorra en realidad es mover los datos de
esa descripción que hemos usado como "temporal" a la auténtica descripción del
registro.
Las cláusulas de INVALID KEY y NOT INVALID KEY, tienen la misma función dada
en la instrucción READ. Solo que aqui, INVALID KEY , se produciría cuando al grabar
el registro, éste ya existiese o hubiera algún error por el cual no se pudieran grabar los
datos.
...
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.
...
...
GO CERRAR.
ERROR.
...
...
CERRAR.
CLOSE ARTICULOS.
...
Además de éste formato, existe para ésta instrucción otro muy común. 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 descripción por
registro. ¿Porque? Sencillo, definiremos nuestro fichero con un registro de tamaño igual
al ancho de nuestro listado, y luego en la WORKING, describiremos el formato de cada
una de las lineas que utilizaremos en la impresión. Quiero hacer un ejemplo mas
extenso para éste caso, que será muy utilizado y distinto en su filosofía al resto.
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.
...
Instr. de Archivos
página(s) : 4/5
(6114 palabras totales en este texto)
(69186 Lecturas)
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.
...
Las únicas cláusulas INVALID y NOT INVALID KEY, se usan exactamente igual que
en las demás relativas a ficheros, es decir ejecutará la sentencia que pongamos a
continuación 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.
...
...
Instr. de Archivos
página(s) : 5/5
(6114 palabras totales en este texto)
(69186 Lecturas)
Las únicas cláusulas INVALID y NOT INVALID KEY, se usan exactamente igual que
en las demás relativas a ficheros, es decir ejecutará la sentencia que pongamos a
continuación 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.
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.
...
...
RESUMIENDO
Una vez vistas todas las intrucciones relativas a ficheros, quiero dejar bien claro su
utilización.
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 información.
Instr. de Pantalla
página(s) : 1/3
(5792 palabras totales en este texto)
(59959 Lecturas)
Vamos a utilizar ésta sección para hacer un análisis profundo de dichas instrucciones.
Aunque la forma mas usual de utilizarla, es para aceptar datos por el teclado, también es
posible utilizarla para "cogerlos" también 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. Además siguen aumentando sus posibilidades.
Veamos sus formatos principales:
Según la opción escogida, así será el valor que contendrá la variable usada, una vez
completada la sentencia. Veamos cada una de las opciones:
Además 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 información sobre
el sistema sobre el que trabajamos, el terminal, la línea, 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.
...
FECHA=990701.
FECHA8=19990701
DIA=4.
La lista de cláusulas es muy larga, y por desgracia algunos compiladores pueden tener
mas que otros, así que voy a explicar las mas comunes a continuación: Recordad que lo
que se explica aquí puede ser válido tanto para ACCEPT como para DISPLAY.
Instr. de Pantalla
página(s) : 2/3
(5792 palabras totales en este texto)
(59959 Lecturas)
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:
Con Acucobol (y hablo de él, por ser el que utilizo en la actualidad) se permite aceptar
cualquier control gráfico típico de windows, como un ENTRY-FIELD, directamente
desde la PROCEDURE DIVISION y con el comando ACCEPT propio de Cobol.
Evidentemente cambia un poco sobre todo porque las cláusulas o propiedades son
mucho mas amplias.
...
WORKING-STORAGE SECTION.
77 NOMBRE PIC X(30).
77 CODIGO PIC 9(5).
77 ESCA PIC 9 COMP-1.
77 QW PIC 9.
...
PROCEDURE DIVISION.
INICIO.
ACCEPT NOMBRE LINE 10 COL 20 PROMPT LOW REVERSE ECHO
CONTROL "FCOLOR=BLUE, BCOLOR=WHITE" ON EXCEPTION ESCA
MOVE 1 TO QW.
ACCEPT CODIGO LINE 12 COL 20 CONVERT.
...
Os aconsejo que hagáis todo tipo de pruebas con las opciones disponibles hasta que
el resultado sea el que deseáis.
Teneis que tener en cuenta que algunas de las cláusulas que explico es posible que
no funcionen en todos los compiladores, así como es posible que existan otras que
yo desconozca debido a que son usadas por otros compiladores.
Instr. de Pantalla
página(s) : 3/3
(5792 palabras totales en este texto)
(59959 Lecturas)
DISPLAY, es la instrucción que usaremos como salida de datos en pantalla. Con ella
mostraremos cualquier texto, cualquier variable, cualquier constante o cualquier valor,
en resumidas es la instrucción para que aparezca lo que sea en pantalla. Las cláusulas
asociadas a esta instrucción son practicamente las mismas que hemos visto para
ACCEPT, con lo que solo las indicaré, su explicación la obtendréis arriba. De todas
maneras ésta instrucción está siendo implementada en muchos mas campos, por
determinados compiladores y no sería justo pensar que su única función es la que voy a
explicar aquí, lo que si es cierto es que ésta es la común a todos los compiladores. Mas
abajo hablaré un poco de todo esto que os digo y de su futuro.
...
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 seguirán 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 cláusula CONTROL, en todos los
ACCEPT y DISPLAY que vayamos a utilizar mientras queramos
mantener éste formato.
DISPLAY LINE CLAUSULAS ..., conseguimos dibujar una línea vertical u horizontal
donde le indiquemos con las cláusulas correspondientes. (No todos los compiladores),
se incorporan además éstas cláusulas:
Acucobol en su afán por conseguir una programación totalmente integrada con los
sistemas gráficos, ha conseguido implementar a la orden DISPLAY la potencia
necesaria para displayar ventanas Windows (100%100) así como cualquier tipo de
control. Hoy podemos con una linea de código displayar un COMBOBOX, LABEL,
FRAME, BITMAP, STANDARD WINDOW, FLOATING WINDOW, PUSH-
BUTTON, ENTRY-LABEL, etc... y asignarle cualquiera de sus propiedades. Pero es un
tema demasiado amplio para tratarlo desde aquí. Necesitaría una sección unica y
exclusivamente para la programación gráfica, pero todo se andará.
página(s) : 1/5
(5707 palabras totales en este texto)
(65505 Lecturas)
Daré cabida en esta sección a la explicación 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 programación y son usadas habitualmente.
MOVE, es la instrucción 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.
Si además el campo al que se mueven los datos es de edición, al hacer el paso del
valor, este a su vez se formateará con la edición declarada en la WORKING.
Si son alfanuméricos la alineación se efectuará a la izquierda a menos que se haya
especificado en la WORKING, al definirla, una justificación a la derecha (JUST
RIGHT). Al igual que en los numéricos si es mas pequeño se perderán 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 [Link],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.
...
NUMERO1=001536
NUMERO2=0000153600 (La coma decimal es virtual)
NUMERO3= 1.536,00
TEXTO1=LENGUAJE COBOL
TEXTO2=LENGUAJE C
TEXTO3= LENGUAJE COBOL
Formato 2:
Agregando CORR a la instrucción conseguimos mover de una sola vez un valor entre
identificadores siempre que los campos que contengan tengan el mismo nombre. Estos
identificadores no pueden ir en niveles 66, 77 ni 88. El efecto es el mismo que si
hicieramos tantos MOVE normales como campos iguales tuviera el identificador. No es
muy usual, pero si hay casos en los que puede ser razonable su uso.
No es necesario que tengan el mismo PIC, ni que estén en el mismo orden, solo que
coincidan en su nombre.
...
WORKING-STORAGE SECTION.
01 DATOS1.
02 NOMBRE PIC X(30).
02 REGION PIC X(20).
02 PAIS PIC X(15).
01 DATOS2.
02 PAIS PIC X(10).
02 REGION PIC X(10).
02 NOMBRE PIC X(10).
...
PROCEDURE DIVISION.
INICIO.
MOVE "ANDRES MONTES" TO NOMBRE IN DATOS1.
MOVE "ANDALUCIA" TO REGION IN DATOS1.
MOVE "ESPAÑA" TO PAIS IN DATOS1.
MOVE CORR DATOS1 TO DATOS2.
...
Nota: Para partir con unos valores, primero los he movido a las variables del
primer grupo (DATOS1). Después de aplicar el MOVE CORR, el valor de las
variables de DATOS2 sería:
DATOS2:
PAIS=ESPAÑA
REGION=ANDALUCIA
NOMBRE=ANDRES MON
Instr. de Variables
página(s) : 2/5
(5707 palabras totales en este texto)
(65505 Lecturas)
INITIALIZE, se utiliza para inicializar variables según su descripción, es decir pondrá
a ceros todas las variables numéricas o de edición y a espacios en blanco las alfabéticas
y alfanuméricas. 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.
...
Esta instrucción tiene formatos diferentes según 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 número 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 después 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.
Instr. de Variables
página(s) : 3/5
(5707 palabras totales en este texto)
(65505 Lecturas)
Formato 2:
INSPECT campo1
REPLACING variable1 CHARACTERS BY Cambio1
(( BEFORE/AFTER) INITIAL)Cadena1
(ALL)(LEADING)( FIRST) Cadena2...
(Se puede repetir de nuevo)
...
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.
Formato 3:
INSPECT campo1
CONVERTING Identificador1 TO Identificador2
(( BEFORE/AFTER) INITIAL) Cadena1 ... (Se puede repetir de nuevo)
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 mayúsculas o en minúsculas 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.
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.
Instr. de Variables
página(s) : 4/5
(5707 palabras totales en este texto)
(65505 Lecturas)
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 concatenación 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 cláusula el valor de identificador1 será en la
posición 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 ejecutaría Sentencia1 si hubiera habido un error al hacer la
concatenación, por ejemplo si se especifica Identificador1 con un valor superior
al tamaño del Campo3.
NOT ON OVERFLOW, se ejecutará Sentencia2 si no existe error en la
operación.
Vamos a ver unos ejemplos y además 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.
...
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.
página(s) : 5/5
(5707 palabras totales en este texto)
(65507 Lecturas)
UNSTRING, hace exactamente lo contrario de que hemos visto que hacía STRING, es
decir divide el contenido de un campo en otros.
DELIMITED BY, indica el límite hasta donde vamos cogiendo el campo1 para
partirlo. Igual que en STRING, solo que con la función 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 información que vaya
fragmentando.
DELIMITER, va a contener en cada caso el elemento separador, si hemos
incluido en DELIMITED varios, Identificador1 guardará el carácter que de los
elegidos ha sido el causante de la fragmentación.
COUNT, cuenta el número de caracteres incluidos en la fragmentación.
DELIMITER y COUNT, se podrán usar si se ha especificado DELIMITED.
Podemos usar tantos DELIMITER y COUNT como campos se vayan a crear en
la fragmentación.
TALLYING, si especificamos esta opción la instrucción nos guardará en
Identificador4 el número de campos que se han utilizado en la fragmentación.
POINTER, indica desde que posición va a ser examinado el campo que desea
desfragmentar, por defecto su valor es 1, es decir desde el primer caracter.
ON OVERFLOW, se ejecutaría Sentencia1 si hubiera habido un error al hacer la
operación.
NOT ON OVERFLOW, se ejecutará Sentencia2 si no existe error en la
operación.
Vamos a hacer lo contrario de antes y conseguir una fecha numérica 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.
TEXTO1 = HOY
TEXTO2 = ES
TEXTO3 = DE
TEXTO4 = DE
ELMES = JUNIO
DIA = 22
ANIO = 2001
FECHA = 22062001
LETRAS = 5
PALABRAS = 7
...
WORKING-STORAGE SECTION.
01 TEXTO PIC X(30) VALUE "MONTES ROBLES, ANDRES".
01 APELLI1 PIC X(20).
01 APELLI2 PIC X(20).
01 NOMBRE PIC X(20).
01 SEPARA PIC X.
01 SEGURIDAD.
02 AP1 PIC XX.
02 AP2 PIC XX.
02 NOM PIC X.
...
PROCEDURE DIVISION.
INICIO.
UNSTRING TEXTO DELIMITED BY " " OR ", "
INTO APELLI1 APELLI2 NOMBRE.
Instrucción Perform
página(s) : 1/4
(8338 palabras totales en este texto)
(50229 Lecturas)
Creo que por méritos propios esta instrucción se merece un apartado para ella sola. Es
una instrucción 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 instrucción mas importante tanto por su
variedad de formatos, como por el número de veces que se suele usar dentro de un
programa, además nos puede hacer mucho mas sencillo el realizar una programación
estructurada.
Cuando decimos que un programa está estructurado, no cabe duda que es debido al uso
de ésta instrucción. 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 debéis
de tener en cuenta que los ejemplos son solo para aclarar la explicación, nunca los
toméis como programas completos y con una lógica aplastante.
Formato 1: Con este formato transferimos el control del programa a un párrafo, cuando
éste termine vuelve el control a la instrucción 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.
...
Formato 2: Una extensión del anterior es indicarle que ejecute mas de un párrafo,
especificando el inicio y el fin.
...
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 párrafo indicado después del
THRU. Es decir que entre PIDENOMBRE y PIDEAPELLIDO podrá
haber cinco párrados mas y todos ellos se hubieran ejecutado.
Instrucción Perform
página(s) : 2/4
(8338 palabras totales en este texto)
(50229 Lecturas)
...
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.
...
Formato 4: Igual que el antrior formato solo que el número de veces que se ejecute
dependerá de una condición y no de un número fijo.
...
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.
...
Instrucción Perform
página(s) : 3/4
(8338 palabras totales en este texto)
(50229 Lecturas)
PRIMERA CONCLUSION
En los dos primeros formatos, como podréis comprobar a menos que sean instrucciones
que se vayan a llamar desde nuestro programa en mas de una ocasión, éstas podían
haber ido en el lugar del PERFORM, es decir las instrucciones una detrás de otra y
evitar el PERFORM.
Para ello hay que tener en cuenta que la utilización del punto en las instrucciones daría
lugar al fin de la instrucción y nos daría errores, por ello, para finalizar la instrucción
nos basamos en END-PERFORM. Veamos un ejemplo de ello con los dos últimos
formatos explicados anteriormente.
...
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.
...
Instrucción Perform
página(s) : 4/4
(8338 palabras totales en este texto)
(50229 Lecturas)
Formato 5: En esta ocasión utilizaremos el PERFORM basándonos en un valor inicial
el cual podremos y aumentar o disminuir y terminar cuando se cumpla una condición.
No se si me he liado un poco con la explicación pero lo que conseguimos es ahorrarnos
varias instrucciones y resumirlas en una sola, para que lo comprendáis veamos su
formato y un ejemplo. Como he explicado anteriormente podemos hacer que el
PERFORM invoque a uno o varios párrafos 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.
...
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.
...
...
WORKING-STORAGE SECTION.
01 NOMBRE PIC X(12).
01 APELLIDO PIC X(12).
01 SALUDO PIC X(30).
01 OP PIC X.
01 LI PIC 99.
01 CONTA1 PIC 99.
01 CONTA2 PIC 9(6).
PROCEDURE DIVISION.
INICIO.
DISPLAY 'PROGRAMA DE SALUDO' LINE 1 ERASE
PERFORM PIDENOMBRE THRU PIDEAPELLIDO
STRING 'HOLA ' DELIMITED BY SIZE NOMBRE DELIMITED BY '
'
' ' DELIMITED BY SIZE APELLIDO DELIMITED BY ' ' INTO
SALUDO
PERFORM VARYING LI FROM 10 BY 1 UNTIL LI = 15
PERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL CONTA1 >
30
DISPLAY SALUDO(CONTA1:1) LINE LI COL CONTA1 LOW
PERFORM VARYING CONTA2 FROM 1 BY 1 UNTIL
CONTA2 > 400000
MOVE ' ' TO OP
END-PERFORM
END-PERFORM
END-PERFORM
DISPLAY 'FINALIZADO' LINE 22
ACCEPT OP
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.
...
Pero ahora hemos intercalado dos PERFORM dentro de éste, el primero para
que nos muestre el mensaje letra a letra y el segundo para hacer de retardo y
así conseguir un efecto como si escribiéramos el SALUDO con una máquina
de escribir.
Pues sí, podemos desarrollar aún mas la instrucción incluyendo dos nuevos elementos.
En primer lugar, por defecto el contenido del PERFORM se ejecuta después de hacer la
comprobación de la condición que precede a UNTIL , pero podemos hacer que ésta se
realice antes.
Con la opción TEST BEFORE, que es la opción por defecto se comprueba primero la
condición 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 condición.
RESUMIENDO
Una mayor utilización de PERFORM sin duda traerá un uso menor de la declaración
GO y con ello conseguimos una programación estructurada. Las ventajas de la
programación estructurada las quiero explicar en un apartado dentro de ésta misma
sección de Manuales, una vez explique las sentenicas GO e IF, que serán la siguiente
aportación al manual.
En esa nueva sección se verá un caso mas práctico y real de utilización de PERFORM
con uso de lecturas de ficheros y demás experiencias cotidianas en el mundo de la
programación en el ámbito de la gestión.
COBOL / WINDOWS
Que duda cabe que Windows ha dado a los programadores una facilidad para crear aplicaciones impresionante
además de una presencia gráfica que para cualquier programador Cobol de hace algunos años nos hace tener una
pequeña envidia por ese entorno y por el poco y lento efecto que tuvo para nuestro lenguaje.
Han tenido que pasar bastantes años para que hayan ido apareciendo herramientas o compiladores que nos permitan
obtener esos resultados "visuales" pero sin perder de vista nuestro lenguaje. Esto que por un lado nos puede parecer
ilógico creo que tiene su explicación en la principal característica del lenguaje Cobol, y ésta no es otra que la
portabilidad, ya sabemos que cualquier programa escrito en Cobol se puede ejecutar con su Runtime
correspondiente en cualquier máquina y eso al referirnos a Windows obviamente se iba a perder simplemente por el
manejo de la pantalla, ya que no sería lógico no aprovechar todas las ventajas que nos ofrecen los lenguajes
llamados visuales para adaptarse al Cobol. No se si ha quedado clara mi visión pero simplemente lo que he querido
decir es que el realizar un programa Cobol para Windows no nos va a permitir su implantación en otro sistema.
Analizando un poco lo que está pasando actualmente con el lenguaje Java, me di cuenta que es prácticamente la
filosofía del Cobol (igual estoy equivocado), es decir que cualquier programa realizado en un lenguaje concreto se
pueda ejecutar en cualquier máquina sin importar su sistema operativo, de hecho yo tengo aplicaciones realizadas en
Unix y las he pasado a MS-DOS y han funcionado a la primera, solo he tenido que cambiar las rutas de acceso a los
ficheros.
Bien, una vez aclarados éstos puntos en ésta página me gustaría comentar todas las posibilidades que tenemos los
programadores Cobol para adaptarnos al mundo Windows y sus posibilidades. Hoy en dia podemos encontrar en el
mercado muchos productos que nos pueden proporcionar ésto, lo que deberemos tener claro es lo que realmente
queremos, ya que hay herramientas que convierten programas escritos en Cobol a otros lenguajes visuales,
herramientas de apoyo a los programas tradicionales o compiladores que directamente generan programas Windows
a partir de sentencias escritas en Cobol. Lo que si que tendremos que tener claro es que al decidirnos por éstas
herramientas nos tenemos que olvidar de nuestros programas perfectamente estructurados y de la garantía de que
todo el programa fuente era lo que nosotros habiamos escrito.
Acucobol GT
El Cobol con interfaz gráfica: Acucorp, líder en Cobol para sistemas abiertos, ha
logrado combinar la tecnología de interfaces gráficas con la portabilidad de los sistemas
abiertos.
Con Acucobol-GT, solamente es necesario compilar los programas una sola vez, para
después ser ejecutados en cualquier plataforma. Es posible desarrollar y distribuir
aplicaciones que hacen uso de interfaces gráficas de usuario en mas de 600 plataformas,
siendo el código objeto 100% compatible con todas ellas.
Administrador de proyectos
Screen Painter
Editor de programas
El Administrador de Proyectos:
Organiza, desarrolla y mantiene los
ficheros de sus proyectos. El
administrador de proyectos de
Acubench es el centro de control
organizativo de las aplicaciones
Acucobol-GT. Los desarrolladores
pueden visualizar y acceder a todos
los ficheros del proyecto, pueden
seleccionar y almacenar las opciones
de compilación y runtime para el
proyecto completo o para programas individuales.
El administrador de proyectos proporciona acceso a todas las herramientas y funciones
de Acubech, incluyendo el Screen Painter y el Editor de Código. Los desarrolladores
pueden también lanzar virtualmente cualquier programa Windows desde el
administrador de proyectos. Esto permite al usuario utilizar Acubech como el sistema de
desarrollo gráfico mas eficaz y de creciente rendimineto.
Screen Painter:
Herramienta visual para crear y
diseñar pantallas gráficas
interactivamente (100% Windows).
Con el Screen Painter de Acubench,
usted puede facilmente crear
pantallas (GUI) Windows para sus
aplicaciones Cobol sin necesidad de
escribir una linea de código.
Simplemente haciendo "click" y
arrastrar "click and drag" los
controles estándar (GUI) de
Windows (como labels, push butons,
list boxes, grid, bitmaps, etc.) a continuación personalizar las propiedades y estilos
pertenecientes a cada control y pantalla. Cuando la pantalla está terminada, el Screen
Painter genera automáticamente el código Cobol desde la pantalla GUI diseñada,
creando el código de una forma tan sencilla como hacer "click" en un icono. El Screen
Painter disminuye el tiempo que lleva escribir una aplicación GUI, tanto para los
diseñadores gráficos que disponen de experiencia para "escribir" código Cobol
presionando un botón, como por la ayuda a los nuevos diseñadores para alcanzar un
aspecto profesional en sus pantallas con el mínimo esfuerzo.
El Editor de Código:
Potentes características y altamente
personalizable.
El editor de código de Acubench
tiene todas las características que un
desarrollador necesita para generar y
manejar el código fuente Cobol. El
area de trabajo del editor de código
incluye características estándar tales
como título, menu, estado, barra de
herramientas y una especial barra de
herramientas de edición, que es
familiar a los programadores. Tanto
el área de trabajo como las opciones de proyecto son facilmente personalizables.
Los programadores pueden definir aquellas opciones para reunir sus necesidades
individuales y preferencias, de este modo incrementar su productividad. Mediante la
barra de herramientas se accede a compilar, depurar y ejecutar procesos contribuyendo
al desarrollo rápido de una aplicación.
NetExpress (Microfocus)
página(s) : 1/3
(3343 palabras totales en este texto)
(25759 Lecturas)
Generar código nativo de gran rendimiento que puede optimizarse para obtener
óptimos resultados en plataformas de hardware específicas.
Trabajar con múltiples dialectos COBOL, lo que facilita el rehosting de
aplicaciones existentes a nuevas plataformas de producción.
Sacar partido a su escalabilidad, desde PCs independientes hasta sistemas UNIX
multiprocesador (Precisa Micro Focus Object COBOL Developer Suite para
UNIX o Server Express)
Disfrutar de un soporte al desarrollo y la depuración en Object COBOL y e-
COBOL.
Contar con el soporte de bibliotecas básicas de clases, y con una extensa
colección de clases, incluyendo la biblioteca completa de clases Win32 GUI.
NetExpress (Microfocus)
página(s) : 2/3
(3343 palabras totales en este texto)
(25759 Lecturas)
ACCESO a DATOS
OpenESQL™:
OpenESQL convierte de forma transparente las sentencias SQL incrustadas en llamadas
a las API ODBC; esto le permite desarrollar fácilmente aplicaciones que acceden a
diferentes sistemas de bases de datos, lo que significa que puede utilizar cualquier
fuente de datos para la que exista un controlador ODBC. Asimismo Net Express
incorpora acceso nativo a DB2 y ofrece un soporte integrado para precompiladores
Oracle y Sybase.
OpenESQL Assistant:
El asistente OpenESQL permite al programador crear sentencias SQL mediante una
interfaz interactiva. A continuación, estas sentencias se insertan automáticamente en el
punto adecuado del código fuente COBOL. El programador puede incluso probar las
sentencias SQL en OpenESQL Assistant a fin de comprobar los resultados de la misma
y modificarla si fuera necesario, sin tener que compilar y ejecutar la aplicación.
NetExpress (Microfocus)
página(s) : 3/3
(3343 palabras totales en este texto)
(25759 Lecturas)
Objective Cobol
Objective COBOL es la vía perfecta para que los programadores de un lenguaje como
COBOL no se queden estancados y lleguen facilmente a usar un lenguaje
completamente innovador y nuevas herramientas de programación.
O.C. es un entorno visual de programación orientado a objetos, destinado al desarrollo
rápido (RAD) de aplicaciones de uso general para Windows 95, 98 y NT. Con O.C., se
puede crear aplicaciones muy eficaces para Windows con un mínimo código manual.
Los programas que ya se tenían hechos se pueden reutilizar, y además añadir controles
nuevos a dichos fuentes como Botones, Edit, Imágenes... de una forma sencilla.
<
O.C. hace del entorno de desarrollo, un sitio agradable y fácil de usar, en él puede
integrar distintas ventanas y recorrer sus fuentes de la forma mas cómoda posible con la
ayuda del Code Explorer, sin tener que ir recorriendo línea a línea, o con el potente
Image Browser, poder crear un control, con una imagen ya diseñada con tan solo
pinchar y arrastrar, sin necesidad de elegir el componente primero.
O.C. permite construir aplicaciones de gestión empresarial con herramientas de base de
datos: Oracle, Informix, Sybase, SQL Server ... tanto vía SQL-Links como ODBC. De
manera que los ficheros indexados completamente planos de Cobol, ahora ya
directamente pueden usarse como ficheros de una Base de Datos Paradox, DBase.....
PRINCIPALES FUNCIONES
Entorno de desarrollo integrado. O.C. permite desarrollar, probar y mantener
aplicaciones dentro de un solo entorno integrado. Puede crear o modificar una
aplicación, incluyendo fichas de entrada, informes, menus, cuadros de diálogo,
definiciones de base de datos sin salir de O.C.
Diseño mediante el método arrastrar y soltar. O.C. ayuda a mantener la
productividad automatizando aquellas tareas de programación repetitivas pero
esenciales. Para diseñar aplicaciones, basta arrastrar unos componentes hasta
una ficha, creando la arquitectura de la aplicación rápida y fácilmente, con un
mínimo de código.
Herramientas bidireccionales. Conforme selecciona y modifica las
propiedades de los componentes y fichas, los resultados de los cambios
realizados aparecen automáticamente en el código fuente y viceversa. Es posible
modificar los archivos fuente directamente con cualquier editor de texto,
incluido el editor de código incorporado. Los cambios efectuados se reflejan de
forma inmediata en las herramientas visuales.
Compilador de código nativo. El compilador optimizador de código nativo
de 32 bits de O.C. genera archivos de aplicación ejecutables (.EXE). Además del
rendimiento mejorado de los ejecutables compilados.
Conectividad de las bases de datos. También permite desarrollar aplicaciones
que accedan fácilmente a base de datos Paradox, DBase. Con SQL Links, las
aplicaciones pueden acceder también a servidores SQL, incluidos en Interbase,
Oracle.
Desconozco en la actualidad que sucede con este compilador y con sus creadores.
Desde ésta página me gustaría comentar todos los pasos para una buena instalación o
por lo menos todos los que yo he seguido, desde conexiones en serie, descripción de
impresoras, usuarios, terminales, emuladores, etc... Además incluiré varias rutinas que
he desarrollado.
Todo lo que aqui se comente, podría funcionar en otros sistemas operativos, pero como
la mayor parte está desarrollado bajo Unix / Linux, es por ésto que están aqui y no en
otra sección de la Web.
Empezando
Una vez instalado, debemos de pensar en la distribución que le vamos a dar a toda
nuestra información, programas, archivos de datos, copys, pruebas y disponer para ello
de una estructura sencilla que nos permita localizar cualquier dato rapidamente.
Un ejemplo, (mi caso práctico) es partiendo del directorio /home, crear varios
directorios, uno para los archivos de datos, otro para los programas fuente, otro para los
listados, otro para los objetos y otro para los copys.
Todo ésto también nos ayudará a hacer las copias de seguridad mas selectivas. Vuelvo a
repetir que todo lo que aqui expongo es sólo una muestra, pero que evidentemente cada
cual puede optar por la opción que mas le convenga.
Como bien sabemos cada vez que hacemos un nuevo login, hay una serie de archivos
que se ejecutan y con alguno de los cuales podemos definir nuestro entorno de trabajo,
para cada usuario que creemos en su directorio se creará un .profile con las
características para ese usuario en concreto, pero tenemos en el directorio /etc un
archivo llamado profile en el cual se definirán las características comunes a todos los
usuarios.
El comando PATH tiene una pequeña diferencia con el que estamos mas acostumbrado
a utilizar en MS-DOS, y es que no toma por defecto el directorio en el que nos
encontramos por defecto, ésto quiere decir que si tenemos definido el PATH con varios
directorios y queremos ejecutar una aplicación que se encuentra en el directorio sobre el
que estamos, nos dirá que no encuentra el archivo, ésto se soluciona incluyendo en el
PATH, el directorio actual, que UNIX lo denomina ".", por lo tanto será conveniente
añadir a nuestra linea de PATH, dentro del archivo /etc/profile el directorio ".".
PATH=$PATH:directorio:directorio:.:
Ya sabemos que en el directorio de cada usuario que hayamos añadido a nuestro sistema
se nos crea un archivo .profile que se ejecutará cada vez que éste usuario entre en el
sistema. Pues bien podemos añadir a éste archivo todo lo que creamos conveniente, por
ejemplo podemos asignarle una tecla de interrupción, por defecto es <Ctrl+C>, pero si
lo que queremos es que ningún usuario pueda salirse del programa que se está
ejecutando o bien ponemos otra que sea menos corriente o bien la quitamos. Una buena
solución es que cada usuario al dar su login y su password se le cargue inmediatamente
su aplicación, con lo que evitaremos que puedan tocar en el sistema, además cuando
salgan de la aplicación le podemos mostrar una pantalla en la que se indica que para
continuar pulsen alguna tecla y cuando la pulsen volverán al programa evitando asi que
nunca estén en otro sitio que no sea en su aplicación.
Si vamos a utilizar el editor vi que viene con el Unix, éste lo podemos adaptar a nuestras
necesidades mediante la variable EXINIT (en mi caso UNIX SYSTEM V), algunas de
éstas opciones son las siguientes:
ai-noai ......- Inicia cada linea en la misma columna que la linea anterior.
aw-noaw ...- Escribe automáticamente los cambios en el buffer antes de ejecutar
ciertas ordenes en vi.
ic-noic ......- Las mayúsculas y las minúsculas son equivalentes en las búsquedas.
nu-nonu ....- Numera cada linea.
smd-nosmd.- Nos indica en la parte inferior de la pantalla con un texto que
estamos en modo de insercción.
report=n ....- (n) equivale al número de lineas mínimo que hayamos modificado,
borrado o editado para que nos avise.
Terminales
Quiero dejar claro que en muchos casos al decir terminal, me estaré refiriendo a
cualquier dispositivo que podamos conectar al servidor y con el cual nos podamos
comunicar con él.
Terminales de texto, son los llamados "tontos" porque solo se comunican con el
servidor, trabajan en una sesión, solo admiten caracteres de texto, nada de
gráficos y solo se pueden conectar con el equipo mediante conexiones RS-232.
Suelen ser en blanco y negro y admiten varias emulaciones.
Platinas de comunicación, pueden conectarse mediante RS-232 o en red, tienen
el tamaño de un libro y en el van las placas de comunicación con varias salidas,
una para conectar monitores VGA, el teclado, una puerta paralelo y la conexión
con el equipo. Pueden mantener mas de una sesión, son en color y requieren
poco mantenimiento.
PC, poco hay que hablar de ellos, son máquinas totalmente independientes que
con un software adecuado, los llamados "emuladores" conseguimos eso, emular
la máquina a la que nos queremos conectar y el resultado es una sesión de
nuestro servidor en el PC, mediante éstos programas. Podemos utilizar cualquier
conexión, por defecto vienen con varias salidas serie RS-232, pero si los
queremos conectar en red, bastará con adquirir en el mercado cualquier tarjeta
de red, configurarla y listo.
CONEXIONES RS-232.
Características:
La velocidad de transmisión será de 9600 ó 19200 baudios dependiendo de la
distancia.
Para distancias superiores a los 200 metros (aprox.) necesitaremos un
amplificador de señal para que ésta no pierda fuerza y no provoque fallos en el
sistema.
Se utilizarán clavijas RS-232 de 25 ó 9 pines dependiendo de las salidas.
Esta conexión se está perdiendo, porque no nos permite utilizar los recursos del
terminal.
Esta conexión tengo que decir que funciona perfectamente tanto en terminales como en
impresoras. Realmente son los pines 2 y 3 los importantes y van cruzados por que uno
emite y otro recibe, asi cuando el terminal emite el servidor recibe y viceversa. Yo
incluso he probado a conectar solo esos dos cables y ha funcionado, pero la conexión
que he descrito la cogí de unas normas de conexión y siempre ha funcionado.
Como consideración, quiero añadir que si nos vemos obligados a utilizar amplificadores
de linea, éstos es necesario que estén lo mas cerca de cada equipo posible, es decir que
entre las puertas serie y el amplificador haya la menor distancia posible, evitaremos
muchos problemas.
CONEXIONES EN RED.
Para conectar nuestros equipos en red podemos utilizar cable coaxial con conectores
BNC o bien cable de 8 hilos CAT-5 con conectores RJ-45, que se le conoce como par
trenzado precisamente por eso, porque los hilos van unidos de dos en dos y a su vez van
"liados" con el resto de cables pero sin perder esa unión. A estos tipos de red se les
conoce como Ethernet o Fast Ethernet dependiendo de la velocidad que puedan llegar a
alcanzar. Hoy en dia la mayoría de las tarjetas de red vienen con las dos conexiones y
nosotros utilizaremos la que mas nos convenga. La de tipo BNC está orientada a
conexiones de pocos equipos y las conexiones se realizan uniendo todos los ordenadores
con un mismo cable utilizando unos conectores en "T" para cada ordenador y unos
terminadores para cada punta del cable, éstas conexiones son menos fiables pero cuando
vamos a conectar 2 ó 3 equipos es la mas barata y rápida. Las conexiones con RJ-45 se
apoyan en un Hub o concentrador, conectándose todos los equipos aqui y siendo éste
quien se ocupa de enviar las informaciones que le llegan a su destino.
En las imágenes de abajo explico los estándares de conexión entre tarjetas Ethernet.
Tanto de un ordenador a otro sin pasar por un Hub, como conectándolos a través de
Hub. Las imágenes están vistas teniendo los pines metálicos hacia arriba.
Cuando conectamos nuestros equipos en red, es posible que no todos tengan el mismo
sistema operativo, para que la compatibilidad exista utilizamos los protocolos de
comunicacion que son como los traductores y hacen que cualquier información enviada
o recibida sea legible por cualquier equipo, obviamente todos los equipos que unamos
deben de tener instalado el mismo protocolo.
El protocolo TCP-IP, que es el utilizado en Internet, es uno de los mejores y hoy en dia
viene con todos los sistemas operativos por lo que su implementación es perfecta. Para
ello cada equipo que se conecte debe de tener un "número de identificación", dirección
IP, y gracias a ésta dirección los paquetes de información sabran su destino y su
remitente. Estas direcciones IP están compuestas por cuatro números de hasta 3 cifras
separados por puntos y deben de ser únicos, por ejemplo en una red podiamos asignarle
la dirección IP [Link] al servidor y luego aumentando en uno la última cifra iriamos
asignando direcciones a los distintos equipos de la red.
Una vez implantado el protocolo en cada uno de los equipos, podemos empezar a
compartir los recursos de la red, en pricipio podremos hacer Telnet o llamadas al
servidor para iniciar sesiones de trabajo en nuestro servidor Unix o hacer FTP (File
Transfer Protocol) para copiar archivos de nuestro servidor a los equipos o viceversa.
EN LINEA.
Una vez conectados, el equipo y los terminales, podemos decir que estamos en linea,
ahora solo queda que ambos "hablen". Si la conexión la realizamos a terminales o
platinas de comunicación, éstos traen un setup que se suele activar con algunas teclas, y
con el cual podremos configurarlo para trabajar adecuadamente, los parámetros mas
importantes, serán velocidad de transmisión, tipo de emulación, bits por palabra, bits de
stop, paridad y algunas consideraciones menos importantes referentes a sonido en
teclas, activación de bloque numérico, etc...
Esto claro está cuando nos conectemos via RS-232, si lo hacemos en red, los parámtros
de velocidad, paridad y bits se suprimen y es la propia red la que nos indica su
velocidad según sus especificaciones, según tarjetas, cables y demás hardware instalado.
Cuando usamos como terminal un PC, ya hemos dicho antes que necesitaremos un
programa que nos emule el sistema al cual nos queremos conectar. Estos programas
llamados "emuladores" suelen tener las mismas opciones que los setup de los
terminales, pero implementan muchas otras opciones, sobre todo orientadas a
aprovechar los recursos que nos ofrecen los PC´s. De hecho podemos controlar el color,
poner botones configurables, barras de herramientas, etc...
A la hora de elegir el programa, debemos de tener en cuenta cual es nuestro sistema
operativo, según utilicemos MS-DOS, Windows, Mac, etc.. deberemos de escoger
programas que corran sobre éstos sistemas operativos.
El S.O. sobre el cual podemos dar algunas orientaciones es sobre Windows, por ser el
mas extendido, bien, pues podemos encontrar en el mercado muchos emuladores que
consiguen dar un aspecto gráfico a nuestros programas de texto y en los cuales podemos
incluir botones, barras de herramientas, teclas de función, etc... Estos programas suelen
poder conectarse por RS-232 o vía Telnet, siendo ésta última la mas recomendable.
En la sección de enlaces podeis ir a las páginas de 3 buenos emuladores, yo he probado
los tres y todos van muy bien.
Impresoras
Para realizar ésta conexión tendremos al igual que en los terminales varias vias, a
continuación las voy a detallar con unos dibujos para que las entendais mejor.
Una vez conectadas las impresoras tendremos dos opciones para mandarles nuestra
información.
1) La mas normal y lógica es añadiéndolas a nuestro Unix y definiendo los nombres
que utilizan en nuestro archivo de configuración de Cobol, en el caso de RM/Cobol (el
que yo utilizo, si lo sabeis para otros compiladores, me lo decís y lo pongo) se hace de
la siguiente forma:
La acción lp y lp -d , es la que se utiliza en Unix SVR4, para utilizar con Linux es lpr .
Con lp enviamos la información a la impresora por defecto y con lp -d se redirecciona
la salida hacia la impresora especificada despues de -d .
De ésta forma conseguimos que todos los envíos a impresoras pasen previamente por el
sistema de Spool del servidor. Por cierto si estais enviando un listado muy largo y
quereis tener una copia de seguridad, podreis hacerlo porque como sabeis Unix
mantiene un archivo con el nombre del proceso de impesión en un directorio específico
para ello.
Veis que la diferencia es darle las opciones del comando stty directamente en la
sentencia. Todo ésto podría variar algo dependiendo de cada versión de Unix.
Conclusión
Me gustaría, claro está, cuando adquiera experiencia en ello, explicar aqui como se
monta un cliente-servidor y como podemos mantener nuestras aplicaciones en Cobol
enlazando además nuestros datos con todas las herramientas disponibles, hojas de
cálculo, procesadores, etc ...
No dudéis que el Cobol sigue existiendo con fuerza y que con el se puede realizar
cualquier aplicación que se nos ocurra, sin olvidar que Cobol fue concebido para la
gestión.