Progress - Desconectar Base de Datos

   
Vista:

Desconectar Base de Datos

Publicado por miguelocar (15 intervenciones) el 11/01/2016 15:06:54
Tengo el siguiente problema, estoy trabajando con una Base de datos y una opcion de mi sistema necesito conectarme a otra base de datos que esta en otro servidor para traer informacion, pero el problema que cuando salgo de la opcion no desconecta la segunda base de datos y me trae problemas.
El codigo es:

/* conecto la segunda Base de Datos */
connect BDG -N TCP -H 192.168.0.5 -S PRCENTRO -U cadena -ld BASE2.

/* busco la informacion en la segunda base de datos */
run ../stk/stkrec50.p.

/* desconecto la base de datos 2 */
disconnect BASE2.

La cuestion es que no da ningun error pero no me desconecta la BASE2 y si vuelo a ingresar a esta opcion, me da el mensaje que ya existe una Base de Datos conectada.
Que estoy haciendo mal ? Muchas Gracias.
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 Alejandro Rodriguez Zavala

Desconectar Base de Datos

Publicado por Alejandro Rodriguez Zavala alerodzav@hotmail.com (63 intervenciones) el 12/01/2016 04:08:05
Prueba con el siguiente código sustituyendo el nombre lógico de la base de datos del ejemplo, para saber que mensaje de error te manda.
1
2
3
4
5
6
7
8
9
10
11
12
13
CONNECT "db-xyz" NO-ERROR.
RUN chk-connect NO-ERROR.
IF ERROR-STATUS:ERROR THEN   MESSAGE "Run statement failed.".
 
PROCEDURE chk-connect:
      DEFINE VARIABLE connect-ok AS LOGICAL NO-UNDO INITIAL TRUE.
     IF ERROR-STATUS:ERROR THEN DO:    MESSAGE "Connect failed.".
          connect-ok = FALSE NO-ERROR.
          IF ERROR-STATUS:ERROR THEN
               MESSAGE "Assignment failed.".
         END.     IF connect-ok THEN RETURN "OK".
    ELSE RETURN "FAILED".
END PROCEDURE.


Puedes utilizar el siguiente código para visualizar los errores ocultos.

defines la variable ix.
haces el connect.
ejecutas los procedimientos x.
hacer disconnect y después metes el código de abajo.

1
2
3
4
5
6
7
8
IF ERROR-STATUS:ERROR AND ERROR-STATUS:NUM-MESSAGES > 0
       THEN DO:
                 MESSAGE ERROR-STATUS:NUM-MESSAGES         " errors occurred during disconection." SKIP
                 "Do you want to view them?"         VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO         UPDATE view-errs AS LOGICAL.
     IF view-errs THEN
        DO ix = 1 TO ERROR-STATUS:NUM-MESSAGES:
             MESSAGE ERROR-STATUS:GET-NUMBER(ix) ERROR-STATUS:GET-MESSAGE(ix).
        END.    END.

Ya verificando el o los errores , si no le pegas me dices.

Espero sea de tu utilidad y en caso de serlo dame la retro.

Saludos y a tus ordenes.
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

Desconectar Base de Datos

Publicado por miguelocar (15 intervenciones) el 12/01/2016 17:46:02
Muchas Gracias Alejandro por tu respuesta, te cuento que hice lo que me dijiste:

1) primero utilice el primer codigo y no me tire ningun error porque se conecta correctamente, lo que puse fue asi:

connect BDG -N TCP -H 192.168.0.5 -S PRCENTRO -U cadena -ld BASE2 no-error.

RUN chk-connect NO-ERROR.
IF ERROR-STATUS:ERROR THEN MESSAGE "Run statement failed.".

PROCEDURE chk-connect:
DEFINE VARIABLE connect-ok AS LOGICAL NO-UNDO INITIAL TRUE.

IF ERROR-STATUS:ERROR THEN
DO:
MESSAGE "Connect failed.".
connect-ok = FALSE NO-ERROR.

IF ERROR-STATUS:ERROR THEN MESSAGE "Assignment failed.".
END.

IF connect-ok THEN RETURN "OK".
ELSE RETURN "FAILED".
END PROCEDURE.

2) Luego hice el codigo 2 que me enviaste y quedo asi:

def var ix as integer.

connect BDG -N TCP -H 192.168.0.5 -S PRCENTRO -U cadena -ld BASE2 no-error.

run ../stk/stkrec50.p no-error.

disconnect BASE2 no-error.

IF ERROR-STATUS:ERROR AND ERROR-STATUS:NUM-MESSAGES > 0 THEN
DO:
MESSAGE ERROR-STATUS:NUM-MESSAGES
" errors occurred during disconection." SKIP
"Do you want to view them?" VIEW-AS ALERT-BOX
QUESTION BUTTONS YES-NO UPDATE view-errs AS LOGICAL.
IF view-errs THEN
DO ix = 1 TO ERROR-STATUS:NUM-MESSAGES:
MESSAGE ERROR-STATUS:GET-NUMBER(ix)
ERROR-STATUS:GET-MESSAGE(ix).
END.
END.


En este ultimo caso no me muestra ningun message de error, pero la base sigue conectada como le puse no-error al connect, cuando vuelvo a ingresar no me tira el error que la base esta conectada, pero si le saco el no-error al connect me dice:

┌──────────────────────────── Error ─────────────────────────────┐
│ ** Warning -- La Base de Datos BASE2 ya estß conectada. (1012) │
│ │
│ ────────────────────────────────────────────────────────────── │
│ <OK> │
────────────────────────────────────────────────────────────────┘

Por lo que entiendo no me hace el disconnect, pero no lo raro es que si lo ejecuto desde el editor me funciona porque se termina la ejecucion del programa y ahi se cancelan las conecciones que haya hecho, pero si lo cuelgo desde el menu de mi sistema queda abierta la coneccion. Parece que solo me funciona si ejecuto un QUIT y ahi cierra la coneccion, pero no es lo que necesito.
Muchas gracias por la ayuda
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
Imágen de perfil de Alejandro Rodriguez Zavsala

Desconectar Base de Datos

Publicado por Alejandro Rodriguez Zavsala (63 intervenciones) el 12/01/2016 19:25:09
Estimado amigo,

Esta es la recomendación que sugiere progress que hagas en tu caso:

Status: Unverified

SYMPTOM(s):

DISCONNECT statement does not actually disconnect from the database

Application makes use of classes which contain static properties and
methods

Other methods in the classes have references to database tables

** Warning -- database <name> is already connected. (1012)

Database physical names <name> and <name> do not match. No connect.
(1018)

FACT(s) (Environment):

OpenEdge 10.1C
OpenEdge 10.2A
All Supported Operating Systems

CAUSE:

The OpenEdge Development: Object-oriented Programming manual states
that once a static property or method of a class is accessed the class
is loaded into memory and stays there for the rest of the session.
Given this, if the class has references to tables in the database you
are trying to disconnect then disconnect statement will pend until
such time as there are no more references to tables in the database.
Given that static classes hang around for the entire session once they
are referenced for the first time it is not possible to get the
disconnect statement to complete its task while the static classes
have hard coded references to the database.

FIX:

Modify the code to use dynamic database objects and ensure that each
method creates the needed buffers, uses them then deletes them before
exiting from the method. Doing this will allow the disconnect
statement to work as desired.


Saludos. !!
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
Imágen de perfil de Alejandro Rodriguez Zavsala

Desconectar Base de Datos

Hola Mike,

Te sugiero que cheques en tus aplicaciones si tienes procesos persistentes de los cuales hagan referencias a tablas y que al momento de cerrar tu aplicación estos no queden activos, esto puede ser que si alguno de estos ocasione que la base de datos no se desconecte.

Por otra parte si deseas consultoría presencial dime y me pongo a tus ordenes.


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