Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol COBOL - General
COBOL - General Discusiones de temática general sobre el lenguaje COBOL y todo lo relacionado con él.
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
Como saber si un disco es local o de red Gusaiello Sistemas operativos 4 26 de julio de 2022 02:08
[Sintaxis] Reporte Error=22946 jmeza Fujitsu COBOL 2 27 de marzo de 2021 15:51
Hola - ayuda :) polenorth Presentación 3 20 de julio de 2020 11:12
[Sintaxis] Exportar Reporte a Excel jmeza Fujitsu COBOL 4 7 de julio de 2018 19:29
[Compilador] Error de generación del reporte de Crash JuanJuan77 PowerCOBOL (ActiveX, v4 - v11) 2 7 de julio de 2017 22:02

Respuesta
 
Herramientas

  #1
Antiguo 23 de febrero de 2023, 04:22
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0
Predeterminado [AYUDA] reporte de ventas de local
0 Inactivo Inactivo

Hola familia, aquí mi duda. Estoy realizando un programa como estudio donde registro ventas de productos de una tienda, el programa tiene que generar un reporte de las ventas realizadas para luego utilizarla en otro programa que aun no he hecho, mi duda es la siguiente, para hacerlo mas desafiante se me ocurrio que podria por medio de logica automatizar al programa para que pueda reconocer cuando un producto que se vendio se repite y asi en uno de los campos del archivo indexado (el reporte de ventas) vaya sumando la cantidad que se vendio de ese producto..y no se realmente si es posible algo así y no se como hacerlo o no es posible, estoy entre varias ideas pero que no llegan a ningun lado y apreciaría mucho una ayuda, espero se haya entendio lo que hace el programa y mi duda existencial

Entre otras cosas tambien el programa genera un ticket para el cliente, esa parte aun no llegue porque estoy estancado en el reporte.

E aqui el código, cualquier consejo o mejora que pueda aplicar seria genial porque soy un principiante aun en esto hasta ahora me han ayudado mucho en esta comunidad y he mejorado gracias a eso!
Código COBOL:
  1.               IDENTIFICATION DIVISION.
  2.        PROGRAM-ID.                VENTAS-LOCAL.
  3.  
  4.        DATE-WRITTEN.              19/2/2023.
  5.        AUTHOR.                    LUCAS GALEANO.
  6.  
  7.        ENVIRONMENT DIVISION.
  8.  
  9.        INPUT-OUTPUT SECTION.
  10.  
  11.        FILE-CONTROL.
  12.            SELECT REPORTE-VENTAS  ASSIGN TO "VENTAS.DAT"
  13.                                   ORGANIZATION IS INDEXED
  14.                                   ACCESS MODE  IS DYNAMIC
  15.                                   RECORD KEY   IS ID-PRODUCTO.
  16.  
  17.            SELECT STOCK-MAESTRO   ASSIGN TO "STOCK-MAESTRO.DAT"
  18.                                   ORGANIZATION IS INDEXED
  19.                                   ACCESS MODE  IS DYNAMIC
  20.                                   RECORD KEY   IS LLAVE-NUMERO-PRODUCTO.
  21.  
  22.            SELECT TICKET          ASSIGN TO "TICKET.DAT"
  23.                                   ORGANIZATION IS LINE SEQUENTIAL.
  24.        DATA DIVISION.
  25.  
  26.        FILE SECTION.
  27.  
  28.        FD REPORTE-VENTAS.
  29.  
  30.        01 VENTA.
  31.            05 LLAVE-VENTAS.
  32.                10 ID-PRODUCTO     PIC 9(2).
  33.            05 NOMBRE              PIC X(20).
  34.            05 U-VENDIDAS          PIC 9(2).
  35.            05 PRECIO-BASE         PIC 9(4).
  36.  
  37.        FD STOCK-MAESTRO.
  38.  
  39.        01 LLAVE.
  40.            05 LLAVE-NUMERO-PRODUCTO PIC 9(2).
  41.        01 REG-PRODUCTOS.
  42.            05 NOMBRE-PRO      PIC X(20).
  43.            05 CANTIDAD-INICIAL PIC 9(3).
  44.            05 ENTRADA         PIC 9(3).
  45.            05 SALIDA          PIC 9(3).
  46.            05 TOTAL           PIC 9(3).
  47.            05 VALOR-VENTA     PIC 9(5).
  48.        FD TICKET.
  49.  
  50.        01 TICKET-DATOS.
  51.            05 TABLA OCCURS 100.
  52.                10 CANTIDAD            PIC 9(2).
  53.                10 NOMBRE-PRO-T        PIC X(20).
  54.                10 PRECIO              PIC 9(5).
  55.                10 TOTAL-T             PIC 9(5).
  56.                10 RECIBIMOS           PIC 9(5).
  57.                10 VUELTO              PIC 9(5).
  58.  
  59.        WORKING-STORAGE SECTION.
  60.  
  61.       *>***********************************************************************
  62.      *>  *                         MENU INTERFAZ                             *
  63.      *>***********************************************************************
  64.        01 WS-TITULO.
  65.            05 FILLER              PIC X(38).
  66.            05 FILLER              PIC X(4)  VALUE "MENU".
  67.            05 FILLER              PIC X(38).
  68.  
  69.        01 WS-OPC-1.
  70.            05 FILLER              PIC X(36) VALUE SPACES.
  71.            05 FILLER              PIC X(17) VALUE "1.REGISTRAR VENTA".
  72.            05 FILLER              PIC X(36) VALUE SPACES.
  73.        01 WS-OPC-2.
  74.            05 FILLER              PIC X(36) VALUE SPACES.
  75.            05 FILLER              PIC X(17) VALUE "2.PROCESAR TICKET".
  76.            05 FILLER              PIC X(36) VALUE SPACES.
  77.        01 WS-OPC-3.
  78.            05 FILLER              PIC X(36) VALUE SPACES.
  79.            05 FILLER              PIC X(17) VALUE "3.IMPRIMIR TICKET".
  80.            05 FILLER              PIC X(36) VALUE SPACES.
  81.  
  82.        01 WS-OPC-0.
  83.            05 FILLER              PIC X(36) VALUE SPACES.
  84.            05 FILLER              PIC X(7)  VALUE "0.SALIR.".
  85.            05 FILLER              PIC X(36) VALUE SPACES.
  86.  
  87.       *>***********************************************************************
  88.      *>*                         TICKET                                      *
  89.      *>***********************************************************************
  90.  
  91.        01 WS-COLUMNA1.
  92.            05 FILLER              PIC X(10) VALUE SPACES.
  93.            05 FILLER              PIC X(59) VALUE ALL "=".
  94.            05 FILLER              PIC X(10) VALUE SPACES.
  95.  
  96.  
  97.  
  98.        01 WS-COLUMNA2.
  99.            05 FILLER              PIC X(10) VALUE SPACES.
  100.            05 FILLER              PIC X(59) VALUE ALL "=".
  101.            05 FILLER              PIC X(10) VALUE SPACES.
  102.  
  103.        01 WS-LINEA-PRODUCTO.
  104.            05 FILLER              PIC X(15) VALUE SPACES.
  105.            05 WS-CANTIDAD         PIC 9(2).
  106.            05 WS-NOMBRE-PRO       PIC X(20).
  107.            05 FILLER              PIC X(30) VALUE SPACES.
  108.            05 WS-PRECIO           PIC 9(5).
  109.            05 FILLER              PIC X(15) VALUE SPACES.
  110.  
  111.        01 WS-LINEA-TOTAL.
  112.            05 FILLER              PIC X(37).
  113.            05 FILLER              PIC X(7) VALUE "TOTAL: ".
  114.            05 WS-TOTAL            PIC 9(5).
  115.            05 FILLER              PIC X(37).
  116.  
  117.        01 WS-LINEA-RECIBO.
  118.            05 FILLER              PIC X(34).
  119.            05 FILLER              PIC X(11) VALUE "RECIBIMOS: ".
  120.            05 WS-RECIBIMOS        PIC 9(5).
  121.            05 FILLER              PIC X(34).
  122.  
  123.        01 WS-LINEA-VUELTO.
  124.            05 FILLER              PIC X(36).
  125.            05 FILLER              PIC X(8) VALUE "VUELTO: ".
  126.            05 WS-VUELTO           PIC 9(5).
  127.            05 FILLER              PIC X(36).
  128.  
  129.        77 WS-TERMINAR-PROG        PIC X(2)  VALUE "NO".
  130.        77 WS-CONTINUAR            PIC X(2)  VALUE "SI".
  131.        77 WS-REG-EXISTE           PIC X     VALUE "T".
  132.        77 WS-OPC                  PIC 9.
  133.  
  134.        PROCEDURE DIVISION.
  135.  
  136.        010-MENU.
  137.            OPEN OUTPUT REPORTE-VENTAS.
  138.            OPEN I-O STOCK-MAESTRO.
  139.            OPEN OUTPUT TICKET.
  140.            PERFORM UNTIL WS-TERMINAR-PROG = "SI"
  141.                DISPLAY WS-TITULO
  142.                DISPLAY " "
  143.                DISPLAY WS-OPC-1
  144.                DISPLAY " "
  145.                DISPLAY WS-OPC-2
  146.                DISPLAY " "
  147.                DISPLAY WS-OPC-3
  148.                DISPLAY " "
  149.                DISPLAY WS-OPC-0
  150.                ACCEPT WS-OPC
  151.            EVALUATE WS-OPC
  152.                WHEN 1 PERFORM 020-REGISTRAR-VENTA
  153.                WHEN 2 PERFORM PROCESAR-TICKET
  154.                WHEN 3 PERFORM IMPRIMIR-TICKET
  155.                WHEN 0 MOVE "SI" TO WS-TERMINAR-PROG
  156.            END-EVALUATE
  157.            END-PERFORM.
  158.            CLOSE REPORTE-VENTAS.
  159.            CLOSE STOCK-MAESTRO.
  160.            CLOSE TICKET.
  161.            STOP RUN.
  162.  
  163.        020-REGISTRAR-VENTA.
  164.            PERFORM UNTIL WS-CONTINUAR = "NO"
  165.            DISPLAY "INGRESE ID DEL PRODUCTO: " WITH NO ADVANCING
  166.            ACCEPT LLAVE-NUMERO-PRODUCTO
  167.            READ STOCK-MAESTRO
  168.                INVALID KEY MOVE "F" TO WS-REG-EXISTE
  169.            END-READ
  170.            IF WS-REG-EXISTE = "F" THEN
  171.                DISPLAY " "
  172.                DISPLAY "PRODUCTO FUERA DE STOCK."
  173.            ELSE
  174.                DISPLAY " "
  175.                DISPLAY "PRODUCTO: " WITH NO ADVANCING
  176.                DISPLAY NOMBRE-PRO   WITH NO ADVANCING
  177.                DISPLAY "STOCK: "    WITH NO ADVANCING
  178.                DISPLAY TOTAL        WITH NO ADVANCING
  179.                DISPLAY "PRECIO: "   WITH NO ADVANCING
  180.                DISPLAY VALOR-VENTA
  181.                DISPLAY " "
  182.                DISPLAY "INGRESE EL MES ACTUAL: " WITH NO ADVANCING
  183.                MOVE LLAVE-NUMERO-PRODUCTO TO ID-PRODUCTO
  184.                MOVE NOMBRE-PRO TO NOMBRE
  185.                WRITE VENTA
  186.  
Marengo97 is offline   Responder Con Cita
  #2
Antiguo 23 de febrero de 2023, 11:00
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@Marengo97, efectivamente esa seria la idea.

Observación1. Lo primero es que al realizar la venta, no solo tendrias que ver si existe el producto o no, sino tambien que tengas stock para venderlo.

Observación2. En la FD de ventas no necesitas tener la descripción pues hay que evitar los campos duplicados.

Y entrando en tu duda, tienes que inicializar registro de VENTA, leer REPORTE-VENTA, incrementar el numero de elementos vendidos, si NO existia WRITE VESTAS, si existia REWRITE VENTAS

Para esto ultimo necesitas un "file status", para reconocer si un registro existe o no.

Te recomiendo que le eches un vistazo al post de FPAIX: [Información] Ejemplos de manejo de archivos y tecla de funcion

En el hace un mantenimiento de un fichero indexado. Dedicale tiempo y pregunta lo que no entiendas.

Para hacer lo que tu quieres necesitas añadir estas cosas:

en SELECT

Código COBOL:
  1.            SELECT REPORTE-VENTAS  ASSIGN TO "VENTAS.DAT"
  2.                                   ORGANIZATION IS INDEXED
  3.                                   ACCESS MODE  IS DYNAMIC
  4.                                   RECORD KEY   IS ID-PRODUCTO
  5.                                   FILE STATUS FS-REPORTE-VENTAS.

en WORKING ( para hacerlo bien, al abrir el fichero (open i-o) hay que preguntar si f-noexiste-REPORTE-VENTAS (ya que metera un 35 en el file status)y si no permitir crearlo y hacer (open output), cuando leas preguntar esta-REPORTE-VENTAS para despues hacer un write o rewrite)

Código COBOL:
  1.        01  FS-REPORTE-VENTAS PIC XX.
  2.               88 esta-REPORTE-VENTAS             value '00' '02'.
  3.               88 n-esta-REPORTE-VENTAS           value '23'.
  4.               88 fin-REPORTE-VENTAS              value '46'  '10'.
  5.               88 bloqueado-REPORTE-VENTAS        value '99' '90'.
  6.               88 f-bloqueado-REPORTE-VENTAS      value '38' '93'.
  7.               88 f-noexiste-REPORTE-VENTAS       value '35'.

En PROCEDURE

Código COBOL:
  1.        PROCEDURE DIVISION.
  2.        DECLARATIVES.
  3.        File-Error SECTION.
  4.            USE AFTER STANDARD ERROR PROCEDURE ON reporte-ventas.      
  5.        END DECLARATIVES.

ante de hacer el write ventas:
Código COBOL:
  1.                initialize venta
  2.                MOVE LLAVE-NUMERO-PRODUCTO TO ID-PRODUCTO
  3.                read reporte-ventas end-read
  4.                add unidades-vendidas to u-vendidas
  5.                if esta-REPORTE-VENTAS then
  6.                     rewrite venta end-rewrite
  7.                else
  8.                     write venta end-write
  9.                end-if.

y si lo quieres multiproceso tienes que controlar que este bloqueado el registro venta pero esto ya es afinar muchos

Código COBOL:
  1.                initialize venta
  2.                MOVE LLAVE-NUMERO-PRODUCTO TO ID-PRODUCTO
  3.                perform test after until not bloqueado-REPORTE-VENTAS
  4.                     read reporte-ventas end-read
  5.                     if bloqueado-REPORTE-VENTAS then
  6.                         display 'Registro bloqueado. Pulse intro para reintentar'
  7.                         accept ws-continuar
  8.                     end-if
  9.                end-perform
  10.                add unidades-vendidas to u-vendidas
  11.                if esta-REPORTE-VENTAS then
  12.                     rewrite venta end-rewrite
  13.                else
  14.                     write venta end-write
  15.                end-if.

Pregunta lo que no entiendas, pero revisa el link que te he puesto.
JCantero is offline   Responder Con Cita
  #3
Antiguo 23 de febrero de 2023, 12:11
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

Se me olvidaba, reporte-ventas debe estar abierto i-o, si deseas inicializar el fichero cada vez:

Código COBOL:
  1.      open output reporte-ventas.
  2.      close reporte-ventas.
  3.      open i-o reporte-ventas.
JCantero is offline   Responder Con Cita
  #4
Antiguo 25 de febrero de 2023, 01:32
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Citación del post de JCantero Ver Mensaje
@Marengo97, efectivamente esa seria la idea.

Observación1. Lo primero es que al realizar la venta, no solo tendrias que ver si existe el producto o no, sino tambien que tengas stock para venderlo.

Observación2. En la FD de ventas no necesitas tener la descripción pues hay que evitar los campos duplicados.

Y entrando en tu duda, tienes que inicializar registro de VENTA, leer REPORTE-VENTA, incrementar el numero de elementos vendidos, si NO existia WRITE VESTAS, si existia REWRITE VENTAS

Para esto ultimo necesitas un "file status", para reconocer si un registro existe o no.

Te recomiendo que le eches un vistazo al post de FPAIX: [Información] Ejemplos de manejo de archivos y tecla de funcion

En el hace un mantenimiento de un fichero indexado. Dedicale tiempo y pregunta lo que no entiendas.

Para hacer lo que tu quieres necesitas añadir estas cosas:

en SELECT

Código COBOL:
  1.            SELECT REPORTE-VENTAS  ASSIGN TO "VENTAS.DAT"
  2.                                   ORGANIZATION IS INDEXED
  3.                                   ACCESS MODE  IS DYNAMIC
  4.                                   RECORD KEY   IS ID-PRODUCTO
  5.                                   FILE STATUS FS-REPORTE-VENTAS.

en WORKING ( para hacerlo bien, al abrir el fichero (open i-o) hay que preguntar si f-noexiste-REPORTE-VENTAS (ya que metera un 35 en el file status)y si no permitir crearlo y hacer (open output), cuando leas preguntar esta-REPORTE-VENTAS para despues hacer un write o rewrite)

Código COBOL:
  1.        01  FS-REPORTE-VENTAS PIC XX.
  2.               88 esta-REPORTE-VENTAS             value '00' '02'.
  3.               88 n-esta-REPORTE-VENTAS           value '23'.
  4.               88 fin-REPORTE-VENTAS              value '46'  '10'.
  5.               88 bloqueado-REPORTE-VENTAS        value '99' '90'.
  6.               88 f-bloqueado-REPORTE-VENTAS      value '38' '93'.
  7.               88 f-noexiste-REPORTE-VENTAS       value '35'.

En PROCEDURE

Código COBOL:
  1.        PROCEDURE DIVISION.
  2.        DECLARATIVES.
  3.        File-Error SECTION.
  4.            USE AFTER STANDARD ERROR PROCEDURE ON reporte-ventas.      
  5.        END DECLARATIVES.

ante de hacer el write ventas:
Código COBOL:
  1.                initialize venta
  2.                MOVE LLAVE-NUMERO-PRODUCTO TO ID-PRODUCTO
  3.                read reporte-ventas end-read
  4.                add unidades-vendidas to u-vendidas
  5.                if esta-REPORTE-VENTAS then
  6.                     rewrite venta end-rewrite
  7.                else
  8.                     write venta end-write
  9.                end-if.

y si lo quieres multiproceso tienes que controlar que este bloqueado el registro venta pero esto ya es afinar muchos

Código COBOL:
  1.                initialize venta
  2.                MOVE LLAVE-NUMERO-PRODUCTO TO ID-PRODUCTO
  3.                perform test after until not bloqueado-REPORTE-VENTAS
  4.                     read reporte-ventas end-read
  5.                     if bloqueado-REPORTE-VENTAS then
  6.                         display 'Registro bloqueado. Pulse intro para reintentar'
  7.                         accept ws-continuar
  8.                     end-if
  9.                end-perform
  10.                add unidades-vendidas to u-vendidas
  11.                if esta-REPORTE-VENTAS then
  12.                     rewrite venta end-rewrite
  13.                else
  14.                     write venta end-write
  15.                end-if.

Pregunta lo que no entiendas, pero revisa el link que te he puesto.
Estuve analizando el programa que me pasaste y la verdad es muy bueno, tiene varias cosas que agarrar como ejemplo, aunque es dificil de leer a veces, digamos que lo entendi en su mayoria excepto algunas cosas, si te parece puedo preguntarte sobre esto en relacion con mi programa por privado asi no hacer del posteo algo muy extenso.

Igual aprovecho para preguntarte sobre el FD reporte-ventas, segun me dijiste es mejor que solo declare su longitud total y ya, para evitar campos duplicados, podrias explicarme mas por que es mejor hacerlo así?, capaz es evidente la respuesta pero a veces teng esos dilemas si usar la working-storage o trabajar mas desde el FD, ahora yo removi los campos del FD pero, ¿si no declaro la llave del archivo que hago?, o puedo eliminar todos los demas campos del Fd excepto el de la llave?
Marengo97 is offline   Responder Con Cita
  #5
Antiguo 25 de febrero de 2023, 08:14
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Mirá, probé utilizando tablas, ya a estas alturas estoy experimentando y estoy incluso mas perdido el output me sale asi:
Cita:
00 01 00000
No me suma la cantidad de unidades vendidas (ws-u-vendidas) no importa cuantas veces repita y por algun motivo me muestra el nombre en espacios...estoy perdiendo la cordura jaja
y encima estoy lidiendo con el error "not numeric" constantemente por los espacios que pasan con el MOVE.
Código COBOL:
  1.        REGISTRAR-VENTA.
  2.            PERFORM varying I from 1 by 1 until WS-CONTINUAR
  3.                                                 equals "n" or
  4.                                                 I > 100
  5.            INITIALIZE REG-PRODUCTOS LLAVE WS-VENTA
  6.            DISPLAY "INGRESE ID DEL PRODUCTO: " WITH NO ADVANCING
  7.            ACCEPT LLAVE-NUMERO-PRODUCTO
  8.            MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-AUX
  9.            READ STOCK-MAESTRO
  10.                INVALID KEY MOVE "F" TO WS-REG-EXISTE
  11.            END-READ
  12.            IF WS-REG-EXISTE = "F" THEN
  13.                DISPLAY " "
  14.                DISPLAY "PRODUCTO FUERA DE STOCK."
  15.            ELSE
  16.                DISPLAY "INGRESE EL MES ACTUAL: " WITH NO ADVANCING
  17.                ACCEPT WS-MES(I)
  18.  
  19.                MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-PRODUCTO(I)
  20.                MOVE NOMBRE-PRO TO WS-NOMBRE(I)
  21.                COMPUTE VALOR-VENTA = FUNCTION NUMVAL(VALOR-VENTA)
  22.                MOVE VALOR-VENTA TO WS-PRECIO-BASE(I)
  23.            
  24.            SEARCH ALL WS-TABLA
  25.              
  26.                AT END MOVE "T" TO WS-REG-EXISTE
  27.                WHEN WS-ID-PRODUCTO(I) = WS-AUX-INDICE
  28.                
  29.                COMPUTE WS-U-VENDIDAS(I) = WS-U-VENDIDAS(I)+ 1
  30.                DISPLAY "SE ACTUALIZÓ EL REGISTRO."
  31.                DISPLAY WS-TABLA(I)
  32.            END-SEARCH
  33.            END-PERFORM.

- - - Updated - - -

Cita de mi comentario: Uso las tablas porque borre la descripcion de FD como me habias aconsejado por lo tanto paso los datos por una tabla y luego habrian de ser escritas en el reporte-ventas.
Marengo97 is offline   Responder Con Cita
  #6
Antiguo 25 de febrero de 2023, 17:57
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@Marengo97, la sugerencia de no repetir campos era porque nombre lo puedes leer de stock-maestro.

El problema que veo en la reforma que has hecho es que debes marcar lo que hay que ejecutar despues del else. Eso se hace con end-if.

Código COBOL:
  1. REGISTRAR-VENTA.
  2.            PERFORM varying I from 1 by 1 until WS-CONTINUAR
  3.                                                 equals "n" or
  4.                                                 I > 100
  5.            INITIALIZE REG-PRODUCTOS LLAVE WS-VENTA
  6.            DISPLAY "INGRESE ID DEL PRODUCTO: " WITH NO ADVANCING
  7.            ACCEPT LLAVE-NUMERO-PRODUCTO
  8.            MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-AUX
  9.            READ STOCK-MAESTRO
  10.                INVALID KEY MOVE "F" TO WS-REG-EXISTE
  11.            END-READ
  12.            IF WS-REG-EXISTE = "F" THEN
  13.                DISPLAY " "
  14.                DISPLAY "PRODUCTO FUERA DE STOCK."
  15.            ELSE
  16.                DISPLAY "INGRESE EL MES ACTUAL: " WITH NO ADVANCING
  17.                ACCEPT WS-MES(I)
  18.  
  19.                MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-PRODUCTO(I)
  20.                MOVE NOMBRE-PRO TO WS-NOMBRE(I)
  21.                COMPUTE VALOR-VENTA = FUNCTION NUMVAL(VALOR-VENTA)
  22.                MOVE VALOR-VENTA TO WS-PRECIO-BASE(I)
  23.               SEARCH ALL WS-TABLA
  24.              
  25.                AT END MOVE "T" TO WS-REG-EXISTE
  26.                WHEN WS-ID-PRODUCTO(I) = WS-AUX-INDICE
  27.                
  28.                 COMPUTE WS-U-VENDIDAS(I) = WS-U-VENDIDAS(I)+ 1
  29.                 DISPLAY "SE ACTUALIZÓ EL REGISTRO."
  30.                 DISPLAY WS-TABLA(I)
  31.                END-SEARCH
  32.            end-if
  33.            END-PERFORM.
JCantero is offline   Responder Con Cita
  #7
Antiguo 25 de febrero de 2023, 18:49
Marengo97
Forero Junior
Última Actividad 22.11.2023 00:42
Posts Posts: 26
Likes enviados Enviados: 5
Likes recibidos Recibidos: 0

Citación del post de JCantero Ver Mensaje
@Marengo97, la sugerencia de no repetir campos era porque nombre lo puedes leer de stock-maestro.

El problema que veo en la reforma que has hecho es que debes marcar lo que hay que ejecutar despues del else. Eso se hace con end-if.

Código COBOL:
  1. REGISTRAR-VENTA.
  2.            PERFORM varying I from 1 by 1 until WS-CONTINUAR
  3.                                                 equals "n" or
  4.                                                 I > 100
  5.            INITIALIZE REG-PRODUCTOS LLAVE WS-VENTA
  6.            DISPLAY "INGRESE ID DEL PRODUCTO: " WITH NO ADVANCING
  7.            ACCEPT LLAVE-NUMERO-PRODUCTO
  8.            MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-AUX
  9.            READ STOCK-MAESTRO
  10.                INVALID KEY MOVE "F" TO WS-REG-EXISTE
  11.            END-READ
  12.            IF WS-REG-EXISTE = "F" THEN
  13.                DISPLAY " "
  14.                DISPLAY "PRODUCTO FUERA DE STOCK."
  15.            ELSE
  16.                DISPLAY "INGRESE EL MES ACTUAL: " WITH NO ADVANCING
  17.                ACCEPT WS-MES(I)
  18.  
  19.                MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-PRODUCTO(I)
  20.                MOVE NOMBRE-PRO TO WS-NOMBRE(I)
  21.                COMPUTE VALOR-VENTA = FUNCTION NUMVAL(VALOR-VENTA)
  22.                MOVE VALOR-VENTA TO WS-PRECIO-BASE(I)
  23.               SEARCH ALL WS-TABLA
  24.              
  25.                AT END MOVE "T" TO WS-REG-EXISTE
  26.                WHEN WS-ID-PRODUCTO(I) = WS-AUX-INDICE
  27.                
  28.                 COMPUTE WS-U-VENDIDAS(I) = WS-U-VENDIDAS(I)+ 1
  29.                 DISPLAY "SE ACTUALIZÓ EL REGISTRO."
  30.                 DISPLAY WS-TABLA(I)
  31.                END-SEARCH
  32.            end-if
  33.            END-PERFORM.
No habia notado que olvide poner el end-if, pero aun con el end-if sucede lo mismo, no suma las unidades vendidas y el campo de nombre del producto lo muestra en espacios vacios.

- - - Updated - - -

Citación del post de JCantero Ver Mensaje
@Marengo97, la sugerencia de no repetir campos era porque nombre lo puedes leer de stock-maestro.

El problema que veo en la reforma que has hecho es que debes marcar lo que hay que ejecutar despues del else. Eso se hace con end-if.

Código COBOL:
  1. REGISTRAR-VENTA.
  2.            PERFORM varying I from 1 by 1 until WS-CONTINUAR
  3.                                                 equals "n" or
  4.                                                 I > 100
  5.            INITIALIZE REG-PRODUCTOS LLAVE WS-VENTA
  6.            DISPLAY "INGRESE ID DEL PRODUCTO: " WITH NO ADVANCING
  7.            ACCEPT LLAVE-NUMERO-PRODUCTO
  8.            MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-AUX
  9.            READ STOCK-MAESTRO
  10.                INVALID KEY MOVE "F" TO WS-REG-EXISTE
  11.            END-READ
  12.            IF WS-REG-EXISTE = "F" THEN
  13.                DISPLAY " "
  14.                DISPLAY "PRODUCTO FUERA DE STOCK."
  15.            ELSE
  16.                DISPLAY "INGRESE EL MES ACTUAL: " WITH NO ADVANCING
  17.                ACCEPT WS-MES(I)
  18.  
  19.                MOVE LLAVE-NUMERO-PRODUCTO TO WS-ID-PRODUCTO(I)
  20.                MOVE NOMBRE-PRO TO WS-NOMBRE(I)
  21.                COMPUTE VALOR-VENTA = FUNCTION NUMVAL(VALOR-VENTA)
  22.                MOVE VALOR-VENTA TO WS-PRECIO-BASE(I)
  23.               SEARCH ALL WS-TABLA
  24.              
  25.                AT END MOVE "T" TO WS-REG-EXISTE
  26.                WHEN WS-ID-PRODUCTO(I) = WS-AUX-INDICE
  27.                
  28.                 COMPUTE WS-U-VENDIDAS(I) = WS-U-VENDIDAS(I)+ 1
  29.                 DISPLAY "SE ACTUALIZÓ EL REGISTRO."
  30.                 DISPLAY WS-TABLA(I)
  31.                END-SEARCH
  32.            end-if
  33.            END-PERFORM.
Podrias mostrarme como quedaria la FD de reporte-ventas segun lo que me indicas?, no logro ver como es que deberia de quedar.
Marengo97 is offline   Responder Con Cita
  #8
Antiguo 25 de febrero de 2023, 22:46
JCantero
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos de parte de los Foreros 
Última Actividad 02.09.2026 00:15
Posts Posts: 442
Likes enviados Enviados: 167
Likes recibidos Recibidos: 269

@Marengo97, lo de la FD era una sugerencia. Dejalo asi aunque este duplicado y cuando vayas aumentando el nivel lo vemos
JCantero is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


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.