Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   COBOL - General (https://www.cobolforo.es/forumdisplay.php?f=44)
-   -   [Duda] Leer dos archivos y crear uno nuevo. (https://www.cobolforo.es/showthread.php?t=1703)

dariodr 16 de diciembre de 2023 12:18

Leer dos archivos y crear uno nuevo.
 
1 Archivos Adjunto(s)
Buenas tengo este enunciado:
[ATTACH=CONFIG]950[/ATTACH]

El archivo principal es este. Crea dos archivos.

Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.        PROGRAM-ID. video-rent.
  3.      *
  4.        ENVIRONMENT DIVISION.
  5.        INPUT-OUTPUT SECTION.
  6.        FILE-CONTROL.
  7.            SELECT rent-file ASSIGN to "alquiler.txt"
  8.               ORGANIZATION IS LINE SEQUENTIAL.
  9.            SELECT ventas-file ASSIGN to "ventas.txt"
  10.               ORGANIZATION IS LINE SEQUENTIAL.
  11.      *
  12.        DATA DIVISION.
  13.        FILE SECTION.
  14.        FD  rent-file.
  15.        01  rent-record.
  16.            03 item-no         PIC 9(3).
  17.            03 video-name      PIC x(20).
  18.            03 tapes-in-stock  PIC 9(3).
  19.      *
  20.        FD ventas-file.
  21.        01  ventas-record.
  22.            03 item-no-v       PIC 9(3).
  23.            03 video-name-v    PIC x(20).
  24.            03 tapes-for-sale  PIC 9(3).
  25.      *    
  26.        WORKING-STORAGE SECTION.
  27.        77  mas-datos  PIC X VALUE SPACES.  
  28.      *
  29.        PROCEDURE DIVISION.
  30.        MAIN-PROCEDURE.
  31.            PERFORM abrir-archivo.
  32.            PERFORM ingreso-datos until mas-datos = 'n' OR 'N'.
  33.            PERFORM cerrar-archivo.
  34.            STOP RUN.
  35.      *
  36.        abrir-archivo.
  37.            OPEN OUTPUT rent-file
  38.                 OUTPUT ventas-file.
  39.      *
  40.        ingreso-datos.
  41.            DISPLAY 'Item Nro: ' NO ADVANCING.
  42.            ACCEPT item-no.
  43.            DISPLAY 'Nombre del Video: ' NO ADVANCING.
  44.            ACCEPT video-name.
  45.            DISPLAY 'Cintas en stock: ' NO ADVANCING.
  46.            ACCEPT tapes-in-stock.
  47.            WRITE rent-record.
  48.            MOVE item-no TO item-no-v.
  49.            MOVE video-name TO video-name-v.
  50.            Display 'Cintas para vender: ' NO ADVANCING.
  51.            ACCEPT tapes-for-sale.
  52.            WRITE ventas-record.
  53.            DISPLAY 'Agregar otro video s/n: ' NO ADVANCING.
  54.            ACCEPT mas-datos.
  55.      *
  56.        cerrar-archivo.
  57.            close rent-file
  58.                  ventas-file.  

Y el archivo que crea uno nuevo es este:

Código COBOL:
  1.        IDENTIFICATION DIVISION.
  2.        PROGRAM-ID. master.
  3.      *
  4.        ENVIRONMENT DIVISION.
  5.        INPUT-OUTPUT SECTION.
  6.        FILE-CONTROL.
  7.            SELECT master-file ASSIGN TO "master.txt"
  8.               ORGANIZATION IS LINE SEQUENTIAL.
  9.            SELECT rent-file   ASSIGN to "alquiler.txt"
  10.               ORGANIZATION IS LINE SEQUENTIAL.
  11.            SELECT ventas-file ASSIGN to "ventas.txt"
  12.               ORGANIZATION IS LINE SEQUENTIAL.
  13.      *
  14.        DATA DIVISION.
  15.        FILE SECTION.
  16.        FD  master-file.
  17.        01  master-rec.
  18.            03 item-no-m       PIC 9(3).
  19.            03 video-name-m    PIC x(20).
  20.            03 cintas-stock-m  PIC 9(3).
  21.            03 cintas-ventas-m PIC 9(3).
  22.      *    
  23.        FD  rent-file.
  24.        01  rent-record.
  25.            03 item-no         PIC 9(3).
  26.            03 video-name      PIC x(20).
  27.            03 tapes-in-stock  PIC 9(3).
  28.      *
  29.        FD ventas-file.
  30.        01  ventas-record.
  31.            03 item-no-v       PIC 9(3).
  32.            03 video-name-v    PIC x(20).
  33.            03 tapes-for-sale  PIC 9(3).
  34.      *    
  35.        WORKING-STORAGE SECTION.
  36.        77  fin-archivo  PIC X VALUE SPACES.  
  37.      *
  38.        PROCEDURE DIVISION.
  39.        MAIN-PROCEDURE.
  40.            PERFORM abrir-archivo.
  41.            PERFORM proceso.
  42.            PERFORM cerrar-archivo.
  43.            STOP RUN.
  44.      *
  45.        abrir-archivo.
  46.            OPEN OUTPUT master-file
  47.                 INPUT rent-file
  48.                 INPUT ventas-file.
  49.      *
  50.        proceso.
  51.            PERFORM leer-fichero-rentas until fin-archivo = 's'.
  52.            PERFORM lee-fichero-ventas until fin-archivo = 's'.
  53.      *     PERFORM escribir-master.  
  54.      *
  55.        leer-fichero-rentas.
  56.            read rent-file
  57.               at end move 's' to fin-archivo
  58.               not at end perform proceso1
  59.             end-read.
  60.      *
  61.        lee-fichero-ventas.
  62.            read ventas-file
  63.               at end move 's' to fin-archivo
  64.               not at end perform proceso2
  65.            end-read.
  66.  
  67.        cerrar-archivo.
  68.            close master-file
  69.                  rent-file
  70.                  ventas-file.
  71.  
  72.        proceso1.
  73.            move item-no        to item-no-m.
  74.            move video-name     to video-name-m.
  75.            move tapes-in-stock to cintas-stock-m.
  76.            write master-rec.
  77.  
  78.        proceso2.
  79.            move tapes-for-sale to cintas-ventas-m.
  80.            write master-rec.
  81.      *
  82.        

Como leo dos archivos a la vez y grabo los datos en uno solo.
Saludos.

Josber 16 de diciembre de 2023 12:35

Hola @dariodr,

Lo primero, no abras los archivos en OUTPUT, porque eso se hace sólo una vez al principio, para crear el archivo vacío, pero si lo haces todas las veces, va a borrar el archivo y a crearlo de nuevo cada vez que ejecutes el programa, (y si quieres evitar el OUTPUT, cambia la cláusula SELECT nombre_de archivo por SELECT OPTIONAL nombre_de_archivo o por unas DECLARATIVES, lo que te sea más cómodo), lo segundo es, ¿qué es lo que quieres exactamente?, ¿que te hagamos un ejemplo, una ayuda porque te atascas en algún sitio, ...? danos alguna pista más.

Un salu2.-

dariodr 17 de diciembre de 2023 02:12

La idea es esta, Tengo 2 archivos de texto:

El primer archivo tiene estos campos:
Código:

Item No
Video Name
Tapes in stock

El segundo archivo tiene estos campos:
Código:

Item No
Video Name
Tapes for sale

Nota: en los dos archivos el No de Item y el Video Name son los mismos.

Lo que quiero hacer:
Crear un nuevo archivo donde se guarde:
Código:

Item No
Video Name
Tapes in stock
Tapes for sale.

Espero se entienda. Salu2.

Josber 18 de diciembre de 2023 11:07

@dariodr, lo que quieres es que te pongamos el código fuente para hacer lo que pides, ¿no?

un salu2.-

dariodr 18 de diciembre de 2023 12:02

Si, exacto. Quiero compararlo con el que tengo.
Salu2.

Josber 19 de diciembre de 2023 11:46

Bueno pues, sin probarlo, porque no tengo los ficheros de datos ni compilador para MS-DOS, con algo así a lo que te pongo, debería de funcionar.

Código COBOL:
  1.  
  2.        IDENTIFICATION DIVISION.
  3.        PROGRAM-ID. TRASPASO.
  4.      *
  5.        ENVIRONMENT DIVISION.
  6.        INPUT-OUTPUT SECTION.
  7.        FILE-CONTROL.
  8.             SELECT OPTIONAL RENT-FILE
  9.                    ASSIGN TO "alquiler.txt"
  10.                    ORGANIZATION IS LINE SEQUENTIAL
  11.                    FILE STATUS IS STRE.
  12.      *
  13.             SELECT OPTIONAL VENTAS-FILE
  14.                    ASSIGN TO "ventas.txt"
  15.                    ORGANIZATION IS LINE SEQUENTIAL
  16.                    FILE STATUS IS STVE.
  17.      *
  18.             SELECT OPTIONAL DESTINO
  19.                    ASSIGN TO "Destino.txt"
  20.                    ORGANIZATION IS LINE SEQUENTIAL
  21.                    FILE STATUS IS STDE.
  22.      *
  23.        DATA DIVISION.
  24.        FILE SECTION.
  25.        FD  RENT-FILE.
  26.        01  RENT-RECORD.
  27.            03  ITEM-NO                  PIC 9(03).
  28.            03  VIDEO-NAME               PIC X(20).
  29.            03  TAPES-IN-STOCK           PIC 9(03).
  30.      *
  31.        FD  VENTAS-FILE.
  32.        01  VENTAS-RECORD.
  33.            03  ITEM-NO-V                PIC 9(03).
  34.            03  VIDEO-NAME-V             PIC X(20).
  35.            03  TAPES-FOR-SALE           PIC 9(03).
  36.      *
  37.        FD  DESTINO.
  38.        01  DESTINO-RECORD.
  39.            03  ITEM-NO-D                PIC 9(03).
  40.            03  VIDEO-NAME-D             PIC X(20).
  41.            03  STOCK-D                  PIC 9(03).
  42.            03  SALE-D                   PIC 9(03).
  43.      *
  44.        WORKING-STORAGE SECTION.
  45.        77  STRE                         PIC XX.
  46.        77  STVE                         PIC XX.
  47.        77  STDE                         PIC XX.
  48.  
  49.        01  CONTA                        PIC 9(04) COMP-5.
  50.        01  CONTA-EDI                    PIC ZZZ9.
  51.        01  TECLA                        PIC X(01).
  52.        01  ERR.
  53.            03                           PIC X(37) VALUE
  54.                             "Error fichero 'Destino.txt' status: ".
  55.            03  ERRO                     PIC XX.
  56.            03                           PIC X(02) VALUE ".".
  57.        01  ERR1.
  58.            03                           PIC X(14) VALUE
  59.                             "El registro  ".
  60.            03  ERRO1                    PIC ZZ9.
  61.            03                           PIC X(38) VALUE
  62.                             ", no existe en el fichero de ventas. ".
  63.      *
  64.        PROCEDURE DIVISION.
  65.        DECLARATIVES.
  66.        DECLA-DESTINO SECTION.
  67.             USE AFTER STANDAR ERROR PROCEDURE ON DESTINO.
  68.        DESTINO-DECLA.
  69.             IF STDE = "35" OR STDE = "30"
  70.                OPEN OUTPUT DESTINO
  71.                CLOSE DESTINO
  72.                OPEN EXTEND DESTINO
  73.             ELSE
  74.                MOVE STDE TO ERRO
  75.                DISPLAY ERR
  76.                ACCEPT TECLA
  77.                CLOSE RENT-FILE
  78.                      VENTAS-FILE
  79.                STOP RUN
  80.             END-IF.
  81.        END DECLARATIVES.
  82.      *
  83.        UNICA SECTION.
  84.        ABRIR.
  85.             OPEN INPUT
  86.                  RENT-FILE
  87.                  VENTAS-FILE
  88.             OPEN EXTEND
  89.                  DESTINO.
  90.        INICIO.
  91.             DISPLAY "Pulse una tecla para iniciar ... "
  92.             ACCEPT TECLA WITH NO ADVANCING.
  93.             INITIALIZE CONTA CONTA-EDI.
  94.      *
  95.        PROCESAR.
  96.             PERFORM WITH NO LIMIT
  97.                     READ RENT-FILE
  98.                          NEXT RECORD
  99.                               AT END
  100.                                  EXIT PERFORM
  101.                               NOT AT END
  102.                                   MOVE ITEM-NO TO ITEM-NO-V ITEM-NO-D
  103.                                   READ VENTAS-FILE
  104.                                        INVALID KEY
  105.                                                MOVE ITEM-NO TO ERRO1
  106.                                                DISPLAY ERR1
  107.                                                ACCEPT TECLA WITH NO ADVANCING
  108.                                        NOT INVALID KEY
  109.                                            MOVE TAPES-FOR-SALE TO SALE-D
  110.                                   END-READ
  111.                                   MOVE VIDEO-NAME TO VIDEO-NAME-D
  112.                                   MOVE TAPES-IN-STOCK TO STOCK-D
  113.                                   WRITE DESTINO-RECORD
  114.                                   ADD 1 TO CONTA
  115.                     END-READ
  116.             END-PERFORM.
  117.      *
  118.         FIN.
  119.             MOVE CONTA TO CONTA-EDI.
  120.      *
  121.             CLOSE RENT-FILE
  122.                   VENTAS-FILE
  123.                   DESTINO.
  124.      *
  125.             DISPLAY "Fin del proceso, se han creado " WITH NO ADVANCING
  126.             DISPLAY CONTA-EDI                         WITH NO ADVANCING
  127.             DISPLAY ", pulse una tecla para terminar ... "
  128.                                                       WITH NO ADVANCING.
  129.             ACCEPT TECLA                              WITH NO ADVANCING.
  130.             STOP RUN.
  131.      *
  132.             END PROGRAM TRASPASO.

No sé que compilador vas a usar, por lo que igual la sentencia PERFORM WITH NO LIMIT, igual no la tiene tu compilador, pero eso se soluciona rápidamente con un sencillo PERFORM a un PROCEDIMIENTO (o ETIQUETA, como lo llames)

Ya nos dirás, si te funciona, si hay algo que no entiendas, pregunta, que estamos para eso.

Un salu2.-


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

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