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
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