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.



Este artículo proviene de Cobol en español
http://www.escobol.com

La dirección de esta noticia es:
http://www.escobol.com/modules.php?name=Sections&op=viewarticle&artid=24