Pensemos en la típica estructura de un programa Cobol:
INICIO
TRATAMIENTO hasta <<fin-fichero-entrada>>
FIN
Dentro del párrafo FIN solemos tener el cierre de los ficheros utilizados por el programa (los de entrada y salida) y los display's necesarios para mostrar las estadísticas (si tienes costumbre de ponerlos para reflejar cuántos registros se han leído del fichero de entrada, cuántos registros se han grabado en el fichero de salida y alguna cosa más que resulte de interés).
Si el programa ha llegado al párrafo FIN y ha sido capaz tanto de cerrar correctamente los ficheros utilizados como de mostrar las estadísticas significa que el programa ha terminado correctamente. Pero necesitamos algo más para que el jcl donde se ejecuta se entere de que ese programa ha finalizado correctamente.
Y te preguntarás: "Y, ¿qué es lo que se necesita?". Pues la respuesta es muy sencilla. Incluir las siguientes dos sentencias:
MOVE ZEROS TO RETURN-CODE
GOBACK
Éste es todo el código que necesitas para indicar la correcta finalización del programa.
Ahora bien, imagínate que necesitas que el programa finalice con un código distinto (por ejemplo, un código de retorno 2) en determinadas situaciones como puede ser que el fichero de salida esté vacío o que el fichero de errores contenga información. Antes de que te preguntes cómo se hace te lo voy a contar ya. Se hace de la siguiente manera:
IF CONT-GRAB-FIC-SALIDA = 0
MOVE 2 TO RETURN-CODE
GOBACK
END-IF
IF CONT-GRAB-FIC-ERRORES > 0
MOVE 2 TO RETURN-CODE
GOBACK
END-IF
OJO!!! Las líneas de código que acabamos de indicar como ejemplo para finalizar el programa con un código de retorno distinto de 0 se deben codificar en el programa antes que las otras líneas de código de finalización correcta. Y, ¿por qué? Porque si invertimos el orden y pusiéramos primero el código que indica la correcta finalización del programa, siempre finalizaríamos el programa correctamente y NUNCA devolvería el código de retorno 2 aunque se cumplan las casuísticas indicadas.