Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Unhappy 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...
Responder Con Cita
  #2  
Antiguo 18-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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?
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 18-09-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 18-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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);
__________________
[Crandel]
Responder Con Cita
  #5  
Antiguo 18-09-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 18-09-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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
__________________
[Crandel]
Responder Con Cita
  #7  
Antiguo 18-09-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Oki doki, Muchas Gracias por tu ayuda....
con esto todo queda Ok.
Responder Con Cita
  #8  
Antiguo 19-09-2005
afxe afxe is offline
Miembro
 
Registrado: jul 2004
Ubicación: Malaga-España
Posts: 273
Poder: 20
afxe Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 26-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:15:04.


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
Copyright 1996-2007 Club Delphi