Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Variables Globales (https://www.clubdelphi.com/foros/showthread.php?t=25292)

Abel Garcia 18-09-2005 19:49:17

Variables Globales
 
Hola, Estoy utilizando FireBird 1.5 y me gustaria saber si
Es posible Crear un variable de tipo global. En otras palabras
una variable que pueda contener un valor el cual pueda ser modificado o almacenado en distinos procedimientos ?

Ejemplo:
Tengo un Procedimiento al cual deseo que reciva como parametro una variable
esta variable la quiero almacenar en esta variable de tipo Global,
el cual a su vez cuando el un triger por ejemplo el de update de una tabla se ejecute se pueda leer el valor de la variable Global y asi tomar un desicion en el procedimiento Update.

Es posible hacer esto ?

Gracias por su ayuda...

Crandel 18-09-2005 20:01:39

Podes hacerlo con un generador, si la varibale que queres almacenar es un entero.

O podes crear una tabla con varibles de configuración y almacenarla ahi.

Que es lo que queres realizar exactamente, por ahi se puede solucionar de otra forma, como con new y old?

Abel Garcia 18-09-2005 20:05:50

Gracias Crandel
Como podria lograrlo utilizando Un Generador, de echo si es una variable entera la que deseo guardar, esta es solo para poder bifurcar en el codigo de el Update de la tabla.
Gracias

Crandel 18-09-2005 20:44:51

un generator se puede crear asi:
Código SQL [-]
create generator VAR_GLOBAL;
le podes asignarle un valor directo:
Código SQL [-]
// DDL
set generator VAR_GLOBAL to valor;
// DML
VAL = GEN_ID (VAR_GLOBAL, valor - GEN_ID (VAR_GLOBAL,0));
incrementar o decrementar su contenido
Código SQL [-]
VAL = gen_id(VAR_GLOBAL, 1);
// o
VAL = gen_id(VAR_GLOBAL, -1);
tomar el valor:
Código SQL [-]
VAL = gen_id(VAR_GLOBAL, 0);

Abel Garcia 18-09-2005 21:06:28

Otra vez muchas gracias Crandel

Solo me queda un duda mas :

en mi procedimiento como puedo ejecutar esta sentensia:

// DDL
set generator VAR_GLOBAL to valor;

es un procedimiento de Firebird 1.5 y me manda error de compilacion cuando intento
insertarla en el codigo del procedimiento ?

O como podria ejecutarla desde mi procedimiento , por ejemplo en el procedimiento de Update de la tabla para resetear el Generador.

Crandel 18-09-2005 21:25:43

Justamente no se puede porque es DDL (Data Definition Language) o Lenguaje
de Definición de Datos. Solo se puede usar cuando uno lo esta definiendo.

por eso te puese una segunda opción DML (Data Manipulation Language), que puedes ejecutar dentro de tu procedimiento, donde VAL es una variable definida dentro del procedimiento, puede ser el valor de return o definida asi:
Código SQL [-]
DECLARE VARIABLE VAL INTEGER;
y valor es el valor que le queres asignar.

Dado que no hay una forma directa de modificar un generador hago uso de una función interna gen_id.

En resumen lo que hace esta forma es sumarle el valor que queres menos el valor que tenia = valor que queres :D

Abel Garcia 18-09-2005 22:07:23

Oki doki, Muchas Gracias por tu ayuda....
con esto todo queda Ok.

afxe 19-09-2005 10:55:54

Hola...

Solo una aclaración: No sé en qué situación se va a ejecutar tu programa (nº de accesos concurrentes, declaracion explicita de transacciones, etc...) pero debes tener en cuenta que los Generators se han usado tradicionalmente para mantener contadores en rutinas multiusuarios: Puedes usar un SELECT MAX(Codigo) para sacar el valor máximo de una tabla y coger el siguiente para dar de alta tu registro, pero si hay otro usuario realizando la misma operación en la misma transacción vas a obtener un bonito mensaje de Clave Duplicada. Para evitar esto están los Generators (bien usandos, como todo). ¿Por qué te suelto este rollo? Porque si hay dos usuarios que lanzan simultáneamente el procedimiento almacenado que dices, se van a ir cambiando el uno al otro el valor de dicho Generator, dando errores incomprensibles en la fase de implantación, que es donde más duele la cabeza y el ego.

Ignora este comentario si estás haciendo un programa monousuario.

Saludos.

rastafarey 26-09-2005 15:20:59

Resp
 
Mira ya se que estas usando la version 1.5 a mi tambien me surgio esa duda y la solucione con tablas pero no es muy buena. La solucion perfecta la tiene firebird 2.0 pero aun no hay un version estable.

Esta version de firebird si soluciona esto de un avez y po siemrpe ya pose un deposito de variables.

El problema con los generadores es que dependiendo del suso d eaplicacion deben existri por secion o traccion osea que seria toda una odicea manejarlo ha teieniendo en cuenta otra cosa que dependiendo si era apra controlar algo como cliente o id de usuarios cada coneccion debes verificar si la cosa finalizaron bien y de verda el valor que quedo era el que debia existir ya sabes por eso de si la db no se cerro como debia ser o se callo por problemas electricos o x. Cosa que con el deposito de variable no pasa ya que una vez que se establece una nuewv aconeccion estas vaiables desaparecenbueno excepto las que estan es el deposito de sistemas que se recrean pos cada coneccion que se estableza.

Espero que te sirva de ayuda aunque dije mas cosas de las que preguntaste pero esa es la idea que la decision final final la tomes tu mismo o tu misma.


La franja horaria es GMT +2. Ahora son las 16:17:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi