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.
|
||
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.