Sub-rutinas estaticas VS dinamicas

Todo lo relacionado con Cobol en ambientes batch, online(CICS,IMS) con bases de datos(DB2, Adabas) etc.
Responder
Avatar de Usuario
Rubén Fernández
Usuario
Usuario
Mensajes: 13
Registrado: 18 Feb 2011, 15:06
País: Chile
Ciudad: Santiago
Ocupación: System Programmer

Sub-rutinas estaticas VS dinamicas

Mensaje por Rubén Fernández » 27 Sep 2011, 15:26

:duda:

Problema:
Programa principal ( P1) y sub-programa( S1) ambos en cobol enterprise bajo z/os
Descripcion :
P1 llama a S1 pasandole 5 parametros :

FUNCION: que puede ser OPEN, CLOSE, READ
LLAVE
REGISTRO
RC
FS

Ok,
La primera vez P1 llama a S1 pasandole como parametro opcion 'OPEN'
S1 verifica y procede a hacer OPEN INPUT de archivo
Retornamos RC = 0
FS = 00

de ahi en adelante S1 sera llamado varias veces para que devuelva registros con determinada llave
La última vez P1 llama a S1 pasandole como parametro opcion 'CLOSE'

Bien aqují viene la consula:
Cuando P1 llama a S1 con call estatico todo bien, no hay problema, pero
cuando p1 llama a S1 en forma dinámica, la primera vez bien
al primer read ( segunda Vez ) se cae por file status 47

Alguien sabe que puede estar pasando, al parecer despues del GOBACK de la pasada 'OPEN' como que se pierde el estado de archivo abierto.
Gracias
RFF

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 543
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Sub-rutinas estaticas VS dinamicas

Mensaje por Vicente » 28 Sep 2011, 09:58

Hola Rubén:
Mi experiencia en cobol es poca, pero mira lo que he leido en el manual de referencia del lenguaje,
cuando explica la sentencia GOBACK:

""In addition, the execution of a GOBACK statement in a called program that
possesses the INITIAL attribute is equivalent to executing a CANCEL statement
referencing that program.""

Después cuando explica la sentencia CANCEL, dice:

""The CANCEL statement ensures that the next time the referenced subprogram is
called it will be entered in its initial state.""

O sea que si tu programa S1 tuviera el atributo INITIAL, sería lógico que el fichero no lo vea abierto la segunda ejecución de S1.

INITIAL es un parámetro de la sentencia PROGRAM-ID de la IDENTIFICATION DIVISION.
Esto es lo que dice el manual sobre INITIAL:

INITIAL
Specifies that when program-name is called, program-name and any programs
contained within it are placed in their initial state. The INITIAL attribute is
not supported for programs compiled with the THREAD option.
A program is in the initial state:
The first time the program is called in a run unit
Every time the program is called, if it possesses the initial attribute
The first time the program is called after the execution of a CANCEL
statement referencing the program or a CANCEL statement referencing a
program that directly or indirectly contains the program
The first time the program is called after the execution of a CALL
statement referencing a program that possesses the initial attribute, and
that directly or indirectly contains the program.
When a program is in the initial state, the following occur:
The program's internal data contained in the working-storage section are
initialized
. If a VALUE clause is used in the description of the data item,
the data item is initialized to the defined value. If a VALUE clause is not
associated with a data item, the initial value of the data item is undefined.
Files with internal file connectors associated with the program are not in
the open mode.
The control mechanisms for all PERFORM statements contained in the
program are set to their initial states.
An altered GO TO statement contained in the program is set to its initial
state.

Saludos
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

naguzman
Usuario
Usuario
Mensajes: 5
Registrado: 07 Abr 2016, 12:11
País: Chile
Ciudad: Valparaiso
Ocupación: Programador

Re: Sub-rutinas estaticas VS dinamicas

Mensaje por naguzman » 07 Abr 2016, 16:27

Estimados,

Esta es mi primera pregunta y pido si cometo una falta me la indiquen.

En nuestra empresa trabajamos con COBOL estandar y accesos a base de datos DATACOM.
Al realizar una subrutina Batch esta queda embebida en el objeto llamador y se ejecuta sin ningun problema, pero al momento de modificarla tengo que volver a recompilar el programa.

Encontre por internet que la solucion es nitroducir el literal 'programa llamado' en una variable y realizar el CALL con esta variable, efectivamente esto resulto retornando variables modificadas y realizando DISPLAYs, pero no me permite en la subrutina ejecutar la instruccion CALL ''DBNTRY'' para tener acceso a base de datos.

Como lograste tu utilizar la opcion Open o Read llamandola dinamicamente, se cae el programa inmediatamente

Alguno de uds me podria ayudar
de antemano muchas gracias.

Responder