En este artículo vamos a introducir el uso de nombres simbólicos (SYMNAMES) en un SORT para hacer referencia a campos y constantes. Se trata de una facilidad que hace más legibles los Sort y facilita su mantenimiento.
Por ejemplo, supongamos que tenemos un fichero con la siguiente estructura:
Campo | Pos. Inicio | Longitud | Formato COBOL |
COD_FACTURA | 1 | 8 | X(8) |
CENTRO | 9 | 4 | X(4) |
FECHA | 13 | 10 | X(10) |
COD_CLIENTE | 23 | 8 | X(8) |
IMP_FACTURA | 31 | 8 | 9(6)V9(2) |
Queremos obtener las facturas del centro ‘2040’ (Madrid), que se hayan generado durante el periodo de rebajas (del 07/01/2013 al 10/02/2013) y cuyo importe sea igual o superior a 500.
El SORT para conseguirlo sería el siguiente:
//SELECCI EXEC PGM=SORT,COND=(0,NE)
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=A144759.SYMNAMES.SMSSTD,DISP=SHR
//SORTOUT DD DSN=A144759.SYMNAMES.SMSSTD.SORT,
// DISP=(NEW,CATLG,DELETE),LRECL=38,RECFM=FB,
// DSORG=PS
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(9,4,CH,EQ,C'2040',AND,
13,10,CH,GE,C'2013-01-07',AND,
13,10,CH,LE,C'2013-02-10',AND,
31,8,ZD,GT,+50000)
Si cambia la estructura del fichero, tendremos que recalcular las posiciones de inicio de los campos afectados y sustituirlas en todas las condiciones en que aparezcan (en este Sort y en cualquier otro que utilice el mismo fichero).
Lo mismo ocurrirá si cambia alguna de las constantes; por ejemplo, si queremos cambiar la fecha de fin del periodo de rebajas, tendremos que sustituirla en todas las condiciones de todos los Sort en que aparezca.
Estos inconvenientes podemos evitarlos mediante el uso de SYMNAMES. Veámoslo mediante una nueva versión del SORT anterior en la que hemos sustituido los nombres de campos y las constantes por nombres simbólicos.
//SELECCI EXEC PGM=SORT,COND=(0,NE)
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=A144759.SYMNAMES.SMSSTD,DISP=SHR
//SORTOUT DD DSN=A144759.SYMNAMES.SMSSTD.SORT,
// DISP=(NEW,CATLG,DELETE),LRECL=38,RECFM=FB,
// DSORG=PS
//SYMNAMES DD *
*CAMPOS
COD_FACTURA,1,8,CH
CENTRO,*,4,CH
FECHA,*,10,CH
COD_CLIENTE,*,8,CH
IMPORTE,*,8,ZD
*CONSTANTES
MADRID,'2040'
INI_REBA,'2013-01-07'
FIN_REBA,'2013-02-10'
TOPE_FACT,50000
//SYSIN DD *
SORT FIELDS=COPY
INCLUDE COND=(CENTRO,EQ,MADRID,AND,
FECHA,GE,INI_REBA,AND,
FECHA,LE,FIN_REBA,AND,
IMPORTE,GT,TOPE_FACT)
En este ejemplo hemos incluido los nombres simbólicos directamente en la ficha SYMNAMES para mayor claridad, pero lo lógico es incluirlos en un fichero. De esa forma podremos reutilizarlos en cualquier otro Sort que utilice el fichero referenciado. Además será posible hacer modificaciones en la estructura del fichero sin tener que cambiar los Sort.
Vemos que es posible incluir la posición de inicio y la longitud del campo, o bien indicar que comienza en la posición siguiente al campo anterior mediante un asterisco.
Muy interesante este punto.