miércoles, 19 de enero de 2011

ICETOOL(II): REPORT; informes.

Continuando con la serie de artículos sobre ICETOOL, en esta ocasión vamos a presentar un artículo de como a partir de un fichero de entrada podemos presentar sus datos mediante un REPORT, con cabecera, roturas, detalle (en columnas), y totales.

Report de un Fichero usando el comando DISPLAY.

Fichero RECS:
----+----1----+----2--
1111000021CCCCCCCCC010
1111000021CCCCCCCCC090
1111000021QQQQQQQQQ020
1111000022VVVVVVVVV050

JCL que realiza el cruce:

//PASO010 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//TOOLIN DD *
  SORT FROM(RECS) TO(TMP) USING(CNTL1)
  DISPLAY FROM(TMP) LIST(REPORT)           -
  DATE TITLE('Facturacion XXXXXXX de la empresa') PAGE -
      BTITLE('Factura:')  BREAK(1,10,CH)               -
      HEADER('Documento') ON(12,10,CH)                 -
      HEADER('Importe')   ON(22,3,ZD)                  -
      BTOTAL('Total x Factura:')                        -
    BMINIMUM('Minimo x Factura:')                      -
    BMAXIMUM('Maximo x Factura:')                      -
    BAVERAGE('Media x Factura:')                       -
  BLANK
//RECS    DD DISP=SHR,
//           DSN=USER.ICETOOL.IN
//TMP     DD DSN=&&TEMP,DISP=(MOD,PASS),
//           SPACE=(TRK,(10,10)),UNIT=SYSDA
//REPORT  DD SYSOUT=*
//CNTL1CNTL DD *
  SORT FIELDS=(1,10,CH,A,12,9,CH,A)
/*

Para hacer un informe a partir de un fichero usaremos la sentencia DISPLAY con varios complementos que iremos viendo.
En este informe utilizamos una ruptura por el campo "Factura", por lo que será importante ordenar el fichero por ese campo, para poder ver la información agrupada por Factura.

Para este paso previo usamos la sentencia SORT con la sentencia USING (en este caso sólo hemos hecho un SORT FIELDS pero podría acompañarse de otras sentencias como INCLUDE COND para seleccionar un determinado número de registros):
 
SORT FROM(RECS) TO(TMP) USING(CNTL1)
...
//CNTL1CNTL DD *
  SORT FIELDS=(1,10,CH,A,12,9,CH,A)
/*

Para escribir el informe hacemos varios pasos:

Mostramos el informe a partir del fichero temporal TMP (que está ordenado para nuestro propósito).
  DISPLAY FROM(TMP) LIST(REPORT)                     -

Podemos tanto enviarlo a la cola de ejecución, como a un fichero. En [//REPORT  DD SYSOUT=*]  especificamos el tipo de salida que queramos.

Mostramos la cabecera del informe.
  DATE TITLE('Facturación XXXXXXX de la empresa') PAGE -

En este caso se va componer por:
  • La fecha (a la izquierda).
  • El título (en el centro).
  • El número de página (a la derecha).

Mostramos el detalle del informe.
   BTITLE('Factura:')  BREAK(1,10,CH)               -
     HEADER('Documento') ON(12,10,CH)               -
     HEADER('Importe')   ON(22,3,ZD)                -

En este caso se va a componer por:
  • Una ruptura (código de factura BREAK(posición incial, longitud, tipo).
  • Por cada factura dos columnas de detalle:
    • Documento (ON(posicion inicial, longitud, tipo).
    • Importe.

Mostramos los totales por factura (total, mínimo, máximo y media de los importes de detalle por cada factura).
   BTOTAL('Total x Factura:')                        -
    BMINIMUM('Minimo x Factura:')                     -
    BMAXIMUM('Maximo x Factura:')                     -
    BAVERAGE('Media x Factura:')                      -

Finalmente tenemos la sentencia BLANK cuya función es eliminar del informe espacios en blanco (es opcional).
  BLANK

Esta es una manera sencilla de presentación de los datos de un fichero.
Se podría ampliar con más cosas como totales generales, formatos de campos, etc.

1 comentario:

Alejandro Juarez dijo...

Buenas tardes, tengo una duda, al generar mi reporte me pone en automatico saltos de pagina cada 60 lineas y reimprimie los encabezados ¿esto como puedo evitarlo? tambien al poner el header me pone un 1 junto con el primer encabezado ¿por que es esto?