|
 |
 |
Ficheros (II)
página(s) : 2/3 (1615 palabras totales en este texto) (36951 Lecturas) 
En cuanto a las variables que vamos a utilizar:
Las de estado de cada fichero.
Contadores para la tabla, las líneas y los albaranes leidos.
Las líneas de nuestro listado.
WORKING-STORAGE SECTION.
01 ESTADOS.
02 STA-ALBA PIC XX.
02 STA-CLIEN PIC XX.
02 STA-PRODU PIC XX.
01 CONTA1 PIC 9(6).
01 CONTALIN PIC 9(6).
01 CONTA PIC 9(6).
01 FINFIC PIC X.
01 TOTAL PIC S9(8)V99.
01 TOLINEA PIC S9(8)V99.
01 TOALBA PIC S9(8)V99.
01 LIN-01.
02 FILLER PIC X(66) VALUE 'LISTADO DE ALBARANES'.
02 FILLER PIC X(10) VALUE 'HOJA .. '.
02 L-HOJA PIC ZZZZ.
01 LIN-02.
02 FILLER PIC X(9) VALUE 'ALBARAN'.
02 FILLER PIC X(12) VALUE ' FECHA'.
02 FILLER PIC X(46) VALUE 'CLIENTE'.
02 FILLER PIC X(13) VALUE 'IMPORTE'.
01 RAYA PIC X(80) VALUE ALL '='.
01 DETALLE.
02 L-ALBARAN PIC ZZZ.ZZZBB.
02 L-FECHA PIC ZZ/ZZ/ZZZZBB.
02 L-CLIENTE PIC ZZZZB.
02 L-NOMCLI PIC X(40)B.
02 L-IMPORTE PIC ZZ.ZZZ.ZZ9,99.
Ahora es el momento de la programación, de que todo salga tal y como hemos planteado.
Voy a ir incluyendo líneas de comentario para que la explicación quede mas detallada. En pocas palabras leemos, actualizamos, listamos, terminamos.
PROCEDURE DIVISION.
INICIO.
Abrimos los ficheros cada uno en su modo adecuado, imprimimos la cabecera del listado e inicializamos las variables.
OPEN INPUT ALBARANES CLIENTES I-O PRODUCTOS EXTEND IMPRE
PERFORM CABECERA
MOVE ' ' TO FINFIC MOVE 0 TO TOTAL CONTA
Iniciamos el bucle de lectura hasta que se cumpla la condición de fin de fichero y movemos campos del fichero a variables de la línea de impresión.
PERFORM UNTIL FINFIC = 'S'
READ ALBARANES NEXT RECORD AT END MOVE 'S' TO FINFIC
NOT AT END
MOVE ALB-CODIGO TO L-ALBARAN
MOVE ALB-FECHA TO L-FECHA
Nos preparamos para leer clientes, tomamos su nombre y si no existe ponemos una aclaración.
MOVE ALB-CLIENTE TO CLI-COD
READ CLIENTES INVALID KEY MOVE 'NO EXISTE EL CLIENTE' TO CLI-NOMBRE
END-READ
MOVE CLI-NOMBRE TO L-NOMCLI
Comenzamos otro bucle interno para acceder a los elementos de la tabla que contiene los productos, la cantidad y el precio del albarán. Además sumamos sus importes para totalizar el albaran. También, si el producto existe le quitamos la cantidad vendida de sus existencias y regrabamos.
MOVE 0 TO TOALBA
PERFORM VARYING CONTA1 FROM 1 BY 1 UNTIL CONTA1 > 10
IF ALB-PRODUCTO (CONTA1) > 0
MOVE ALB-PRODUCTO TO PRO-CODIGO
READ PRODUCTO INVALID KEY
DISPLAY 'PRODUCTO NO ENCONTRADO, NO SE ACTUALIZA'
NOT INVALID KEY
SUBTRACT ALB-CANTIDAD FROM PRO-EXISTENCIAS
REWRITE REGPRODU INVALID KEY DISPLAY 'ERROR'
END-REWRITE
END-READ
COMPUTE TOLINEA ROUNDED = ALB-CANTIDAD * ALB-PRECIO
COMPUTE TOALBA ROUNDED = TOALBA + TOLINEA
END-IF
END-PERFORM
Al totalizar el albaran imprimimos la linea correspondiente y comprobamos que no hemos llegado al final de la página. El salto lo realizaremos despues de imprimir 54 líneas.
MOVE TO-ALBA TO L-IMPORTE
COMPUTE TOTAL ROUNDED = TOTAL + TOALBA
MOVE 0 TO TOALBA
WRITE LINEA FROM DETALLE AFTER 1
ADD 1 TO CONTALIN ADD 1 TO CONTA
IF CONTALIN > 54 WRITE LINEA FROM RAYA AFTER 1
END-IF
END-READ
END-PERFORM
Una vez terminado el bucle de lectura. Imprimimos una línea con los totales acumulados, cerramos los ficheros y terminamos el programa.
WRITE LINEA FROM RAYA AFTER 1
MOVE CONTA TO L-ALBARAN
MOVE 0 TO L-FECHA L-CLIENTE
MOVE 'TOTAL GENERAL' TO L-NOMCLI
MOVE TOTAL TO L-IMPORTE
WRITE LINEA FROM DETALLE AFTER 1
WRITE LINEA FROM RAYA AFTER 1
CLOSE PRODUCTOS ALBARANES CLIENTES IMPRE
STOP RUN.
Este párrafo es el que utilizamos para escribir la cabecera, tanto al principio como cada vez que llenamos una página.
CABECERA.
MOVE 0 TO CONTALIN ADD 1 TO HOJA MOVE HOJA TO LHOJA
WRITE LINEA FROM LIN-01 AFTER PAGE
WRITE LINEA FROM RAYA AFTER 2
WRITE LINEA FROM LIN-02 AFTER 1
WRITE LINEA FROM RAYA AFTER 1.
........... | (1/3) | | (3/3) |
|
|