Cobol - Problemas con File-Status

 
Vista:

Problemas con File-Status

Publicado por Lucas (1 intervención) el 04/08/2023 22:14:54
Hola estoy teniendo problemas a la hora de utilizar condicionales con los estados de File-status, pueden ir directamente al bloque al parrrafo BUSCAR-NOMBRE. La idea es que si se ingresa un titulo que no existe en el registro tire un display de ERROR, devolviendo un codigo 23 pero no siempre cumple con esa condicion a pesar de poner cualquier titulo inexistente, a veces ingresas un titulo que no esta registrado y te muestra por display un registro que no tiene nada que ver, dando una salida de tipo "00" y no deberia ser así, ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
IDENTIFICATION DIVISION.
 
       PROGRAM-ID.                 LIBRERIA.
       AUTHOR.                     LUCAS GALEANO.
       DATE-WRITTEN                9/7/2023.
 
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT REG-LIBROS ASSIGN TO "REGISTRO-LIBROS.DAT"
                               ORGANIZATION IS INDEXED
                               RECORD KEY IS LIBRO-ID
                               ALTERNATE RECORD KEY IS NOMBRE
 
                               ALTERNATE RECORD KEY IS EDITORIAL
                               WITH DUPLICATES
                               ACCESS MODE IS DYNAMIC
                               FILE STATUS IS FS-REGISTRO-LIBROS.
 
 
       DATA DIVISION.
       FILE SECTION.
 
       FD REG-LIBROS.
 
       01 DATOS-LIBRO.
           05 LIBRO-ID PIC 999     VALUE ZEROS.
           05 NOMBRE   PIC X(20)   VALUE SPACES.
           05 EDITORIAL PIC X(20)  VALUE SPACES.
           05 ESTADO   PIC X(12)   VALUE SPACES.
      *05 FECHA-INGRESO.
      *     10 DIA  PIC 99 VALUE ZEROS.
      *     10 MES  PIC X(10) VALUE SPACES.
      *     10 AÑO  PIC 9999 VALUE ZEROS.
      * 05 FECHA-ALQUILER.
      *     10 DDIA PIC 99 VALUE ZEROS.
      *     10 MMES PIC X(10) VALUE SPACES.
      *     10 AAÑO PIC 9999 VALUE ZEROS.
 
       WORKING-STORAGE SECTION.
      *Codigos de error del archivo.
       01 FS-REGISTRO-LIBROS PIC XX.
           88 ESTA-REG         VALUE "00" "02".
           88 N-ESTA-REG       VALUE "23".
           88 F-NOEXISTE-REG   VALUE "35".
           88 FIN-REG          VALUE "10".
           88 F-ABIERTO        VALUE "12".
           88 A                VALUE "98".
           88 B VALUE "97" "49" "48" "47" "46" "44" "39".
      *Variables del programa.
       77 CONTINUAR PIC X.
       77 CONTINUAR-REG PIC X.
       77 ELIMINAR-OPC  PIC X.
       77 BUSCAR-OPC    PIC X.
       77 OPC       PIC X.
       77 LIMPIAR   PIC X(80) VALUE SPACES.
       77 LIMPIAR-LINEA PIC X(80) VALUE SPACES.
       77 N         PIC 99.
      *77 nn         PIC 99.
       77 AUX-ID    PIC 999.
       77 DESDE     PIC X(20).
       77 HASTA     PIC X(20).
       77 EXISTE   PIC 9 VALUE 0.
 
       PROCEDURE DIVISION.
       DECLARATIVES.
      *Estados de error del archivo
       FILE-ERROR SECTION.
           USE AFTER STANDARD ERROR PROCEDURE ON REG-LIBROS.
       END DECLARATIVES.
      *LOGICA PRINCIPAL
       MENU.
           PERFORM UNTIL CONTINUAR = "N"
           PERFORM LIMPIAR-PANTALLA
           DISPLAY "ADMINISTRADOR DE CATALOGO" AT LINE 1 COL 1 WITH
                                                           REVERSE-VIDEO
           DISPLAY " "                         AT LINE 3 COL 1
           DISPLAY "1.Registrar, Editar, Remplazar libro" AT LINE 4
                                                           COL 1
           DISPLAY "2.Eliminar libro"          AT LINE 5 COL 1
           DISPLAY "3.Ver catalogo"            AT LINE 6 COL 1
           DISPLAY "4.Crear nuevo registro"    AT LINE 7 COL 1
           DISPLAY "5.Buscar libro"            AT LINE 8
           DISPLAY "0.Salir"                   AT LINE 9 COL 1
           DISPLAY " "                         AT LINE 10 COL 1
           DISPLAY "Ingrese tecla ( )"         AT LINE 11 COL 1 WITH
                                                           REVERSE-VIDEO
           ACCEPT OPC                          AT LINE 11 COL 16 WITH
                                               PROMPT UNDERLINE
           EVALUATE OPC
           WHEN 1 PERFORM REGISTRAR-LIBRO
           WHEN 2 PERFORM ELIMINAR-LIBRO
           WHEN 3 PERFORM VER-LIBROS
           WHEN 4 PERFORM CREAR-ARCHIVO
           WHEN 5 PERFORM BUSCAR-LIBRO
           WHEN 0 MOVE "N" TO CONTINUAR
           END-EVALUATE
           END-PERFORM.
           CLOSE REG-LIBROS.
           STOP RUN.
 
 
       REGISTRAR-LIBRO.
           MOVE SPACES TO DATOS-LIBRO.
           PERFORM LIMPIAR-PANTALLA.
           MOVE "S" TO CONTINUAR-REG.
      *************************************************************************
      *INTERFAZ MENU DE INGRESO DE DATOS
      *************************************************************************
           DISPLAY "Numero de serie:" AT LINE 1 COL 1.
           DISPLAY "Nombre:"       AT LINE 2 COL 1.
           DISPLAY "Editorial:"    AT LINE 3 COL 1.
           DISPLAY "Estado:"       AT LINE 4 COL 1.
           DISPLAY
           "presione ENTER sin ingresar datos para salir al menu"
                                               AT LINE 7 COL 12
                                                     WITH REVERSE-VIDEO.
 
 
           DISPLAY "Numero de serie    :" AT LINE 1 COL 1 WITH
                                                          REVERSE-VIDEO.
 
           ACCEPT LIBRO-ID WITH PROMPT UNDERLINE UPDATE AT LINE 1
                                                       COL 25.
 
           IF LIBRO-ID EQUALS 000 MOVE "N" TO CONTINUAR-REG END-IF.
 
 
           IF CONTINUAR-REG EQUALS "S"
           PERFORM ABRIR-IO-ARCHIVO
           READ REG-LIBROS END-READ
           IF ESTA-REG THEN
               DISPLAY NOMBRE          AT LINE 2 COL 25
               DISPLAY EDITORIAL       AT LINE 3 COL 25
               DISPLAY ESTADO          AT LINE 4 COL 25
           END-IF
           DISPLAY "Numero de serie    :" AT LINE 1 COL 1
           DISPLAY LIBRO-ID            AT LINE 1 COL 25
 
           DISPLAY "Nombre    :"     AT LINE 2 COL 1 WITH REVERSE-VIDEO
           ACCEPT NOMBRE               AT LINE 2 COL 25
           DISPLAY "Nombre:    "       AT LINE 2 COL 1
           DISPLAY NOMBRE              AT LINE 2 COL 25
 
           DISPLAY "Editorial    :"  AT LINE 3 COL 1 WITH REVERSE-VIDEO
           ACCEPT EDITORIAL            AT LINE 3 COL 25
           DISPLAY "Editorial    :"    AT LINE 3 COL 1
           DISPLAY EDITORIAL           AT LINE 3 COL 25
 
           DISPLAY "Estado    :"     AT LINE 4 COL 1 WITH REVERSE-VIDEO
           ACCEPT ESTADO               AT LINE 4 COL 25
           DISPLAY "Estado    :"       AT LINE 4 COL 1
           DISPLAY ESTADO              AT LINE 4 COL 25
      *************************************************************************
           IF N-ESTA-REG THEN
               WRITE DATOS-LIBRO END-WRITE
           ELSE
               REWRITE DATOS-LIBRO END-REWRITE
           END-IF
           IF NOT ESTA-REG THEN
               PERFORM LIMPIAR-PANTALLA
               DISPLAY "ERROR AL REGISTRAR DATOS" AT LINE 1 COL 1
                                           WITH BACKGROUND-COLOR 4
           PERFORM CERRAR-ARCHIVO
           END-IF.
 
 
       VER-LIBROS.
           PERFORM ABRIR-ARCHIVO-INPUT.
           IF F-NOEXISTE-REG THEN
               PERFORM LIMPIAR-PANTALLA
               DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS"
                       WITH BACKGROUND-COLOR 4 AT LINE 1 COL 1
 
 
 
               DISPLAY "Presione ENTER para salir al menu"
                                               AT LINE 7 COL 12 WITH
                                               REVERSE-VIDEO
               ACCEPT OPC AT LINE  10 COL 34
           ELSE
               PERFORM LIMPIAR-PANTALLA
               INITIALIZE LIBRO-ID
               START REG-LIBROS KEY IS >= LIBRO-ID END-START
               READ REG-LIBROS NEXT RECORD END-READ
               DISPLAY
               "ID |TITULO            |EDITORIAL          |ESTADO     "
               WITH REVERSE-VIDEO AT LINE 1 COL 1
               PERFORM VARYING N FROM 02 BY 1 UNTIL FIN-REG
                   DISPLAY DATOS-LIBRO AT LINE N COL 1
                   READ REG-LIBROS NEXT RECORD END-READ
               END-PERFORM
               ADD 1 TO N
               DISPLAY "Presione ENTER para salir al menu"
                                               AT LINE N COL 1 WITH
                                               REVERSE-VIDEO
               ACCEPT OPC AT LINE N COL 34
 
           END-IF.
           PERFORM CERRAR-ARCHIVO.
 
       ELIMINAR-LIBRO.
           PERFORM ABRIR-IO-ARCHIVO.
           PERFORM LIMPIAR-PANTALLA.
           MOVE SPACES TO DATOS-LIBRO
 
           DISPLAY "Indique por id el libro que desea eliminar:"
           WITH REVERSE-VIDEO AT LINE 1 COL 1.
           DISPLAY "Presione ENTER para salir al menu"
           WITH REVERSE-VIDEO AT LINE 7 COL 12.
 
           ACCEPT LIBRO-ID AT LINE 1 COL 46 WITH PROMPT UNDERLINE UPDATE.
 
           IF LIBRO-ID NOT EQUALS 000
 
           PERFORM LIMPIAR-PANTALLA
 
           START REG-LIBROS KEY IS >= LIBRO-ID
           READ REG-LIBROS END-READ
           IF ESTA-REG
               DISPLAY
               "ID |TITULO            |EDITORIAL         |ESTADO     "
                                   WITH REVERSE-VIDEO AT LINE 1 COL 1
               DISPLAY DATOS-LIBRO AT LINE 2 COL 1
               DISPLAY "ELIMINAR(1)|VOLVER(0) :" AT LINE 5 COL 1
                                                   WITH REVERSE-VIDEO
 
               ACCEPT ELIMINAR-OPC AT LINE 5 COL 25
               EVALUATE ELIMINAR-OPC
                   WHEN 1
                   DISPLAY LIMPIAR-LINEA AT LINE 10 COL 1
                   DELETE REG-LIBROS INVALID KEY
                       DISPLAY "ERROR AL ELIMINAR" AT LINE 5 COL 1
                   END-DELETE
                   DISPLAY "REGISTRO ELIMINADO CON EXITO" AT LINE 5
                                                COL 1
                                                WITH BACKGROUND-COLOR 2
                           ACCEPT OPC AT LINE 5 COL 29
                   WHEN 0 PERFORM ELIMINAR-LIBRO
           ELSE
               DISPLAY "EL REGISTRO NO EXISTE" AT LINE 1 COL 1
                                           WITH BACKGROUND-COLOR 4
                           ACCEPT OPC AT LINE 1 COL 22
           END-IF
 
           END-IF.
           PERFORM CERRAR-ARCHIVO.
 
 
       CREAR-ARCHIVO.
           PERFORM ABRIR-IO-ARCHIVO
           IF NOT F-NOEXISTE-REG THEN
               PERFORM LIMPIAR-PANTALLA
               DISPLAY "SE DETECTO UN ARCHIVO EXISTENTE, DE PROCEDER EL"
               AT LINE 1 COL 1 WITH BACKGROUND-COLOR 6
               " ARCHIVO ACTUAL SERA ELIMINADO" AT LINE 1 COL 48
                               WITH BACKGROUND-COLOR 6
               DISPLAY "ELIMINAR(1)|SALIR AL MENU(0) :" AT LINE 10 COL 1
                                                   WITH REVERSE-VIDEO
               ACCEPT ELIMINAR-OPC AT LINE 10 COL 31
               EVALUATE ELIMINAR-OPC
                   WHEN 1
                   PERFORM CERRAR-ARCHIVO
                   OPEN OUTPUT REG-LIBROS
                   PERFORM CERRAR-ARCHIVO
                   PERFORM LIMPIAR-PANTALLA
                   DISPLAY "ARCHIVO CREADO CON EXITO."
                                               WITH BACKGROUND-COLOR 2
                   ACCEPT OPC AT LINE 1 COL 27
                   WHEN 0 PERFORM CERRAR-ARCHIVO EXIT
           ELSE
               OPEN OUTPUT REG-LIBROS
               CLOSE REG-LIBROS
               PERFORM LIMPIAR-PANTALLA
               DISPLAY "ARCHIVO CREADO CON EXITO."
                                               WITH BACKGROUND-COLOR 2
               ACCEPT OPC AT LINE 1 COL 27
           END-IF.
 
       BUSCAR-LIBRO.
           PERFORM LIMPIAR-PANTALLA.
           PERFORM ABRIR-ARCHIVO-INPUT
           IF NOT F-NOEXISTE-REG
               DISPLAY "MENU DE BUSQUEDA"          AT LINE 1 COL 1
                                               WITH REVERSE-VIDEO
               DISPLAY "(I)Busqueda por id"        AT LINE 3 COL 1
               DISPLAY "(N)Busqueda por nombre"    AT LINE 4 COL 1
               DISPLAY "(E)Busqueda por editorial" AT LINE 5 COL 1
               DISPLAY "Ingrese opcion( )"         AT LINE 7 COL 1
                                               WITH REVERSE-VIDEO
               ACCEPT BUSCAR-OPC AT LINE 7 COL 16
               IF BUSCAR-OPC EQUALS "i" MOVE "I" TO BUSCAR-OPC END-IF
               IF BUSCAR-OPC EQUALS "n" MOVE "N" TO BUSCAR-OPC END-IF
               IF BUSCAR-OPC EQUALS "e" MOVE "E" TO BUSCAR-OPC END-IF
               PERFORM CERRAR-ARCHIVO
               EVALUATE BUSCAR-OPC
               WHEN "I"
               PERFORM BUSCAR-ID
               WHEN "N"
               PERFORM BUSCAR-NOMBRE
               WHEN "E"
               PERFORM BUSCAR-EDITORIAL
               END-EVALUATE
 
           ELSE
               DISPLAY "ERROR, NO EXISTE UN ARCHIVO DE REGISTROS"
                                 AT LINE 1 COL 1 WITH BACKGROUND-COLOR 4
               ACCEPT OPC AT LINE 1 COL 43
           END-IF.
      *************************************************************************
      *BLOQUE DE CODIGO DE BUSQUEDAS
      *************************************************************************
       BUSCAR-ID.
           PERFORM LIMPIAR-PANTALLA.
           MOVE SPACES TO DATOS-LIBRO
           DISPLAY "Codigo:   " AT LINE 2 COL 1 WITH REVERSE-VIDEO
           DISPLAY
           "-----------------------------------------------------"
                                               AT LINE 3 COL 1.
 
           DISPLAY
               "ID |TITULO            |EDITORIAL         |ESTADO     "
                                   WITH REVERSE-VIDEO AT LINE 4 COL 1
           ACCEPT LIBRO-ID AT LINE 2 COL 13 WITH PROMPT UNDERLINE UPDATE
           MOVE LIBRO-ID TO AUX-ID
           START REG-LIBROS KEY IS >= LIBRO-ID
           READ REG-LIBROS END-READ
           IF ESTA-REG
               PERFORM VARYING N FROM 01 BY 1 UNTIL FIN-REG OR
                                                   LIBRO-ID > AUX-ID
                   DISPLAY DATOS-LIBRO AT LINE 5 COL 1
                   READ REG-LIBROS NEXT RECORD END-READ
               END-PERFORM
           ELSE
               DISPLAY "EL REGISTRO NO EXISTE" AT LINE 5 COL 1
                                               WITH BACKGROUND-COLOR 4
           END-IF.
           ACCEPT OPC AT LINE 6 COL 1.
           PERFORM CERRAR-ARCHIVO.
      *13
       BUSCAR-NOMBRE.
           PERFORM LIMPIAR-PANTALLA.
           PERFORM ABRIR-ARCHIVO-INPUT.
 
           DISPLAY "Titulo:   " AT LINE 2 COL 1 WITH REVERSE-VIDEO
           DISPLAY
           "-----------------------------------------------------"
                                               AT LINE 3 COL 1.
 
           DISPLAY
               "ID |TITULO            |EDITORIAL         |ESTADO     "
                                   WITH REVERSE-VIDEO AT LINE 4 COL 1.
           ACCEPT DESDE AT LINE 2 COL 14.
           MOVE DESDE TO NOMBRE.
           MOVE NOMBRE TO HASTA.
      *    DISPLAY HASTA AT LINE 1 COL 1
 
           START REG-LIBROS KEY IS >= NOMBRE END-START.
           READ REG-LIBROS NEXT RECORD END-READ.
              DISPLAY FS-REGISTRO-LIBROS AT LINE 1 COL 1.
           IF N-ESTA-REG
               DISPLAY "EL REGISTRO NO EXISTE" AT LINE 5 COL 1
                                               WITH BACKGROUND-COLOR 4
               ACCEPT OPC AT LINE 5 COL 22
           ELSE
 
               PERFORM VARYING N FROM 01 BY 1 UNTIL FIN-REG OR
                                                      NOMBRE > HASTA
                   DISPLAY DATOS-LIBRO AT LINE 5 COL 1
                   READ REG-LIBROS NEXT RECORD END-READ
               END-PERFORM
           ADD 1 TO N
           ACCEPT OPC AT LINE 6 COL 1
 
           END-IF.
           PERFORM CERRAR-ARCHIVO.
 
       BUSCAR-EDITORIAL.
           PERFORM LIMPIAR-PANTALLA.
           MOVE SPACES TO DATOS-LIBRO
           DISPLAY "Editorial:   " AT LINE 2 COL 1 WITH REVERSE-VIDEO
           DISPLAY
           "-----------------------------------------------------"
                                               AT LINE 3 COL 1.
 
           DISPLAY
               "ID |TITULO            |EDITORIAL         |ESTADO     "
                                   WITH REVERSE-VIDEO AT LINE 4 COL 1.
           ACCEPT DESDE AT LINE 2 COL 16.
           MOVE DESDE TO EDITORIAL.
 
           START REG-LIBROS KEY IS >= EDITORIAL END-START.
           READ REG-LIBROS NEXT RECORD END-READ.
           PERFORM VARYING N FROM 05 BY 1 UNTIL FIN-REG OR
                                               EDITORIAL > DESDE
               IF EDITORIAL EQUALS DESDE
                   MOVE 1 TO EXISTE
               ELSE
                   MOVE 0 TO EXISTE
               END-IF
      *     add 1 to nn
               DISPLAY DATOS-LIBRO AT LINE N  COL 1
               READ REG-LIBROS NEXT RECORD END-READ
           END-PERFORM.
      *     display nn at line 10 col 1.
      *     accept opc at line 11 col 1.
           IF EXISTE EQUALS 0
               DISPLAY "EL REGISTRO NO EXISTE" WITH BACKGROUND-COLOR 4
                                               AT LINE 5 COL 1
               MOVE 5 TO N
           END-IF.
 
           ACCEPT OPC AT LINE N COL 1
           PERFORM CERRAR-ARCHIVO.
      *************************************************************************
       LIMPIAR-PANTALLA.
           PERFORM VARYING N FROM 01 BY 1 UNTIL N>24
               DISPLAY LIMPIAR AT LINE N COLUMN 1
           END-PERFORM.
 
       ABRIR-ARCHIVO-INPUT.
           OPEN INPUT REG-LIBROS.
 
       ABRIR-IO-ARCHIVO.
           OPEN I-O REG-LIBROS.
 
       CERRAR-ARCHIVO.
           CLOSE REG-LIBROS.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de FERNANDO
Val: 24
Ha aumentado 1 puesto en Cobol (en relación al último mes)
Gráfica de Cobol

Problemas con File-Status

Publicado por FERNANDO (26 intervenciones) el 07/08/2023 17:47:46
Hola Lucas,
Para este caso debes usar el STATUS 46, se esta posicionando mas allá de los registros ingresados.
puedes usar el invalid key en el START or el STATUS 46, según ejemplo que dejo.

MOVE 0 TO SW-EXISTE
START REG-LIBROS KEY IS = NOMBRE
INVALID KEY
MOVE 1 TO SW-EXISTE
NOT INVALID KEY
READ REG-LIBROS NEXT RECORD END-READ
END-START.
DISPLAY FS-REGISTRO-LIBROS AT LINE 1 COL 1.
IF B OR SW-EXISTE = 1
DISPLAY "EL REGISTRO NO EXISTE" AT LINE 5 COL 1
ACCEPT OPC AT LINE 5 COL 22
ELSE
PERFORM VARYING N FROM 01 BY 1 UNTIL FIN-REG OR
NOMBRE > HASTA
DISPLAY DATOS-LIBRO AT LINE 5 COL 1
READ REG-LIBROS NEXT RECORD END-READ
END-PERFORM
ADD 1 TO N
ACCEPT OPC AT LINE 6 COL 1
END-IF.
PERFORM CERRAR-ARCHIVO.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar