Iniciar Sesión

Ver la Versión Completa : [Duda] I/O Error al ejecutar una base de datos


DestinedBroken
30 de noviembre de 2021, 17:28
Hola comunidad,

Estoy empezando a trabajar con bases de datos en Cobol y este es mi primer ejercicio. Es muy sencillo. Solamente se le pide al usuario que rellene una serie de campos para introducir una persona con sus atributos en un registro de la base. Lo extraño del código es que funcionar, funciona todo bien. Me introduce correctamente todo, pero al final, cuando le digo que no quiero seguir con el programa, es cuando me tira el error:

https://i.ibb.co/R9h3f8N/image.png

El código:


program-id. create-files as "primero bases de datos".

environment division.
configuration section.
input-output section.

file-control.
select optional empleados-archivo
assign to "f:\empleados.dat"
organization is line sequential.

data division.
file section.
fd empleados-archivo.
*label etiqueta-antigua-para-cintas.
01 empleados-registro.
05 empleados-id pic x(6).
05 empleados-nombre pic x(25).
05 empleados-apellidos pic x(35).
05 empleados-edad pic x(3).
05 empleados-telefono pic x(9).
05 empleados-direccion pic x(35).

working-storage section.
01 identificador pic x(36) value
-"Introduce un ID del nuevo empleado: ".
01 nombre pic x(33) value "Introduce un nombre de empleado:".
01 apellidos pic x(25) value "Introduce los apellidos:".
01 edad pic x(19) value "Introduce la edad:".
01 telefono pic x(33) value "Introduce un numero de telefono:".
01 direccion pic x(25) value "Introduce una direccion:".

01 si-no pic x.
01 entrada pic x.

procedure division.

program-begin.
perform procedimiento-de-apertura
move "s" to si-no
perform agregar-registros
until si-no = "n"
perform procedimiento-de-cierre

.

procedimiento-de-apertura.
open extend empleados-archivo
.

procedimiento-de-cierre.
close empleados-archivo
.

agregar-registros.
move "n" to si-no
perform obtener-campos
until entrada = "s"
perform escribir-registro
perform reiniciar
.

obtener-campos.
move space to empleados-registro
display identificador
accept empleados-id
display nombre
accept empleados-nombre
display apellidos
accept empleados-apellidos
display edad
accept empleados-edad
display telefono
accept empleados-telefono
display direccion
accept empleados-direccion
perform continuar

.

continuar.
move "s" to entrada
if empleados-nombre = space
move "n" to entrada
end-if
.

escribir-registro.
write empleados-registro
.

reiniciar.
display "Almacenar otro registro en la base de datos (s/n)??"
accept si-no
if si-no = "s"
move "s" to si-no
end-if
if si-no not = "s"
move "n" to si-no
end-if
.

end program create-files.

Kuk
30 de noviembre de 2021, 19:06
@DestinedBroken, hola amigo. Por lo pronto esto lo tendrás que modificar porque sinceramente no vale:


if si-no = "s"
move "s" to si-no
end-if
if si-no not = "s"
move "n" to si-no
end-if


Fíjate en el primer MOVE, piensa en el ELSE....

Luego por lo del error, me parece que es el momento de que uses el Debug, verás que chollo. Te muestra el contenido de los campos, puedes seguir la ejecución sentencia por sentencia.

Si aún encuentras dificultades, dímelo y te doy más pistas ;)

Fito
30 de noviembre de 2021, 22:38
Holaaaa:

Te está faltando el STOP RUN, después que corres la rutina de cierre. Porque sigue ejecutando las líneas de abajo.

Saludos

Fito...

DestinedBroken
1 de diciembre de 2021, 16:47
@Fito, Esta es una de las cosas que me he dado cuenta. Gracias compañero.

@Kuk, Paso a poner mi código mejorado. He quitado muchas cosas que no tenían sentido. Como rutinas de solo una línea de código. El trozo de código del if-else también lo he cambiado. Creo que ahora está mejor.

El problema está resuelto, pero no funciona cuando quiero meter más personas en la base de datos. Me explico:
https://i.ibb.co/y5811fH/image.png


program-id. create-files as "primero bases de datos".

environment division.
configuration section.
input-output section.

file-control.
select optional empleados-archivo
assign to "f:\empleados_escritura.dat"
organization is line sequential.

data division.
file section.
fd empleados-archivo.
*label etiqueta-antigua-para-cintas.
01 empleados-registro.
05 empleados-id pic x(6).
05 empleados-nombre pic x(25).
05 empleados-apellidos pic x(35).
05 empleados-edad pic x(3).
05 empleados-telefono pic x(9).
05 empleados-direccion pic x(35).

working-storage section.
01 identificador pic x(36) value
-"Introduce un ID del nuevo empleado: ".
01 nombre pic x(33) value "Introduce un nombre de empleado:".
01 apellidos pic x(25) value "Introduce los apellidos:".
01 edad pic x(19) value "Introduce la edad:".
01 telefono pic x(33) value "Introduce un numero de telefono:".
01 direccion pic x(25) value "Introduce una direccion:".

01 si-no pic x.
01 entrada pic x.

procedure division.

program-begin.
open extend empleados-archivo
* move "s" to si-no
perform agregar-registros until si-no = "n"
close empleados-archivo
stop run

.
agregar-registros.
* move "n" to si-no
perform obtener-campos until entrada = "s"
write empleados-registro
perform reiniciar
.

obtener-campos.
move space to empleados-registro
display identificador
accept empleados-id
display nombre
accept empleados-nombre
display apellidos
accept empleados-apellidos
display edad
accept empleados-edad
display telefono
accept empleados-telefono
display direccion
accept empleados-direccion
perform continuar

.

continuar.
move "s" to entrada
if empleados-nombre = space
display
"ERROR: No ha introducido un nombre para el empleado,"
- "vuelva a intentarlo"

move "n" to entrada
end-if
.

reiniciar.
display "Almacenar otro registro en la base de datos (s/n)??"
accept si-no
if si-no = "s"
move "s" to si-no

else
move "n" to si-no
end-if

.

end program create-files.

Kuk
1 de diciembre de 2021, 20:20
@DestinedBroken,


perform obtener-campos until entrada = "s"


Échale un vistazo a la lógica de esta parte. Cuando añades el primer registro, le pones la "s", en un momento dado tienes que limpiar el campo de la "s" porque queda ahí todo el rato.

Gusaiello
2 de diciembre de 2021, 11:52
@DestinedBroken, voy hacer una pregunta que parecerá muy tonta : haz hecho el diagrama antes de comenzar a codificar?

Por que este problema en un programa tan simple se detecta de inmediato siguiendo la lógica del diagrama.

DestinedBroken
3 de diciembre de 2021, 10:57
@Kuk, Gracias compa. Lo puse a vacío tras volver de meter los datos por consola. Ahora funciona todo correcto. Una tontería vaya....

@Gusaiello, diagrama? La primera vez que escucho eso. ¿Te refieres a dibujar en un papel lo que va a hacer el programa? Si es así, decir que el código es de un ejercicio hecho en un curso que estoy siguiendo. A mí me daba error cuando no debería, de ahí que lo haya intentado solucionar.

Kuk
4 de diciembre de 2021, 11:21
@DestinedBroken, una cosa más, esto son ficheros y no BBDD. Cuando hablamos de BBDD entendemos DB2, MySQL, SQL Server etc. Es decir cuando utilizamos SQL.
Esto son ficheros secuenciales. También existen los indexados, que son los abuelos de las BBDD ;)

Gusaiello
6 de diciembre de 2021, 10:51
diagrama? La primera vez que escucho eso
Si, exactamente a eso me refería.
En mis inicios aprendi que el primer paso para realizar un programa era comenzar por el diagrama.
Una vez hecho el diagrama, preparaba un lote de prueba que consistía en preparar un conjunto de datos que permitiera seguir todos los caminos del diagrama.
Y por último hacía la pruebaa de escritorio que consistía en hacer pasar los datos del lote de prueba por el diagrama.
Tal vez parezca un procedimiento algo tedioso, pero puedo garantizarte que a la hora de codificar, jamas me falló un programa ya que la lógica ya había sido probada.

DestinedBroken
2 de febrero de 2022, 11:00
@DestinedBroken, una cosa más, esto son ficheros y no BBDD. Cuando hablamos de BBDD entendemos DB2, MySQL, SQL Server etc. Es decir cuando utilizamos SQL.
Esto son ficheros secuenciales. También existen los indexados, que son los abuelos de las BBDD ;)

Hola,
Pues he dicho siempre "BBDD" porque es la terminología que usan en un cursillo que estoy siguiendo... Aunque teniendo en cuenta la ristra de fallos que estoy sacando, empiezo a pensar que no di precisamente con el mejor de todos los cursos. Gracias!

@Gusaiello
Sobre lo que comentas, intento presentar la idea del programa con lápiz y papel. Un poco de pseudo código y demás por el estilo. Pero cuando me pongo a programar como tal, lo que hago es probar también lo que he hecho con "tests" tontos. Las capturas mostradas en los hilos de ayuda que creo son precisamente de eso mismo. Para este ejercicio de la BBDD meto registros al más puro estilo "lorem ipsum" y ya.

Josber
2 de febrero de 2022, 11:06
empiezo a pensar que no di precisamente con el mejor de todos los cursos

Pues no, me parece que no es el mejor curso que hay por ahí :D:D

DestinedBroken
2 de febrero de 2022, 11:13
Pues no, me parece que no es el mejor curso que hay por ahí :D:D
Lo bueno es que me quedan pocos vídeos para terminarlo. Una vez hecho eso, me iré a otro mejor ����