PDA

Ver la Versión Completa : [Duda] Leer dos archivos y crear uno nuevo.


dariodr
16 de diciembre de 2023, 12:18
Buenas tengo este enunciado:
950

El archivo principal es este. Crea dos archivos.

IDENTIFICATION DIVISION.
PROGRAM-ID. video-rent.
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT rent-file ASSIGN to "alquiler.txt"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT ventas-file ASSIGN to "ventas.txt"
ORGANIZATION IS LINE SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
FD rent-file.
01 rent-record.
03 item-no PIC 9(3).
03 video-name PIC x(20).
03 tapes-in-stock PIC 9(3).
*
FD ventas-file.
01 ventas-record.
03 item-no-v PIC 9(3).
03 video-name-v PIC x(20).
03 tapes-for-sale PIC 9(3).
*
WORKING-STORAGE SECTION.
77 mas-datos PIC X VALUE SPACES.
*
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM abrir-archivo.
PERFORM ingreso-datos until mas-datos = 'n' OR 'N'.
PERFORM cerrar-archivo.
STOP RUN.
*
abrir-archivo.
OPEN OUTPUT rent-file
OUTPUT ventas-file.
*
ingreso-datos.
DISPLAY 'Item Nro: ' NO ADVANCING.
ACCEPT item-no.
DISPLAY 'Nombre del Video: ' NO ADVANCING.
ACCEPT video-name.
DISPLAY 'Cintas en stock: ' NO ADVANCING.
ACCEPT tapes-in-stock.
WRITE rent-record.
MOVE item-no TO item-no-v.
MOVE video-name TO video-name-v.
Display 'Cintas para vender: ' NO ADVANCING.
ACCEPT tapes-for-sale.
WRITE ventas-record.
DISPLAY 'Agregar otro video s/n: ' NO ADVANCING.
ACCEPT mas-datos.
*
cerrar-archivo.
close rent-file
ventas-file.



Y el archivo que crea uno nuevo es este:

IDENTIFICATION DIVISION.
PROGRAM-ID. master.
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT master-file ASSIGN TO "master.txt"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT rent-file ASSIGN to "alquiler.txt"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT ventas-file ASSIGN to "ventas.txt"
ORGANIZATION IS LINE SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
FD master-file.
01 master-rec.
03 item-no-m PIC 9(3).
03 video-name-m PIC x(20).
03 cintas-stock-m PIC 9(3).
03 cintas-ventas-m PIC 9(3).
*
FD rent-file.
01 rent-record.
03 item-no PIC 9(3).
03 video-name PIC x(20).
03 tapes-in-stock PIC 9(3).
*
FD ventas-file.
01 ventas-record.
03 item-no-v PIC 9(3).
03 video-name-v PIC x(20).
03 tapes-for-sale PIC 9(3).
*
WORKING-STORAGE SECTION.
77 fin-archivo PIC X VALUE SPACES.
*
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM abrir-archivo.
PERFORM proceso.
PERFORM cerrar-archivo.
STOP RUN.
*
abrir-archivo.
OPEN OUTPUT master-file
INPUT rent-file
INPUT ventas-file.
*
proceso.
PERFORM leer-fichero-rentas until fin-archivo = 's'.
PERFORM lee-fichero-ventas until fin-archivo = 's'.
* PERFORM escribir-master.
*
leer-fichero-rentas.
read rent-file
at end move 's' to fin-archivo
not at end perform proceso1
end-read.
*
lee-fichero-ventas.
read ventas-file
at end move 's' to fin-archivo
not at end perform proceso2
end-read.

cerrar-archivo.
close master-file
rent-file
ventas-file.

proceso1.
move item-no to item-no-m.
move video-name to video-name-m.
move tapes-in-stock to cintas-stock-m.
write master-rec.

proceso2.
move tapes-for-sale to cintas-ventas-m.
write master-rec.
*



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:
Item No
Video Name
Tapes in stock

El segundo archivo tiene estos campos:
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:
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.



IDENTIFICATION DIVISION.
PROGRAM-ID. TRASPASO.
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPTIONAL RENT-FILE
ASSIGN TO "alquiler.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS STRE.
*
SELECT OPTIONAL VENTAS-FILE
ASSIGN TO "ventas.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS STVE.
*
SELECT OPTIONAL DESTINO
ASSIGN TO "Destino.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS STDE.
*
DATA DIVISION.
FILE SECTION.
FD RENT-FILE.
01 RENT-RECORD.
03 ITEM-NO PIC 9(03).
03 VIDEO-NAME PIC X(20).
03 TAPES-IN-STOCK PIC 9(03).
*
FD VENTAS-FILE.
01 VENTAS-RECORD.
03 ITEM-NO-V PIC 9(03).
03 VIDEO-NAME-V PIC X(20).
03 TAPES-FOR-SALE PIC 9(03).
*
FD DESTINO.
01 DESTINO-RECORD.
03 ITEM-NO-D PIC 9(03).
03 VIDEO-NAME-D PIC X(20).
03 STOCK-D PIC 9(03).
03 SALE-D PIC 9(03).
*
WORKING-STORAGE SECTION.
77 STRE PIC XX.
77 STVE PIC XX.
77 STDE PIC XX.

01 CONTA PIC 9(04) COMP-5.
01 CONTA-EDI PIC ZZZ9.
01 TECLA PIC X(01).
01 ERR.
03 PIC X(37) VALUE
"Error fichero 'Destino.txt' status: ".
03 ERRO PIC XX.
03 PIC X(02) VALUE ".".
01 ERR1.
03 PIC X(14) VALUE
"El registro ".
03 ERRO1 PIC ZZ9.
03 PIC X(38) VALUE
", no existe en el fichero de ventas. ".
*
PROCEDURE DIVISION.
DECLARATIVES.
DECLA-DESTINO SECTION.
USE AFTER STANDAR ERROR PROCEDURE ON DESTINO.
DESTINO-DECLA.
IF STDE = "35" OR STDE = "30"
OPEN OUTPUT DESTINO
CLOSE DESTINO
OPEN EXTEND DESTINO
ELSE
MOVE STDE TO ERRO
DISPLAY ERR
ACCEPT TECLA
CLOSE RENT-FILE
VENTAS-FILE
STOP RUN
END-IF.
END DECLARATIVES.
*
UNICA SECTION.
ABRIR.
OPEN INPUT
RENT-FILE
VENTAS-FILE
OPEN EXTEND
DESTINO.
INICIO.
DISPLAY "Pulse una tecla para iniciar ... "
ACCEPT TECLA WITH NO ADVANCING.
INITIALIZE CONTA CONTA-EDI.
*
PROCESAR.
PERFORM WITH NO LIMIT
READ RENT-FILE
NEXT RECORD
AT END
EXIT PERFORM
NOT AT END
MOVE ITEM-NO TO ITEM-NO-V ITEM-NO-D
READ VENTAS-FILE
INVALID KEY
MOVE ITEM-NO TO ERRO1
DISPLAY ERR1
ACCEPT TECLA WITH NO ADVANCING
NOT INVALID KEY
MOVE TAPES-FOR-SALE TO SALE-D
END-READ
MOVE VIDEO-NAME TO VIDEO-NAME-D
MOVE TAPES-IN-STOCK TO STOCK-D
WRITE DESTINO-RECORD
ADD 1 TO CONTA
END-READ
END-PERFORM.
*
FIN.
MOVE CONTA TO CONTA-EDI.
*
CLOSE RENT-FILE
VENTAS-FILE
DESTINO.
*
DISPLAY "Fin del proceso, se han creado " WITH NO ADVANCING
DISPLAY CONTA-EDI WITH NO ADVANCING
DISPLAY ", pulse una tecla para terminar ... "
WITH NO ADVANCING.
ACCEPT TECLA WITH NO ADVANCING.
STOP RUN.
*
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.-