Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   COBOL - General (https://www.cobolforo.es/forumdisplay.php?f=44)
-   -   [Duda] COBOL problema con READ, status = 46 (https://www.cobolforo.es/showthread.php?t=1608)

Marengo97 7 de febrero de 2023 17:18

COBOL problema con READ, status = 46
 
1 Archivos Adjunto(s)
Hola comunidad, necesito ayuda.
Recibo un error que luce así en consola:
[ATTACH=CONFIG]880[/ATTACH]
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:
Código COBOL:
  1. IDENTIFICATION DIVISION.
  2.        PROGRAM-ID.                PROG-PAGOS-F.
  3.        AUTHOR.                    LUCAS GALEANO.
  4.        DATE-WRITTEN.              1/2/2023.
  5.  
  6.        ENVIRONMENT DIVISION.
  7.        INPUT-OUTPUT SECTION.
  8.        FILE-CONTROL.
  9.            SELECT REG-VENDEDORES ASSIGN TO "REG-MAESTRO.DAT"
  10.                ORGANIZATION IS LINE SEQUENTIAL.
  11.  
  12.            SELECT REG-VENTAS     ASSIGN TO "REG-VENTAS-MAESTRO.DAT"
  13.                ORGANIZATION IS LINE SEQUENTIAL.
  14.  
  15.        DATA DIVISION.
  16.        FILE SECTION.
  17.        FD REG-VENDEDORES.
  18.        01 VENDEDORES.
  19.            88 FIN-DEL-ARCHIVO        VALUE HIGH-VALUE.
  20.            05 EMPLEADO               PIC 9(2).
  21.            05 SUELDO-BASE            PIC 9(5).
  22.            05 CANTIDAD-VENTAS        PIC 9.
  23.            05 TOTAL-RECAUDACION      PIC 9(5) VALUE ZEROS.
  24.            
  25.  
  26.        FD REG-VENTAS.
  27.        01 COBRO-VENTAS.
  28.            05 VENDEDOR              PIC 9(2) OCCURS 100 TIMES.
  29.  
  30.        WORKING-STORAGE SECTION.
  31.        01 WS-VENDEDORES.
  32.            05 WS-EMPLEADO            PIC 9(2).
  33.            05 WS-SUELDO-BASE         PIC 9(5).
  34.            05 WS-CANTIDAD-VENTAS     PIC 9.
  35.            05 WS-TOTAL-RECAUDACION   PIC 9(5).
  36.  
  37.  
  38.        77 WS-PRECIO-PRODUCTO         PIC 9(5).
  39.        77 WS-TOTAL-EMPLEADOS         PIC 99.
  40.        77 WS-CONTADOR                PIC 99 VALUE ZEROS.
  41.        77 WS-INDICE                  PIC 99.
  42.  
  43.  
  44.  
  45.        PROCEDURE DIVISION.
  46.        GO TO BEGIN-INPUT.
  47.        BEGIN-OUTPUT.
  48.            OPEN OUTPUT REG-VENDEDORES.
  49.            OPEN OUTPUT REG-VENTAS.
  50.            DISPLAY "INGRESE DATOS SOLICITADOS".
  51.            DISPLAY " ".
  52.            DISPLAY "INGRESE TOTAL DE EMPLEADOS DE LA COMPANIA".
  53.            ACCEPT WS-TOTAL-EMPLEADOS.
  54.            PERFORM VARYING WS-CONTADOR FROM 01 BY 1
  55.                                  UNTIL WS-CONTADOR > WS-TOTAL-EMPLEADOS
  56.                PERFORM INGRESO-DATOS
  57.                WRITE VENDEDORES FROM WS-VENDEDORES
  58.                WRITE COBRO-VENTAS
  59.                END-WRITE
  60.                MOVE ZEROS TO WS-TOTAL-RECAUDACION
  61.            END-PERFORM.
  62.            DISPLAY COBRO-VENTAS
  63.            DISPLAY VENDEDORES
  64.            CLOSE REG-VENDEDORES.
  65.            CLOSE REG-VENTAS.
  66.          
  67.            
  68.        BEGIN-INPUT.
  69.            OPEN INPUT REG-VENDEDORES.
  70.            OPEN INPUT REG-VENTAS.
  71.            READ REG-VENDEDORES AT END SET FIN-DEL-ARCHIVO TO TRUE
  72.            END-READ
  73.            PERFORM VARYING WS-INDICE FROM 01 BY 1
  74.                              UNTIL VENDEDOR(WS-INDICE) > EMPLEADO
  75.                            
  76.            DISPLAY "RECAUDACION DE LA SEMANA DE EMPLEADO ",EMPLEADO
  77.                                   "ES: ",TOTAL-RECAUDACION
  78.            READ REG-VENDEDORES AT END SET FIN-DEL-ARCHIVO TO TRUE
  79.            END-READ
  80.            END-PERFORM.
  81.            CLOSE REG-VENDEDORES REG-VENTAS.
  82.            STOP RUN.
  83.  
  84.        INGRESO-DATOS.
  85.            DISPLAY "INGRESE NUMERO DE EMPLEADO:".
  86.            ACCEPT WS-EMPLEADO.
  87.            DISPLAY "INGRESE SUELDO BASE:".
  88.            ACCEPT WS-SUELDO-BASE.
  89.            DISPLAY "INGRESE CANTIDAD DE VENTAS REALIZADAS:".
  90.            ACCEPT WS-CANTIDAD-VENTAS.
  91.            INITIALIZE COBRO-VENTAS
  92.               PERFORM VARYING WS-INDICE FROM 01 BY 1 UNTIL
  93.                            WS-INDICE > WS-CANTIDAD-VENTAS
  94.            DISPLAY "PRECIO DEL PRODUCTO:"
  95.            ACCEPT WS-PRECIO-PRODUCTO
  96.            ADD WS-PRECIO-PRODUCTO    TO WS-TOTAL-RECAUDACION
  97.            END-PERFORM.
  98.            MOVE WS-EMPLEADO          TO VENDEDOR(WS-INDICE).
  99.  
  100.  
  101.  
  102.       *Una compañía de seguros tiene contratados a n vendedores. Cada vendedor realiza
  103.      *múltiples ventas a la semana. La política de pagos de la compañía es que cada vendedor
  104.      *recibe un sueldo base más un 10% extra por comisiones de sus ventas. El gerente de la
  105.      *compañía desea saber, por un lado, cuánto dinero deberá pagar en la semana a cada
  106.      *vendedor por concepto de comisiones de las ventas realizadas, y por otro lado, cuánto
  107.      *deberá pagar a cada vendedor como sueldo total (sueldo base + comisiones). Para cada
  108.      *vendedor ingresar cuanto es su sueldo base, cuantas ventas realizó y cuanto cobró por
  109.      *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,

Código COBOL:
  1.           PERFORM VARYING WS-INDICE FROM 01 BY 1
  2.                              UNTIL VENDEDOR(WS-INDICE) > EMPLEADO
  3.                              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.


La franja horaria es GMT +2. Ahora son las 16:19.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.