
Clasificando (Sort)
La clasificación,
no cabe duda que es una opción muy interesante en según
que programas o aplicaciones. El uso de tener varias
claves alternadas sobre todo de nuestros archivos históricos
nos evita tener que hacerlo muy a menudo, pero sobre
todo con el uso de los ficheros maestros, es muy común
el desar clasificar por cualquiera de los campos de
los que dispone el fichero.
Para
realizar estas clasificaciones, nuestro Cobol también
dispone de lo suficiente. Podemos clasificar por todos
los campos que deseemos, así como escoger el orden que
queramos para cada uno de ellos. Todo esto queda englobado
en la sentencia SORT, pero esta depende de muchas mas cosas.
No voy a explicar a fondo todo el funcionamiento de SORT,
entre otras cosas, porque yo mismo no lo utilizo mucho, pero empecemos a despejar dudas.
Lo primero que necesitamos es un archivo sobre el que volcar nuestra clasificación y que además utilizará el propio SORT para hacer las clasificaciones. Este fichero se define en la FILE-CONTROL como cualquier otro fichero solo que haciendo ver al compilador que se va a tratar de un archivo SORT y a continuación se define su estructura en la FILE SECTION.
Para el ejemplo nos basaremos en el fichero de la Agenda que hemos visto en la sección "Programando". El fichero de clasificación se llamará ORDEN y solo contendrá
los campos por los que deseemos clasificar.
ENVIRONMENT
DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT
AGENDA ASSIGN TO RANDOM "AGENDA.DAT" ORGANIZATION
INDEXED ACCESS DYNAMIC RECORD
KEY KEYAGE. SELECT
ORDEN ASSIGN TO SORT. DATA DIVISION. FILE
SECTION. FD AGENDA
LABEL RECORD STANDARD. 01 REGAGE. 02
KEYAGE. 03
AGECOD PIC 9(4). 02
AGENOM PIC
X(30). 02
AGEDOM PIC
X(30). 02
AGEPOS PIC
9(5). 02
AGEPOB PIC
X(20). 02
AGEPRO PIC
X(15). 02
AGETEL PIC
X(20). 02
AGEMOV PIC
X(20). 02
AGEMAI PIC
X(30). 02
AGEWEB PIC
X(40).
SD
ORDEN. 01 REGORD. 02
ORDNOM PIC X(30). 02
ORDPOB PIC
X(30). 02
ORDPRO PIC
X(30).
|
Notad que hemos sustituido FD (File Descrition) por SD (Sort Description)
para nuestro fichero de clasificación y que solo
hemos incluido en éste fichero tres campos, los
que nosotros hemos escogido para hacer las clasificaciones.
Este archivo puede tener todos los campos que se
desee, incluso otros que no estén en el fichero
a clasificar. Además el orden en que figuren no
tiene importancia ni significa nada a la hora de
clasificar. Con la SD
solo indicamos los campos que va a tener el fichero.
A partir de aquí, nuestro programa puede continuar normalmente
hasta llegar al momento en que deseemos clasificar y
para ello vamos a ver un poco como es la sintaxis de una sentencia SORT.
Formato 1: Este formato se utiliza para clasificar un
archivo y guardar el contenido del fichero clasificado
en otro archivo. Esta opción no se suele utilizar
ya que tiene pocas posibilidades. Tendríamos un
fichero en el que se basaría SORT para clasificar,
un fichero maestro del que leeriamos para clasificar
y el resultado lo guardaría en otro fichero.
SORT fichero_de_clasificacion (ON ASCENDING KEY)
campo (ON
DESCENDING KEY) campo
USING fichero a clasificar
GIVING fichero que quedará clasificado
Formato 2: Este formato es mas utilizado ya que el control
de la clasificación lo hacemos nosotros tanto antes como después.
SORT fichero_de_clasificacion (ON ASCENDING KEY) campo (ON DESCENDING KEY) campo
INPUT PROCEDURE que_hacemos antes
OUTPUT PROCEDURE que hacemos despues
- Fichero_de_clasificacion:
hace referencia al fichero que hemos definido
como SORT.
- campo: hace referencia a cualquiera de los campos
de dicho fichero que hemos definido, podremos
poner tantos como deseemos y en el orden
que queramos.
- que hacemos antes: indica el proceso
que obligaremos al compilador a realizar
antes de clasificar.
Podemos indicar varios parrafos como hariamos
con un PERFORM indicando
THRU o bien utilizar una SECTION.
- que hacemos despues: indicaremos que hacer una vez el fichero esté clasificado. Igual que antes podremos indicar un párrafo o varios o utilizar una SECTION.
Veamos a continuación un ejemplo con nuestro programa.
WORKING-STORAGE SECTION. 01 LINEA. 02
LNOM PIC X(30)BB. 02
LPOB PIC
X(20)BB. 02
LPRO PIC
X(12).
01 OP PIC X. ... PROCEDURE DIVISION. INICIO. SORT
ORDEN ON
ASCENDING ORDPOB ON
DESCENDING ORDNOM INPUT
PROCEDURE CARGAR OUTPUT
PROCEDURE SALIDA. STOP
RUN.
CARGAR
SECTION. INI-CAR. OPEN
INPUT AGENDA. LEER. READ
AGENDA NEXT RECORD AT END GO FIN-CAR. MOVE
AGENOM TO ORDNOM. MOVE
AGEPOB TO ORDPOB. MOVE
AGEPRO TO ORDPRO. RELEASE
REGORD. GO
LEER. FIN-CAR. CLOSE
AGENDA. EXIT.
SALIDA
SECTION. INI-SAL. RETURN
ORDEN AT END GO FIN-SAL. MOVE
ORDNOM TO LNOM. MOVE
ORDPOB TO LPOB. MOVE
ORDPRO TO LPRO. DISPLAY
LINEA LINE 20. ACCEPT
OP LINE 21. GO
INI-SAL. FIN-SAL. EXIT.
|
Antes de
seguir, habréis notado que se han incluido dos nuevas
sentencias, RELEASE y RETURN.
Bien, estas instrucciones son las que utiliza Cobol
para grabar y leer en los ficheros de SORT. El funcionamiento
es el mismo, es decir RELEASE,
lo que hace es introducir los datos en el fichero y
RETURN los extrae. Además si os habéis dado cuenta, el fichero de clasificación no es necesario abrirlo ni cerrarlo.
En este caso hemos clasificado ascendentemente por poblacion y a su vez descendientemente por nombre. Podríamos haber utilizado cualquier otra forma o haber clasificado por los tres campos
o solo por uno.
En la sección dedicada a la INPUT PROCEDURE simplemente hemos
cargado el fichero de clasificación, pero a la vez podríamos haber discriminado registros del maestro y haber creado otros campos nuevos para clasificar. Aunque si bien es lo mas lógico
a realizar.
En la sección dedicada a la OUTPUT PROCEDURE, lo que hacemos
es sacar por pantalla apoyándonos en la variable LINEA, el contenido del fichero una vez clasificado, pero igualmente podríamos haber hecho cualquier cosa. Tened en cuenta
que una vez aquí nuestro fichero ORDEN queda clasificado
y por lo tanto podemos hacer lo que deseemos.
|
|