Iniciar Sesión

Ver la Versión Completa : [Duda] Agregar,actualizar registros en archivos indexados


Marengo97
12 de febrero de 2023, 00:03
Hola gente recientemente me puse a practicar con archivos indexados, el programa que estoy intentando crear tiene la funcion de agarrar un archivo indexado al que se le desea actualizar y/o insertar nuevos registros
aca el codigo:
IDENTIFICATION DIVISION.
PROGRAM-ID. ACTUALIZAR-STOCK.
DATE-WRITTEN. 10/2/2023.
AUTHOR. LUCAS GALEANO.

ENVIRONMENT DIVISION.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STOCK-MAESTRO ASSIGN TO "STOCK-MAESTRO.DAT"
ORGANIZATION IS INDEXED
RECORD KEY IS LLAVE-NUMERO-PRODUCTO
ACCESS MODE IS DYNAMIC.

SELECT ENTRADAS-STOCK ASSIGN TO "STOCK-ENTRADAS.DAT"
ORGANIZATION IS INDEXED
RECORD KEY IS E-LLAVE-NUMERO-ENTRADA
ACCESS MODE IS DYNAMIC.

SELECT STOCK-MAESTRO-ACT ASSIGN TO "STOCK-MAESTRO-ACT.DAT"
ORGANIZATION IS INDEXED
RECORD KEY IS N-LLAVE-NUMERO-ACT
ACCESS MODE IS DYNAMIC.
DATA DIVISION.
FILE SECTION.

FD STOCK-MAESTRO.

01 REG-PRODUCTOS.
88 FIN-ARCHIVO VALUE HIGH-VALUE.
05 LLAVE-NUMERO-PRODUCTO PIC 99.
05 NOMBRE-PRODUCTO PIC X(12).
05 CANTIDAD-INICIAL PIC 9(3).
05 ENTRADA PIC 9(3).
05 SALIDA PIC 9(3).
05 TOTAL PIC 9(3).
05 VALOR-VENTA PIC 9(5).

FD ENTRADAS-STOCK.

01 REG-ENTRADA-PRODUCTOS.
88 FIN-ARCHIVO-ENTRADA VALUE HIGH-VALUE.
05 E-LLAVE-NUMERO-ENTRADA PIC 99.
05 E-NOMBRE-PRODUCTO PIC X(12).
05 E-CANTIDAD-INICIAL PIC 9(3).
05 E-ENTRADA PIC 9(3).
05 E-SALIDA PIC 9(3).
05 E-TOTAL PIC 9(3).
05 E-VALOR-VENTA PIC 9(5).

FD STOCK-MAESTRO-ACT.

01 REG-PRODUCTOS-ACT.
88 FIN-ARCHIVO-ACT VALUE HIGH-VALUE.
05 N-LLAVE-NUMERO-ACT PIC 99.
05 N-NOMBRE-PRODUCTO PIC X(12).
05 N-CANTIDAD-INICIAL PIC 9(3).
05 N-ENTRADA PIC 9(3).
05 N-SALIDA PIC 9(3).
05 N-TOTAL PIC 9(3).
05 N-VALOR-VENTA PIC 9(5).

WORKING-STORAGE SECTION.
01 BOOLEANO PIC XX.
88 WS-VERDADERO VALUE "SI".
88 WS-FALSO VALUE "NO".

PROCEDURE DIVISION.
005-SALTAR.
DISPLAY "¿DESEAS VER EN PANTALLA EL STOCK ACTUALIZADO?".
ACCEPT BOOLEANO.
IF WS-VERDADERO
GO TO 045-IMPRIMIR-STOCK-PANTALLA
ELSE
EXIT
END-IF.

010-ABRIR-ARCHIVOS.
OPEN INPUT STOCK-MAESTRO.
OPEN OUTPUT ENTRADAS-STOCK.
OPEN OUTPUT STOCK-MAESTRO-ACT.

020-LEER-ARCHIVO.
READ STOCK-MAESTRO AT END SET FIN-ARCHIVO TO TRUE
END-READ.

030-ESCRIBIR-ARCHIVO-ENTRADA.

DISPLAY "INGRESE EL PRODUCTO USANDO LA SIGUIENTE PLANTILLA"
" PARA FINALIZAR PRECIONE -ESPACIO-".
PERFORM 060-INGRESE-PRODUCTO.
PERFORM UNTIL REG-ENTRADA-PRODUCTOS = SPACES
WRITE REG-ENTRADA-PRODUCTOS
PERFORM 060-INGRESE-PRODUCTO
END-PERFORM.
CLOSE ENTRADAS-STOCK.

040-ACTUALIZAR-ARCHIVO.
OPEN INPUT ENTRADAS-STOCK.
READ ENTRADAS-STOCK AT END SET FIN-ARCHIVO-ENTRADA TO TRUE
END-READ.
PERFORM UNTIL FIN-ARCHIVO AND FIN-ARCHIVO-ENTRADA
*>ESTE IF ACTUALIZA REGISTROS DE SER LA CLAVE LA MISMA DE NO SER ASI NO SE ACTUALIZA.

IF LLAVE-NUMERO-PRODUCTO = E-LLAVE-NUMERO-ENTRADA
MOVE REG-ENTRADA-PRODUCTOS TO REG-PRODUCTOS-ACT
WRITE REG-PRODUCTOS-ACT
READ STOCK-MAESTRO AT END SET FIN-ARCHIVO TO TRUE
END-READ
READ ENTRADAS-STOCK AT END SET FIN-ARCHIVO-ENTRADA
TO TRUE
END-READ
ELSE
MOVE REG-PRODUCTOS TO REG-PRODUCTOS-ACT
WRITE REG-PRODUCTOS-ACT
READ STOCK-MAESTRO AT END SET FIN-ARCHIVO TO TRUE
END-READ
END-IF
*>ESTE IF AGREGA NUEVOS REGISTROS DE OTRO MODO NO LO HACE.

IF E-LLAVE-NUMERO-ENTRADA < LLAVE-NUMERO-PRODUCTO
MOVE REG-ENTRADA-PRODUCTOS TO REG-PRODUCTOS-ACT
WRITE REG-PRODUCTOS-ACT
READ ENTRADAS-STOCK AT END SET FIN-ARCHIVO-ENTRADA
TO TRUE
END-READ
ELSE
MOVE REG-PRODUCTOS TO REG-PRODUCTOS-ACT
WRITE REG-PRODUCTOS-ACT
READ STOCK-MAESTRO AT END SET FIN-ARCHIVO TO TRUE
END-PERFORM.
PERFORM 050-CERRAR-ARCHIVOS.

045-IMPRIMIR-STOCK-PANTALLA.
OPEN INPUT STOCK-MAESTRO-ACT.
READ STOCK-MAESTRO-ACT AT END SET FIN-ARCHIVO-ACT TO TRUE
END-READ.
PERFORM UNTIL FIN-ARCHIVO-ACT
DISPLAY REG-PRODUCTOS-ACT
READ STOCK-MAESTRO-ACT AT END SET FIN-ARCHIVO-ACT TO TRUE
END-READ
END-PERFORM.
CLOSE STOCK-MAESTRO-ACT
STOP RUN.

050-CERRAR-ARCHIVOS.

CLOSE STOCK-MAESTRO.
CLOSE ENTRADAS-STOCK.
CLOSE STOCK-MAESTRO-ACT.


060-INGRESE-PRODUCTO.
DISPLAY "NNPPPPPPPPPPPPIIIEEESSSTTT$$$$$".
ACCEPT REG-ENTRADA-PRODUCTOS.


Los problemas que estoy teniendo pues son de indole variados, tanto para insertar un registro nuevo como para actualizar, y en algunos casos encontre el motivo del problema pero no encuentro una manera optima de lograr lo que quiero lograr...cual es la manera correcta de lograr lo que busco?
Intente separar ambas acciones en dos performs diferentes cerrando los archivos antes de entrear al siguiente perform pero no dio resultados, aparecen otros problemas raros como que ninguna informacion pasa al nuevo archivo y se ve vacio..
Se que el problema es que esta intentando leer mas allá de algun archivo pero no se como arreglarlo, algunos archivos terminan de leerse antes y eso hace que todo se vuelva loco.

Acá dejo algunas capturas de resultados en consola

En esta captura intente actualizar la Key 02
883

En esta captura logre insertar un nuevo registro Key 09
884
885

En esta otra captura se ve que intenté ingresar dos nuevos registros y me tira error en linea 130
886

JCantero
12 de febrero de 2023, 20:45
@Marengo97, En el programa que pones hay muchas cosas. Para que te podamos ayudar dinos en que linea te da que problema porque hay muchas cosas.

Deberias de ordenar un poco las opciones para que quede mas claro lo que intentas hacer.

Por ejemplo.
Displaya un menu con opciones.

Alta registro
Modificación registro
Eliminar registro
Listar registros
Salir



Y ya una vez seleccionado la opción hacer la opción indicada.

El manejo de ficheros indexados e diferente a uno sequencial.

Puedes leer un registro existente por su clave.


read stock-maestro key is llave-numero-producto end-read


Puedes escribir un registro que no existe


write reg-productos end-write


Puedes reescribir o actualizar un registro que ya existe


rewrite reg-productos end-rewrite


Para hacer write o rewrite el fichero tiene que estar abierto asi


open i-o stock-maesto


Puedes posicionarte en un registro y leer en secuencial


start stock-maestro key is > llave-numero-producto end-start
read stock-maestro at END SET FIN-ARCHIVO-ACT TO TRUE END-READ




Por ultimo te recomiendo que veas este tutorial que hace la gestión de un fichero indexado. Te pongo el link del hilo abierto.

- - - Updated - - -

[Información] Curso gratuito de GNU Cobol (https://www.cobolforo.es/showthread.php?1606-Curso-gratuito-de-GNU-Cobol)

Lenguaje COBOL desde 0 | IToo (https://itoo.dev/p/lenguaje-cobol-desde-0)

Marengo97
13 de febrero de 2023, 01:12
Muchas gracias me re sirve, si, vi algo sobre el modo I-O pero no lo entendi muy bien por eso fui a por lo basico, inputs y outputs.
Si lo se no es muy ordenado..aun intento encontrar la manera de ser prolijo llevo un mes estudiando el lenguaje, se aprende poco a poco pero cuesta ser ordenado.