
Environment Division
Es la segunda division por orden de aparición, 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
comunicación con dicho fichero.
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.
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 sería el siguiente:
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
También podriamos cambiar el valor del símbolo 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 mayúsculas o minúsculas o que no haya diferencias entre ambas con la clausula
ALPHABET.
INPUT-OUTPUT SECION: Es la siguiente sección dentro de la Environment, donde se especificarán todos los ficheros que vamos a
utilizar, su tipo, su modo de acceso asi como el medio en que estarán, esta sección solo será obligatoria cuando vayamos a utilizar
ficheros. Esta tiene dos párrafos FILE-CONTROL e I-O-CONTROL.
123456789012
A B
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 OPTIONAL si indicamos esta opción 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.
Cláusula ASSIGN aqui especificamos el tipo de dispositivo, si es una impresora PRINTER,
si es un fichero sobre el que vamos a grabar RANDOM o DISC,
se pueden utilizar otros como INPUT, INPUT-OUTPUT, CASSETTE, MAGNETIC-TAPE,
pero sin duda los mas utilizados son los dos primeros para identificar si el fichero utilizará una salida impresa
o se utilizará sobre disco. Para identificar ficheros utilizados para clasificar utilizaremos SORT.
Cláusula ORGANIZATION aqui indicamos la organización de los registros de nuestro fichero,
podrá ser SEQUENTIAL, RELATIVE o INDEXED, si nuestro archivo fuera secuencial se podrían omitir ésta clausula asi como
las restantes. De ésta organización se deriva el formato del fichero, SEQUENTIAL si los registros se graban
secuencialmente conforme se dan entrada sin importar si están 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 posición 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, podría ser INDEXED, y cada código será
único para cada artículo y con el nos iremos a su posición y podremos ver todos los demas datos que hagan referencia al registro.
Existe también para los archivos de texto, tipo AUTOEXEC.BAT la posibilidad de asignarlos directamente especificando
LINE SEQUENTIAL en ésta clausula.
Cláusula 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.
Cláusula 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 alfanúmerica y tendrá que estar especificada en la FD del fichero.
Si el archivo fuera RELATIVE, esta clausula se sustituiría por RELATIVE KEY e indicará el número de registro del fichero,
deberá estar declarado en la WORKING-STORAGE SECTION como una variable numérica sin signo.
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:DATOSCLIENTES.DAT" ORGANIZATION INDEXED
ACCESS DYNAMIC RECORD KEY KEY-CLIENTE ALTERNATE RECORD KEY-CLIENTE1 FILE STATUS
STACLI.
SELECT IMPRESORA ASSIGN TO PRINT "PRINTER".
|
|
|
Hemos declarado el archivo CLIENTES como indexado con dos claves, una principal KEY-CLIENTE
y otra alternativa KEY-CLIENTE1 y hemos asignado una variable para guardar los posibles códigos
de error para cuando operemos con éste fichero STACLI. Al indicarle el acceso dinámico 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
aclaración, 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
sería grabar todo lo que debería salir por la impresora en un archivo con ese nombre. |
|
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.
Al asignar la impresora, si asignamos el
nombre PRINTER, éste hace referencia a la impresora por defecto pero tambien podríamos
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 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.
|
|