PDA

Ver la Versión Completa : [Duda] COBOL problema con READ, status = 46


Marengo97
7 de febrero de 2023, 17:18
Hola comunidad, necesito ayuda.
Recibo un error que luce así en consola:
880
Mi pregunta es por que sucede esto y como solucionarlo, claramente hay un error que estoy cometiendo pero no puedo verlo :(, y cada que vez que ejecuto el programa no importa que haga siempre me repite una linea con valor de " " (espacios) en RECAUDACION DE EMPLEADO..., capaz esta relacionado al error que estoy teniendo.
Y el IMPLICIT CLOSE tambien me tiene atascado.
Ojala puedan ayudarme :sis:

Codigo:
IDENTIFICATION DIVISION.
PROGRAM-ID. PROG-PAGOS-F.
AUTHOR. LUCAS GALEANO.
DATE-WRITTEN. 1/2/2023.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT REG-VENDEDORES ASSIGN TO "REG-MAESTRO.DAT"
ORGANIZATION IS LINE SEQUENTIAL.

SELECT REG-VENTAS ASSIGN TO "REG-VENTAS-MAESTRO.DAT"
ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD REG-VENDEDORES.
01 VENDEDORES.
88 FIN-DEL-ARCHIVO VALUE HIGH-VALUE.
05 EMPLEADO PIC 9(2).
05 SUELDO-BASE PIC 9(5).
05 CANTIDAD-VENTAS PIC 9.
05 TOTAL-RECAUDACION PIC 9(5) VALUE ZEROS.


FD REG-VENTAS.
01 COBRO-VENTAS.
05 VENDEDOR PIC 9(2) OCCURS 100 TIMES.

WORKING-STORAGE SECTION.
01 WS-VENDEDORES.
05 WS-EMPLEADO PIC 9(2).
05 WS-SUELDO-BASE PIC 9(5).
05 WS-CANTIDAD-VENTAS PIC 9.
05 WS-TOTAL-RECAUDACION PIC 9(5).


77 WS-PRECIO-PRODUCTO PIC 9(5).
77 WS-TOTAL-EMPLEADOS PIC 99.
77 WS-CONTADOR PIC 99 VALUE ZEROS.
77 WS-INDICE PIC 99.



PROCEDURE DIVISION.
GO TO BEGIN-INPUT.
BEGIN-OUTPUT.
OPEN OUTPUT REG-VENDEDORES.
OPEN OUTPUT REG-VENTAS.
DISPLAY "INGRESE DATOS SOLICITADOS".
DISPLAY " ".
DISPLAY "INGRESE TOTAL DE EMPLEADOS DE LA COMPANIA".
ACCEPT WS-TOTAL-EMPLEADOS.
PERFORM VARYING WS-CONTADOR FROM 01 BY 1
UNTIL WS-CONTADOR > WS-TOTAL-EMPLEADOS
PERFORM INGRESO-DATOS
WRITE VENDEDORES FROM WS-VENDEDORES
WRITE COBRO-VENTAS
END-WRITE
MOVE ZEROS TO WS-TOTAL-RECAUDACION
END-PERFORM.
DISPLAY COBRO-VENTAS
DISPLAY VENDEDORES
CLOSE REG-VENDEDORES.
CLOSE REG-VENTAS.


BEGIN-INPUT.
OPEN INPUT REG-VENDEDORES.
OPEN INPUT REG-VENTAS.
READ REG-VENDEDORES AT END SET FIN-DEL-ARCHIVO TO TRUE
END-READ
PERFORM VARYING WS-INDICE FROM 01 BY 1
UNTIL VENDEDOR(WS-INDICE) > EMPLEADO

DISPLAY "RECAUDACION DE LA SEMANA DE EMPLEADO ",EMPLEADO
"ES: ",TOTAL-RECAUDACION
READ REG-VENDEDORES AT END SET FIN-DEL-ARCHIVO TO TRUE
END-READ
END-PERFORM.
CLOSE REG-VENDEDORES REG-VENTAS.
STOP RUN.

INGRESO-DATOS.
DISPLAY "INGRESE NUMERO DE EMPLEADO:".
ACCEPT WS-EMPLEADO.
DISPLAY "INGRESE SUELDO BASE:".
ACCEPT WS-SUELDO-BASE.
DISPLAY "INGRESE CANTIDAD DE VENTAS REALIZADAS:".
ACCEPT WS-CANTIDAD-VENTAS.
INITIALIZE COBRO-VENTAS
PERFORM VARYING WS-INDICE FROM 01 BY 1 UNTIL
WS-INDICE > WS-CANTIDAD-VENTAS
DISPLAY "PRECIO DEL PRODUCTO:"
ACCEPT WS-PRECIO-PRODUCTO
ADD WS-PRECIO-PRODUCTO TO WS-TOTAL-RECAUDACION
END-PERFORM.
MOVE WS-EMPLEADO TO VENDEDOR(WS-INDICE).



*Una compañía de seguros tiene contratados a n vendedores. Cada vendedor realiza
*múltiples ventas a la semana. La política de pagos de la compañía es que cada vendedor
*recibe un sueldo base más un 10% extra por comisiones de sus ventas. El gerente de la
*compañía desea saber, por un lado, cuánto dinero deberá pagar en la semana a cada
*vendedor por concepto de comisiones de las ventas realizadas, y por otro lado, cuánto
*deberá pagar a cada vendedor como sueldo total (sueldo base + comisiones). Para cada
*vendedor ingresar cuanto es su sueldo base, cuantas ventas realizó y cuanto cobró por
*cada venta.

Marengo97
7 de febrero de 2023, 17:33
EDIT = Ignoren el "Go to begin-imput" eso solo lo utiilizo para testear el parrafo "BEGIN-IMPUT" ignorando el primer parrafo.

Armando
7 de febrero de 2023, 17:52
Hola, como están?

Por lo que veo estás leyendo 2 veces (2 registros), y poniendo una llave si llega al fin.
Pero no preguntás si llega al fin (FIN-DEL-ARCHIVO)
El error 46 en si es que estás intentando leer más allá del fin del archivo,

espero que te sea útil.
saludos
Armando

Marengo97
7 de febrero de 2023, 18:14
Honestamente no se como resolverlo, probe quitando el read fuera del Perform Varying...y genera un loop infinito, si saco el de dentro, me repite el status = 46...tambien probe con Set vendedores to high-values y tampoco funciona.

Kuk
7 de febrero de 2023, 18:21
@Marengo97,


PERFORM VARYING WS-INDICE FROM 01 BY 1
UNTIL VENDEDOR(WS-INDICE) > EMPLEADO
OR FIN-DEL-ARCHIVO

Marengo97
7 de febrero de 2023, 18:31
Eres un genio, muchisimas gracias me funciono!!
Por que funciono? soy principiante en cobol y cosas basicas aun no las entiendo al 100%

Kuk
7 de febrero de 2023, 19:46
@Marengo97, no te preocupes, ya irás cogiéndole el truco ;)

En el bucle te basabas sólo en el contador, como te ha dicho @Armando, el File-Status 46 significa lectura después de haber llegado ya al último registro del fichero.
Con lo cual, si te fijas en la condición, la única manera de que se diera el caso de FS=46 era que la condición VENDEDOR(WS-INDICE) > EMPLEADO no se haya cumplido aún pero que ya hayas llegado al último registro del fichero que estás leyendo.

Controlar siempre el fin del fichero es algo que tienes que tatuarte en la mente para cada programa que crees y/o modifiques.