Curso de Programación COBOL y SQL
Contenido
OBJETIVOS DEL CURSO...................................................................................2 REQUISITOS GENERALES................................................................................3 TEMARIO........................................................................................................4 3.1 Programacin COBOL........................................................................4 Objetivos....................................................................................... Contenido...................................................................................... Objetivos....................................................................................... Contenido...................................................................................... Objetivos....................................................................................... Contenido...................................................................................... 3.1.1 3.1.2 3.2 3.2.1 3.2.2 3.3 3.3.1 3.3.2 Contenido
Programacin SQL.............................................................................6
Programacin estructurada...............................................................8
1
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
2
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1- REQUISITOS GENERALES
Para la realizacin del curso de programacin COBOL, es necesario disponer de un entorno de desarrollo host COBOL/HP-UX/ORACLE en el que se podrn editar, archivar, compilar, linkeditar programas COBOL y ejecutar scripts Shell de UNIX a travs de la herramienta (Utilcan). Adems, cada alumno contar con un PC con el siguiente software instalado. Microsoft Windows XP Professional Service Pack 3 Utilcan Para poder trabajar con esta herramienta, ser necesario que en sistemas nos den de alta el usuario correspondiente en UNIX, que tendr las siglas del nombre del usuario Editor UltraEdit 32 para programacin COBOL Editor Microfocus Net Express ( incluye la posibilidad de compilar programas en local, expandir copys y otras facilidades para la programacin COBOL) Cliente Oracle SQL*Plus Cliente de conexin a SSH al HOST de desarrollo Putty: Cliente SSH WinSCP: Cliente grfico FTP
3
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1- TEMARIO.
a. Programacin COBOL
1.1 1.1.1 Objetivos Conocer los principales componentes de un programa COBOL, aprendiendo a interpretar la sintaxis de este lenguaje de programacin, sus reglas sintcticas generales y los requerimientos de su escritura en un procesador de textos. Aprender a estructurar un programa COBOL completo y cules son los criterios de ejecucin. Conocer las instrucciones utilizadas para la programacin COBOL. Utilizar la terminologa empleada con los archivos, los conceptos principales, sus caractersticas, los tipos bsicos y la operativa requerida para su manejo. Aprender a solucionar los problemas con archivos. Conocer los criterios que favorecen la calidad final de los programas en aspectos como: legibilidad, eficiencia, fiabilidad, documentacin, etc. 1.1.1 Contenido 1. Elementos del lenguaje COBOL. 1.1 Constantes figurativas: 1.2 Constantes identificadas por un nombre. 1.3 Identificadores 1.4 Operadores. 1.5 Operadores de relacin, de Lgicos. 1.6 Expresiones aritmticas. 1.7 Orden de ejecucin. 1.8 Expresiones de BOOLE 2. Estructura de un programa Cobol. 2.1 Descripcin General 2.2 Identification division. 2.3 Environment divisin. 3. La divisin DATA 3.1 Introduccin 3.2 Seccin de ficheros, de trabajo. 3.3 Descripcin de una estructura registro. 3.4 Nmero de nivel, Nombre de datos. PICTURE. CAMPOS ALFABTICOS. CAMPOS ALFANUMRICOS. 3.5 CAMPOS NUMRICOS, PICTURE para la edicin, USAGE , VALUE, SIGN, JUSTIFIED, BLANK, OCCURS, REDEFINES. 3.6 Seccin de enlace, de comunicaciones, de informes, de pantalla. 4. La divisin PROCEDURE. 4.1 Sentencias bsicas. 5. Sentencias de control
4
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
6. Cadenas de caracteres. 7. Manipulacin de tablas. 8. Ficheros de entrada y salida. 9. Clasificacin y fusin de ficheros. [Link] entre programas. [Link] de pantallas.
5
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
a. Programacin SQL
1.1 1.1.1 1. Objetivos Crear consultas avanzadas con SQL Crear y modificar la estructura de la base de datos con SQL Crear, actualizar y eliminar registros de una base de datos Automatizar todas las tareas de tratamiento de datos con SQL
2. 3.
4. 5. 6. 7.
1.1.1 Contenido Componentes del SQL [Link] de definicin de datos (LDD) [Link] de manipulacin de datos (LMD) [Link] de sentencias Tipos de datos Estructuras de las tablas [Link] de tablas nuevas [Link] clusula constraint [Link] de ndices [Link] el diseo de una tabla [Link] [Link] [Link] sobre vistas [Link] de ms de una tabla Operadores lgicos Consultas bsicas Operadores lgicos Sentencias SQL [Link] [Link]/ROLLBACK [Link] [Link] [Link] [Link] [Link] [Link] BY [Link] [Link] [Link] INTO [Link] [Link],MIN [Link] BY [Link] Y SUBSELECT [Link] DE COLUMNAS
6
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
7
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
a. Programacin estructurada
1.1 1.1.1 Objetivos Comprender la justificacin de la programacin estructurada. Conocer en qu consiste la programacin estructurada. Utilizar la programacin estructurada en el diseo de aplicaciones. Mantener mejor las aplicaciones.
1.1.1 Contenido 1. La visin clsica de la programacin estructurada: la programacin sin goto. 2. La visin moderna de la programacin estructurada: la segmentacin. 3. Programacin estructurada y orientacin a objetos.
8
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
COBOL
9
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Contenido 1- Elementos del lenguaje COBOL............................................................3 Constantes figurativas:............................................................................3 Constantes identificadas por un nombre.................................................3 Identificadores.........................................................................................3 Operadores..............................................................................................3 Operadores de relacin............................................................................4 Operadores de Lgicos............................................................................4 Expresiones aritmticas...........................................................................4 Orden de ejecucin..................................................................................4 Expresiones de BOOLE.............................................................................5 2Estructura de un programa Cobol.........................................................6 Descripcin General.................................................................................6 Identification division...............................................................................6 Environment division...............................................................................6 3La divisin DATA.................................................................................10 INTRODUCCIN......................................................................................10 Seccin de ficheros................................................................................10 Seccin de trabajo.................................................................................10 Descripcin de una estructura registro..................................................10 Nmero de nivel.....................................................................................11 Nombre de datos...................................................................................12 PICTURE.................................................................................................12 CAMPOS ALFABTICOS...........................................................................12 CAMPOS ALFANUMRICOS.....................................................................12 CAMPOS NUMRICOS.............................................................................13 PICTURE para la edicin.........................................................................13 USAGE....................................................................................................14 VALUE....................................................................................................15 SIGN.......................................................................................................15
10
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
JUSTIFIED...............................................................................................15 BLANK....................................................................................................15 OCCURS.................................................................................................16 REDEFINES.............................................................................................16 Seccion de enlace..................................................................................16 Seccin de comunicaciones...................................................................16 Seccin de informes...............................................................................17 Seccin de pantalla................................................................................17 4La divisin PROCEDURE......................................................................18 Introduccin...........................................................................................18 Sentencias bsicas.................................................................................18 567891011Sentencias de control.........................................................................27 Cadenas de caracteres.......................................................................33 Manipulacin de tablas.......................................................................38 FICHEROS DE ENTRADA Y SALIDA.......................................................41 CLASIFICACIN Y FUSIN DE FICHEROS.............................................64 COMUNICACIN ENTRE PROGRAMAS..............................................68 VISUALIZACIN DE PANTALLAS.......................................................71
11
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. DATA DIVISION PROCEDURE DIVISION Constantes figurativas: Una constante figurativa es una constante predefinida en COBOL que puede utilizarse en cualquier parte de la WORKING-STORAGE SECTION o PROCEDURE DIVISION para asignar su valor a un campo. Zero- Designa el valor 0 en el caso de datos numricos. Tambin puede ser referenciada por los nombres ZEROS o ZEROES. Space- Esta constante se utiliza para asignar a un campo no numrico uno o mas espacios en blanco. Tambin puede ser referenciada por el nombre SPACES. High-value- Se utiliza para asignar a literales alfanumricos el valor mas alto posible del cdigo de caracteres que estemos utilizando (Valor FF en ASCII). Tambin puede ser referenciada por el nombre de HIGH-VALUES. Low-Value- Se utiliza para asignar a literales alfanumricos el valor mas bajo posible del cdigo de caracteres que estemos utilizando (Valor 00 en ASCII). Tambin puede ser referenciada por el nombre de LOW-VALUES. ALL literal- representa una repeticin del literal especificado. Constantes identificadas por un nombre. Estn formadas por un identificador al que asociamos un valor. Se describen en la DATA DIVISION con nivel 78. Una constante identificada por un nombre se utiliza en cualquier lugar donde un literal pueda aparecer en un formato. Identificadores. Los identificadores son nombres creados por el programador. Para formar un identificador hay que tener en cuenta las siguientes reglas: Un identificador consta de un mximo de 30 caracteres. Estos caracteres pueden ser solamente letras, dgitos y el guin. No deben empezar ni terminar en un guin. Un identificador definido por el usuario no puede tener el mismo nombre que una palabra reservada. Un identificador debe contener obligatoriamente al menos una letra, excepto cuando se trate de un nombre de prrafo o de seccin. Cualquier identificador utilizado en la PROCEDURE DIVISION debe estar previamente definido en la ENVIRONMENT DIVISION o en la DATA DIVISION. Operadores. Los operadores son smbolos que indican como son manipulados los datos. Carcter Significado Ejemplo
12
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
+ * / ** = ()
Operadores de relacin. Los operadores de relacin se utilizan para comparar dos valores numricos o dos valores alfanumricos (no numricos). El resultado puede ser verdadero o falso. Carcter = < > <= >= Significado Igual que Menor que Mayor que Menor igual Mayor igual Ejemplo A=B A<B A>B A <= B A >= B
Estos operadores, tienen todos igual prioridad. Operadores de Lgicos. Los operadores lgicos nos permiten combinar varias expresiones de relacin. Igual que los operadores de relacin, se utilizan normalmente para tomar decisiones. Un operador lgico toma una combinacin de valores verdaderos-falsos y devuelve un resultado verdadero o falso.
Los operadores lgicos colocados en orden de prioridad son los siguientes: NOT, AND, OR.
A B Not A V V F
A AND B V
A OR B V 13
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
V F F V F F
F V V
F F F
V V F
Expresiones aritmticas. Una expresin aritmtica puede ser una constante, una variable o un conjunto de constantes y variables unidas por operadores aritmticos.
* El parntesis izquierdo no debe ir seguido de un espacio. * El parntesis derecho no debe ir precedido de un espacio. * El signo = u los operadores +, -, *, - y ** deben ir precedidos y seguidos de un espacio.
Orden de ejecucin. A la hora de evaluar una expresin, la prioridad de las operaciones es la siguiente:
1- Primero se evalan las operaciones entre parntesis, de los mas internos a los mas externos. 2- Despus, y siguiendo el orden que se describe a continuacin se evalan los operadores aritmticos: ** *, / +,-
Los operadores escritos sobre una misma lnea tienen la misma prioridad. Cuando en una expresin intervienen varios operadores con la misma prioridad, estos se evalan de izquierda a derecha.
Expresiones de BOOLE. Una expresin de BOOLE da como resultado un valor verdadero o falso. Los operadores que intervienen en una expresin de BOOLE pueden ser: Operadores de relacin y operadores lgicos.
14
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si en una expresin de BOOLE intervienen varios tipos de operadores primero se evalan los operadores aritmticos, despus los operadores de relacin y por ultimo los operadores lgicos. Ejemplo: ((A = 0) AND ((B*2) NOT = 0)) OR (C=0) 2 5 1 3 6 4
15
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
2-
COBOL
es
un
conjunto
de
sentencias
COBOL
Las sentencias, entradas, prrafos y secciones de un programa COBOL son agrupadas en cuatro divisiones que forman la estructura general de dicho programa.
El formato general y el orden de presentacin de las entradas y sentencias que constituyen un programa COBOL es:
IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. [END PROGRAM id-programa]
Estos nombres representan las cabeceras de las cuatro divisiones mencionadas y la cabecera de final de programa que es opcional y valida bajo las normas ANS85. En esta ultima, id-programa debe coincidir con el nombre especificado en el parrafo PROGRAM-ID.
Identification division.
La division de IDENTIFICACION, sirve para proporcionar un nombre para identificar el programa. Opcionalmente se puede especificar informacin acerca del autor, fecha en que fue escrito, etc.. El formato general para la divisin es el siguiente.
IDENTIFICATION DIVISION. PROGRAM-ID. Nombre del programa. [AUTHOR. Nombre del programador.]
16
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
[INSTALATION. Lugar de instalacin.] [DATE-WRITTEN. Fecha en que fue escrito.] [DATE-COMPILED. Fecha en que fue compilado.] [SECURITY. Entrada de comentarios.]
Solo las dos primeras lineas, IDENTIFICATION DIVISION y PROGRAM-ID, son obligatorias.
Program-id.
Este parrafo sirve para espeficar el nombre del programa. Este nombre sera utilizado por el compilador o durante la ejecucin para indicar en que programa ocurrio algun error.
El nombre del programa debe ajustarse a las reglas de formacin de un identificador COBOL, vistas en el capitulo anterior.
El resto de los parrafos son opcionales, pueden aparecer en cualquier orden, y su utilizacin queda perfectamente definida en el formato descrito.
Si un comentario ocupa mas de una linea, no esta permitido utilizar el guin como caracter de continuacin, sin embargo puede ser continuado en las lineas siguientes, comenzando en el margen B. Environment division.
La division de ENTORNO permite definir el tipo de ordenador para el que fue escrito el programa, asi como los dispositivos perifericos necesarios para soportar los ficheros utilizados en el programa.
17
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
SOURCE-COMPUTER. Modelo de ordenador. OBJECT-COMPUTER. Modelo de ordenador. SPECIAL-NAMES. Nombres especiales.] [INPUT-OUTPUT SECTION. FILE-CONTROL. Control de ficheros. [I-O CONTROL. Control de entrada / Salida.] ]
Seccion de configuracin.
Esta seccin es opcional. Su utilidad es documentar el programa COBOL, indicando el modelo de ordenador utilizado y asociar los nombres nemonicos especificados por el programador a nombres utilizados por el compilador. A continuacin se describen los parrafos que la componen.
Parrafo SOURCE: Sirve para especificar el modelo de ordenador que va a compilar el programa. Su formato es el siguiente: SOURCE COMPUTER. Modelo de ordenador. [WITH DEBUGING MODE.]
La opcin WITH DEBUGING MODE permite introducir en el fichero fuente COBOL, codigo que nos servira de ayuda para depurar el programa.
Parrafo OBJECT: Sirve para especificar el modelo de ordenador que va a ejecutas el programa. Su formato es el siguiente: OBJECT COMPUTER. Modelo de ordenador.
18
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La clausula MEMORY SIZE tiene como finalidad documentar el programa y especifica el tamao de la memoria necesaria para poder ejecutar el programa expresado en palabras, caracteres o modulos.
La clausula SEQUENCE, especifica la secuencia de caracteres utilzada en comparaciones y clasificaciones no numericas. Si esta se omite se utiliza el codigo ASCII o EBCDIC. En nuestro caso se utiliza el codigo ASCII La clausula SEGMENT-LIMIT solo sirve de comentario. La segmentacin en COBOL tiene sentido en la PROCEDURE DIVISION, la cual y para este proposito, estara dividida completamentamente en secciones, cada una de las cuales estara clasificada como una porcion fija o como un segmento independiente del programa objeto. El numero de segmento esta comprendido entre 1 y 49. Parrafo SPECIAL-NAMES:
SPECIAL-NAMES [Nombre de funcin IS nombre nemnico] [ALPHABET] [DECIMAL-PIOINT IS COMMA] [CURRENCY SIGN IS literal]
Nombre de funcin es un nombre reconocido por el compilador, por ejemplo PRINTER y nombre nemotecnico es un nombre creado por el programador.
19
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La clausula ALPHABET se utiliza para asignar un nombre a un conjunto especifico de caracteres o a una determinada secuencia de clasificacin. Su formato es el siguiente:
El juego de caracteres STANDARD-1 o ASCII es el codigo American Standard Code for Information Interchange. STANDARD-2 es el codigo ISO 7-bit.
Cuando se especifica un nombre de alfabeto en una clausula CODE-SET en la descripcin de fichero, es para especificar el codigo de caracteres que se quiere utilizar.
Si se especifica la opcin de literal, el nombre de alfabeto no puede referenciarse en la clausula CODE-SET. La secuencia de clasificacin identificada esta definida de acuerdo con las siguientes reglas: 1- El valor de cada literal especifica: A) El valor ordinal de un caracter dentro del juego de caracteres nativo, si el literal es numerico. B) El caracter actual dentro del juego de caracteres nativo, si el literal no es numerico. Si el literal no es numerico y esta formado por varios caracteres, cada caracter, comenzando con el caracter mas a la izquierda, es asignado a posiciones sucesivas, ascendentemente, en la secuencia de clasificacin que esta especificando.
20
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
2- El orden en el que los literales aparecen en la clausula ALPHABET, en secuencia ascendente, especifica el nmero ordinal del caracter dentro de la secuencia de clasificacin.
3- Cualquier caracter dentro de la secuenca nativa de clasificacin que este explicitamente espresado en el literal, asume una posicin, en la secuencia de clasificacin, mayor que cualquiera de los caracteres explicitamente especificados.
4- Si se especifica la opcin THRU, el conjunto de caracteres contiguos, del codigo nativo, que comienzan con el caracter especificado por el literal-1 y que termina con el caracter especificado por el literal-2, es asignado a posiciones sucesivas, ascendentemente, en la secuencia de clasificacin que se esta especificando.
5- Si se especifica la opcin ALSO, los caracteres del codigo nativo especificados por literal-1 y literal-3 se asignan a la misma posicin en la secuencia de clasificacin que se esta especificando.
Los caracteres que ocupan las posiciones mas baja y mas alta en la secuencia de clasificacin definida, se asocian con las constantes figurativas LOW-VALUE y HIGHVALUE respectivamente. Si estas posiciones son ocupadas por mas de un caracter, el valor de la constante figurativa correspondiente se asocia al ultimo caracter especificado.
La clausula DECIMAL-POINT IS COMMA permite transformar, en la edicin de resultados, el punto decimal en los numeros, en coma.
La funcin de la clausula CURRENCY IS literal es la de reemplazar el signo $ de la moneda americana, que se usa en la clausula PICTURE, por el correspondiente signo de la moneda local. El literal esta limitado a un solo caracter, el cual debe especificarse en la clausula PICTURE correspondiente, en lugar del caracter $.
Seccion de entrada-salida.
Esta seccin es opcional. Permite declarar los ficheros de E/S que utiliza el programa, asi como definir las tecnicas especiales de E/S. 21
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
3-
La divisin DATA.
INTRODUCCIN.
La divisin de datos se utiliza para realizar una descripcin completa de los ficheros que intervienen en el programa, de sus registros lgicos y de las variables intermedias o de trabajo.
El formato general para esta divisin es el siguiente: DATA DIVISION. [FILE SECTION. Descripcin del fichero Descripcin del registro. ... ]
[WORKING-STORAGE SECTION [77 Descripcin de campos individuales. ] [01 Descripcin de registros. ]] [LINKAGE SECTION. [77 Descripcin de campos individuales. ] [01 Descripcin de registros. ]] [COMMUNICATION SECTION. [Descripcin comunicacin. ] [Descripcin de registros. ] ] [REPORT SECTION. [Descripcin de informes.]] [SCREEN SECTION. 01 Descripcin de pantallas.]
Seccin de ficheros.
22
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
En la FILE SECTION debe describirse toda la informacin referente a los ficheros utilizados en el programa.
Seccin de trabajo.
En la WORKING-STORAGE SECTION se describen los campos utilizados por el programa como campos intermedios o de trabajo. El formato es el siguiente: [WORKING-STORAGE SECTION. [77 Descripcin de campos individuales.] [01 Descripcin de registros.]]
Los campos que se especifican en la SECCIN DE TRABAJO pueden agruparse siguiendo el formato empleado en el apartado descripcin de una estructura registro, expuesto a continuacin, o bien ser campos de independientes en cuyo caso van precedidos por el numero de nivel 77. Descripcin de una estructura registro.
Una descripcin de registro consiste en un conjunto de descripciones de datos, las cuales describen las caractersticas de un registro en particular. Cada descripcin de dar esta formada por un numero de nivel seguido de un nombre de datos, o de la clusula FILLER, seguido de una serie de clusulas si es que estas son requeridas.
Una descripcin de registro puede tener una estructura jerarquizada compuesta por una o mas inscripciones jerarquizadas o campos que escribiremos de acuerdo con el siguiente formato:
23
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
El orden de estas clusulas puede ser cualquiera, excepto la clusula REDEFINES, que debe ser la primera, en el caso de especificarse. Toda inscripcin debe terminar con un punto.
El nombre del registro lleva numero de nivel 01 y el resto de los campos lleva un numero de nivel de 02 a 49.
Nmero de nivel.
Sirve para indicar la relacin existente entre un campo y el resto de los campos del registro.
- Campos elementales: Un campo elemental no puede subdividirse o no es necesario subdividirlo para ser tratado por el programa. - Campos compuesto: Un campo compuesto esta formado por varios campos elementales. - Campos independientes : Un campo independiente es un campo de trabajo que ser definido en la seccin de trabajo.
Una estructura jerarquizada, permite trabajara con registros completos, con campos compuestos y con campos elementales.
Los nmeros de nivel que pueden utilizarse son: del 01 al 49, 66, 77, 78 y 88. El nivel superior es el 01.
Las normas a seguir para utilizar los nmeros de nivel son las siguientes: 24
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
* Un campo compuesto tiene un nivel superior que cualquiera de sus campos elementales. * El numero de nivel 01 solo puede preceder al nombre del registro. * Los nmeros del 02 al 49 pueden preceder a cualquier campo del registro, elemental o compuesto. * Los numero de nivel utilizados no tienen porque ser correlativos. * El numero de nivel 77 se utiliza para describir campos independientes en la WORKING. * El numero de nivel 88 se utiliza para describir nombres de condicin. El formato es el siguiente:
THROUGTH 88 nombre de condicin VALUE literal-1 THRU literal-2 literal-3 THRU THROUGTH literal-4
* El numero de nivel 66 se utiliza nicamente con la clusula RENAMES. Permite asignar un nuevo nombre a un campo elemental, a un campo compuesto o a un conjunto de campos elementales. Su formato es el siguiente:
La clusula RENAMES no puede formar parte de la descripcin de un campo y es obligatorio especificarla inmediatamente despus de la descripcin del registro.
Un campo con numero de nivel 01, 77 u 88 no puede ser renombrado por esta clusula.
Ni nombre de dato-2 ni nombre de dato-3 pueden tener la clusula OCCURS, ni pueden estar subordinados a un campo que contenga la clusula OCCURS.
25
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
* El numero de nivel 78 se utiliza para definir constantes identificadas por un nombre. Cada referencia a una constante, es reemplazada por el compilador COBOL, por su valor.
Nombre de datos
Sirve para nombrar el campo con el fin de poder referenciarlo en el programa y debe escribirse a continuacin del numero de nivel. Si en la PROCEDURE DIVISION no se va a referenciar alguno de los campos nombrados, el nombre de cada uno de estos campos, puede ser sustituido por la palabra FILLER. PICTURE. Esta clusula permite declarar el tipo y el tamao de un campo elemental. El tipo determina la informacin que puede almacenarse en el campo, as como las operaciones de que con l puedan realizarse. Su formato es el siguiente:
El tipo de campo, depende de los caracteres que se empleen para definir la especificacin de formato. Los campos los podemos clasificar en alfabticos, alfanumricos y numricos.
La longitud del campo viene dada por el numero de caracteres empleados en la especificacin de formato para declarar el campo. El mximo numero de caracteres permitido es 30. CAMPOS ALFABTICOS.
26
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Permiten almacenar nicamente letras y/o blancos. El carcter que se emplea para definir un campo de este tipo es la A.
CAMPOS ALFANUMRICOS.
Permiten almacenar cualquier carcter del juego de caracteres ASCII. El carcter que se emplea para definir un campo de este tipo es la X.
CAMPOS NUMRICOS.
Permiten almacenar cualquier valor numrico. Tener en cuenta que en COBOL no se permiten nmeros superiores a 18 cifras. Los caracteres que se emplean para definir un campo de este tipo sin: 9, S, V y P.
El significado de cada uno de los caracteres que pueden intervenir en una especificacin de formato para un campo numrico es:
9 S
Representa un cifra del 01 al 9. Indica la aparicin del signo + o -. El signo no es obligatorio, pero es conveniente ponerlo porque sino COBOL, despus de cada operacin lo suprime sistemticamente, lo que repercute en un mayor tiempo de ejecucin. Cuando se pone, debe ser el primer carcter de la especificacin de formato. Representa la posicin de un punto decimal implcito. Se utiliza internamente para alinear las partes decimales de los campos, cuando se quiere realizar una operacin. Indica una cifra virtual, representando un cero. Para la que no se ha reservado una posicin de memoria. PICTURE para la edicin.
27
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Para visualizar por pantalla o escribir por la impresora un campo, adems de los caracteres A, X, 9, V y P se dispone de los caracteres:
Z * . , 0 B / CR DB $ + -
Representa una cifra del 0 al 9. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco. Representa una cifra del 0 al 9. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un *. Los caracteres Z y * no pueden ir precedidos, pero si seguidos del carcter 9.
. ,
El punto hace que se inserte un punto decimal para separar la parte entera de la parte decimal. La coma hace que se inserte este mismo carcter en el lugar que se indica en la especificacin de formato.
La clusula DECIMAL-POINT IS COMMA en la ENVIRONMENT DIVISION, permite invertir el papel del punto y la coma en las especificaciones de formato en la edicin. B 0 / CR Permite que se inserte un espacio en blanco en el lugar que se indica en la especificacin de formato. Permite que se inserte un cero en el lugar de que se indica en la especificacin de formato. Permite que se inserte una barra en el lugar de que se indica en la especificacin de formato. Smbolo bancario indicativo de crdito. Solo puede colocarse a la derecha de la especificacin de formato. CR aparece sobre la lnea que se imprime si el valor es negativo. Si el valor es positivo aparecern en su lugar 2 espacios en blanco. Smbolo bancario indicativo de dbito. Solo puede colocarse a la derecha de la especificacin de formato. DB aparece sobre la lnea que se imprime si el valor es negativo. Si el valor es positivo
DB
28
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
aparecern en su lugar 2 espacios en blanco. $ + Un carcter $ colocado en el primer lugar en la especificacin de formato, permite la aparicin de este carcter en el lugar indicado. Un carcter + colocado en primer o ultimo lugar en la especificacin de formato, permite la aparicin de un + para valores positivos y de un - para valores negativos en el lugar indicado. Un carcter + colocado en primer o ultimo lugar en la especificacin de formato, permite la aparicin de un espacio en blanco para valores positivos o un - para valores negativos en el lugar indicado.
$$... La aparicin en una especificacin de formato de n caracteres $, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter $. ++... La aparicin en una especificacin de formato de n caracteres +, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter + para los valores positivos o un - para los valores negativos. -La aparicin en una especificacin de formato de n caracteres +, permite editar un valor de n-1 cifras. Si la cifra a escribir se corresponde con un 0 no significativo, se escribe en su lugar un espacio en blanco, excepto a la izquierda de la primera cifra significativa que se inserta un carcter - para los valores negativos.
La clusula DECIMAL-POINT IS COMMA, permite utilizar la coma decimal en lugar del punto decimal. Sin embargo, este problema puede ser resuelto sin necesidad de especificar esta clusula. Para ello indicaremos en la especificacin de formato el lugar de la coma mediante el carcter V e insertaremos a su izquierda o derecha el carcter coma1 . USAGE.
Esta clusula permite indicar cono se almacenar en memoria, valor en un campo numrico. Su formato es el siguiente:
29
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
DS L Y IPA C MU A I N L O P T TO A UA E SG C MU A I N LX O P T TO A C MU A I N L3 O P T TO A C MU A I N L4 O P T TO A C MU A I N L5 O P T TO A o o o o o CM OP C MO PX C MO P3 C MO P4 C MO P5
DISPLAY es la opcin por defecto. Con esta opcin, cara carcter sea numrico o no, ocupa un byte o octeto en memoria, representado en ASCII. Los valores numricos son almacenados en base 10.
COMP y COMP-4 tienen el mismo significado. Se emplean con campos numricos y los valores son almacenados en los mismos en binario puro. Empleando la representacin complemento a 2.
COMP-3 se emplea solo con campos numricos y hace que un valor sea almacenado en binario decimal empaquetado (BCD). El semiocteto menos significativo contiene el signo.
COMP-5 es un formato similar a COMP, con la diferencia de que el valor que puede almacenarse, no depende del numero de 9 indicados en la clusula PIC, si no del numero binario mas grande que pueda almacenarse en ese espacio.
COMP-X es un formato similar a COMP. Con respecto a este tiene las siguientes diferencias:
* a) La especificacin de formato puede estar formada totalmente por X. * b) Tanto si la especificacin de formato esta constituida por X o por 9, el valor que puede almacenarse queda limitado al numero binario mas grande que pueda almacenarse. * c) El uso de COMP-X con elementos utilizados en operaciones aritmticas, esta restringido a las operaciones ADD, SUBSTRACT, MULTIPLY y DIVIDE no permitindose el empleo de ON SIZE ERROR. Si el resultado obtenido con estas operaciones es demasiado grande, se trunca. Si el resultado no es un entero, se 30
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta clusula puede utilizarse en esta seccin, para asignar un valor a un campo con nivel 88, nombres de condicin, para asignar un valor a una constante identificada por un nombre o bien para inicializar campos de datos con un determinado valor. Formato: VALUE literal. SIGN.
Esta clusula especifica la posicin y el modo de representacin del signo operacional de un campo numrico en cuya especificacin de formato se ha especificado S. Su formato es el siguiente:
La clusula SIGN se aplica a campos numricos descritos como USAGE IS DISPLAY. Si la clusula SEPARATE no se especifica, el signo del numero es incorporado en el dgito de la derecha (TRAILING) o en el dgito de la izquierda (LEADING). En este caso el carcter S de la PICTURE no se tiene en cuenta para determinar el tamao del campo.
Si la clusula SEPARATE se especifica, entonces el signo es almacenado como un carcter separado adicional a los dgitos. En esta caso el carcter S se tiene en cuenta para determinar el tamao del campo.
31
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta clusula permite justificar un valor alfabtico o alfanumrico a la derecha. Su formato es el siguiente:
Esta clusula puede especificarse solamente con campos elementales u no puede especificarse para un campo descrito como numrico o de edicin.
BLANK.
Esta clusula llena un campo numrico con espacios cuando su valor sea cero. De esta forma, eliminan todos los caracteres de insercin, en caso de que la zona a editar sea nula. Su formato es el siguiente:
Esta clusula puede especificarse solamente con campos elementales con formato DISPLAY o con campos numricos de edicin. OCCURS.
numricos
Esta clusula permite definir una estructura de datos denominada tabla. Una tabla es un conjunto de elementos todos del mismo tipo, esto es, con idnticos atributos. Su formato es el siguiente:
OCCURS n TIMES.
La clusula OCCURS indica el numero de veces, n, que se repite un elemento (campo simple o compuesto) con la misma descripcin.
32
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
El subndice correspondiente al primer elemento es 1. El subndice puede ser un numero entero o un nombre de datos. Si es un nombre de datos se recomienda declararlo con formato binario (COMP).
La clusula OCCURS no puede especificarse en una descripcin con numero de nivel 01 o 77.
Una tabla en COBOL puede tener hasta 3 subndices. En este caso se dice que la tabla es de 3 dimensiones.
La clusula OCCURS y VALUE son incompatibles, lo cual no permite inicializar una tabla en su propia declaracin. REDEFINES.
Esta clusula permite dar a un campo o a un rea de memoria mas de un nombre y mas de un formato. Su formato es el siguiente:
nombre de dato-1 REDEFINES nombre de dato-2 FILLER
Los campos nombre de dato-1 y campos nombre de dato-2 han de estar declarados al mismo nivel, pero no a nivel 66 u 88.
La redefinicin de un campo compuesto se hace inmediatamente despus del ultimo de los campos elementales que forman parte de aquel.
Seccion de enlace.
33
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta seccin permite declarar campos de memoria para ser utilizados por otros programas y por consiguiente conservar los datos de un programa para otro. Seccin de comunicaciones.
Esta seccion permite procesar mensajes y controlar el flujo de los mismos. Seccin de informes.
Esta seccin permite crear un dormato especifico para imprimir un fichero de salida. Seccin de pantalla.
34
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
4-
La divisin PROCEDURE.
Introduccin.
La DIVISIN DE PROCEDIMIENTOS indica la secuencia necesarias, sentencias COBOL, para resolver un problema dado.
de
operaciones
[DECLARATIVES. {Nombre de Seccin SECTION [numero-segmento].[sentencia USE]. [Nombre de prrafo. [sentencia] ...]...}... END DECLARATIVAS. ] {Nombre de Seccin SECTION [numero-segmento].[sentencia USE]. [Nombre de prrafo. [sentencia] ...]...}...
La clusula USING se especifica solamente en programas que luego son llamados (CALL) o enlazados (CHAIN). La sentencia USE cuando es ejecutada la seccin.
Como las otras divisiones, la PROCEDURE DIVISION, puede ser dividida en secciones y estas a su vez en prrafos. Cada prrafo generalmente agrupar varias sentencias. La divisin en secciones es opcional y es poco utilizada, en cambio la divisin en prrafos es frecuente.
Opcionalmente la PROCEDURE DIVISION puede contener secciones DECLARATIVAS. En caso de utilizarlas, estas deben ser las primeras en definirse. Su finalidad es el tratamiento de errores.
35
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencias bsicas
Esta secuencia permite visualizar datos por pantalla o imprimirlos directamente en la impresora. Su formato es el siguiente:
Formato 1:
nombre de datos DISPLAY literal [WITH NO ADVANCING] literal nombre de datos UPON nombre de funcin nombre nemonico
El nombre mnemnico debe ser un nombre asociado a un nombre de funcin, nombre reconocido por el compilador en el prrafo SPECIAL-NAMES.
El literal puede ser una constante figurativa, excepto ALL, una constante de caracteres o un literal numrico. La opcin NO ADVANCING hace que el cursor no avance de lnea, una vez que se ha ejecutado la sentencia DISPLAY.
Cuando utilizamos la clusula UPON, el nombre simblico debe declararse en el prrafo SPECIAL-NAMES. Si en lugar de utilizar un nombre mnemnico utilizamos un nombre de funcin el resultado es el mismo.
Formato 2:
nombre de datos-1 DISPLAY literal-1 AT LINE NUMBER entero-1 COL nombre de datos-2 COLUMN NUMBER entero-2 nombre de datos-3
36
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La frase UPON CRT, es la opcin por defecto e indica visualizar los datos indicados por pantalla.
La frase MODE IS BLOCK hay que especificarla cuando nombre de datos-1 corresponde a un campo compuesto y para que los datos elementales nombrados con FILLER sean tenidos en cuenta. Esto es, nombre de datos-1 es considerado como un campo elemental.
Si no se especifica nombre de datos-1 o literal-1, DISPLAY, sin mas mueve el cursor a la posicin indicada.
Si nombre de datos-1 es una constante figurativa, tiene un efecto especial que indicamos a continuacin: SPACE LOW-VALUE ALL X01 ALL X02 ALL X07 Limpia la pantalla desde la posicin del cursor especificada, hasta el final de la misma. Mueve el cursor a la posicin especificada. Limpia desde la posicin del cursor especificada, hasta el final de la lnea. Limpia toda la pantalla. Suena, enva un pitido.
Opciones.
Esta clusula emite un sonido cada vez que DISPLAY es ejecutado. Esta clusula hace parpadear el elemento
37
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
visualizado. HIGHLIGTH REVERSE-VIDEO Esta clusula hace que el elemento visualizado aparezca en alta intensidad Esta clusula hace que el elemento visualizado aparezca en vdeo inverso. Esta clusula se utiliza con campos elementales y especifica el tamao del campo. Si el tamao especificado es menor que el especificado en la clusula PIC, solamente aparecer la porcin de la parte izquierda y si el tamao especificado es mas grande se rellena con blancos. Esta clusula hace que el visualizado aparezca subrayado. elemento
Esta clusula especifica el color en el que es visualizado el elemento. Entero es un valor entre 0 y 7. Esta clusula especifica el color de fondo sobre el que es visualizado el elemento. Entero es un valor entre 0 y 7. Borra la pantalla. Borra una lnea.
Esta sentencia permite asignar a uno o mas campos de datos. Valores desde el teclado. Su formato es el siguiente:
DATE DAY TIME
Esta sentencia permite asignar a nombre de datos el valor de las constantes DATE, DAY y TIME.
38
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
DATE es una constante de seis cifras de la forma AAMMDD, donde AA son las dos ultimas cifras del ao, MM es el mes y DD es el da. DAY es una constante de cinco cifras de la forma AANNN, donde AA son las dos ultimas del ao y NNN es el da del ao.
TIME es una constante de 8 cifras HHMMSSCC, donde HH es la hora (00..23), MM son los minutos, SS son los segundos y CC son las centsimas de segundo.
Formato 2:
nombre-nemonico ACCEPT nombre de datos FROM nombre de funcion
El nombre mnemnico debe ser un nombre asociado a un nombre de funcin, nombre reconocido por el compilador, en el prrafo SPECIAL-NAMES. Formato 3:
nombre de datos-2 ACCEPT nombre de datos-1 AT LINE NUMBER entero-1 EXCEPTION [FROM CRT] [MODE IS BLOCK] [WITHopciones] EXCEPTION NOT ON ESCAPE sentencia-2 [END-ACCEPT] ON ESCAPE
sentencia-1
Una sentencia ACCEPT es tratada bajo este formato si va seguida de alguna de las clusulas AT, UPON, MODE o WITH, sin es considerada como una sentencia ACCEPT estndar (ANSI) vista anteriormente.
Los campos elementales en nombre de datos-1 deben tener una USAGE DISPLAY. La clusula AT da la posicin de pantalla donde va a comenzar la operacin de lectura. Si no se especifica, se supone la lnea 1, columna 1.
39
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Las clusulas LINE y COL pueden aparecer en cualquier orden y sirven para especificar la lnea y la columna respectivamente, donde va a comenzar la lectura. El numero de lnea viene especificado por nombre de datos-2 o por entero-1 y el numero de columna por nombre de datos-3 o por entero-3.
La frase UPON CRT, es la opcin por defecto e indica aceptar el dato indicado por la consola.
Si nombre de datos-1 corresponde a un campo compuesto, y la frase MODE IS BLOCK no se ha especificado, entonces los campos elementales correspondientes que no sean FILLER son aceptados en el orden que estn especificados y separados por un numero de espacios en blanco igual a la longitud del campo FILLER correspondiente. Si esta frase se especifica entonces nombre de datos-1 es considerado como un campo elemental.
Opciones: BELL o BEEP BLINK HIGHLIGHT REVERSE-VIDEO esta clusula emite un sonido cada vez que ACCEPT es ejecutado. Esta clusula hace parpadear el elemento aceptado. Esta clusula hace que el elemento aceptado aparezca en alta intensidad. Esta clusula hace que el elemento aceptado aparezca en vdeo inverso. Esta clusula se utiliza con campos elementales y especifica el tamao del campo. Si el tamao especificado es menor que el especificado en la clusula PIC, prevalece el tamao especificado por la clusula SIZE y si el tamao es mas grande prevalece el especificado por la clusula PIC. Esta clusula hace que el elemento aceptado aparezca subrayado. Especifica el color en el que se escribe el elemento aceptado. Especifica el color de fondo sobre el que se escribe el elemento aceptado
40
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta clusula marca sobre la pantalla con el carcter especificado, los posiciones vacas mientras se ejecuta la operacin ACCEPT. PROMPT sin carcter utiliza el carcter por defecto (carcter de subrayado). Esta clusula termina automticamente un operacin ACCEPT cuando se tecla el ultimo carcter. Esta clusula obliga a dejar el campo completamente vaco o completamente lleno. Esta clusula obliga a no dejar el campo completamente vaco. Esta clusula impide que los caracteres tecleados aparezcan en la pantalla. Esta clusula permite visualizar el contenido del campo antes de efectuar la entrada. Esta clusula ajusta el contenido de un campo numrico editado o no editado, a la derecha una vez que se finaliza ACCEPT. Para ello es necesario que se especifique simultneamente la clusula SIZE.
AUTO
FULL o LENGTH-CHECK
Si se especifica la frase ON EXCEPTION y la operacin ACCEPT no termina satisfactoriamente, se ejecuta sentencia-1, que es una sentencia imperativa (no condicional). Si se especifica la frase NOT ON EXCEPTION y la operacin ACCEPT termina satisfactoriamente, se ejecuta la sentencia-2, que es tambin una sentencia imperativa.
Opcionalmente se puede utilizar la frase END-ACCEPT la cual delimita el mbito del ACCEPT.
Esta sentencia permite transferir datos de un campo de memoria a otro o a otros. Su formato es el que sigue: Formato 1: 41
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Los datos contenidos en el campo nombre dato-1 o en el literal son movidos al campo nombre datos-2. Despus de realizarse esta operacin de mover, los dos campos contendrn los mismos datos.
Si a continuacin de la clusula TO especificamos mas de un campo, el contenido del campo nombre dato-1 se mueva a todos ellos.
En la transferencia de un campo elemental a otro elemental se pueden presentar los dos casos siguientes.
1- Movimiento de un campo numrico a otro numrico (no de edicin o de edicin). En este caso los campos origen y receptor se alinean por el punto decimal. Si el tamao del campo receptor es menor que el tamao del campo emisor, se produce un truncamiento de la parte entera y/o decimal. En caso contrario, se rellena con ceros no significativos cualquiera de las partes.
En caso de que el campo receptor sea de edicin, se siguen las mismas reglas expuestas para la clusula PICTURE.
2- Movimiento de un campo de cualquier tipo a otro de tipo alfabtico o alfanumrico. (No de edicin o de edicin). En este caso el contenido del campo emisor se va colocando en el campo receptor de izquierda a derecha, excepto cuando en el campo receptor se haya declarado la clusula JUSTIFIED RIGTH, en cuyo caso, el contenido ser colocado de derecha a izquierda.
42
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si el tamao del campo receptor es menor que el campo emisor se produce truncamiento. En caso contrario se rellena con espacios en blanco.
Si el campo receptor es de edicin, se siguen las mismas reglas expuestas para la clusula PICTURE.
1- Como un campo elemental, cuya longitud es la suma de los campos elementales que lo forman. En este caso el campo receptor es considerado como un campo elemental alfanumrico.
Formato 2:
CORRESPONDING CORR
MOVE
Cuando se utiliza esta clusula todos los campos tienen que ser compuestos.
Utilizando la clusula CORR con la sentencia MOVE, es posible mover un numero variable de campos elementales pertenecientes a nombre dato-1 a nombre dato-2 que tengan el mismo nombre.
Los campos con igual nombre tienen que ocupar la misma posicin jerrquica en ambos campos compuestos.
Si los campos elementales pertenecen a subgrupos del campo compuesto, los nombres de estos subgrupos tienen tambin que coincidir en ambos campos compuestos.
Esta sentencia permite asignar a uno o mas campos, el valor de un literal numrico, de otro campo numrico o de una expresin aritmtica. Su formato es el siguiente.
nombre dato-3 literal numerico expresion aritmetica
Sentencia-1 imperativas).
sentencia-2
son
sentencias
no
condicionales
(sentencias
La frase END-COMPUTE solo puede ser utilizada con la frase SIZE ERROR.
Opcin ROUNDED.
Esta opcin, que sigue al nombre del campo que deber contener el resultado, permite redondear dicho resultado. Este redondeo consiste en aadir una unidad en la cifra menos significativa almacenada, si la primera decimal truncada es 5 o mayor de 5.
Durante la ejecucin, se puede dar un resultado cuyo numero de cifras enteras supere el tamao de la parte entera del campo receptor. Esto produce un truncamiento de las cifras mas significativas del resultado. La opcin ON SIZE ERROR, permite tomar una determinada accin, si se produce este caso, ejecutando la sentencia imperativa escrita a continuacin de la misma. De esta forma se controla cualquier anomala que pueda ocurrir en la ejecucin de una operacin aritmtica. Un ejemplo tpico es la divisin por cero.
Por el contrario, la sentencia imperativa que sigue a la frase NOT ON SIZE ERROR, se ejecuta, si durante la ejecucin de una operacin aritmtica no ocurre ninguna anomala.
44
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia ADD
Esta sentencia permite sumar dos o mas operandos numricos y almacenar el resultado en uno o varios campos elementales.
Formato 1:
nom dato-1 bre A D D literal num erico [N T O O SIZ ER O N E R R sentencia-2] [EN -A D D D ] ... TO [nom dato-2 bre [R U D ]] O N ED ... [O N SIZE ER O R R sentencia-1]
Opcin TO.
Esta opcin hace que los valores de los operandos a su izquierda sean aadidos a los valores a su derecha. Todos los operandos tienen que ser numricos.
La frase END-ADD puede ser solamente utilizada con la frase SIZE ERROR.
Formato 2:
nombre dato-1 ADD literal numerico [NOT ON SIZE ERROR sentencia-2] [END-ADD]
... GIVING
Opcin GIVING.
La suma de los operandos que preceden a la palabra GIVING, pueden ser almacenados en cada uno de los campos que siguen a dicha palabra. Los campos elementales que estn a continuacin de la palabra GIVING pueden ser numricos o numricos editados.
45
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Formato 3:
CORRESPONDING
ADD
CORR
Los campos elementales de nombre dato-1, sern sumados a los campos de igual nombre de nombre dato-2. El resultado queda almacenado en los campos elementales de nombre dato-2.
Sentencia SUBTRACT.
La sentencia SUBTRACT es utilizada para restar un dato numrico, o la suma de dos o mas datos numricos, de uno o mas campos dejando el resultado en uno o mas campos. Formato 1:
SUBTRACT
... FROM
Con este formato, todos los operandos que preceden a la palabra FROM se suman y el total es restado de nombre dato-2, almacenando el resultado en el mismo campo, y repitiendo el proceso para el resto de los campos que siguen a la palabra FROM.
Formato 2:
SUBTRACT
... FROM
GIVING
Con este formato, todos los operandos que preceden a la palabra FROM son sumados y el total, es restado al valor actual de literal-2 o de nombre dato-2, almacenando el resultado en los campos que siguen a la palabra GIVING.
46
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Formato 3:
SUBTRACT
CORRESPONDING CORR
Cuando se utiliza este formato los campos elementales de nombre dato-1 son restados de los correspondientes campos elementales de nombre dato-2.
Sentencia MULTIPLY.
La sentencia MULTIPLY es utilizada para multiplicar un dato numrico por otro u otros datos numricos y dejar el resultado en uno o mas campos.
Formato 1:
MULTIPLY
BY
Con este formato, el operando que precede a la palabra BY se multiplica por el valor que la sigue, almacenando el resultado en nombre dato-2, y repitiendo el proceso para todos los campos que siguen a BY.
La frase END-MULTIPLY puede ser solamente utilizada con la frase SIZE ERROR.
Formato 2:
47
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
MULTIPLY
BY
GIVING
Con este formato, el operando literal o nombre dato-1 se multiplica por literal-2 o nombre dato-2, almacenando los resultados en los campos que siguen a la palabra GIVING.
Sentencia DIVIDE.
La sentencia DIVIDE es utilizada para dividir uno o mas datos numricos por otro y dejar el resultado en uno o mas campos.
Formato 1:
nombre dato-1 DIVIDE literal INTO nombre dato-2 [ROUNDED] ... [ON SIZE ERROR sentencia-1]
Con este formato, el operando que precede a la palabra INTO acta como divisor del valor actual de nombre dato-2, almacenando el resultado en este mismo campo, y repitiendo el proceso para el resto de los campos que siguen a la palabra INTO.
La frase END-DIVIDE puede ser utilizada solamente en el caso de que se especifique la frase SIZE ERROR.
Formato 2:
nombre dato-1 DIVIDE literal INTO literal-2 nombre dato-2 GIVING nombre dato-3 [ROUNDED]
48
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Con este formato el operando literal o nombre dato-1 acta como divisor de nombre dato-2 o literal-2, almacenando el resultado en los campos que siguen a la palabra GIVING.
Formato 3:
nombre dato-1 DIVIDE literal BY literal-2 nombre dato-2 GIVING nombre dato-3 [ROUNDED]
Con este formato el operando literal o nombre dato-1 se dividen por el valor de literal-2 o nombre dato-2, almacenando los resultados en los campos que siguen a la palabra GIVING.
Formato 4:
nombre dato-1 DIVIDE literal INTO literal-2 nombre dato-2 GIVING nombre dato-3 [ROUNDED]
REMAINDER nombre dato-4 [ON SIZE ERROR sentencia-1] [NOT ON SIZE ERROR sentencia-2] [END-DIVIDE]
Con este formato el operando literal o nombre dato-1 acta como divisor de nombre dato-2 o literal-2, almacenando el valor en los campos que siguen a la palabra GIVING y el resto de la divisin en el campo nombre dato-4. El resto puede ser entero o decimal y se calcula restando del dividendo el producto del cociente por el divisor. El calculo del resto, no se tiene en cuenta el redondeo en caso de que se haya especificado la clusula ROUNDED.
Formato 5:
nombre dato-1 DIVIDE literal BY literal-2 nombre dato-2 GIVING nombre dato-3 [ROUNDED] REMAINDER nombre dato-4
49
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Con este formato el operando literal o nombre dato-1 se divide por el valor actual de nombre dato-2 o literal-2, almacenando el valor en los campos que siguen a la palabra GIVING y el resto de la divisin en el campo nombre dato-4. El resto puede ser entero o decimal y se calcula restando del dividendo el producto del cociente por el divisor. El calculo del resto, no se tiene en cuenta el redondeo en caso de que se haya especificado la clusula ROUNDED.
50
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
5-
Sentencias de control.
La sentencia IF toma una decisin referente a la accin a ejecutar en un programa, basndose en el resultado, verdadero o falso, de una condicin. Su formato es:
accin-1 IF condicin [THEN] NEXT SENTENCE ELSE NEXT SENTENCE accin-2 [END-IF]
Si en la condicin intervienen operadores de diferentes tipos, los operadores aritmticos tienen mayor prioridad, despus se ejecutan los operadores de relacin y por ultimo los operadores lgicos.
Si el resultado de la condicin es verdadero, se ejecutar lo indicado por la accin-1. Si el resultado de la condicin es falso, se ejecutar lo indicado por la accin-2. Si el resultado de la condicin es falso, y la clusula ELSE se ha omitido, la accin-1 se ignora. En cualquier caso de los anteriormente expuestos, la ejecucin continua con la siguiente sentencia ejecutable.
Cuando la accin-1 o la accin-2 estn formadas por varias sentencias, solamente la ultima finaliza con un punto, ya que este indica el final de una sentencia IF.
Pruebas de relacin:
IS
Condiciones combinadas.
Una condicin combinada esta formada por un conjunto de condiciones simples unidas por los operadores OR y AND. El formato es el siguiente:
AND condicin simple OR condicin simple
Tambin, hay que tener presente que el operador NOT puede preceder a una condicin simple o a una condicin combinada.
Pruebas de clase.
52
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Pruebas de signo. Permiten determinar si el valor de un campo numrico de una expresin aritmtica es positivo, negativo o cero. El formato general es el siguiente:
nombre datos POSITIVE IS [NOT] NEGATIVE expr-aritmetica ZERO
Permiten probar si un nombre de condicin al que se le ha asociado un determinado valor, coincide con el valor del campo de datos del cual depende.
Las sentencias IF...THEN pueden estar anidadas. Esto quiere decir que como accin-1 o accin-2, de acuerdo con el formato, puede escribirse otra sentencia IF.
Estructura IF.
La estructura presentada a continuacin, aparece con bastante frecuencia y es por lo que la damos un tratamiento por separado. Esta estructura es consecuencia del anidamiento de sentencias IF.
53
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
IF condicin-1 . sentencias-1 . ELSE IFcondicin-2 . sentencias-2 . ELSE IFcondicin-3 . sentencias-3 . ELSE . sentencias-n . [END-IF]
Si se cumple la condicin-1, se ejecutan las sentencias-1 y si no se cumplen se examinan secuencialmente las condiciones siguientes hasta ELSE, ejecutndose las sentencias correspondientes al primer ELSE IF, cuya expresin sea cierta. Si todas las expresiones son falsas, se ejecutan las sentencias-n correspondientes al ultimo ELSE. En cualquier caso, se continua con la siguiente sentencia en la estructura.
La sentencia PERFORM es utilizada para transferir explcitamente el control a uno o mas procedimientos y devolver el control implcitamente, cuando la ejecucin del procedimiento especificado, finalice. La sentencia PERFORM se puede utilizar para controlar la ejecucin de una o mas sentencias, las cuales estn dentro del mbito de la sentencia PERFORM. Formato 1:
Si no se especifica la sentencia THRU, la sentencia PERFORM ejecuta una vez, el conjunto de sentencias que forman el procedimiento-1. Si la opcin THRU se especifica, entonces se ejecutan, una vez todos los procedimientos existentes en el programa entre procedimiento-1 y procedimiento-2, ambos inclusive.
Formato 2:
54
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si no se especifica la opcin THRU, la sentencia PERFORM ejecuta el numero de veces especificado por entero o por un nombre de datos, le conjunto de sentencias que forman procedimiento-1. Si la opcin THRU se especifica, entonces se ejecutan el numero de veces especificado, todos los procedimientos existentes en el programa entre procedimiento-1 y procedimiento-2, ambos inclusive.
Formato 3:
PERFORM
Cuando se emplea este formato, la sentencia PERFORM ejecuta el numero de veces especificado por entero o por nombre de datos, el conjunto de sentencias que hay entre PERFORM y END-PERFORM. Un punto, como final de alguna de las sentencias de esta estructura, dara lugar a un error, ya que se entendera como final de la sentencia PERFORM.
Formato 4:
AFTER PERFORM procedimiento-1 [THRU procedimiento-2] WITH TEST BEFORE UNTIL condicin
Si no se especifica la opcin THRU, la sentencia PERFORM ejecuta el conjunto de sentencias que forman el procedimiento-1 hasta que la condicin sea verdad. Si la opcin THRU se especifica, entonces se ejecutan, hasta que la condicin sea verdad, todos los procedimientos existentes en el programa entre procedimiento-1 y procedimiento-2, ambos inclusive.
55
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1- Se evala la condicin. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa, si es falsa se pasa al punto 2. 2- Se ejecuta el procedimiento-1 hasta el procedimiento-2, si ha sido especificado, y se vuelve al punto 1. La opcin TEST BEFORE, evala la condicin antes de la ejecucin, esto quiere decir que la ejecucin se efectuara 0 o mas veces. Es la opcin por defecto.
La opcin TEST AFTER, evala la condicin despus de la ejecucin, esto quiere decir que la ejecucin se efectuara una o mas veces.
Formato 5:
BEFORE PERFORM WITH TEST AFTER {sentencia} ... END-PERFORM UNTIL condicin
Cuando se emplea este formato, la sentencia PERFORM ejecuta el conjunto de sentencias que hay entre PERFORM y END-PERFORM hasta que la condicin sea verdad. Un punto, como final de alguna de las sentencias de esta estructura, dara lugar a un error, ya que se entendera como final de la sentencia PERFORM.
Formato 6:
BEFORE PERFORM procedimiento-1 [THRU procedimiento-2] nombre dato-1 VARYING nombre indice-1 UNTIL condicin FROM nombre dato-2 literal nombre indice-2 WITH TEST AFTER nombre dato-3 BY nombre indice-3
1- El nombre dato-1 se inicializa al valor especificado por literal o nombre dato-2 que sigue a FROM. 2- Se evala la condicin. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa. Si es falsa se pasa al punto 3. 3- Se ejecuta el procedimiento-1 hasta el procedimiento-2, si ha sido especificado. 4- Se suma a nombre dato-1 el valor especificado por nombre dato-3 que sigue a BY, y se vuelve al punto 2.
Formato 7:
BEFORE PERFORM WITH TEST AFTER nombre dato-3 BY nombre indice-3 UNTIL condicin {sentencia} ... END-PERFORM VARYING nombre indice-1 nombre dato-1 FROM nombre dato-2 literal nombre indice-2
La ejecucin, si no se ha especificado la opcin TEST AFTER, se realiza de la forma siguiente: 1- El nombre dato-1 se inicializa al valor especificado por literal o nombre dato-2 que sigue a FROM. 2- Se evala la condicin. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa. Si es falsa se pasa al punto 3. 3- Se ejecutan las sentencias entre PERFORM y END-PERFORM. 4- Se suma a nombre dato-1 el valor especificado por nombre dato-3 que sigue a BY, y se vuelve al punto 2.
Formato 8:
57
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
BEFORE PERFORM procedimiento-1 [THRU procedimiento-2] nombre dato-1 VARYING nombre indice-1 UNTIL condicin-1 nombre dato-4 AFTER nombre indice-4 FROM nombre dato-5 literal-2 nombre indice-5 nombre dato-6 BY nombre indice-6 FROM nombre dato-2 literal nombre indice-2 WITH TEST AFTER nombre dato-3 BY nombre indice-3
UNTIL condicin-2
La ejecucin, si no se ha especificado la opcin TEST AFTER, se realiza de la forma siguiente: 1- El nombre dato-1 y el nombre dato-4 se inicializan a los valores respectivos que siguen a cada FROM. 2- Se evala la condicin-1. Si es cierta, se da por finalizada la ejecucin de la sentencia PERFORM y se pasa a la sentencia siguiente en el programa. Si es falsa se pasa al punto 3. 3- Se evala la condicin-2. Si es cierta, el nombre dato-4 se inicializa al valor especificado por literal-2 o nombre dato-4 que sigue a FROM, tambin se suma a nombre dato-1 el valor especificado por nombre dato-3 que sigue a BY y se continua en el punto 2. Si es falsa se pasa al punto 4. 4- Se ejecutan las sentencias entre procedimiento-1 y procedimiento-2, si ha sido especificado. 5- Se suma a nombre dato-4 el valor especificado por nombre dato-6 que sigue a BY, y se vuelve al punto 3.
Los nombres dato y/o pueden ser enteros o reales, positivos o negativos y cero excepto los nombres de ndice que deben ser enteros.
Dentro del mbito de una sentencia PERFORM, puede especificarse otra sentencia PERFORM, aunque hay que tener presentes las siguientes reglas: 58
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1- El procedimiento PERFORM ejecutado desde el mbito de otro PERFORM debe ser totalmente exterior o totalmente interior a este. 2- Los mbitos de dos PERFORM se pueden solapar cuando las sentencias de llamada para su ejecucin estn fuera de estos mbitos. 3- Las sentencias PERFORM pueden ser anidadas libremente. 4- Un procedimiento PERFORM puede llamarse asimismo, esto es, la recursividad esta permitida.
Sentencia EXIT.
Esta sentencia se utiliza como complemento de la sentencia PERFORM, para proporcionar un punto final para uno o mas procedimientos, a fin de permitir la salida desde cualquier punto.
Formato: EXIT
Esta sentencia permite transferir el control desde un punto de la divisin PROCEDURE a otro.
Se puede omitir la escritura del nombre de procedimiento utilizando la sentencia GO TO en combinacin con la sentencia ALTER, especificando en esta ultima el nombre del procedimiento al que se debe bifurcar.
Formato 2: 59
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia ALTER.
Esta sentencia permite modificar el punto al cual ha de bifurcar una sentencia GO. Su formato es el siguiente:
ALTER nombre procedimiento-1 TO [PROCEED TO] nombre procedimiento-2 [nombre procedimiento-3 TO [PROCEED TO] nombre procedimiento-4] ...
Sentencia STOP.
La sentencia STOP RUN termina el programa y devuelve el control al sistema operativo. Por eso es la ultima sentencia que se ejecuta.
La sentencia STOP literal, suspende la ejecucin del programa y enva el literal especificado a la pantalla. A continuacin el operador puede continuar la ejecucin del programa o bien detener la misma.
60
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
6-
Cadenas de caracteres.
Introduccin.
Una cadena de caracteres es un literal no numrico esto es, una secuencia de caracteres (en nuestro caso ASCII) encerrados entre comillas simples o dobles.
Sentencia EXAMINE.
Esta sentencia cuenta el numero de ocurrencias de un carcter dado en un campo de datos y si es preciso, este carcter puede ser reemplazado por otro.
Formato 1:
UNTIL FIRST EXAMINE nombre dato TALLYING ALL LEADING [REPLACING BY carcter-2] carcter-1
Este formato permite examinar y/o reemplazar caracteres en un campo de datos. Formato 2:
ALL LEADING carcter-3 BY carcter-4 UNTIL FIRST FIRST
El campo denominado por nombre dato tiene que ser un campo de caracteres.
61
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Carcter representa un nico carcter. Si el campo es numrico el carcter debe ser un dgito numrico (0 a 9), un dgito del 0 al 9 no numrico (0 a 9) o la constante figurativa ZERO. Si el campo no es numrico, el carcter puede ser numrico, no numrico o cualquier constante figurativa excepto ALL.
La opcin TALLYING crea automticamente un campo entero denominado TALLY que acta como contador. La cuenta representa el numero de: 1- Caracteres diferentes del carcter-1 hasta la aparicin del carcter igual a carcter-1 (UNTIL FIRST). 2- Veces que se repite el carcter-1 en el campo nombre dato (ALL). 3- Veces que aparece el carcter-1 antes de encontrar uno distinto a el (LEADING).
Cuando se utiliza la opcin REPLACING, las reglas de sustitucin son las siguientes: 1- El carcter-1 o el carcter-3 queda sustituido por el carcter-2 o por el carcter-4 (ALL). 2- La sustitucin por carcter-2 o carcter-4 termina cuando aparece un carcter distinto al carcter-1 o carcter-3 (LEADING). 3- El primer carcter o carcter-3 que aparezca es sustituido por el carcter-2 o carcter-4 (FIRST). 4- La sustitucin por carcter-2 o por carcter-4 finaliza cuando aparece un carcter-1 o carcter-3, o cuando se llega al final del campo (UNTIL FIRST).
Sentencia TRANSFORM.
Esta sentencia permite alterar todos o parte de los caracteres de un campo de acuerdo con una regla de transformacin. Formato:
62
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Dato-1 y dato-2 representan una constante figurativa, un literal no numrico o un nombre de dato. Por lo tanto, existen nueve posibles combinaciones que determinan otras tantas reglas de transformacin. Ambos sern de la misma longitud o numero de caracteres.
Sentencia INSPECT.
Esta sentencia permite contar, reemplazar, o contar y reemplazar ocurrencias de caracteres simples o grupos de caracteres en un campo de datos.
Formato 1:
INSPECT nombre dato-1 TALLYING nombre dato-2 FOR CHARACTERS BEFORE INITIAL AFTER nombre dato-4 literal-2 ...
Formato 2:
INSPECT nombre dato-1 TALLYING nombre dato-2 ALL FOR LEADING literal-1 AFTER nombre datos-3 BEFORE INITIAL nombre dato-4 ... ...
Formato 3:
INSPECT nombre dato-1 TALLYING nombre dato-2 REPLACING CHARACTERS nombre dato-5 BY literal-3 AFTER BEFORE INITIAL nombre dato-4 literal-2 ...
63
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Formato 4:
ALL INSPECT nombre dato-1 REPLACING LEADING FIRST BEFORE INITIAL AFTER nombre dato-4 literal-2 ... ... literal-1 nombre dato-3 BY literal-3 nombre dato-5
Formato 5:
INSPECT nombre dato-1 TALLYING nombre dato-2 FOR {opciones contar} REPLACING {opciones reemplazar}
Formato 6:
literal-4 INSPECT nombre dato-1 CONVERTING nombre dato-6 BEFORE INITIAL AFTER nombre dato-4 literal-2 ... TO nombre dato-7 literal-5
Nombre dato-1 es el campo a examinar. Puede ser un campo elemental o un campo compuesto.
Nombre dato-3 ... Nombre dato-7 se refieren a un campo elemental numrico o no numrico.
64
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Los literal-1,...,literal-5 y los campos denominados por nombre dato-3,.., nombre dato-7, pueden tener cualquier numero de caracteres.
TALLYING indica que hay que contar el numero de veces que aparece la cadena de caracteres designada por nombre dato-3. La cuenta se lleva en nombre dato-2.
CHARACTERS indica que hay que contar todos los caracteres del campo denominado por nombre dato-1.
LEADING indica que hay que contar solo las primeras ocurrencias contiguas.
BEFORE INITIAL indica que el conteo se debe interrumpir despus de la primera ocurrencia designada por nombre dato-4.
AFTER INITIAL indica que el conteo debe comenzar despus de la primera ocurrencia designada por nombre dato-4.
REPLACING indica que el campo denominado por nombre dato-1, hay que reemplazar algunos o todos los caracteres por otros especficos en la sentencia INSPECT. Las opciones que se pueden especificar con REPLACING son las mismas que se han especificado para TALLYING y tienen el mismo significado, si pensamos en que hay que reemplazar en lugar de contar. Aparece una opcin mas que es FIRST.
FIRST indica que solo se reemplaza la primera ocurrencia del campo denominado nombre dato-1.
CONVERTING indica que hay que convertir cada carcter de una cadena de caracteres a los correspondientes caracteres de otra. Ambas cadenas deben tener la misma longitud.
Sentencia STRING.
65
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta sentencia permite enlazar (concatenar) el contenido total o parcial de dos o mas campos, almacenarlo el resultado en un solo campo.
Formato:
nombre dato-1 STRING literal-1 ... DELIMITED BY nombre dato-2 literal-2 SIZE
...
INTO nombre dato-3 [WITH POINTER nombre dato-4] [ON OVERFLOW sentencia-1] [NOT ON OVERFLOW sentencia-2] [END-STRING]
Nombre dato-1 o literal-1, representan las cadenas que deseamos enlazar y nombre dato-3 indica el campo donde se almacenar el resultado. Este campo no debe contener smbolos de edicin. Los campos emisores y receptores no deben ser numricos.
Los campos utilizados como delimitadores (DELIMITED BY nombre dato-2), son campos elementales no numricos que indican hasta que carcter hay que mover, excluido este.
La opcin SIZE indica que, el numero de caracteres que tienen que ser transferidos es como mucho igual al tamao del campo receptor.
Cada literal puede ser un literal no numrico o una constante figurativa excepto ALL.
La opcin POINTER permite especificar por medio del campo nombre dato-4. La posicin en la que va a ser almacenado el primer carcter transferido. Este valor por defecto es 1 y es incrementado en 1 por cada carcter transferido.
66
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si el valor nombre dato-4 es menor que 1 o toma un valor mayor que el tamao del campo receptor, la transferencia de caracteres a este campo se interrumpe y se ejecuta la sentencia-1, si se ha especificado la opcin ON OVERFLOW. En otro caso, la transferencia se realiza totalmente y se ejecuta la sentencia-2, si se ha especificado la opcin NOT ON OVERFLOW.
Sentencia UNSTRING.
INTO {nombre dato-4 [DELIMITER IN nombre dato-5] [COUNT IN nombre dato-6]} [WITH POINTER nombre dato-7] [TALLYING IN nombre dato-8] [ON OVERFLOW sentencia-1] [NOTON OVERFLOW sentencia-2] [END-UNSTRING]
Nombre dato-1 indica la cadena que hay que separar. El resultado se almacena en el campo o los campos representados en nombre campo-4. Los campos utilizados como delimitadores (DELIMITED), son campos elementales alfanumricos que indican por donde hay que separar el campo denominado por nombre dato-1. Si se utiliza la clusula ALL, las posibles ocurrencias consecutivas indicadas por estos campos, se trataran como si fuese una nica ocurrencia.
Cada literal puede ser un literal no numrico o una constante figurativa excepto ALL.
Si se especifica la opcin DELIMITER IN, los caracteres delimitadores son tratados como datos alfanumricos elementales y almacenados en los campos referenciados por nombre dato-5.
67
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si se especifica la opcin COUNT IN, el valor correspondiente al numero de caracteres examinados, excluyendo los delimitadores, es almacenado en el campo referenciado por nombre dato-6.
Si se especifica la opcin POINTER la cadena identificada por nombre dato-1 es examinada a partir de la posicin especificada por el campo nombre dato-7. Esta posicin por defecto es 1. Esta campo es incrementado automticamente en una unidad por cada carcter examinado.
Si se especifica la opcin TALLYING, el valor correspondiente al numero de campos receptores activados durante la ejecucin de una sentencia UNSTRING, es almacenado en nombre dato-8.
Si se especifica la opcin OVERFLOW y el valor del campo nombre dato-7 es menor que 1 o mayor que el tamao de la zona emisora, o bien todos los campos receptores se han activado y aun quedan caracteres por examinar en el campo emisor, la sentencia-1 se ejecuta. Si no se da una condicin OVERFLOW y se ha especificado la sentencia NOT ON OVERFLOW entonces se ejecuta la sentencia-2.
68
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
7-
Manipulacin de tablas.
Introduccin.
Una tabla es un conjunto de elementos del mismo tipo, que comparten en comn un nombre comn pero que son distinguibles por la posicin que ocupa cada uno de ellos en la tabla. Cada elemento de la tabla puede contener un dato numrico o una cadena de caracteres o una combinacin de ambos. La representacin de una tabla se hace mediante variables suscritas o de subndices y puede tener una o varias dimensiones.
La descripcin de una tabla se hace en la seccin FILE y en la seccin WORKING-STORAGE utilizando la clusula OCCURS.
Clusula OCCURS.
OCCURS [entero-1 TO] entero-2 TIMES [DEPENDING ON nombre dato-1] ASCENDING KEY IS nombre dato-2 DESCENDING [INDEXED BY indice-1 [indice-2] ... ] [nombre dato-3] ... ...
La clusula OCCURS no puede especificarse en una descripcin de nivel 01, 77, 88 o 66.
69
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Cuando el numero de veces que se repite el campo con la misma descripcin es variable, se emplea la especificacin entero-1 TO entero-2 donde el valor de entero-1 es menor que el valor de entero-2.
Cuando se especifica la clusula DEPENDING, es para indicar el numero de veces que se repite el campo con la misma descripcin es variable y depende del campo nombrado por nombre dato-1.
Las clusulas ASCENDING o DESCENDING, indican si los elementos de la tabla estan ordenados ascendentemente o descendentemente por uno o mas campos denominados por nombre dato-2 y nombre dato-3 ..., que formen parte de dichos elementos.
La clusula INDEXED se utiliza para especificar el nombre de ndice o ndices, cuando en una tabla ordenada se realiza una bsqueda binaria.
Sentencia SET.
Permite transferir el valor de un literal, nombre de datos o de un ndice a uno mas identificadores. Formato 1:
indice-1 SET nombre dato-1 [nombre dato-2] [indice-2] TO indice-3 entero nombre dato-3
Cuando se ejecuta esta sentencia el valor del operando que sigue a TO es transferido a los operandos que siguen a SET.
Formato 2 :
UP BY SET indice-1 [indice-2] ... DOWN BY entero nombre dato
70
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Este formato permite ir incrementando (UP BY) o decrementando (DOWN BY) el ndice o ndices en el valor especificado por nombre dato o entero.
Esta clusula declara un campo un campo para ser utilizado como un ndice.
Un campo de ndice solo puede ser referenciado por la sentencias SET y SEARCH.
Esta sentencia permite realizar una bsqueda secuencial entre los elementos de una tabla hasta que el contenido de uno de ellos satisfaga una determinada condicin.
nombre dato-2 SEARCH nombre dato-1 VARYING indice-1 sentencia-2 WHEN condicin-1 NEXT SENTENCE [END-SEARCH] WHEN condicin-2 NEXT SENTENCE sentencia-3 [AT END sentencia-1]
Nombre dato-1 se refiere al elemento de la tabla, por lo tanto, su descripcin debe contener una clusula OCCURS mas la clusula INDEXED BY. Puede ser tambin un campo subordinado a otro que contenga una clusula OCCURS.
Cuando se especifica nombre dato-2 debe ser descrito por medio de la clusula USAGE IS INDEX o como un campo elemental entero. El valor de este campo evoluciona paralelamente al ndice de la tabla y se emplea cuando:
b) Se desea incrementar simultneamente el ndice de otra tabla diferente a la tabla en la que se esta realizando la bsqueda.
Las condiciones de las clusulas WHEN se evalan en el orden en que estan descritas.
1. Se inicializa el ndice asociado con nombre dato-1, por medio de una sentencia SET, con un valor que se corresponde con el numero de elemento de la tabla donde se desee que comience la bsqueda. 2. Si el valor del ndice asociado es mayor que el numero de elementos de la tabla, la bsqueda termina y se ejecuta la sentencia que sigue a la clusula AT END, si esta se ha especificado.
3. Se evalan las condiciones de las clusulas WHEN en el orden que estan descritas. Si se satisface alguna de las condiciones, la bsqueda termina y se ejecuta la sentencia asociada con la condicin satisfecha. Si no se satisface ninguna de las condiciones se incrementa el valor de valor del ndice asociado con nombre dato-1 y se continua en el paso 2.
SEARCH nombre dato-1 [AT END sentencia-1] sentencia-2 WHEN condicin NEXT SENTENCE
72
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Nombre dato-1 se refiere al elemento de la tabla, por lo tanto, su descripcin debe contener una clusula OCCURS mas la clusula INDEXED BY y adems la tabla debe estar ordenada por uno o mas campos pertenecientes a dicho elemento, cuestin que indicaremos con la clusula ASCENDING KEY o con la clusula DESCENDING KEY.
73
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
8-
Fichero:
Un fichero es una coleccin de informacin que almacenamos en un soporte para poder manipularla en cualquier momento. Esta informacin se almacena como un conjunto de registros, conteniendo todos ellos generalmente los mismos campos. Campo elemental almacena un dato numrico o de caracteres.
Organizaciones bsicas:
Existen tres organizaciones bsicas de los registros de un fichero, de cuya combinacin se derivan multitud de organizaciones posibles. Estas son:
Modos de acceso:
Se habla de acceso secuencial cuando se van accediendo a posiciones sucesivas, esto es tras acceder a la posicin N, se accede a la posicin N+1, y se habla de acceso aleatorio o directo cuando se accede directamente a la posicin deseada, sin necesidad de acceder a las posiciones que le preceden.
Segn el tipo el tipo de organizacin empleada para crear un fichero el modo de acceso puede ser:
74
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta seccin es opcional. El nombre de la misma, INPUT-OUTPUT SECTION, deber figurar cuando se especifique alguno de sus prrafos. Su Formato es el siguiente:
INPUT-OUTPUT SECTION. FILE-CONTROL. { entrada de control de los ficheros } ... I-O CONTROL. { entrada de control de E/S } ...
Prrafo FILE-CONTROL.
Este prrafo se utiliza para dar un nombre a cada fichero que se utiliza en el programa, al mismo tiempo que se le asigna el equipo perifrico correspondiente. Tambin da informacin acerca de como esta organizado el fichero y cual es el modo de acceso.
Este prrafo esta formado exclusivamente por las sentencias SELECT, existiendo una por cada fichero que se utiliza en el programa. Su formato es el siguiente:
75
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
[ORGANIZATIONIS organizacin] [ACCESS MODE IS modo-de acceso] [LOCK MODE IS modo-de cierre] [RECORD KEY IS clave] [FILE STATUS IS nombre-de-dato]
La palabra OPTIONAL, puede ser solamente especificada con ficheros abiertos en modo INPUT, I-O o EXTENDED. Su funcin es indicar que el fichero especificado puede o no estar presente cuando el programa se ejecute.
El nombre de fichero es el nombre simblico dado al fichero. Debe ser nico en el programa.
Clusula ASSIGN:
Nombre externo del fichero es el nombre real que tiene el fichero bajo el sistema operativo. Si este contiene el carcter -, se tomar como nombre para identificar solamente los caracteres que siguen al ultimo -. Para especificar este nombre puede utilizarse un literal o un nombre de dato.
76
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Cuando un nombre de dispositivo va seguido de un nombre externo, la palabra clave que referencia el dispositivo se ignora.
DISK hace referencia a que el fichero especificado esta sobre el disco magntico. El nombre simblico dado al fichero no tiene porque coincidir con el nombre fsico del fichero. DISK sin nombre externo especifica un fichero en disco cuyo nombre sobre el mismo se especificar en la clusula VALUE OF FILE-ID. Si esta clusula se omite se asume como nombre externo, el nombre interno simblico.
Clusula RESERVE:
Indica al compilador que reserve o no, un numero de reas de entrada adicionales al rea de trabajo normal que se requiere para almacenar un bloque o registro fsico del fichero, una vez ledo. Esto puede repercutir en una mayor velocidad de proceso.
Clusula ORGANIZATION:
77
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
SEQUENTIAL se refiere a la organizacin secuencial, RELATIVE se refiere a la organizacin relativa e INDEXED se refiere a la organizacin secuencial indexada.
Clusula ACCESS:
Indica el modo o tipo de acceso que se va a utilizar para leer y/o escribir lo registros del fichero.
SEQUENTIAL significa que los registros sern accedidos secuencialmente, RANDOM significa que los registros pueden ser accedidos de una forma aleatoria por la clave o por el numero relativo del registro y DINAMIC significa que los registros pueden ser accedidos de forma secuencial o aleatoria.
Clusula LOCK:
Indica si todos o parte de los registros del fichero, pueden o no ser compartidos por otros procesos.
78
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
RECORD RECORDS
EXCLUSIVE especifica que el fichero es exclusivo, esto es, no compartible, y MANUAL o AUTOMATIC especifican que el fichero puede ser compartido por mas de un proceso.
WITH LOCK ON RECORD hace referencia a hacer no compartible un nico registro y WITH LOCK ON MULTIPLE RECORDS, hace referencia a hacer no compartibles mltiples registros.
Esta clusula se utiliza en ficheros con organizacin indexada, e indica la clave utilizada para acceder a los registros de los mismos,
Nombre de dato indica el campo alfanumrico elemental o compuesto perteneciente a un registro del fichero que se utilizar como clave. El contenido de este campo debe ser nico para cada registro.
Cuando se realiza una operacin de E/S sobre el fichero, el sistema mueve un valor al campo denominado por nombre de datos, que indica como se ha realizado dicha operacin. Este campo puede ser numrico o alfanumrico, de longitud de dos dgitos. 79
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
0 1 2 3 4 9
Operacin correcta. Fin de fichero. Clave invalida. Error permanente. Error Lgico. Mensaje de error del sistema.
0 2 4 5 7
No hay informacin disponible. Clave invalida en fichero indexado. La longitud del registro no es correcta. Fichero opcional referenciado no presente. El fichero secuencial no esta en cinta magntica.
Este prrafo permite especificar si dos o mas ficheros van a compartir un rea comn de E/S, o bien permite registrar puntos de control, a partir de los cuales se puede reanudar la ejecucin del programa, tras producirse una interrupcin en el mismo. Esto es bueno, si pensamos que existe el riesgo de una interrupcin accidental durante la ejecucin de un programa, ya que permitira reanudar la ejecucin del mismo, no desde el principio sino desde el ultimo punto de control grabado.
80
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
[SAME [RECORD] AREA FOR fichero-3 {fichero-4}....] [MULTIPLE FILETAPE CONTAINS {fichero-5 [POSITION entero-2]}...]...
La clusula RERUN establece puntos de control desde los cuales se podr reanudar la ejecucin del programa en caso de ocurrir una interrupcin accidental o provocada.
Un punto de control es una informacin del estado del ordenador en un punto determinado de la ejecucin del programa, que se graba generalmente sobre el disco y que permite reanudar la ejecucin del programa desde dicho punto en caso de interrupcin.
81
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si se emplea el formato 1, se graba un registro de control cada vez que se llegue al final fsico de un volumen.
Si se emplea el formato 2, se graba un registro de control cada vez que se hayan procesado de fichero-2, entero-1 registros o bien cada vez que pasen entero-1 minutos.
La funcin de la clusula SAME es indicar que dos o mas ficheros compartirn el mismo rea. Esta clusula es til cuando se dispone de poca memoria.
La clusula MULTIPLE FILE se utiliza cuando varios ficheros estn contenidos en un mismo soporte de cinta magntica. Esta clusula adems de especificar que ficheros estn contenidos, permite indicar la posicin relativa de dichos ficheros en la cinta.
Seccin de ficheros:
En la FILE SECTION debe describirse toda la informacin debe describirse toda la informacin referente a los ficheros utilizados en el programa.
FD nombre de fichero:
FD es la abreviatura de File Description y nombre de fichero, es un nombre creado correspondiente al fichero que va a describirse. Existen tantas FD como ficheros utilicemos en el programa.
Esta clusula es obligatoria e indica si los registros llevan o no etiquetas. Las etiquetas son unos registros adicionales a los registros de datos de un fichero, situados al principio y al final del mismo, que sirven para identificar al fichero. Estos 82
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
registros (etiquetas) se generan cuando se accede a un fichero para salida o se leen cuando se accede a un fichero para entrada.
1- Omitir esta identificacin, clusula OMITTED. 2- Crear etiquetas estndar para todos los ficheros, generadas por el propio sistema, clusula STANDARD. 3- Crear etiquetas con un formato determinado. Le etiqueta seria identificada con un nombre y descrita a nivel 01.
Formato:
Los ficheros en disco requieren etiquetas, en cambio un fichero para salida al que le hemos asignado la impresora no requiere etiquetas.
Esta informacin es necesaria para los ficheros en disco. Indica el nombre externo del fichero, esto es, el nombre que tiene el fichero que se esta describiendo, en el directorio correspondiente del disco. El formato para esta clusula es el siguiente:
nombre-de-datos VALUE OF FILE-ID IS literal
83
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta clusula no puede especificarse, si en la clusula ASSIGN se ha especificado el nombre externo del fichero.
Esta clusula especifica el formato del registro lgico en le fichero. Su formato es el siguiente:
FIXED o simplemente F especifica que todos los registros son de la misma longitud y VARIABLE o V especifica que los registros pueden tener longitud variable o fija.
Esta clusula especifica el numero de registros lgicos que contenidos en un registro fsico o bloque, o el numero de caracteres contenidos en un registro fsico. Su formato es el siguiente:
Si los bloques son de longitud variable debe especificarse entero-1 TO, esto es, el tamao de los bloque estar comprendido entre los valores entero-1 y entero-2. Si los valores son de longitud fija, el tamao vendr dado por entero-2.
84
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta clusula se incluye solamente con ficheros en cintas o discos magnticos. El agrupar los registros de un fichero en bloques, tiene dos objetivos fundamentalmente:
- Aprovechar al mximo los carretes de cinta o las pistas del disco optimizando los espacios entre bloques (IRG). - Optimizar los tiempos de lectura y grabacin empleados.
Esta clusula indica el tamao o numero de caracteres del registro lgico. Su formato es el siguiente.
Si los registros son de longitud variable debe especificarse entero-1 TO, esto es, el tamao de los registros estar comprendido entre los valores entero-1 y entero-2. Si los registros son de longitud fija, el tamao vendr dado por entero-2.
Esta clusula, siendo opcional, es interesante especificarla ya que el valor calculado por el compilador como suma de los campos especificados para el registro y el valor especificado en esta clusula no coinciden, se nos avisar de ello al final de la compilacin.
Esta clusula permite dar un nombre a cada formato distinto de los registros lgicos de un fichero. Su formato es el siguiente:
Esta clusula, opcional, nombra a los registros asociados al fichero que se esta describiendo, quiere esto decir que cada nombre de dato corresponde a un nivel =!. 85
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Clusula LINAGE:
nombre-de-dato-1 LINAGE IS LINES entero-1 nombre-de-dato-2 WITH FOOTING AT entero-2 nombre-de-dato-3 LINES AT TOP entero-3 nombre-de-dato-4 LINES AT BOTTOM entero-4
El tamao de la pgina fsica es. entero-3 + entero-1 + entero-4. El pie de pgina se incluye en el tamao de la pgina lgica. 86
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Clusula CODE-SET:
Esta clusula especifica el juego de caracteres empleado para representar los datos sobre dispositivos externos. Solamente puede ser especificado para ficheros con organizacin secuencial. Su formato es el siguiente:
87
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Descripcin de registros:
Un registro es una estructura jerarquizada compuesta por una o mas inscripciones jerarquizadas (campos) que describiremos de acuerdo con el siguiente formato:
nombre de datos nmero de nivel FILLER [REDEFINES] [BLANK WHEN ZERO] [JUSTIFIED RIGHT] [OCCURS] [PICTURE] [USAGE] [SIGN] [VALUE].
El orden de escritura de estas clusulas puede ser cualquiera, excepto de la clusula REDEFINES, que debe ser la primera, en el caso de especificarse.
El nombre del registro lleva nivel 01 y el resto de los campos lleva un numero de nivel de 02 a 49.
Clusula VALUE:
Esta clusula cuando se utiliza en la descripcin de un registro en la seccin FILE, es para asignar un valor a un campo con nivel 88. Su formato es el siguiente:
THROUGH 88 nombre de condicin VALUE literal-1 THROUGH literal-3 THRU literal-4 ... THRU literal-2
88
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
FICHEROS SECUENCIALES:
1. Especificar la clusula SELECT correspondiente al fichero, dentro del prrafo FILE-CONTROL. Si es necesario describir tambin el prrafo I-O CONTROL.
2. Descripcin del fichero, esto es, especificacin de la clusula FD correspondiente al fichero, dentro de la FILE SECTION.
3. En la PROCEDURE DIVISION: a) Abrir el fichero para la salida (OUTPUT) o adicionales (EXTEND), utilizando la sentencia OPEN. b) Grabar datos en el fichero utilizando la sentencia WRITE. c) Cerrar el fichero utilizando la sentencia CLOSE, una vez finalizado las operaciones de salida.
89
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
SELECT [OPTIONAL] nombre-fichero-1ASSIGN TO dispositivo entero-1 RESERVE NO [RECORD] ORGANIZATION IS LINE [ACCESS MODE IS SEQUENTIAL] [LOCK MODE IS modo-de-cierre] [FILE STATUS IS nombre-de-dato] SEQUENTIAL ALTERNATE AREAS AREA
Si se omite la clusula ORGANIZATION se asume organizacin secuencial y si se omite la clusula ACCESS se asume acceso secuencial.
La organizacin RECORD SEQUENTIAL, se refiere a un fichero secuencial estndar. En este, la longitud de cada registro se especifica por dos bytes que preceden al propio registro. La organizacin LINE SEQUENTIAL, es la opcin por defecto, y hace que cada registro vaya seguido de un carcter fin de lnea que acta como delimitador.
En la clusula SELECT tambin se puede especificar el fichero como un fichero en mltiples carretes de cinta magntica, mediante la frase ASSIGN TO MULTIPLE REEL FILE nombre-externo-del-fichero.
FD nombre del fichero LABEL RECORD [VALUE OF FILE-ID] [RECORDING MODE IS]
90
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
[BLOCK CONTAINS] [RECORD CONTAINS] [DATA RECORD IS] [LINAGE IS] [CODE-SET IS].
Sentencia OPEN:
La operacin de abrir un fichero, establece una comunicacin entre el rea de E/S asociada a ese fichero y el dispositivo externo que lo soporta, comprueba las etiquetas en los ficheros de entrada y las crea para los ficheros de salida, y sita el puntero de lectura-escritura en el primer registro o al final del fichero dependiendo del modo en que se haya abierto el fichero.
Formato 1:
Formato 2:
Formato 3:
91
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Formato 4:
Si el fichero esta almacenado en un soporte que permite la operacin de rebobinar y se especifica la clusula REVERSED, los datos para una sentencia READ quedan disponibles en orden inverso, esto es, comenzando por el ultimo. La clusula NO REWIND hace que el carrete de cinta no se rebobine. Esto puede ser muy til cuando en una cinta hay mltiples ficheros.
Si se especifica la frase WITH LOCK, el efecto es equivalente a especificar LOCK MODE EXCLUSIVE en la sentencia SELECT correspondiente a este fichero, esto es, el fichero no puede ser compartido por otros procesos.
Un fichero abierto en modo OUTPUT es implcitamente un fichero no compartible. Para que mas de un proceso puedan compartir un fichero hay que abrirlo en modo I-O.
Cuando se especifica la clusula INPUT, se abre el fichero especificado para leer. El puntero de lectura se sita en el primer registro. Si el fichero no existe se produce un error.
Cuando se especifica la clusula OUTPUT, se abre el fichero especificado para escribir. Si el fichero que se abre existe, se destruye su contenido actual crendose as de nuevo. Si no se existe se crea.
Cuando se especifica la clusula I-O, se abre el fichero especificado para leer y escribir. El puntero de lectura-escritura se sita en el primer registro. Si este no existe se crea. En este caso una operacin de lectura dara lugar a una condicin de fin de fichero y una operacin de escritura dara lugar a un error. Este modo no se puede utilizar con una organizacin LINE SEQUENTIAL.
Cuando se especifica la clusula EXTEND, significa que se van aadir datos a un fichero con modo de acceso secuencial. De esta forma podemos aadir mas registros a un fichero existente. Si el fichero no existe se crea.
92
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia WRITE:
Cuando se ejecuta esta sentencia se efecta una operacin de salida o de escritura de un registro lgico con destino a un fichero de salida o de entrada-salida. Estas transferencias de informacin se hacen a travs del rea de memoria asignada al fichero aunque esta operacin es transparente al usuario.
BEFORE AFTER
Registro identifica el nombre del registro lgico que se desea escribir. Este estar declarado en la FILE SECTION o en la DATA DIVISION. El fichero asociado debe abrirse en modo OUTPUT o EXTENDED.
Si se especifica la opcin FROM, primero se mueve el contenido del campo referenciado por nombre-de-dato-1 al campo referenciado por registro y a continuacin se efecta la operacin de escribir.
Las opciones BEFORE o AFTER ADVANCING se aplican solamente a ficheros de salida impresos e indican, escribir el registro antes de (BEFORE) o despus de (AFTER) avanzar, entero o nombre-de-dato-1 lneas, pagina (PAGE o FORMFEED), o tabulacin vertical (TAB).
93
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Nombre mnemnico es un nombre creado por el programador con el fin de asociarlo en el prrafo SPECIAL-NAMES a una palabra reservada COBOL.
Si se especifica END-OF-PAGE o su equivalente EOP, debe especificarse la clusula LINAGE en la descripcin del fichero (FD) en el cual estamos escribiendo. EOP es una condicin que es cierta cuando se alcanza el final de la pagina lgica, en cuyo caso se ejecuta sentencia-1.
Sentencia-1 condicionales.
sentencia-2
son
sentencias
imperativas,
esto
es,
no
Cuando en la descripcin de un fichero se utiliza la clusula LINAGE no se puede utilizar ADVANCING nombre-nemonico.
END-WRITE solo se puede utilizar con END-OF-PAGE y sirve para delimitar el mbito de la sentencia WRITE.
Si el tipo de organizacin es RECORD SEQUENTIAL y en la sentencia WRITE no se utiliza la opcin ADVANCING, se asume el avance automtico equivalente a haber especificado, BEFORE ADVANCING 1 LINE.
Sentencia CLOSE.
Cada fichero abierto por medio de una sentencia OPEN, debe ser cerrado por una sentencia CLOSE bien cuando finaliza el programa o bien cuando se desea abrirlo de modo diferente. Una sentencia CLOSE puede cerrar uno o mas ficheros.
94
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Las opciones REEL y UNIT se utilizan con cintas magnticas y discos magnticos respectivamente para indicar que le fichero tratado es multivolumen.
La opcin NO REWIND se utiliza para anular la operacin de rebobinado que se produce normalmente al cerrar un fichero contenido en cinta magntica.
La opcin WITH LOCK hace que el fichero cerrado no pueda volverse a abrir durante el resto de la ejecucin del proceso en cuestin.
Para acceder a un fichero secuencial, los pasos a seguir son los siguientes:
1-
Especificar la clusula SELECT correspondiente al fichero, dentro del prrafo FILE-CONTROL. Si es necesario describir tambin el prrafo I-O-CONTROL.
2- En la descripcin del fichero, esto es , especificacin de la clusula FD correspondiente al fichero, dentro de la FILE SECTION. 3- En la PROCEDURE DIVISION: a) Abrir el fichero para entrada (INPUT) o para entrada y salida (I-O) utilizando la sentencia OPEN. b) Utilizar la sentencia READ para leer los datos del fichero. c) Cerrar el fichero utilizando al sentencia CLOSE, una vez finalizadas las operaciones de entrada-salida.
Para acceder a los datos de un fichero secuencial, a continuacin de haberlo creado, primero se debe cerrar el mismo, utilizando la sentencia CLOSE, y despus se vuelve a abrir para entrada utilizando la sentencia OPEN.
Sentencia READ:
Cuando se ejecuta esta sentencia se deja disponible un registro lgico en el rea de entrada, para ser procesado.
95
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
READ fichero RECORD [INTO nombre de dato] [WITH [NO] LOCK] [AT END sentencia-1] [NOT AT END sentencia-2] [END-READ]
Fichero es el nombre simblico del fichero del cual se quiere leer un registro. Este fichero tiene que ser abierto en modo INPUT o I-O.
Cuando se abre el fichero el puntero de lectura-escritura apunta al primer registro a leer y cada vez que se ejecuta una sentencia READ se lee un registro y el puntero de lectura-escritura avanza para apuntar al siguiente registro a leer.
Si se especifica la opcin INTO, la sentencia READ adems de dejar disponible un registro lgico en el rea de entrada, esto es, en el registro de entrada esta definido en la FD, mueve el contenido de este registro al rea de datos especificada por nombre de datos.
La opcin INTO no puede ser utilizada cuando el fichero contiene registros de varios tipos.
La frase AT END es una condicin que es cierta cuando al ejecutarse una sentencia READ se detecta el final del fichero, en cuyo caso se ejecuta la sentencia-1. Si la condicin resulta ser falsa, entonces se ejecuta, despus de haberse realizado la operacin de lectura, la sentencia-2, si la frase NOT AT END ha sido especificada, y se pasa a la sentencia siguiente.
Sentencia-1 condicionales.
sentencia-2
son
sentencias
imperativas,
esto
es,
no
Aunque la frase AT END sea opcional, debe especificarse cuando se acceda secuencialmente a los registros de un fichero, para poder detectar cuando se llega al final del mismo.
96
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
END-READ delimita el mbito de la sentencia READ y puede ser utilizado solamente con la frase INVALID KEY.
En un fichero secuencial abierto en modo INPUT, la sentencia READ o READ WITH LOCK no puede leer un registro en modo exclusivo.
En un fichero abierto en modo I-O con LOCK MODE AUTOMATIC, a menos que se especifique la opcin WITH NO LOCK, cada registro en el momento de leerse es exclusivo, no compartido, siendo liberado cuando finaliza la lectura.
En un fichero abierto en modo I-O con LOCK MODE MANUAL, cada registro en el momento de leerse no es exclusivo a menos que se especifique la opcin WITH LOCK en la sentencia READ.
Si el fichero se abre en modo I-O, es posible modificar el ultimo registro ledo por medio de la sentencia REWRITE, la cual presentamos a continuacin.
Sentencia REWRITE.
Este sentencia permite reemplazar un registro existente en un fichero en disco por otro registro.
Registro es el nombre de un registro lgico especificado en la FILE SECTION de la DATA DIVISON. El fichero asociado con este registro debe ser un fichero residente en disco y abierto en modo I-O.
El numero de caracteres del registro a reemplazar debe ser igual al numero de caracteres del registro que lo va a reemplazar.
97
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Para ficheros en los que el modo de acceso es secuencial la ultima sentencia ejecutada antes de la ejecucin de la sentencia REWRITE, debe ser una sentencia READ. El registro reemplazado ser lgicamente el registro ledo.
La posicin indicada por el puntero de lectura-escritura ser la misma despus de haber ejecutado una sentencia REWRITE.
98
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Introduccin:
Un fichero indexado es un fichero con organizacin secuencial indexada. La organizacin secuencial indexada o de ndices es un modelo de almacenamiento de datos que se apoya en una tabla de ndices que acta como ndice y en un fichero de datos.
Para crear un fichero secuencial indexado, los pasos a seguir son los mismos que se han expuesto para ficheros secuenciales.
SELECT [OPTIONAL] nombre-fichero-1ASSIGN TO DISK entero-1 RESERVE NO ORGANIZATION IS INDEXED SEQUENTIAL RANDOM DYNAMIC nombre dato-1 RECORD KEY IS clave-m = nombre dato-4,[nombre dato-5] ... nombre dato-1 ALTERNATE RECORD KEY IS [LOCK MODE IS modo-de-cierre] [FILE STATUS IS nombre-de-dato-3] clave-m = nombre dato-6,[nombre dato-7] ... ALTERNATE AREAS AREA
ACCESS MODE IS
Cuando el modo de acceso es SEQUENTIAL, el acceso a los registros del fichero indexado se hace en orden ascendente de clave, la cual viene dada por un campo alfanumrico denominado por nombre dato-1.
99
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Cuando el modo de acceso es DYNAMIC, se puede acceder a los registros del fichero secuencial y/o aleatoriamente.
La clusula RECORD KEY especifica la clave principal del fichero. Su valor ha de ser nico. La clusula ALTERNATE RECORD KEY especifica la clave secundaria, terciaria, .., etc. Si se especifica WITH DUPLICATES admite mas de una clave secundaria igual.
Clave-m es una concatenacin de uno o mas campos de un registro asociado con el fichero que estamos describiendo. Esta clave mltiple solo podr ser referenciada por las sentencias START y READ.
El o los campos usados como clave debern declararse como campos alfanumricos, admitindose los campos numricos.
FD nombre de fichero LABEL RECORD IS [STANDARD] [VALUE OF FILE-ID] [RECORDING MODE IS] [BLOCK CONTAINS] [RECORD CONTAINS] [DATA RECORD IS]
Sentencia OPEN:
100
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
OPEN{{
[WITH LOCK]}...}
Sentencia CLOSE:
Sentencia READ:
NEXT READ fichero PREVIOUS KEPT [WITH NO [AT END sentencia-1] [NOT AT END sentencia-2] [END-READ] LOCK] RECORD [INTO nombre dato-1]
101
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Cuando el modo de acceso es secuencial, el acceso a los registros del fichero indexado se hace en orden ascendente de la clave, la cual viene dada por el campo descrito a continuacin de la clusula RECORD KEY.
Cuando se utiliza el formato 2, antes de que se ejecute la sentencia READ, es necesario haber cargado el campo descrito a continuacin de la clusula RECORD KEY, el valor de la clave del registro que se quiere leer.
La opcin NEXT o PREVIOUS debe especificarse cuando en un fichero en modo de acceso DYNAMIC los registros se leen secuencialmente.
Si la opcin PREVIOUS se ha especificado, despus de ejecutarse una sentencia READ el puntero de lectura-escritura pasa a apuntar al registro anterior. Si el puntero ya se encontraba en el primer registro. Si el puntero que se encontraba en el primer registro, entonces se da una condicin de fin de fichero (AT END).
En un fichero abierto I-O con LOCK MODE MANUAL WITH LOCK ON RECORDO, una sentencia READ puede adquirir un registro en modo exclusivo solamente si la frase WITH LOCK ha sido especificada.
En un fichero abierto I-O con LOCK MODE MANUAL WITH LOCK ON MULTIPLE RECORDSO, una sentencia READ puede adquirir un registro en modo exclusivo solamente si la frase WITH KEPT LOCK ha sido especificada. Esto es, KEPT debe ser incluido, cuando manualmente se desea hacer exclusivos mltiples registros.
102
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
En un fichero abierto I-O con LOCK MODE AUTOMATICO, a menos que se especifique la opcin WITH NO LOCK, cada registro es en el momento de leerse exclusivo, no compartido, siendo liberado cuando finaliza la lectura.
Si se especifica la opcin KEY la clave utilizada para recuperar un registro viene dada por nombre-dato-2 o por clave-m. Si esta opcin no se especifica, para recuperar un registro se utiliza la clave principal, que viene dada por el campo descrito a continuacin de la clusula RECORD KEY.
Cuando se ejecuta una sentencia READ, descrita de acuerdo con formato-2, el contenido del campo especificado como clave, es comparado con los valores contenidos en los correspondientes campos de los registros del fichero, hasta que se encuentre un valor igual, en cuyo caso se recupera el registro y se ejecuta la sentencia-4 si la frase NOT INVALID KEY ha sido especificada. Si no se encuentra el registro entonces se ejecuta sentencia-3 descrita a continuacin de la frase INVALID KEY, si esta opcin ha sido especificada.
Sentencia WRITE:
WRITE registro [FROM nombre-dato-1] [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-WRITE]
El nombre de dato que especifica la clave principal, debe ser puesto por el programa al valor deseado, antes de ejecutar la sentencia WRITE.
103
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si el modo de acceso es SEQUENTIAL, los registros deben ser emitidos al sistema en orden ascendente de la clave principal.
Si el modo de acceso es RANDOM o DYNAMIC los registros pueden ser emitidos al sistema en cualquier orden.
a) Cuando se ha especificado modo de acceso secuencial para un fichero abierto para escribir (OUTPUT) y la clave del registro no es mayor que la del registro anterior. b) Cuando el fichero se ha abierto en modo OUTPUT o I-O y la clave del registro a escribir existe ya en el fichero. c) Cuando el fichero se ha abierto en modo OUTPUT o I-O y la clave alternativa del registro a escribir ya existe en el fichero. d) Cuando el disco esta lleno.
Sentencia REWRITE:
REWRITE registro [FROM nombre-dato-1] [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-REWRITE]
El fichero asociado con registro debe ser un fichero residente en disco y abierto en modo I-O.
104
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Para ficheros en los que el modo de acceso es SEQUENTIAL, la ultima sentencia ejecutada antes de la ejecucin de la sentencia REWRITE debe ser una sentencia READ, la cual localiza el registro a reemplazar por el valor contenido en le campo que hace referencia a la clave principal.
Para ficheros en los que el modo de acceso es RANDOM o DYNAMIC, el registro a reemplazar viene dado por el contenido del campo que hace referencia a la clave principal. No es necesario ejecutar previamente una sentencia READ.
a) Cuando se ha especificado modo de acceso secuencial y el valor contenido en el campo clave del registro que ha de ser reemplazado no es igual al valor del campo clave del ultimo registro ledo.
b) Cuando el valor del campo que referencia la clave principal no coincide con el valor de la clave de alguno de los registros del fichero.
c) Cuando el valor del campo que referencia la clave alternativa existe ya en el fichero.
Sentencia START:
Esta sentencia permite iniciar el proceso de acceso a los registros de un fichero con organizacin indexada o relativa a partir de una clave especificada y no a partir del principio del fichero.
105
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
EQUAL TO = GREATERTHAN > NOT LESS THAN NOT < GREATERTHAN OR EQUAL TO nombre-dato] >= LESS THAN < NOT GREATERTHAN NOT > LESS THAN OR EQUAL TO <=
[WITH SIZE entero] [INVALID KEY sentencia-1] [NOTINVALID KEY sentencia-2] [END-START]
Fichero es el nombre de un fichero indexado abierto en modo INPUT o I-O, con modo de acceso SEQUENTIAL o DYNAMIC.
Nombre-dato es un campo alfanumrico que debe ser declarado en una clusula RECORD KEY asociada con el fichero.
Nombre-dato puede ser tambin un campo subordinado al campo especificado en la clusula RECORD KEY. Este campo subordinado debe ser la posicin del carcter mas a la izquierda, se corresponda con la posicin del carcter mas a la izquierda del campo especificado en la clusula RECORD KEY, esto es, el primer campo subordinado.
Previamente a la ejecucin de una sentencia START el programa debe cargar en nombre-dato el valor de la clave correspondiente al registro en el que nos queremos posicionar.
La comparacin indicada por la operacin de relacin especificada a continuacin de KEY, ocurre entre el valor del campo clave de los registros del fichero y el valor del contenido en el campo-dato. Si la longitud de los campos comparados no son iguales, el campo mas largo se trunca a la longitud del mas corto.
106
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Si la frase KEY no se especifica, la operacin de relacin que se asume es EQUAL TO (=) y la comparacin anterior se hace con respecto al campo declarado en la clusula RECORD KEY.
Si el operador de relacin especifica que la clave debe ser mayor que, o mayor o igual que nombre-dato, entonces el puntero de lectura escritura del fichero se posiciona en el primer registro lgico cuya clave satisfaga la condicin.
Si el operador de relacin especifica que la clave debe ser menor que, o menor o igual que nombre-dato, entonces el puntero de lectura escritura se posiciona en el ultimo registro lgico del fichero cuya clave satisfaga la condicin.
Si la condicin no es satisfecha por alguno de los registros del fichero, entonces se da la condicin INVALID KEY y se ejecuta la sentencia 1, si la frase ha sido especificada.
Si se especifica la opcin WITH SIZE, entonces se ignora el operador de relacin especificado a continuacin de KEY. Esta opcin especifica el numero de caracteres de la clave que se van a utilizar en la comparacin (EQUAL TO).
Sentencia DELETE:
Esta sentencia permite borrar un determinado registro de un fichero con organizacin indexada o relativa.
Formato 1: DELETE fichero RECORD [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-DELETE]
107
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Antes de que se ejecute una sentencia DELETE, es necesario haber cargado en el campo descrito a continuacin de la clusula RECORD KEY, el valor de la clave del registro al que se quiere acceder.
Para ficheros en los que el modo de acceso es SEQUENTIAL la ultima sentencia ejecutada antes de la ejecucin de la sentencia DELETE debe ser la sentencia READ, la cual localiza el registro a borrar por el valor contenido en el campo que hace referencia a la clave principal.
Para ficheros en los que el modo de acceso es RANDOM o DYNAMIC, el registro a borrar viene dado por el contenido del campo que hace referencia a la clave principal. No es necesario ejecutar previamente una sentencia READ.
Cuando se ejecuta la sentencia DELETE, el contenido del campo especificado como clave, es comparado con los valores contenidos en los correspondientes campos de los registros del fichero, hasta que se encuentre un valor igual, en cuyo caso se borra el registro y se ejecuta la sentencia-2 si la frase NOT INVALID KEY ha sido especificada. Si no se encuentra un valor igual a la clave dada, entonces se ejecuta la sentencia-1 descrita a continuacin de la frase INVALID KEY, si esta ha sido especificada.
La frase INVALID KEY no puede ser especificada con una sentencia DELETE que haga referencia a un fichero con modo de acceso secuencial.
108
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Esta sentencia borra los ficheros especificados, los cuales deben ser cerrados previamente.
Ficheros REALATIVOS:
Clusula SELECT
SELECT [OPTIONAL] nombre-fichero-1ASSIGN TO DISK entero-1 RESERVE NO ORGANIZATION IS RELATIVE SEQUENTIAL RANDOM DYNAMIC ALTERNATE AREAS AREA
ACCESS MODE IS
[RELATIVE KEY IS nombre dato-1] [LOCK MODE IS modo-de-cierre] [FILE STATUS IS nombre-de-dato-3]
Cuando el modo de acceso SEQUENTIAL, el acceso a los registros del fichero relativo se hace en orden ascendente de numero relativo de registro. En este caso la clusula RELATIVE KEY es opcional.
Si el modo de acceso es RANDOM o DYNAMIC, el valor de nombre-dato-1 indica el registro al cual va a accederse. Este numero viene dado por un campo numrico entero sin signo especificado por medio de la frase RELATIVE KEY.
Cuando el modo de acceso es DYNAMIC, se puede acceder a los registros del fichero secuencial y/o aleatoriamente.
109
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La clusula RELATIVE KEY especifica el campo denominado por nombre-dato, que va a contener el numero relativo de registro al cual se quiere acceder. Este campo no puede estar definido en la descripcin de registro asociada con el fichero en cuestin y debe ser declarado cono un campo numrico sin signo.
La sentencia OPEN de los ficheros relativos es la misma que la de los indexados y secuenciales.
La sentencia CLOSE de los ficheros relativos es la misma que la de los indexados y secuenciales.
110
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia READ:
Formato 1 (secuencial):
NEXT READ fichero PREVIOUS KEPT [WITH NO [AT END sentencia-1] [NOT AT END sentencia-2] [END-READ] LOCK] RECORD [INTO nombre dato-1]
Formato 2 (directo):
READ fichero RECORD [INTO nombre dato-1] KEPT [WITH NO [INVALID KEY sentencia-3] [NOT INVALID KEY sentencia-4] [END-READ] LOCK]
Antes de que se ejecute la sentencia READ, es necesario haber cargado en el campo descrito a continuacin de la clusula RELATIVE KEY, el valor relativo del registro al que se quiere acceder.
La opcin NEXT o PREVIOUS debe especificarse cuando un fichero con modo de acceso DYNAMIC los registros se leen secuencialmente.
La opcin NEXT lee el siguiente registro del fichero, y ejecuta la sentencia-1 si se especifica la clusula AT END, y es final del fichero, sino ejecuta sentencia-2 si se
111
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
especifica la clusula NOT AT END. La opcin PREVIOUS lee el registro anterior del fichero, y ejecuta la sentencia-1 si se especifica la clusula AT END, y es final del fichero, sino ejecuta sentencia-2 si se especifica la clusula NOT AT END.
Cuando se ejecuta una sentencia READ, con el formato 2 se lee el registro que la clave del fichero ha especificado.
Sentencia WRITE:
WRITE registro [FROM nombre-dato-1] [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-WRITE]
Sentencia REWRITE:
REWRITE registro [FROM nombre-dato-1] [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-REWRITE]
Sentencia START:
112
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
EQUAL TO = GREATERTHAN > NOT LESS THAN NOT < GREATERTHAN OR EQUAL TO nombre-dato] >= LESS THAN < NOT GREATERTHAN NOT > LESS THAN OR EQUAL TO <=
Sentencia DELETE:
DELETE fichero RECORD [INVALID KEY sentencia-1] [NOT INVALID KEY sentencia-2] [END-DELETE]
113
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
9-
El formato general de un programa de clasificacin COBOL es el siguiente: IDENTIFICATION DIVISION. PROGRAM-ID. Nombre-programa.
FILE-CONTROL. SELECT fichero-1 de entrada ASSIGN TO DISK. SELECT fichero-2 de salida ASSIGN TO DISK. SELECT fichero-3 de clasificacin ASSIGN TO DISK [SORT STATUS IS nombre de dato-1]
DATA DIVISION. FILE SECTION. FD fichero-1 de entrada ... FD fichero-2 de salida ...
SD fichero-3 de clasificacin [RECORD CONTAINS [entero-1 TO] entero-2 CHARACTERS] [DATA RECORD IS registro-1 [registro-2].... ] nombre de dato-2 [VALUE OF FILE-ID IS ] 114
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
PROCEDURE DIVISION.
[SORT ... ]
[MERGE ... ]
Si se especifica la clusula SORT STATUS, se colocar en nombre dato-1 un valor de 2 dgitos para indicar como se ha realizado la operacin de clasificacin. Los valores que se pueden dar son los siguientes:
00 30 9-
Clasificacin efectuada correctamente Error El segundo dgito corresponde a un numero de error del sistema.
Sentencia SORT:
La sentencia SORT crea un fichero clasificado, ejecutando un procedimiento de entrada, o transfiriendo registros desde otros ficheros. Su formato es el siguiente:
115
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
ASCENDING SORT fichero-3 ON ASCENDING [ON DESCENDING KEY nombre dato-2 ...] ... DESCENDING KEY nombre dato-1 ...
[WITH DUPLICATES IN ORDER] [COLLATINGSEQUENCE IS nombre alfabeto] INPUT PROCEDURE IS seccion-1 [THRU seccion-2] USING fichero-1 ... OUTPUT PROCEDURE IS seccion-3 [THRU seccion-4] GIVING fichero-2 ...
Fichero-3 es el fichero de clasificacin, el cual tiene que ser descrito en la DATA DIVISION, precedido por SD. El resto de los ficheros son ficheros normales. Para evitar resultados inesperados, es conveniente que el tamao de registro sea el mismo para todos los ficheros.
Indican, si la clasificacin se a realizar ascendente o descendentemente, por el contenido de uno o mas campos.
Nombre dato-1 y nombre dato-2, ..., son los nombres de los campos por los que se desea clasificar el fichero. Estos campos deben pertenecer a los registros asociados al fichero-3. En la descripcin de estos campos no puede figurar la clusula OCCURS.
Los nombres de dato que siguen a la palabra KEY deben especificarse en orden decreciente de significacin.
Si se especifica la clusula DUPLICATES y el contenido de todos los campos empleados en la clasificacin, pertenecientes a un determinado registro, coinciden con el contenido de los correspondientes campos de otros registros, entonces el orden en el que son colocados los registros es el orden de aparicin en los ficheros de entrada segn se han especificado en la sentencia SORT. Si se da este caso y la clusula DUPLICATES no se ha especificado, el orden de los registros a los que nos referimos queda indefinido.
116
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La clasificacin se realiza de acuerdo con el orden de valores del cdigo de caracteres empleado por defecto (ASCII). Si se especifica la clusula COLLATING SEQUENCE es posible realizar la clasificacin en otra secuencia que sea ASCII, por ejemplo, EBCDIC.
* Todos los registros del fichero o ficheros de entrada son transferidos al fichero de clasificacin, fichero-3, para ser clasificados, es decir, se renuncia a realizar cualquier operacin sobre los registros de entrada.
117
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
* Todos los registros del fichero de clasificacin, fichero-3, son transferidos al fichero o ficheros de salida, es decir, se renuncia a realizar cualquier operacin sobre los registros clasificados.
La condicin necesaria y nica para que un SORT funcione es que los ficheros de entrada y salida sean secuenciales.
Esta opcin permite referenciar una o mas secciones, para realizar cualquier operacin sobre los registros de entrada, antes de que sean transferidos al fichero de clasificacin, fichero-3, por medio de la sentencia RELEASE, para ser clasificados.
Sentencia RELEASE:
Esta sentencia transfiere los registros al fichero de clasificacin, para a continuacin ser clasificados.
Una sentencia RELEASE solamente puede utilizarse en una seccin asociada a una sentencia SORT.
INPUT
Esta opcin permite referenciar una o mas secciones, para realizar cualquier operacin sobre los registros clasificados, antes de que sean transferidos al fichero de salida, fichero-2, por medio de la sentencia RETURN. 118
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia RETURN:
Esta sentencia permite recuperar del fichero de clasificacin, los registros una vez clasificados.
RETURN fichero-clasificacin RECORD [INTO nombre-datos] AT END sentencia-1 [NOT AT END sentencia-1] [END-RETURN].
Una sentencia RETURN solamente se puede utilizar en una seccin OUTPUT asociada a una sentencia SORT o MERGE.
Sentencia MERGE:
Esta sentencia permite fusionar dos o mas ficheros clasificados por un mismo conjunto de campos. Su formato es el siguiente:
ASCENDING MERGE fichero-3 ON ASCENDING [ON DESCENDING KEY nombre dato-2 ...] ... [COLLATINGSEQUENCE IS nombre alfabeto] USING fichero-1 ... OUTPUT PROCEDURE IS seccion-3 [THRU seccion-4] GIVING fichero-2 ... DESCENDING KEY nombre dato-1 ...
119
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
10-
Para transferir el control de un programa a un subprograma se utiliza la sentencia CALL, cuyo formato es el siguiente.
identificador CALL literal [ON OVERFLOW sentencia [END-CALL]] [USING nombre-dato-1 [nombre-dato-2] ...]
Identificador o literal especifican el nombre del subprograma. Si se utiliza un identificador para llamar al programa, este debe ser declarado como un campo alfanumrico y si se utiliza un literal, este debe ser no numrico.
Los nombres-dato especificados a continuacin de la clusula USING se refieren a campos que pueden utilizar tanto el programa principal como el subprograma.
Si durante la sentencia CALL no es posible acomodar el programa en memoria el programa especificado para su ejecucin, se pasa a ejecutar la siguiente sentencia en secuencia. Ahora si se ha especificado la clusula ON OVERFLOW, entonces se ejecuta la sentencia imperativa especificada a continuacin de la esta clusula.
Sentencia ENTRY:
Esta sentencia permite especificar cual es el punto de entrada en el subprograma llamado. Su formato es el siguiente:
120
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Dentro de un programa pueden especificarse mas de un punto de entrada denominndose cada uno de ellos con un nombre diferente. Solo los ocho primeros caracteres de cada nombre son significativos.
Cuando el programa principal llama a un subprograma, el control puede transferirse a la primera sentencia de la PROCEDURE DIVISION, o a otra sentencia diferente. En el primer caso, se puede prescindir de la sentencia ENTRY y especificar a continuacin de la palabra DIVISION, la opcin USING seguida de los campos de datos correspondientes, pero en el segundo caso si es necesaria, con el fin de indicar mediante un nombre cual es el punto de entrada en el subprograma, esto es, indicar a partir de que sentencia se desea que comience la ejecucin en el programa.
Esta sentencia define el final lgico del subprograma llamado. Su formato es el siguiente:
EXIT PROGRAM
La ejecucin de esta sentencia hace que el control sea devuelto a la sentencia inmediatamente a continuacin de la sentencia CALL que efecto la llamada al subprograma.
121
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Sentencia Cancel:
Esta sentencia garantiza que la siguiente vez que el programa sea llamado para su ejecucin, partamos de su estado inicial. Su formato es el siguiente:
identificador CANCEL literal
Indentificador o literal especifican el nombre del subprograma a cancelar. Si se utiliza un indentificador, este debe ser declarado como un campo alfanumrico y si se utiliza un literal, este debe ser no numrico.
Cuando un subprograma es cancelado todos los subprogramas contenidos dentro del subprograma referenciado por la sentencia CANCEL, son tambin cancelados.
Sentencia CHAIN:
La sentencia CHAIN transfiere el control desde un programa a otro sin que este ultimo, devuelva el control cuando finaliza. Su formato es el siguiente:
identificador CHAIN literal [ON OVERFLOW sentencia] [ USING nombre dato-1[nombre dato-2]...]
Identificador o literal especifican el nombre del programa a encadenar. Si se utiliza un identificador para llamar al programa, este debe ser declarado como alfanumrico y si se utiliza un literal este debe ser no numrico.
La clusula USING es incluida en la sentencia CHAIN, solamente si hay una frase USING en la cabecera de la PROCEDURE DIVISION del programa encadenado.
Los nombre dato especificados a continuacin de la clusula USING se refieren a los campos de datos que son transmitidos al programa encadenado.
El primer programa que ejecuta la sentencia CHAIN, esta siempre en memoria, esto es, la memoria ocupada por este programa nunca es liberada y aunque ejecutemos un nuevo CHAIN para volverlo a cargar esto no sucede porque ya esta en memoria.
La memoria ocupada por un programa encadenado, no es liberada hasta que se ejecute un segundo CHAIN en secuencia, no contando con el CHAIN del primer programa, el cual es nico.
LINKAGE SECTION.
Esta seccin permite describir los campos de datos comunes al programa principal y al subprograma, esto es, los campos de datos que comparten ambos programas.
La descripcin de los campos y registros en esta seccin, se realiza utilizando la misma sintaxis que en la WORKING-STORAGE SECTION, a excepcin de la clusula VALUE que aqu solo puede utilizarse con los nombres de condicin.
El programa principal y el subprograma se compilan separadamente por lo que es necesario que la descripcin de los campos de datos comunes aparezcan en la DATA DIVISION de cada programa. Sin embargo, el sistema no reserva memoria para los registros y campos de datos declarados en LINKAGE SECTION, pero si pone a disposicin del subprograma los registros y campos aqu declarados y que fueron reservados para el programa principal.
123
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Los nombres de campos de datos que se especifican a continuacin de la clusula USING en la llamada CALL, no tienen porque denominarse igual que los correspondientes campos especificados a continuacin de la clusula USING en el subprograma.
124
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
11-
VISUALIZACIN DE PANTALLAS.
SCREEN SECTION.
La SCREEN SECTION contiene una descripcin de cada campo sobre la pantalla. El acceso a estos campos es mediante las sentencias ACCEPT y DISPLAY. Su formato general es el siguiente:
SCREEN SECTION. {01 nombre pantalla opciones. {Nn [nombre datos] opciones}}}
Cada zona de datos perteneciente a la pantalla puede comenzar con un numero de nivel del 02 al 49.
La palabra FILLER no se puede utilizar en una descripcin de pantalla pero nombre-datos puede omitirse.
Una descripcin de una zona elemental de datos debe contener al menos una de las siguientes opciones: BELL, BLANK LINE, BLANK SCREEN, COLUMN, LINE, PICTURE, VALUE.
Una pantalla puede ser referenciada solamente por una sentencia ACCEPT o DISPLAY.
La opcin USING permite utilizar el campo asociado, tanto para entrada como para salida. La sentencia DISPLAY pantalla visualiza los campos de salida del diseo pantalla y la sentencia ACCEPT pantalla, permite teclear los datos par los campos de entrada del mismo diseo.
Opciones: 125
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
OPCION AUTO BACKGROUND-COLOR BELL BLANK BLANK WHEN ZERO BLINK COLUMN o COL FOREGROUND-COLOR FULL o LENGHT-CHECK HIGHLIGHT JUSTIFIED o JUST LINE OCCURS PROMPT REQUIRED REVERSE-VIDEO SECURE SIGN SIZE UNDERLINE VALUE ZERO-FILL
DESCRIPCIN Va al siguiente campo campo una vez rellenado el anterior. Especifica el color de fondo del elemento a visulizar en pantalla. Emite un sonido cada vez que el elemento es ejecutado Borra una linea o la pantalla. Pone blancos cuando el campo es cero. Hace parpadear un texto en pantalla. Especifica una columna en pantalla. Especifica el color de primer plano de un literal Obliga a dejar el campo completamente lleno o vacio. Pon el literal o campo con un color mas intenso. Ajusta el campo a la derecha. Especifica una linea en pantalla. Permite definir un campo con subindices. Cambia el prompt del sistema. Obliga a rellenar el campo. Camia el color de fondo por el de primer plano. No visualiza en pantalla lo introducido. Pone el signo del numero. Especifica el tamao del campo. Hace que el elemento escrito en pantalla aparezca subrayado. Especifica una cadena de caracteres para visualizarla por pantalla. Rellena a ceros los campos numericos.
126
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
SQL
127
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
CONTENIDO
1. 2. 3. INTRODUCCIN........................................................................................2 BREVE HISTORIA......................................................................................2 COMPONENTES DEL SQL..........................................................................3 3.1. 3.2. 3.3. 4. 5. LENGUAJE DE DEFINICIN DE DATOS (LDD) 3 LENGUAJE DE MANIPULACIN DE DATOS (LMD) TIPOS DE SENTENCIAS 4 4
TIPOS DE DATOS......................................................................................5 ESTRUCTURAS DE LAS TABLAS................................................................8 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. 5.7. 5.8. CREACIN DE TABLAS NUEVAS 8 LA CLUSULA CONSTRAINT CREACIN DE NDICES ELIMINACIN VISTAS 13 14 12 10 9
6. 7. 8. 9.
OPERADORES LGICOS..........................................................................17 CONSULTAS BSICAS.............................................................................23 OPERADORES LGICOS..........................................................................23 SENTENCIAS SQL...................................................................................24 9.1. 9.2. 9.3. 9.4. 9.5. 9.6. 9.7. 9.8. 9.9. BETWEEN CONTAINS COUNT BORRADO DISTINCT EXIST 27 GROUP BY HAVING 30 31 32 33 33 128
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
24 25 25 25 26 26 28 30
COMMIT/ROLLBACK
9.16. SELECCIN DE COLUMNAS 9.17. CLUSULA FROM 9.19. SUBCONSULTA 9.21. UPDATE 39 35 37 38 9.18. CLUSULA WHERE 35 9.20. UNION, UNION ALL Error: Reference source not found
34
129
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1. INTRODUCCIN
El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre los datos o sobre la estructura de los mismos. Pero como sucede con cualquier sistema de normalizacin hay excepciones para casi todo; de hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace diferente de otro motor, por lo tanto, el lenguaje SQL normalizado (ANSI) no nos servir para resolver todos los problemas, aunque si se puede asegurar que cualquier sentencia escrita en ANSI ser interpretable por cualquier motor de datos.
2. BREVE HISTORIA
La historia de SQL (que se pronuncia deletreando en ingls las letras que lo componen, es decir "ese-cu-ele" y no "siquel" como se oye a menudo) empieza en 1974 con la definicin, por parte de Donald Chamberlin y de otras personas que trabajaban en los laboratorios de investigacin de IBM, de un lenguaje para la especificacin de las caractersticas de las bases de datos que adoptaban el modelo relacional. Este lenguaje se llamaba SEQUEL (Structured English Query Language) y se implement en un prototipo llamado SEQUELXRM entre 1974 y 1975. Las experimentaciones con ese prototipo condujeron, entre 1976 y 1977, a una revisin del lenguaje (SEQUEL/2), que a partir de ese momento cambi de nombre por motivos legales, convirtindose en SQL. El prototipo (System R), basado en este lenguaje, se adopt y utiliz internamente en IBM y lo adoptaron algunos de sus clientes elegidos. Gracias al xito de este sistema, que no estaba todava comercializado, tambin otras compaas empezaron a desarrollar sus productos relacionales basados en SQL. A partir de 1981, IBM comenz a entregar sus productos relacionales y en 1983 empez a vender DB2. En el curso de los aos ochenta, numerosas compaas (por ejemplo Oracle y Sybase, slo por citar algunos) comercializaron productos basados en SQL, que se convierte en el estndar industrial de hecho por lo que respecta a las bases de datos relacionales. En 1986, el ANSI adopt SQL (sustancialmente adopt el dialecto SQL de IBM) como estndar para los lenguajes relacionales y en 1987 se transform en estndar ISO. Esta versin del estndar va con el nombre de SQL/86. En los aos siguientes, ste ha sufrido diversas revisiones que han conducido primero a la versin SQL/89 y, posteriormente, a la actual SQL/92. El hecho de tener un estndar definido por un lenguaje para bases de datos relacionales abre potencialmente el camino a la intercomunicabilidad entre todos los productos que se basan en l. Desde el punto de vista prctico, por desgracia las cosas fueron de otro modo. Efectivamente, en general cada productor adopta e implementa en la propia base de datos slo el corazn del lenguaje SQL (el as llamado Entry level o al mximo el Intermediate level), extendindolo de manera individual segn la propia visin que cada cual tenga del mundo de las bases de datos. Actualmente, est en marcha un proceso de revisin del lenguaje por parte de los comits ANSI e ISO, que debera terminar en la definicin de lo que en este momento se conoce como SQL3. Las caractersticas principales de esta nueva
130
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
encarnacin de SQL deberan ser su transformacin en un lenguaje stand-alone (mientras ahora se usa como lenguaje hospedado en otros lenguajes) y la introduccin de nuevos tipos de datos ms complejos que permitan, por ejemplo, el tratamiento de datos multimediales.
1. 2. 3.
[Link] DE DEFINICIN DE DATOS (LDD)
Proporciona rdenes para la definicin y modificacin de esquemas de relacin, borrado de relaciones y creacin de ndices. El lenguaje de definicin de datos (LDD) de SQL permite especificar informacin relativa a las relaciones que forman una base de datos: El esquema de cada relacin El dominio de valores asociado a cada atributo Las restricciones de integridad El conjunto de ndices que se deben mantener por cada relacin Informacin de seguridad y autorizacin para cada relacin La estructura de almacenamiento fsico de cada relacin
[Link] DE SENTENCIAS
Las sentencias SQL pertenecen a dos categoras principales: Lenguaje de Definicin de Datos, DDL y Lenguaje de Manipulacin de Datos, DML. Estos dos lenguajes no son lenguajes en s mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL en funcin de su cometido. La diferencia principal reside en que el DDL crea objetos en la base de datos y sus efectos se pueden ver en el diccionario de la base de datos; mientras que el DML es el
131
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
que permite consultar, insertar, modificar almacenada en los objetos de la base de datos.
eliminar
la
informacin
Cuando se ejecutan las sentencias DDL de SQL, el SGBD confirma la transaccin actual antes y despus de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implcito el commit y se pueden deshacer. Existe pues un problema al mezclar sentencias DML con DDL, ya que estas ltimas pueden confirmar las primeras de manera involuntaria e implcita, lo que en ocasiones puede ser un problema. A continuacin se presenta una tabla con las sentencias SQL ms comunes, clasificadas segn el lenguaje al que pertenecen.
SENTENCIA DDL Alter procedure Alter Table Analyze Create Table Create Index OBJETIVO Recompilar un procedimiento almacenado. Aadir o redefinir una columna, modificar la asignacin de almacenamiento. Recoger estadsticas de rendimiento sobre los objetos de la BD para utilizarlas en el optimizador basado en costes. Crear una tabla. Crear un ndice.
Drop Table Eliminar una tabla. Drop Index Eliminar un ndice. Grant Truncate Revoke SENTENCIA DML Insert Delete Update Select Commit Rollback Conceder privilegios o papeles, roles, a un usuario o a otro rol. Eliminar todas las filas de una tabla. Retirar los privilegios de un usuario o rol de la base de datos. OBJETIVO Aadir filas de datos a una tabla. Eliminar filas de datos de una tabla. Modificar los datos de una tabla. Recuperar datos de una tabla. Confirmar como permamentes las modificaciones realizadas. Deshacer todas las modificaciones realizadas desde la ltima
132
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
confirmacin.
1. TIPOS DE DATOS
Los tipos de datos SQL se clasifican en 13 tipos de datos primarios y de varios sinnimos vlidos reconocidos por dichos tipos de datos. Los tipos de datos primarios son:
TIPO DE DATOS BINARY BIT BYTE COUNTER LONGITU D 1 byte 1 byte 1 byte 4 bytes DESCRIPCIN Para consultas sobre tabla adjunta de productos de bases de datos que definen un tipo de datos Binario. Valores Si/No True/False Un valor entero entre 0 y 255. Un nmero incrementado automticamente (de tipo Long) Un entero escalable entre [Link].477,5808 y [Link].477,5807. Un valor de fecha u hora entre los aos 100 y 9999. Un valor en punto flotante de precisin simple con un rango de - 3.402823*1038 a -1.401298*10-45 para valores negativos, 1.401298*10- 45 a 3.402823*1038 para valores positivos, y 0. Un valor en punto flotante de doble precisin con un rango de - 1.79769313486232*10308 a -4.94065645841247*10-324 para valores negativos, 4.94065645841247*10-324 a 1.79769313486232*10308 para valores positivos, y 0. Un entero corto entre -32,768 y 32,767. Un entero largo entre -2,147,483,648 y 2,147,483,647.
DOUBLE
8 bytes
2 bytes 4 bytes
1 byte por De cero a un mximo de 1.2 gigabytes. carcter De cero 1 gigabyte. Utilizado para objetos OLE.
SINNIMOS
INTEGER1 AUTOINCREMENT MONEY DATE TIME TIMESTAMP FLOAT4 IEEESINGLE REAL FLOAT FLOAT8 IEEEDOUBLE NUMBER NUMERIC INTEGER2 SMALLINT INT INTEGER INTEGER4 GENERAL OLEOBJECT LONGCHAR MEMO NOTE ALPHANUMERIC CHAR - CHARACTER STRING - VARCHAR VALUE
SINGLE
DOUBLE
char (n) es una cadena de caracteres de longitud fija, con una longitud n especificada por el usuario (character) varchar (n) es una cadena de caracteres de longitud variable, con una longitud n especificada por el usuario (character varying) int es un entero (integer) smallint es un entero pequeo numeric (p,d) es un nmero en punto flotante, cuya precisin la especifica el usuario; el nmero est formado por p dgitos y, de esos p dgitos, d pertenecen a la parte decimal real, double precision son respectivamente nmeros en punto flotante y nmeros en punto flotante de doble precisin float (n) es un nmero en punto flotante, cuya precisin es la menos de n dgitos date es una fecha del calendario, que contiene un ao de cuatro dgitos, un mes y un da del mes time es la hora del da, expresada en horas, minutos y segundos
134
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
timestamp es una combinacin de date y time En los sistemas de bases de datos se usa coercin de tipos para permitir la comparacin de valores compatible valores int y smallint cadenas de diferente longitud SQL permite incluir en la declaracin de dominio de un atributo la clusula not null que prohbe la insercin de valores nulos en ese atributo
1. 2.
[Link] DE TABLAS NUEVAS
CREATE TABLE tabla (campo1 tipo (tamao) ndice1, campo2 tipo (tamao) ndice2,... , ndice multicampo , ... ) En donde:
tabla campo1 campo2 tipo tamao ndice1 ndice2 Es el nombre de la tabla que se va a crear. Es el nombre del campo o de los campos que se van a crear en la nueva tabla. La nueva tabla debe contener, al menos, un campo. Es el tipo de datos de campo en la nueva tabla. (Ver Tipos de Datos) Es el tamao del campo slo se aplica para campos de tipo texto. Es una clusula CONSTRAINT que define el tipo de ndice a crear. Esta clusula en opcional.
Es una clusula CONSTRAINT que define el tipo de ndice ndice multicampos a crear. Un ndice multicampo es aquel que est multicampo indexado por el contenido de varios campos. Esta clusula en s opcional.
CREATE TABLE Empleados (Nombre TEXT (25), Apellidos TEXT (50)) (Crea una nueva tabla llamada Empleados con dos campos, uno llamado Nombre de tipo texto y longitud 25 y otro llamado apellidos con longitud 50). CREATE TABLE Empleados (Nombre FechaNacimiento DATETIME) CONSTRAINT IndiceGeneral UNIQUE (Nombre, Apellidos, FechaNacimiento) (Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto y longitud 10, otro con llamado Apellidos de tipo texto y longitud predeterminada (50) y uno ms llamado FechaNacimiento de tipo Fecha/Hora. Tambin crea un ndice nico - no permite valores repetidos - formado por los tres campos.) CREATE TABLE Empleados (IdEmpleado INTEGER CONSTRAINT
135
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
TEXT
(10),
Apellidos
TEXT,
IndicePrimario PRIMARY, Nombre TEXT, Apellidos TEXT, FechaNacimiento DATETIME) (Crea una tabla llamada Empleados con un campo Texto de longitud predeterminada (50) llamado Nombre y otro igual llamado Apellidos, crea otro campo llamado FechaNacimiento de tipo Fecha/Hora y el campo IdEmpleado de tipo entero el que establece como clave principal.)
Si se desea crear un ndice para un campo cuando se est utilizando las instrucciones ALTER TABLE o CREATE TABLE la clusula CONTRAINT debe aparecer inmediatamente despus de la especificacin del campo indexado. Si se desea crear un ndice con mltiples campos cuando se est utilizando las instrucciones ALTER TABLE o CREATE TABLE la clusula CONSTRAINT debe aparecer fuera de la clusula de creacin de tabla.
ndice UNIQUE Descripcin Genera un ndice de clave nica. Lo que implica que los registros de la tabla no pueden contener el mismo valor en los campos indexados.
136
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Y KEY
los campos de la clave principal deben ser nicos y no nulos, cada tabla slo puede contener una nica clave principal. Genera un ndice externo (toma como valor del ndice campos contenidos en otras tablas). Si la clave principal de la tabla externa consta de ms de un campo, se debe utilizar una definicin de ndice de mltiples campos, listando todos los campos de referencia, el nombre de la tabla externa, y los nombres de los campos referenciados en la tabla externa en el mismo orden que los campos de referencia listados. Si los campos referenciados son la clave principal de la tabla externa, no tiene que especificar los campos referenciados, predeterminado por valor, el motor Jet se comporta como si la clave principal de la tabla externa estuviera formada por los campos referenciados.
FOREIG N KEY
[Link] DE NDICES
Si se utiliza el motor de datos Jet de Microsoft slo se pueden crear ndices en bases de datos del mismo motor. La sintaxis para crear un ndice en una tabla ya definida en la siguiente: CREATE [UNIQUE] INDEX ndice ON Tabla (campo [ASC|DESC][, campo [ASC| DESC], ...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }] En donde:
ndice tabla campo ASC|DESC UNIQUE DISALLO W NULL IGNORE NULL PRIMARY Es el nombre del ndice a crear. Es el nombre de una tabla existente en la que se crear el ndice. Es el nombre del campo o lista de campos que constituyen el ndice. Indica el orden de los valores de los campos ASC indica un orden ascendente (valor predeterminado) y DESC un orden descendente. Indica que el ndice no puede contener valores duplicados. Prohibe valores nulos en el ndice Excluye del ndice los valores nulos incluidos en los campos que lo componen. Asigna al ndice la categora de clave principal, en cada tabla slo puede existir un nico ndice que sea "Clave Principal". Si un ndice es clave principal implica que no puede contener valores nulos ni duplicados.
En el caso de ACCESS, se puede utilizar CREATE INDEX para crear un pseudo ndice sobre una tabla adjunta en una fuente de datos ODBC tal como SQL Server que no tenga todava un ndice. No necesita permiso o tener acceso a un servidor remoto para crear un pseudo ndice, adems la base de datos remota no es consciente y no es afectada por el pseudo ndice. Se utiliza la misma sintaxis para las tablas adjuntas que para las originales. Esto es especialmente til para crear un ndice en una tabla que sera de slo lectura debido a la falta de un ndice. CREATE INDEX MiIndice ON Empleados (Prefijo, Telefono) (Crea un ndice llamado MiIndice en la tabla empleados con los campos Prefijo y Telfono.)
137
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
CREATE UNIQUE INDEX MiIndice ON Empleados (IdEmpleado) WITH DISALLOW NULL (Crea un ndice en la tabla Empleados utilizando el campo IdEmpleado, obligando que el campo IdEmpleado no contenga valores nulos ni repetidos.)
ALTER TABLE Empleados ADD COLUMN Salario CURRENCY (Agrega un campo Salario de tipo Moneda a la tabla Empleados.) ALTER TABLE Empleados DROP COLUMN Salario (Elimina el campo Salario de la tabla Empleados.) ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY (IdEmpleado) REFERENCES Empleados (IdEmpleado) (Agrega un ndice externo a la tabla Pedidos. El ndice externo se basa en el campo IdEmpleado y se refiere al campo IdEmpleado de la tabla Empleados. En este ejemplo no es necesario indicar el campo junto al nombre de la tabla en la
138
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
clusula REFERENCES, pues ID_Empleado es la clave principal de la tabla Empleados.) ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos (Elimina el ndice de la tabla Pedidos.)
[Link]
Cuando una tabla ya no es til y no vamos a volver a necesitarla debe ser borrada. Esta operacin se puede realizar con el comando DROP TABLE. DROP TABLE tabla [CASCADE CONSTRAINTS]; Se borra la tabla de la base de datos, borrando toda la informacin contenida en la tabla, es decir, todas las filas. Tambin se borrar toda la informacin que sobre la tabla existiera en el diccionario. Puede que si alguna columna de esta tabla a borrar sirva como clave ajena de alguna tabla detalle, impida la eliminacin de la tabla, ya que existe una restriccin que requiere de la existencia de la tabla maestra. Esto se puede arreglar colocando la coletilla CASCADE CONSTRAINTS. Esto produce que las restricciones de la tabla detalle se borren antes de borrar la tabla maestra. La siguiente sentencia produce la eliminacin de la tabla de departamentos. SQL> drop table dep cascade constraints; Table dropped.
[Link]
Una vista es como una ventana a travs de la cual se puede consultar o cambiar informacin de la tabla a la que est asociada. Las vistas tienen la misma estructura que una tabla: filas y columnas. La nica diferencia es que slo se almacena de ellas la definicin, no los datos. Los datos que se recuperan mediante una consulta a una vista se presentarn igual que los de una tabla. De hecho, si no se sabe que se est trabajando con una vista, nada hace suponer que es as. Al igual que sucede con una tabla, se pueden insertar, actualizar, borrar y seleccionar datos en una vista. Aunque siempre es posible seleccionar datos de una vista, en algunas condiciones existen restricciones para realizar el resto de las operaciones sobre vistas. Por qu utilizar vistas? Las vistas pueden proporcionar un nivel adicional de seguridad. Por ejemplo, en la tabla de empleados, cada responsable de departamento slo tendr acceso a la informacin de sus empleados. La siguiente sentencia produce la creacin de la vista de los empleados del departamento de administracin (cod_dep=100). SQL> create view ampAdmin as 2 select * from ep where cod_dep=100; View created. Las vistas permiten ocultar la complejidad de los datos. Una BD se compone de muchas tablas. La informacin de dos o ms tablas puede recperarse utilizando una combinacin de dos o ms tablas, y estas combinaciones pueden llegar a ser muy confusas. Creando una vista como resultado de la combinacin se puede ocultar la complejidad al usuario.
139
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Las vistas ayudan a mantener unos nombres razonables. Creacin de una Vista CREATE VIEW vista [({columna ,}+] AS consulta ; La vista se crea con las columnas que devuelve una consulta. Si no nos importa que las columnas de la vista hereden los nombres de las columnas recuperadas en la consulta no tenemos que especificarlos. Borrado de una Vista DROP VIEW vista ;
SQL> create view depAdmin (cod_emp, nombre_emp, nombre_dep, dir) 2 as select e.cod_emp, [Link], [Link], [Link] 3 from emp e, dep d 4 where e.cod_dep=d.cod_dep and [Link]='Administracion'; SQL> select * from depAdmin; COD_EMP NOMBRE_EMP NOMBRE_DEP ---------- ---------- --------------- ---------DIR
140
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Administracion Valladolid Administracion Valladolid Administracion Valladolid Administracion Valladolid Administracion Valladolid Administracion Valladolid
6 rows selected.
Variables de Usuario Se pueden definir Variables de usuario con el comando DEFINE DEFINE Variable = valor Para borrar una variable se utiliza el comando UNDEFINE UNDEFINE variable Como ejemplo se puede definir la variable OFICIO
SQL> define oficio=Analista SQL> define tabla=emp SQL> select nombre, oficio from &tabla where oficio='&oficio'; old 1: select nombre, oficio from &tabla where oficio='&oficio' new 1: select nombre, oficio from emp where oficio='Analista' NOMBRE OFICIO ---------- ----------Sastre Analista Recio Analista
Captura de Datos desde el Terminal En muchas ocasiones es necesario recoger datos desde un terminal, que luego sern utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las variables de sustitucin o los parmetros en la lnea de comandos. Cuando SQL*Plus reconoce una variable de sustitucin sin valor asignado se lo pide al usuario:
SQL> select * from dep where nombre='&nombredep'; Enter value for nombredep: I+D old 1: select * from dep where nombre='&nombredep' new 1: select * from dep where nombre='I+D'
141
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
prompt Buscar los datos de un empleado. pause Pulse Return. accept nombremp prompt 'Empleado? ' select * from emp where nombre='&nombremp';
Otros Comandos Los siguientes comandos tambin se pueden incluir en un archivo de comandos: CONNECT: para conectarse como otro usuario. HELP: para obtener ayuda en lnea. EXIT: para dejar SQL*PLus y salir al Sistema Operativo. DESCRIBE DESC: para obtener informacin sobre la estructura de una tabla. HOST o !: para ejecutar un comando del Sistema Operativo.
1. OPERADORES LGICOS
OPERAD OR AND OR USO Es el "y" lgico. Evala dos condiciones y devuelve un valor de verdad slo si ambas son ciertas. Es el "o" lgico. Evala dos condiciones y devuelve un valor de verdad 142
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
si alguna de las dos es cierta. NOT Negacin lgica. Devuelve el valor contrario de la expresin.
Operadores de Comparacin
OPERADOR < > <> <= >= = BETWEEN LIKE In Menor que Mayor que Distinto de Menor o igual que Mayor o igual que Igual que Utilizado para especificar un intervalo de valores. Utilizado en la comparacin de un modelo Utilizado para especificar registros de una base de datos USO
Funciones de Agregado Las funciones de agregado se usan dentro de una clusula SELECT en grupos de registros para devolver un nico valor que se aplica a un grupo de registros.
FUNCI N AVG COUNT SUM MAX MIN DESCRIPCIN Utilizada para calcular el promedio de los valores de un campo determinado Utilizada para devolver el nmero de registros de la seleccin Utilizada para devolver la suma de todos los valores de un campo determinado Utilizada para devolver el valor ms alto de un campo especificado Utilizada para devolver el valor ms bajo de un campo especificado
Funciones Aritmticas
FUNCIN ABS(n) COMETIDO Calcula el valor absoluto de n. EJEMPLO RESULTA DO
CEIL(n)
Calcula el valor entero select ceil(15.7) inmediatamente superior o igual from dual; a n.
16
Calcula el valor entero select floor(15.7) FLOOR(n) inmediatamante inferior o igual from dual; a n. MOD(m,n) Calcula el resto resultante de
15
143
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Calcula el redondeo de m a n select ROUND(m, decimales. Si n<0 el redondeo round(123.456,1) from 123.5 n) se efectua a por la izquierda del dual; punto decimal. SQRT(n) Calcula la raz cuadrada de n.
select sqrt(4) from dual;
Calcula el signo de n, select sign(-12) from devolviendo -1 si n<0, 0 si n=0 dual; -1 y 1 si n>0.
CHR(n)
Devuelve el carcter cuyo select chr(65) from dual; valor codificado es n. Devuelve el valor ascii de cad.
select ascii('A') from dual;
ASCII(cad)
65
Devuelve cad1 concatenada con select CONCAT(cad1,cad cad2. Esta concat(concat(nombre,' es 2) funcin es '),oficio) from emp; esquivalente al operador ||.
LOWER(cad)
Devuelve la cadena cad con select lower('MinUsCulAs') todas sus letras from dual; minusculas convertidas a minsculas.
select upper('maYuSCulAs') MAYUSCULA Devuelve la cadena cad con from dual; S todas sus letras convertidas a
UPPER(cad)
144
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
INITCAP(cad)
Isabel
Devuelve cad1 con longitud n, y ajustada a la select lpad('P',5,'*') from LPAD(cad1,n,cad2 derecha, ****P dual; ) rellenando por la izquierda con cad2. Devuelve cad1 con longitud n, y ajustada a la select rpad('P',5,'*') from RPAD(cad1,n,cad izquierda, P**** dual; 2) rellenando por la derecha con cad2. Devuelve cad en la que cada ocurrencia de la select REPLACE(cad,ant, replace('digo','i','ie') cadena ant ha nue) sido sustituida from dual; por la cadena nue.
diego
Devuelve la sudcadena de select cad compuesta substr('ABCDEFG',3,2) from CD SUBSTR(cad,m,n) por n caracteres dual; a partir de la posicion m. LENGTH(cad)
select length('cadena') Devuelve la longitud de cad. from dual;
RESULTA DO 14-MAR97
145
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
incrementada from dual; en n meses. Devuelve la select last_day(sysdate) from 31-MARfecha del ltimo da del dual; 97 mes de d.
LAST_DAY(d)
Devuelve la diferencia en select MONTHS_BETWEEN meses entre months_between(sysdate,'01(d1, d2) las fechas d1 y JAN-97') from dual; d2. Devuelve la fecha del primer da de select next_day(sysdate, la semana cad 'sunday') from dual; despus de la fecha d.
2.434094 24
NEXT_DAY(d,cad)
16-MAR97
Convierte la cadena cad a un nmero, select TO_NUMBER(cad,f to_number('12345') opcionalmente de mto) acuerdo con el formato from dual; fmto.
124345
Convierte la fecha d a una cadena de select caracteres, '14-MARto_char(sysdate) from TO_CHAR(d, fmto) opcionalmente de 97' dual; acuerdo con el formato fmto. Convierte la cadena cad de tipo varchar2 a select to_date('1TO_DATE(cad,fmto) fecha, opcionalmente JAN-97') from dual; de acuerdo con el formato fmto.
01-JAN-97
Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentacin de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan. Mscaras de Formato Numricas
FORMATO COMETIDO EJEMPLO RESULTA DO 146
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
20
1,997
Ao sin signo con select to_char(sysdate,'yyyy') yyyy yyy cuatro, tres, dos o un from dual; 1997 yy y dgitos. q Trimestre.
select to_char(sysdate,'q') from dual;
ww w
Nmero de la select to_char(sysdate,'ww') semana del ao o del from dual; mes. Nmero del mes.
select to_char(sysdate,'mm') from dual;
11
mm
03
Nmero del da del select to_char(sysdate,'ddd') ddd dd ao, del mes o de la from dual; d semana. hh hh12 La hora en formato hh24 12h. o 24h. mi Los minutos de la hora.
select to_char(sysdate,'hh') from dual; select to_char(sysdate,'mi') from dual;
073
12 15
ss sssss
Los segundos dentro select del minuto, o desde to_char(sysdate,'sssss') from dual; las 0 horas.
44159
Nombre del mes o su select month o to_char(sysdate,'month') from march abreviatura de tres mon dual; letras. Nombre del da de la select to_char(sysdate,'day') semana o su day dy friday from dual; abreviatura de tres letras. a.m. p.m. El espacio del da.
select to_char(sysdate,'a.m.') from
p.m.
147
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
dual;
Indicador del ao select to_char(sysdate,'b.c.') from b.c. a.d. respecto al del nacimiento de Cristo. dual;
a.d.
Otras Funciones
FUNCIN DECODE(var, val1, cod1, val2, cod2, ..., defecto) COMETIDO EJEMPLO RESULTA DO
Convierte el select decode(oficio, valor de var, de 'Presidente', 'P', 'Director', P, D, X, ... acuerdo con la 'D', 'X') from emp; codificacin. sin ejemplo. sin ejemplo.
Devuelve el GREATEST(exp1, mayor valor de sin ejemplo. exp2, ...) una lista. Devuelve el LEAST(cad,fmto) menor valor de sin ejemplo. una lista.
NVL(val, exp)
Devuelve la expresin exp select salario+nvl(comision,0) 450000, si val es NULL, from emp; 350000, ... y val si en otro caso.
2. CONSULTAS BSICAS
La estructura bsica de una expresin de consulta SQL consiste en tres clusulas: select, from y where select: corresponde a la operacin proyeccin del lgebra relacional from: corresponde a la operacin producto cartesiano del lgebra relacional where: corresponde al predicado de la operacin seleccin del lgebra relacional
1. OPERADORES LGICOS
Los operadores lgicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A excepcin de los dos ltimos todos poseen la siguiente sintaxis: <expresin1> operador <expresin2> En donde expresin1 y expresin2 son las condiciones a evaluar, el resultado de la operacin vara en funcin del operador lgico. La tabla adjunta muestra los diferentes posibles resultados:
<expresin1> Verdad Operador AND <expresin2> Falso Resultado Falso 148
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Falso Falso Verdad Verdad Verdad Falso Falso Falso Null Null Null
AND AND AND OR OR OR OR XOR XOR XOR XOR Eqv Eqv Eqv Eqv Imp Imp Imp Imp Imp Imp Imp Imp Imp
Verdad Verdad Falso Falso Verdad Verdad Falso Verdad Falso Verdad Falso Verdad Falso Verdad Falso Verdad Falso Null Verdad Falso Null Verdad Falso Null
Verdad Falso Falso Verdad Verdad Verdad Falso Falso Verdad Verdad Falso Verdad Falso Falso Verdad Verdad Falso Null Verdad Verdad Verdad Verdad Null Null
2. SENTENCIAS SQL
1. 2. 3. 4.
[Link]
Para indicar que deseamos recuperar los registros segn el intervalo de valores de un campo emplearemos el operador Between cuya sintaxis es: campo [Not] Between valor1 And valor2 (la condicin Not es opcional)
149
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
En este caso la consulta devolvera los registros que contengan en "campo" un valor incluido en el intervalo valor1, valor2 (ambos inclusive). Si anteponemos la condicin Not devolver aquellos valores no incluidos en el intervalo. SELECT * FROM Pedidos WHERE CodPostal Between 28000 And 28999 (Devuelve los pedidos realizados en la provincia de Madrid)
[Link]/ROLLBACK
Cada vez que se realiza alguna operacin en la base de datos se realiza no sobre la tabla en s, sino sobre una copia local de la misma. As, si queremos que los resultados de la modificacin se trasladen a la base de datos y perduren en el tiempo hay que confirmar dicha operacin con el comando commit. Tambin se puede impedir que los ltimos cambios lleguen a efectuarse con rollback, aunque existen algunas sentencias SQL que se 'autoconfirman' y no se pueden volver atrs.
[Link]
Comparacin de conjuntos En conjuntos la frase << mayor que algn >> se representa en SQL por ( >SOME ), tambin podra entenderse esto como << mayor que el menor de >>, su sintaxis es igual que la del conector IN. SQL tambin permite las comparaciones ( >SOME ),( =SOME ) ( >=SOME ), ( <=SOME ) y ( <>SOME ). Tambin existe la construccin ( >ALL ), que corresponde a la frase << mayor que todos >>. Al igual que el operador SOME, puede escribirse ( >ALL ), ( =ALL ) ( >=ALL ), ( <=ALL ) y ( <>ALL ). En ocasiones podramos querer comparar conjuntos para determinar si un conjunto contiene los miembros de algn otro conjunto. Tales comparaciones se hacen usando las construcciones CONTAINS y NOT CONTAINS
[Link]
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente Count(expr) En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto. Aunque expr puede realizar un clculo sobre un campo, Count simplemente cuenta el nmero de registros sin tener en cuenta qu valores se almacenan en los registros. La funcin Count no cuenta los registros que tienen campos null a menos que expr sea el carcter comodn asterisco (*). Si utiliza un asterisco, Count calcula el nmero total de registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente ms rpida que Count(Campo). No se debe poner el asterisco entre dobles comillas ('*'). SELECT Count(*) AS Total FROM Pedidos
[Link]
150
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Con insertar y modificar, la otra operacin que completa el trio es la de borrado de filas. La sintaxis es la que sigue: DELETE FROM tabla [WHERE condicin]; Borrar todas las filas que cumplan la condicin especificada en la clusula WHERE. Si esta clusula no se fija, se borrarn todas las filas de la tabla. Aqu cabe decir que aunque con DELETE borremos todas las filas de una tabla, no borramos la definicin de la tabla del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una diferencia con la sentencia DROP TABLE, que produce la eliminacin tanto del contenido de la tabla como de la definicin de la misma.
[Link]
Cuando se realiza una consulta sobre una tabla en la que se extrae informacin de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta. Si este comportamiento no nos resulta satisfactorio podemos utilizar la clusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta. Podemos ver cmo funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de nuestros empleados.
OFICIO ----------Presidente Director Secretario Contable Comercial Comercial Director Analista Programador Programador Director Analista Programador Programador 14 rows selected.
Pero si incluimos la clusula DISTINCT la respuesta vara para adecuarse ms a nuestras expectativas.
151
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
OFICIO ----------Analista Comercial Contable Director Presidente Programador Secretario 7 rows selected. [Link]
La construccin EXISTS devuelve el valor TRUE si la subconsulta del argumento no est vaca, y la construccin NOT EXISTS devuelve TRUE si la consulta es vaca. Ejemplo: encontrar todos los nombre y apellidos de la relacin persona si es que en la relacin jugadores existe un jugador con el nmero de dni 27128055. SELECT nombre, apellido FROM persona WHERE EXISTS (SELECT dni FROM jugadores WHERE dni = 27128055 ) Como el dni = 27128055 no existe en la relacin jugadores, la condicin es FALSE y por lo tanto la respuesta es vaca
[Link] BY
SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar funciones sobre esos conjuntos de filas. La sintaxis es la siguiente: SELECT {* | {columna,}+} FROM {tabla,}+ WHERE condicin GROUP BY {columna ,}+ HAVING condicin ORDER BY {expresinColumna [ASC | DESC],} +; En la clusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la clusula HAVING se especifica la condicin que han de cumplir los grupos para pasar al resultado. La evaluacin de las diferentes clusulas en tiempo de ejecucin se efecta en el siguiente orden: WHERE filtra las filas GROUP BY crea una tabla de grupo nueva HAVING filtra los grupos ORDER BY clasifica la salida
Un ejemplo de utilizacin de la seleccin de grupos puede ser seleccionar los empleados agrupados por su oficio. Un primer intento de consulta es el siguiente:
SQL> select nombre, oficio from emp group by oficio; select nombre, oficio from emp
152
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
SQL> select count(nombre), oficio from emp group by oficio; COUNT(NOMBRE) OFICIO ------------- ----------2 Analista 2 Comercial 1 Contable 3 Director 1 Presidente 4 Programador 1 Secretario 7 rows selected.
Las funciones de agrupamiento que se pueden utilizar son las siguientes. Funciones de Agrupamiento
FUNCIN COUNT(col) COMETIDO Cuenta el nmero de filas agrupadas. Calcula el valor medio de todos los valores de la columna col. Calcula el valor mximo de todos los valores de la columna col. Calcula el valor mnimo de todos los valores de la columna col. EJEMPLO
select count(nombre),oficio from emp group by oficio; select avg(salario),oficio from emp group by oficio;
AVG(col)
MAX(col)
MIN(col)
SUM(col)
Calcula la suma de los valores select sum(salario), oficio from emp group by oficio; de la columna col.
153
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
los valores de la columna col from emp group by oficio; sin tener en cuenta los valores nulos.
Calcula la varianza de los select variance(salario), VARIANCE(c valores de la columna col sin oficio from emp group by ol) tener en cuenta los valores oficio; nulos.
Hay que tener en cuenta que los valores nulos no participan en el clculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las clusulas DISTINCT y ALL. Tambin se pueden utilizar aunque no realicemos agrupacin alguna en la consulta, considerando a toda la tabla como un grupo.
[Link]
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sintaxis es: expresin [Not] In(valor1, valor2, . . .) SELECT * FROM pedidos WHERE Provincia In ('Madrid', 'Barcelona', 'Sevilla')
[Link] INTO
El comando que permite insertar filas en las tablas es el siguiente. INSERT INTO tabla [({columna,}*)] VALUES ({expresin,}+); Slo especificaremos las columnas donde insertar y su orden cuando no insertemos datos en todas ellas o no lo hagamos en el mismo orden en que definimos la tabla. La asociacin columna-valor es posicional. Los valores deben cumplir con los tipos de datos definidos. Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, (''). A continuacin se puede ver la insercin de filas en las tablas de ejemplo.
REM insertar filas en la tabla dep insert into dep values (100,'Administracion','Valladolid'); insert into dep values (200,'I+D','Boecillo'); insert into dep values (300,'Produccion','Cigales');
154
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
REM insertar filas en la tabla emp insert into emp values (101,'Cano','Presidente',null,'3-FEB-96',450000,null,100); insert into emp values (102,'Roncal','Director',101,'3-FEB-96',350000,null,100); insert into emp values (103,'Rueda','Secretario',102,'17-MAR-96',175000,null,100); insert into emp values (104,'Martin','Contable',102,'17-MAR-96',235000,null,100); insert into emp values (105,'Sanz','Comercial',101,'17-MAR-96',150000,10,100); insert into emp values (106,'Lopez','Comercial',101,'21-MAR-96',150000,15,100); insert into emp values (201,'Perez','Director',101,'4-JUN-96',350000,null,200); insert into emp values (202,'Sastre','Analista',201,'8-JUN-96',300000,null,200); insert into emp values (203,'Garcia','Programador',202,'8-JUN-96',225000,null,200); insert into emp values (204,'Mateo','Programador',202,'8-JUN-96',200000,null,200); insert into emp values (301,'Yuste','Director',101,'3-OCT-96',350000,null,300); insert into emp values (302,'Recio','Analista',301,'4-FEB-97',300000,null,300); insert into emp values (303,'Garcia','Programador',302,'4-FEB-97',210000,null,300); insert into emp values (304,'Santana','Programador',302,'4-FEB-97',200000,null,300); [Link]
Se utiliza para comparar una expresin de cadena con un modelo en una expresin SQL. Su sintaxis es: expresin Like modelo En donde expresin es una cadena modelo o campo contra el que se compara expresin. Se puede utilizar el operador Like para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo puede especificar un valor completo (Ana Mara), o se puede utilizar una cadena de caracteres comodn como los reconocidos por el sistema operativo para encontrar un rango de valores (Like An*). El operador Like se puede utilizar en una expresin para comparar un valor de un campo con una expresin de cadena. Por ejemplo, si introduce Like C* en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta con parmetros, puede hacer que el usuario escriba el modelo que se va a utilizar.
155
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
El ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de cualquier letra entre A y F y de tres dgitos: Like 'P[A-F]###' Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la A a la D seguidas de cualquier cadena. Like '[A-D]*' En la tabla siguiente se muestra cmo utilizar el operador Like para comprobar expresiones con diferentes modelos.
ACCESS TIPO DE COINCIDENCIA Varios caracteres Carcter especial Varios caracteres Un solo carcter Un solo dgito Rango de caracteres Fuera de un rango Distinto de un dgito Combinada MODELO PLANTEADO 'a*a' 'a[*]a' 'ab*' 'a?a' 'a#a' '[a-z]' '[!a-z]' '[!0-9]' 'a[!b-m]#' SQL-SERVER EJEMPLO LIKE 'A%' LIKE '_NG' LIKE '[AF]%' LIKE '[A-F]%' LIKE '[A^B] %' DESCRIPCIN Todo lo que comience por A Todo lo que comience por cualquier carcter y luego siga NG Todo lo que comience por A F Todo lo que comience por cualquier letra comprendida entre la A y la F Todo lo que comience por A y la segunda letra no sea una B COINCIDE 'aa', 'aBa', 'aBBBa' 'a*a' 'abcdefg', 'abc' 'aaa', 'a3a', 'aBa' 'a0a', 'a1a', 'a2a' 'f', 'p', 'j' '9', '&', '%' 'A', 'a', '&', '~' 'An9', 'az0', 'a99' NO COINCIDE 'aBC' 'aaa' 'cab', 'aab' 'aBBBa' 'aaa', 'a10a' '2', '&' 'b', 'a' '0', '1', '9' 'abc', 'aj0'
En determinado motores de bases de datos, esta clusula, no reconoce el asterisco como carcter comodn y hay que sustituirlo por el carcter tanto por ciento (%).
[Link], MIN
Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo especifico de una consulta. Su sintaxis es: Min(expr) Max(expr)
156
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
En donde expr es el campo sobre el que se desea realizar el clculo. Expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL). SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'Espaa' SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'Espaa'
[Link] BY
Se utiliza para especificar el criterio de ordenacin de la respuesta a la consulta. Por defecto la ordenacin es ascendente, aunque se puede especificar un orden descendente. La ordenacin se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuacin se puede ver un ejemplo de uso de la clusula ORDER BY en la que quiere obtener un listado de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.
SQL> select nombre, salario from emp order by salario desc, nombre; NOMBRE SALARIO ---------- ---------Cano 450000 Perez 350000 Roncal 350000 Yuste 350000 Recio 300000 Sastre 300000 Martin 235000 Garcia 225000 Garcia 210000 Mateo 200000 Santana 200000 Rueda 175000 Lopez 150000 Sanz 150000 14 rows selected.
[Link] Y SUBSELECT
La recuperacin de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al SGBD la informacin que se quiere recuperar. Esta es la sentencia SQL, con diferencia, ms habitual. La sentencia SELECT consta de cuatro partes bsicas: La clusula SELECT seguida de la descripcin de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria. La clusula FROM seguida de la especificacin de las tablas de las que se han de obtener los datos. Esta parte es obligatoria.
157
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La clusula WHERE seguida por un criterio de seleccin, una condicin. Esta parte es opcional. La clusula ORDER BY seguida por el criterio de ordenacin. Esta parte es opcional.
Una primera aproximacin a la sintaxis de la sentencia SELECT puede mostrarnos la siguiente expresin: SELECT {* | {columna,}+} FROM {tabla,}+[WHERE condicin] [ORDER BY {expresinColumna [ASC | DESC],}+]; Como una primera utilizacin de la sentencia SELECT podemos utilizarla para ver todas las tablas que tenemos en la base de datos.
[Link] DE COLUMNAS
Las columnas a seleccionar se enumeran sin ms en la clusula SELECT. Si se desea seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las columnas o colocando un asterisco, *, en su lugar. Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentacin. Si ste resulta demasiado largo, corto o crptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna.
SQL> select nombre "Departamento", loc "Est en" from dep; Departamento Esta en --------------- ---------Administracion Valladolid I+D Boecillo Produccion Cigales
[Link] FROM
La clusula FROM define las tablas de las que se van a seleccionar las columnas. Se puede aadir al nombre de las tablas el usuario propietario de las mismas de la forma [Link]. De esta manera podemos distinguir entre las tablas de un usuario y otro. Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o ms usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si
158
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
quisiramos acceder a las filas de la tabla dep del usuario jperez, (adems de tener privilegios de lectura sobre esa tabla) deberamos escribir la siguiente sentencia SQL:
between not
159
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
between
Contiene la cadena 'abc' a partir del select * from emp where like '_abc segundo carcter y luego cualquier nombre like 'Ma%'; %' cadena de caracteres
Operadores de Aritmticos
OPERAD OPERACI OR N + * / Suma Resta EJEMPLO
select nombre, salario+comision from emp where oficio='VENDEDOR'; select nombre from emp where sysdate-fecha_alta > 365;
[Link]
A veces se han de utilizar en una consulta los resultados de otra consulta, llamada subconsulta. Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados cuyo salario est por encima de la media:
SQL> select nombre from emp 2 where salario > (select avg(salario) from emp); NOMBRE ---------Cano Roncal Perez Sastre Yuste Recio 6 rows selected.
160
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La consulta ms interna calcula el salario medio, y la consulta ms externa lo utiliza para seleccionar los nombres que ganan ms que la media. El valor de comparacin puede ser un valor simple, como en el ejemplo anterior, o un conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a utilizar vara. En el primer caso se puede utilizar un operador de comparacin de carcter aritmtico (<, >, etc.). Y en el segundo uno de tipo lgico (IN). Las subconsultas pueden devolver ms de una columna, y se habrn de comparar de manera consecuente: Las columnas de la clausula WHERE de la consulta principal deben estar agrupadas por parntesis. Las columnas encerradas entre parntesis deben coincidir en nmero y tipo de datos con los datos que devuelve la subconsulta.
El nivel de anidamiento de subconsultas es ilimitado. Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la creacin de la misma con la clusula AS. Si quisiramos crear una tabla con los datos de los empleados del departamento 200 lo podramos hacer de la siguiente manera:
SQL> create table dep200 (nombre, oficio) 2 as select nombre,oficio from emp 3 where cod_dep=200; Table created.
No es necesario especificar tipos ni tamaos de las columnas, ya que vienen determinados por los tipos y tamaos de las columnas recuperadas en la subconsulta.
161
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
2897884 ARQUERO 5
2978985 DEFENSOR 3 4
Ejemplo: Obtener todos los nombres de la relacin persona cuyos apellidos sean Marquesi o Serrat SELECT nombre FROM PERSONAWHERE apellido = "MARQUESI" UNION SELECT nombre FROM PERSONA WHERE apellido = "SERRAT"
ANSWE R 1 2 3 PRIMER NOMBRE MARTIN PABLO JUAN
Ejemplo: Obtener todos los DNI de los que juegan al ftbol y, adems, estn en la lista de la relacin persona SELECT dni FROM persona INTERSECT SELECT dni FROM jugadores
ANSWER 1 DNI 261259 88 254856 99 289788 45
Por omisin, la operacin de unin elimina las tuplas duplicadas. Para retener duplicados se debe escribir UNION ALL en lugar de UNION.
[Link]
Otra de las operaciones ms comunes es la modificacin de la informacin almacenada en las tablas. Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a continuacin. UPDATE tabla SET {columna = expresin,}+ [WHERE condicin]; Se especificar en la clusula SET las columnas que se actualizarn y con qu valores. La clusula WHERE indica las filas con las que se va a trabajar. Si se omite la actualizacin afectar a todas las filas de la tabla.
162
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
163
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Programaci n estructurada
164
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Contenido
1. 2. 3. 4. 5. 6. 7. Objetivo...................................................................................................2 La visin clsica de la programacin estructurada: la programacin sin goto La visin moderna de la programacin estructurada: la segmentacin...3 Programacin estructurada y orientacin a objetos.................................7 Ejercicios................................................................................................25 Evaluacin.............................................................................................26 Actividades prcticas.............................................................................27 2
Actividades prcticas
165
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1. Objetivo
Al concluir este curso el alumno aprender a: Comprender la justificacin de la programacin estructurada. Conocer en qu consiste la programacin estructurada. Utilizar la programacin estructurada en el diseo de aplicaciones. Mantener mejor las aplicaciones.
Los programas que utilizan slo estas tres instrucciones de control bsicas o sus variantes (como los bucles for, repeat o la instruccin condicional switch-case), pero no la instruccin goto, se llaman estructurados. sta es la nocin clsica de lo que se entiende por programacin estructurada (llamada tambin programacin sin goto) que hasta la aparicin de la programacin orientada a objetos se convirti en la forma de programar ms extendida. Esta ltima se enfoca hacia la reduccin de la cantidad de estructuras de control para reemplazarlas por otros elementos que hacen uso del concepto de polimorfismo. Aun as los programadores todava utilizan las estructuras de control (if, while, for, etc.) para implementar sus algoritmos porque en muchos casos es la forma ms natural de hacerlo. Una caracterstica importante en un programa estructurado es que puede ser ledo en secuencia, desde el comienzo hasta el final sin perder la continuidad de la tarea que cumple el programa, lo contrario de lo que ocurre con otros estilos de programacin.
166
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Este hecho es importante debido a que es mucho ms fcil comprender completamente el trabajo que realiza una funcin determinada si todas las instrucciones que influyen en su accin estn fsicamente contiguas y encerradas por un bloque. La facilidad de lectura, de comienzo a fin, es una consecuencia de utilizar solamente tres estructuras de control, y de eliminar la instruccin de transferencia de control goto.
Aunque no puede fijarse de antemano el nmero y tamao de estos mdulos, debe intentarse un compromiso entre ambos factores. Si nos encontramos ante un mdulo con un tamao excesivo, podremos dividir ste a su vez en partes (nuevos mdulos) ms manejables, producindose la sucesiva divisin siempre desde problemas generales a problemas cada vez menos ambiciosos y, por tanto, de fcil desarrollo y seguimiento. As, esta divisin toma la forma de un rbol cuya raz es el programa principal que implementa la solucin al problema que afrontamos utilizando uno o varios mdulos que realizan partes de dicha solucin por s solos o invocando a su vez otros mdulos que solucionan subproblemas ms especficos. A esta aproximacin se la denomina diseo descendente o top-down, como queda esquematizado en la siguiente figura:
167
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Fig. 5.1. Diseo descendente. El carcter autocontenido de los mdulos o libreras hace que pueda ocultarse el funcionamiento interno de las funciones contenidas en un mdulo, ya que para utilizarlas basta con saber con qu nombre y argumentos se invocan y qu tipo de valores devuelven. Al reunirlas en un mdulo, se realza la relacin entre las mismas separndolas del resto del programa. Esta ocultacin de los detalles se denomina encapsulacin y se alcanza dividiendo el cdigo del programa en dos ficheros diferenciados: un fichero (con extensin ".h") que incluye la declaracin de los tipos de datos y de las funciones gracias a lo cual se sabe cmo acceder y utilizar cada una de las mismas y otro (con extensin ".c") que contiene el cdigo de cada una de las funciones declaradas en el .h. Al compilar este ltimo queda transformado en cdigo objeto (al cual ya no se puede acceder para su lectura o modificacin) y puede distribuirse conjuntamente con el fichero de declaracin (el que acaba en .h), para su uso por parte de terceros sin riesgo alguno de alteracin de la funcionalidad original (sta qued encapsulada u oculta). Esto es as porque para hacer uso de las funciones incluidas en el mdulo nicamente necesitaremos conocer la informacin que nos proporciona el fichero de declaracin: el nombre, tipos de datos de los argumentos y valores de retorno de las funciones. No es necesario conocer los detalles de implementacin (sentencias que se ejecutan dentro de una funcin). Ejemplo prctico 1 Supongamos que queremos desarrollar una aplicacin para que dos usuarios jueguen al ajedrez. En primer lugar, necesitamos una serie de funciones asociadas al tablero: una que coloque todas las piezas de ambos jugadores en las posiciones iniciales, otra que determine si se ha producido el final de la partida, otra que confirme la presencia de una pieza del jugador en juego en una determinada casilla, otra que confirme que el movimiento no se sale del tablero, o que ese tipo de pieza puede realizarlo, y una ltima que lleve a efecto el movimiento de una pieza del jugador en juego (eliminando del tablero a otra pieza del jugador contrario si procede). Para estas ltimas puede ser preciso utilizar a su vez otro mdulo que represente las funciones de movimiento asociadas a cada tipo de pieza. La descomposicin en mdulos del programa quedara:
168
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Fig. 5.2. Descomposicin del programa en mdulos. As, el contenido del fichero de libreratablero.h sera: enum columnas { a, b, c, d, e, f, g, h }; struct tablero {int posx; enum columnas posy; struct pieza mipieza; struct tablero *siguiente;} int Final(struct tablero *mitablero); void Inicio(struct tablero *mitablero); int Pertenece(struct tablero *mitablero, int posx, enum columnas posy); void Dibuja(struct tablero *mitablero); int FueraTablero(struct tablero *mitablero, int x1, enum columnas y1, int x2, enumcolumnas y2); int Valido_T(struct tablero *mitablero, int x1, enum columnas y1, int x2, enum columnas y2); void Mover(struct tablero *mitablero, int x1, enum columnas y1, int x2, enum columnas y2); As, el fichero de declaracin pieza.h incluira el siguiente cdigo: enum color { blanco, negro }; enum tipo { peon, torre, caballo, alfil, reina, rey } struct pieza { enum color micolor; enum tipo mitipo;} int Valido_P(struct pieza *mipieza, int x1, int y1, int x2, int y2); De esta forma, con el conocimiento pblico de ambos ficheros de declaracin (tablero.h, pieza.h) podremos hacer uso de las funciones de los mdulos tablero y pieza declaradas en estos ficheros, a pesar
169
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
de nuestra ignorancia completa de cmo fueron implementadas. Lo ignoramos, ya que no tenemos acceso a los ficheros de implementacin o cdigo fuente (tablero.c,pieza.c); nicamente disponemos del cdigo objeto (ablero.o, pieza.o) para su ejecucin posterior. Evidentemente, desde el cdigo que haga uso de alguna de las citadas funciones de la librera, hemos de invocar los ficheros de declaracin correspondientes. Para ello, utilizaremos la directiva de C include, tal y como hacamos para utilizar las funciones de entrada/salida con stdio.h o las de cadenas de caracteres con strong.h, slo que cambiaremos los smbolos < y > por dobles comillas ", por no tratarse de una librera estndar, sino creada por el propio programador y cuya ubicacin, por tanto, no es la del directorio que alberga dichas libreras, en la cual el compilador busca por defecto, sino la especificada entre dobles comillas. En caso de no especificarse ninguna ruta dentro de las dobles comillas, sera buscada en el directorio actual. Por tanto, podemos indicar que esta tcnica persigue obtener una descomposicin en forma de rbol que permita el fraccionamiento del programa en mdulos que resulten fciles de entender, desarrollar, probar y mantener, y que agrupen las funciones y datos que estn estrechamente relacionadas entre s. Ejemplo prctico 2 El siguiente programa implementa apertura de ajedrez Amar: #include "tablero.h" main() { struct tablero mipartida; Inicio(&mipartida); Mover(&mipartida, b, 1, a, 3); Dibuja(&mipartida); } Al igual que las funciones Mover y Valido de la librera o mdulo tablero invocan a una funcin del mdulo pieza, el cdigo de la primera debe incluir el fichero de declaracin de la segunda: #include "pieza.h"
170
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
171
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La declaracin o interfaz es de dominio pblico, conocido por las dems partes del programa. En la implementacin se explicitan y codifican los elementos necesarios para responder a lo especificado en la declaracin. Esta separacin permite que cada objeto definido en nuestro sistema pueda ocultar su implementacin y hacer pblica su interfaz de comunicacin. La ocultacin de la informacin permite aislar una parte del programa del resto, y que el cdigo de una parte sea revisado o extendido sin afectar a la integridad de las dems partes. En este sentido, es interesante resaltar que la opcin de encapsular datos y operaciones en libreras y objetos facilita enormemente que se puedan utilizar en una aplicacin ajena. Se puede, por tanto, empezar a hablar de una relacin consumidor/proveedor de cdigo. La programacin convencional daba ms importancia a la relacin entre el programador y su cdigo, que a la relacin entre el cdigo y las aplicaciones en que se usa. El proceso de construccin del software resultante de aplicar las dos propiedades ya comentadas anteriormente sera: 1. Gracias a la abstraccin se agruparn funcionalidad e informacin en partes diferenciadas. El sistema estar constituido entonces por partes que se invocan entre s. 2. A continuacin, se definir una interfaz pblica que permite la utilizacin de cada parte del sistema, manteniendo oculta la implementacin en el interior de ella. Resumiendo las analogas existentes entre ambas tcnicas de programacin, se puede decir que la abstraccin facilita la comprensin de la divisin de un programa en partes y la encapsulacin permite aislar la implementacin de cada una de las partes, aumentando la estabilidad y reutilizacin del cdigo. En las unidades siguientes, seguiremos esta idea de asociar la programacin estructurada a la orientacin a objetos relacionando cada mdulo/librera con las operaciones a realizar sobre una estructura de datos. En el ejemplo prctico 3 vamos a ver una aplicacin de la programacin estructurada a la gestin de los productos que pone a la venta un determinado comercio. Estos productos podrn ser tanto libros como pelculas en DVD. Ejemplo prctico 3 En la aplicacin contaremos con un mdulo para realizar operaciones con artculos, como dar de alta y de baja un producto, visualizarlos en pantalla, vender un determinado nmero de ejemplares o reponer stock de ese producto. La estructura de los datos correspondientes a un producto de dicho comercio sera: struct articulo { char cod_art[10]; float precio; unsigned int existencias; }; Tambin contaremos con estructuras que agrupen la informacin relativa a los libros por un lado y a las pelculas por otro, de forma que pueda consultarse el cdigo de producto por el autor de un libro, el director de una pelcula o por sus nombres, as como dar de alta y de baja los libros y pelculas. Por ejemplo, las estructuras libro y DVD podran ser: enum genero { historica, intriga, rosa, viaje, autoayuda, aventuras, ensayo };
172
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
struct libro { char cod_art[10]; char titulo[20]; char autores[30]; char editorial[10]; enum genero migenero; }; struct DVD { char cod_art[10]; char titulo[20]; char director[10]; char actores[30]; int ao; }; As, la nica relacin entre la estructura articulo y la descripcin del mismo en la estructura libro o DVD es el mismo valor del campo cod_art. De esta forma, es el programa principal el que se encarga de relacionarlos. La estructura en forma de rbol de las libreras de nuestra aplicacin quedara de la siguiente forma:
Fig. 5.3. Estructura de rbol de la aplicacin. Se podra haber optado por incluir un campo en la estructura de tipo artculo que se correspondiera con los datos del libro o DVD. As descargamos al programa principal de la responsabilidad de relacionar ambas estructuras mediante el cdigo del artculo y podramos mostrar la informacin sobre el precio y stock junto con los detalles del libro o DVD, o dar de alta/baja simultneamente a la estructura artculo y al libro/DVD. La estructura articulo resultante sera: enum tipo { libro, DVD }; union descripcion { struct libro milibro;
173
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
struct DVD miDVD; }; struct articulo { enum tipo mitipo; union descripcion midescripcion; float precio; unsigned int existencias; }; Y entonces la jerarqua de las libreras de nuestra aplicacin sera completamente diferente:
Fig. 5.4. Jerarqua de las libreras de la aplicacin. A partir de ahora supondremos que, en este ejemplo, optamos por la primera de las dos asociaciones posibles: artculos y libros/dvd. Empezaremos por definir el archivo de declaracin articulo.h con la estructura articulo y la cabecera de las funciones que implementa: struct articulo { char cod_art[10]; float precio; unsigned int existencias; }; float Vender( struct articulo *ar, int cantidad ); struct articulo Alta(long int codigo, float euros, unsigned int cantidad );
174
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
void Visualizar(struct articulo *ar ); void Reponer(struct articulo *ar, int cantidad ); La correspondiente implementacin de estas funciones en el fichero articulo.c quedara: #include <stdio.h> #include <string.h> #include "articulo.h" struct articulo Alta(char *codigo, float euros, unsigned int cantidad ) { struct articulo ar; ar.cod_art[0] = codigo; [Link] = euros; [Link] = cantidad; return ar; } void Visualizar(struct articulo *ar ) { printf("Cdigo del artculo: %s\n", ar->cod_art); printf("Precio del artculo: %f\n", ar->precio); printf("Existencias del artculo: %d\n", ar->existencias); } float Vender( struct articulo *ar, int cantidad ) { ar->existencias= ar->existencias-cantidad; return (cantidad*ar->precio); } void Reponer(struct articulo *ar, int cantidad ) { ar->existencias= ar->existencias+cantidad; } A partir de esta librera bsica de funciones podemos implementar nuevos procedimientos que den mayores funcionalidades. Por ejemplo, supongamos que una vez introducido un artculo no puede ser introducido otro que tenga el mismo cdigo. Para realizar una funcin que verifique si es vlido o no el nuevo artculo, podemos utilizar la funcin de comparacin: int Valida( struct articulo *ar1, struct articulo *ar2 ) {
175
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
if(!strcmp( ar1->cod_art, ar2->cod_art )) return 0; else return 1; } /* Programa con funcin Valida */ main() { int i; struct articulo ar[5], br[5]; ... /* Carga de los arrays con datos */ ... for (i=0; i<5; i++){ if (!Valida(ar[i], br[i])) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", i+1); } ... /* Carga de los arrays con nuevos datos */ ... for (i=0; i<5; i++){ if (!Valida(ar[i], br[i])) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", i+1); } } /* Programa sin funcin Valida */ void main() {
176
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
int i; struct articulo ar[5], br[5]; ... /* Carga de los arrays con datos */ ... for (i=0; i<5; i++){ if (!strcmp(ar[i]->cod_art, br[i] ->cod_art)) printf ("Los articulos de la posicin %d son iguales\n", i+1); else printf ("Los articulos de la posicin %d son distintos\n", i+1); } ... /* Carga de los arrays con nuevos datos */ ... for (i=0; i<5; i++){ if (!strcmp(ar[i]->cod_art, br[i] ->cod_art)) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", +1); } } Supongamos que se utiliza la funcin Valida en muchos lugares del programa y que es necesario hacer un cambio que implica la modificacin de la condicin de la misma. Este cambio en un nico punto de la librera modifica automticamente el funcionamiento de todo el programa. En la versin con funcin Valida slo hay que modificar el cdigo de la misma para que el programa quede actualizado, no siendo necesario modificar el programa principal que la invoca. Si esta funcin no existiera, el programador debera ir buscando en el programa cada uno de los lugares donde se ha utilizado la condicin de comparacin y aadirle la condicin de desigualdad de existencias, lo cual lleva mucho ms tiempo y har probablemente que se produzca algn error, al pasar inadvertida la modificacin en alguna sentencia. Ese tipo de errores son muy difciles de depurar. int Valida( struct articulo *ar1, struct articulo *ar2 ) { if(!strcmp( ar1->cod_art, ar2->cod_art ) && (ar1->existencias == ar2-> existencias)) return 0;
177
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
else return 1; } /* Programa con funcin Valida */ main() { int i; struct articulo ar[5], br[5]; ... /* Carga de los arrays con datos */ ... for (i=0; i<5; i++){ if (!Valida(ar[i], br[i])) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", +1); } ... /* Carga de los arrays con nuevos datos */ ... for (i=0; i<5; i++){ if (!Valida(ar[i], br[i])) printf ("Los artculos de la posicin %d son iguales\n", +1); else printf ("Los artculos de la posicin %d son distintos\n", i+1); } } /* Programa sin funcin Valida modificado*/ main() { int i; struct articulo ar[5], br[5]; ... /* Carga de los arrays con datos */
178
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
... for (i=0; i<5; i++){ if (!strcmp(ar[i]->cod_art, br[i] ->cod_art) && (ar1-> existencias == ar2-> existencias)) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", i+1); } ... /* Carga de los arrays con nuevos datos */ ... for (i=0; i<5; i++){ if (!strcmp(ar[i]->cod_art, br[i] ->cod_art) && (ar1-> existencias == ar2-> existencias)) printf ("Los artculos de la posicin %d son iguales\n", i+1); else printf ("Los artculos de la posicin %d son distintos\n", i+1); } } La ocultacin de la informacin no slo es til cuando se modifica alguna funcin, sino que tambin permite la modificacin de la estructura completa, sin necesidad de modificar el programa principal. Imagina que queremos cambiar la estructura porque los artculos no son unitarios (un libro por entregas o una serie en DVD con varios captulos). Entonces, las ventas no sern unitarias por lo que el campo existencias y las ventas no sern nmeros enteros, sino valores reales. Con la librera de funciones bsicas que hemos realizado no es necesario cambiar ni una lnea de cdigo del programa principal. nicamente debemos redefinir parte de la librera para que la estructura defina dicho campo de forma apropiada y las funciones alta y vender reciban un float como argumento cantidad, y la funcin Visualizar utilice %f en lugar de %d en la instruccin printf. El ejemplo que vamos a desarrollar en este apartado consiste en crear una biblioteca que permita representar en un plano de dos dimensiones el seguimiento de las trayectorias de los aviones en un determinado espacio areo. Para ello, debemos representar fundamentalmente tres estructuras: a) Las zonas del espacio areo que estn restringidas (por saturacin, razones de seguridad o uso militar). b) Las trayectorias que siguen los aviones. c) El rea concreta del mapamundi sobre la que nuestra aplicacin muestra el seguimiento.
179
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Ejemplo prctico 4 Aunque la aplicacin pretende simular la trayectoria de unos aviones en un espacio del mundo, esta simulacin es una simplificacin, ya que el mundo real tiene tres dimensiones (incluyendo los aviones y las zonas restringidas a la navegacin area comercial). Para nuestro ejemplo slo nos interesa una visin en dos dimensiones, en la que la altitud de los aviones y de las zonas restringidas no queda reflejada y la ignoramos a pesar de su importancia real. Asimismo, el planeta tiene unas dimensiones suficientemente grandes como para que no sea til mostrar las trayectorias de los aviones a una escala global, por lo que debemos limitar nuestro seguimiento a una parte de todo el planeta. Para saber qu parte del mundo queremos mostrar, utilizaremos una estructura dedicada a este fin. Hemos comentado con anterioridad que otra de las estructuras que nos interesa representar es la zona restringida, de forma que refleje su extensin (en forma de un polgono en 2D) y las razones de dicha restriccin (seguridad, militar, saturacin). Adicionalmente, hemos de representar a las aeronaves y su movimiento. Con este objeto, la estructura que las representa almacena la velocidad a la que se desplazan. La trayectoria que siguen se supone prefijada en un fichero antes de comenzar la ejecucin de la simulacin (pero con trayectoria independiente para cada uno de los aviones). En resumen, la aplicacin que queremos construir deber permitir representar una zona del planeta con dos tipos de elementos: las zonas restringidas y los aviones en movimiento. Los aviones no podrn moverse por las zonas restringidas. Para establecer la configuracin inicial de este mundo, utilizaremos lectura de ficheros escritos en modo texto (para una mayor comprensin y sencillez). As, el programa principal de nuestra aplicacin utilizar las funciones de las libreras que definamos con objeto de proporcionar al usuario las siguientes operaciones: a) Modificar las condiciones de ejecucin: el fichero que define el mundo, la velocidad a la que transcurre el tiempo para los movimientos y el tiempo total que durar la simulacin. b) Ejecutar la simulacin del seguimiento. c) Reiniciar la simulacin del seguimiento. Adicionalmente tambin se podra enriquecer nuestra aplicacin con un editor mediante el cual se pudiera modificar el fichero que almacena la definicin del mundo. Para conseguirlo agruparemos las distintas funciones en tres mdulos o libreras: una dedicada a la lectura de ficheros, otra a mostrar en pantalla el estado de la zona que estamos siguiendo y una tercera para realizar los movimientos de los aviones.
180
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Uno de los tipos de datos en los que se fundamenta nuestra aplicacin es el que representa un punto en coordenadas polares. La posicin de un avin se representa mediante un punto de este tipo y la de una zona restringida con una secuencia de puntos dinmicamente enlazados que define un polgono. struct punto { double r, angulo; struct punto *siguiente; }; Otra de las estructuras bsicas de la aplicacin es la que permite definir la trayectoria de un avin. Para ello, suponemos que un avin tiene dos motores (uno por cada ala) y que su dinmica se define por las velocidades que imprimen. Como se explic anteriormente, los aviones seguirn trayectorias definidas a priori en un fichero. Estas trayectorias vienen definidas por tramos en los que se mantiene una determinada aceleracin producida por el motor de cada ala del avin. As, utilizaremos una estructura enlazada para encadenar una trayectoria con la siguiente, de la forma indicada a continuacin: struct trayectoria { double tramo, adcha, aizda; struct trayectoria *siguiente; } Con estas dos estructuras ya es posible definir las partes en comn de todas las figuras: los aviones, las zonas restringidas y el campo de visin de la pantalla con la que mostramos el seguimiento. Para ello, supondremos que los puntos que delimitan el polgono correspondiente a una zona restringida o al campo de visin se definen en coordenadas polares con respecto al centro de la zona restringida o del campo de visin. En cambio, a los aviones se les supone sin grosor y, por tanto, estarn representados nicamente mediante su punto central. Por ltimo, mencionar que utilizaremos una estructura doblemente enlazada (con la figura siguiente y la anterior) para ir recorriendo todas las figuras que se presenten en una ejecucin de nuestro programa. As, la parte comn a los tres tipos de figuras es la siguiente: enum tipo { campo_vision, zona, avion }; struct figura { enum tipo mitipo; double x,y; ... struct figura *anterior; struct figura *siguiente; }
181
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
La parte ausente en el cdigo anterior es la correspondiente al movimiento del avin, que vendr definido por su velocidad (v) y su velocidad angular (w), su distancia entre las ruedas (r) y la direccin que lleva el avin (tetha). Debido a que estos campos slo son aplicables a los aviones y, en cambio, la secuencia de puntos definida por el atributo mispuntos es aplicable a los otros dos tipos de figuras (zonas restringidas y campo de visin), por tanto se pueden representar como una unin semejante a la siguiente: struct velocidad { double v,w,r,tetha; struct trayectoria *mistrayecs; } union grosor_o_velocidad { struct velocidad mivelocidad; struct punto *mispuntos; } Y as la estructura completa de figura quedara: enum tipo { campo_vision, zona, avion }; struct figura { enum tipo mitipo; double x,y; union grosor_o_velocidad no_comun; struct figura *anterior; struct figura *siguiente; } Grficamente vamos a ver un ejemplo de zona restringida y de avin en movimiento.
182
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Antes de pasar a detallar el funcionamiento interno de las funciones, haremos una breve sntesis de las funciones que vamos a agrupar en cada uno de los tres mdulos: a) Creacin y destruccin de figuras: En esta librera se especifican todas las funciones que crean las estructuras para los datos, leen dichos datos de un fichero y vacan y destruyen las estructuras creadas. LeerFiguras: esta funcin crea la lista de figuras y llama a la funcin LeerFigura, que lee una figura tantas veces como sea necesario para definir todo el entorno. LeerFigura: esta funcin simplemente va llamando a todas las funciones que leen los campos que definen una Figura. LeerTipo: lee el tipo de la figura; los validos son: campo de visin, avin y zona restringida. LeerNodos: crea la estructura de los puntos de una figura. Al menos debe existir un punto por figura (es el caso de los aviones). LeerInicial: lee los valores de la posicin inicial de la figura. stos son las coordenadas x, y. En el caso de los aviones tambin se leern los valores de v, w, r y tetha. LeerTrayecs: crea la lista de trayectorias y las lee desde el fichero. LeerControl: lee un carcter del fichero y comprueba si es el carcter de control esperado; si lo es, se salta el resto de la lnea llamando a la funcin LineaSiguiente; en otro caso devuelve error. LineaSiguiente: lee caracteres del fichero hasta encontrar un fin de lnea (respetando el fin de fichero), es decir, ignora el resto de la lnea. LeeNumero: lee caracteres del fichero hasta encontrar uno que sea distinto del espacio en blanco y devuelve el numero correspondiente (float o int). BorrarFiguras: libera toda la memoria ocupada por la lista de figuras que compone el mundo en 2D. BorrarNodos: libera toda la memoria ocupada por la lista de puntos que delimita una regin prohibida o un campo de visin. BorrarTrayecs: libera toda la memoria ocupada por la lista de tramos que define la trayectoria de un avin.
b) Movimiento de figuras (slo aviones) En este mdulo se definen las funciones que nos permiten mover los aviones (son las nicas figuras que tienen dicha capacidad).
MueveFigura: los aviones describen una serie dada de trayectorias en funcin del instante en que nos encontremos (esto viene dado en el fichero de entrada que describe el mundo). Adems, cada una de estas trayectorias tiene una aceleracin especifica para cada rueda. Con estas aceleraciones correspondientes al tramo del instante actual se calcula la nueva velocidad. AplicaMov: con la nueva velocidad ya calculada se aplica sobre la posicin y direccin del avin para determinar su nueva posicin y velocidad.
c) Dibujo de figuras Esta librera incluye la definicin de las funciones que manejan la presentacin en pantalla del seguimiento de los aviones. A continuacin, se indican todas las funciones que deberan componer esta librera, aunque por razones de espacio en este captulo slo se han desarrollado IniciaG, CierraG, DibujaFigura y EntraFigura. IniciaG: funcin que inicializa las funciones grficas. CierraG: funcin que cierra el modo grfico. DibujaMundo: presenta en la pantalla las zonas restringidas y los aviones que se han ledo del fichero y cuyas coordenadas se encuentran dentro de los lmites del campo de visin. Dibuja tambin el borde del campo de visin.
183
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Corte: calcula matemticamente los puntos de corte de una recta con los lados del campo de visin. DibujaFigura: va dibujando un avin o una zona uniendo sus vrtices y comprobando si estn dentro de la campo de visin o no. EntraFigura: comprueba si la figura est dentro de los limites de la pantalla, fuera o bien parte dentro y parte fuera. Scroll: funcin que permite modificar los lmites del campo de visin que se muestra en pantalla. DibujaCampo: dibuja las cuatro lneas que limitan el campo de visin. BorraCampo: oculta las figuras del campo de visin dibujando un rectngulo negro con las dimensiones del mismo. BorraFigura: borra una figura del campo de visin. CorteLinea: comprueba si algn punto de la lnea se ha cruzado con alguna zona restringida o avin. Esto lo hace viendo si en los puntos en los que debe dibujar la lnea ya haba algo pintado.
De estas tres libreras, nicamente vamos a ver cmo se realizarn los clculos necesarios para implementar el movimiento de los aviones. Para llevar a cabo estos clculos tenemos en cuenta las siguientes consideraciones del problema: El avin esta dotado de dos motores, uno en cada ala sobre las cuales se puede aplicar una determinada velocidad lineal (v1 y v2). Dichas alas no pueden girar, con lo que para que el avin pueda girar lo que hacemos es aplicar una velocidad mayor o menor al motor de un ala que al de la otra. Las alas estn separadas por una distancia r. El avin en un determinado instante se encuentra en una posicin (X,Y) y con una direccin u con respecto del eje vertical.
Existen dos posibles movimientos diferentes que puede describir un mvil: Traslacin. Desplazamiento definido por la velocidad lineal v:
Fig. 5.7. Desplazamiento definido por la velocidad lineal. Rotacin. Movimiento sobre s mismo definido por la velocidad angular w: ngulo = Velocidad Angular * Tiempo
184
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
Fig. 5.8. Movimiento sobre s mismo definido por la velocidad angular w. As pues lo que vara en cada tipo de movimiento es: Su nueva posicin (X',Y') es funcin de la posicin en la que se encontraba antes y de la v:
185
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
As, las frmulas a aplicar son las siguientes: La velocidad del avin en un determinado instante es la media de las velocidades aplicadas a sus ruedas:
v(n) = (vdcha(n)+ vizda(n)) /2 La posicin de un avin en un determinado instante se calcula sumando la posicin que tena en el instante anterior con la velocidad que lleva por el tiempo.
Tenemos que tener en cuenta tambin que el avin se mueve en cualquier direccin, con lo que en unos casos la nueva coordenada X o Y aumenta o disminuye en funcin de la direccin u en la que se mueva, con lo que tendremos que considerar el seno en el caso de la X y el coseno en el caso de la Y: X(n+1)=X(n)+v(n)senut Y(n+1)=Y(n)+v(n)cosut La velocidad angular en un determinado instante se calcula, de la misma forma que en el caso lineal, a partir de las velocidades lineales de las alas pero considerando la diferencia y el radio entre ellas:
v(n)= (vdcha(n)+ vizda(n)) / r La direccin en la que se mueve el avin en un determinado instante se calcula a partir de la direccin que tena en el instante anterior y de la velocidad angular del instante anterior:
u(n+1)=u(n)+ v(n)t La librera que modeliza este movimiento se compone de dos funciones: en una se calcula el tramo en el que nos encontramos y obtiene las velocidades que deseamos aplicar, y en otra se calculan los nuevos valores de la situacin actual de la figura definida por las coordenadas x e y, y por la orientacin del avin determinada por el ngulo tetha. A continuacin, se muestra el cdigo de la primera de ellas, que recibe como argumento el tiempo actual (con el que seleccionaremos el tramo en vigor) y el tiempo transcurrido desde la ltima actualizacin de la posicin: void MueveFigura( struct figura *f, float Ttotal, float Tparcial ) {
186
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
float nueva_v, nueva_w; struct trayectoria *tramo; tramo = f-> [Link]; while(tramo->siguiente != 0 && tramo->tramo < Ttotal) tramo = tramo->siguiente; nueva_v = ( tramo->adcha + tramo->aizda ) / 2.0; nueva_w = ( tramo->aizda - tramo->adcha ) / f->[Link].r; AplicaMov( f, na, nalfa, Tparcial ); } Esta funcin primero calcula la nueva v y w del tramo actual, y una vez obtenidas estas velocidades se llama a la funcin AplicaMov que modifica los valores de posicionamiento de la figura. La funcin que mueve la figura es entonces: void AplicaMov( struct figura *f, float nv, float nw, float Tparcial ) { f->[Link].v = nv; f->x = f->x + ( f->v * sin( f->[Link])* tf ); f->y = f->y + ( f->v * cos( f->[Link]) * tf ); f->[Link].w = nw; f->[Link] = f->[Link] + f->[Link].w * tf; if( f->[Link] > 2 * 3.1416 ) for(;(f->[Link] = f->[Link] - 2 * 3.1416) > 2 * 3.1416;); else if( f->[Link] < 0 ) for(;(f->[Link] = f->[Link] + 2 * 3.1416) < 0;); } Las lneas finales de esta funcin tienen por objeto impedir que el ngulo tetha sea mayor que 2 * pi. En dicho caso, habr dado una vuelta completa y debe tomar los valores prximos a cero que correspondan al giro.
187
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1. Ejercicios
Crea una librera de funciones para operar con nmeros complejos. Desarrolla las funciones nombradas en este captulo para jugar al ajedrez. Genera un programa que haciendo uso de la librera artculo explicada en este captulo permita realizar una bsqueda de un producto y su posterior compra, completando la implementacin de las funciones de las libreras de libros y DVD cuya declaracin ha sido indicada en el texto. Implementa las funciones, la librera de creacin y destruccin de figuras correspondiente al ejemplo de seguimiento de aviones en el espacio areo.
188
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
2. Evaluacin
1. 2. 3. Explica por qu razn las libreras se definen mediante dos ficheros, uno de extensin .h y otro .c. Describe qu tienen en comn la visin clsica y la moderna de la programacin estructurada. Enumera las ventajas de la programacin estructurada sobre la programacin tradicional.
189
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]
1. Actividades prcticas
Desarrolla una librera de funciones ms que permita aviones inteligentes, esto es, que su movimiento no est prefijado mediante tramos, sino que sea capaz de moverse por el mundo que dibujemos segn una lgica de control (por ejemplo, evitando las zonas restringidas y otros aviones). Para ello, se deber dotar a dicha figura de un destino que pretende alcanzar y de sensores que le permitan percibir el mundo. Crea otra librera de funciones que permita que existan figuras mviles controladas por el usuario. Esto es, que mediante cuatro teclas (arriba, abajo, izquierda y derecha) permita a un usuario guiar una figura mvil por el mundo. Propn una ampliacin al ejemplo de gestin de productos en una tienda desarrollando las libreras asociadas a las otras estructuras necesarias para la aplicacin: Proveedores, Clientes, Empleados y Pedidos.
190
Telf.: +34 948 36 26 00 Fax: +34 948 12 91 52 [Link]









