Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-11-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.700
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
El problema es que desconoces cómo funcionan los triggers, por eso te estás liando. Lo primero es entender el funcionamiento de los mismos, revisa el capítulo 23 de La cara oculta de Delphi, habla de "Stored procedure y triggers". Concretamente el apartado " Las variables new. y old. ".
Es sencillo, pero hay que tener los conceptos claros.
Responder Con Cita
  #2  
Antiguo 10-11-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
fjcg02 Va camino a la fama
De memoria... con errores sintácticos y demás...

Código SQL [-]
CREATE TRIGGER Afiliacion_New_Reg FOR Afiliacion
ACTIVE BEFORE INSERT
  POSITION 0
AS
DECLARE WCODPRV AS INTEGER;
BEGIN
  IF (NEW.Codigo IS NULL) THEN 
  NEW.Codigo = GEN_ID(ID_Afiliacion, 1);
  IF (NEW.CodPrv  IS NULL) THEN 
  BEGIN
     SELECT FIRST CODPRV FROM TABLAPARAMETROS 
     WHERE PARAMETRO='PROVINCIA' 
     INTO :WCODPRV
     NEW.CodPrv = WCODPRV;
  END
END;

Ahora, te hace falta leer mucho, tal y como te ha remoendado Casimiro.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 10-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Gracias a los dos. Partiendo de la base de que efectivamente estoy aprendiendo a usar triggers y strored procedures; leí el capítulo que me indicáis de la Cara oculta de Builder y mucha información que he encontrado, especialmente en Teoría y Práctica sobre Firebird. Pero en todo lo que he leído no me aclara la duda que tengo.

A ver si lo he entendido bien, y perdonad si soy un pesado: En el código que pone de ejemplo fjcg02 se busca un valor en la tabla de parámetgros (SELECT FIRST ...) pero es que no es el caso que yo planteo. Yo ya sé cual es el valor de ese campo (pongamos por ejemplo, ya que resido en Toledo, el 45); por lo tanto no tengo que buscar cuál es su valor, y esa es mi pregunta: ¿Cómo le digo al trigger o al procedimiento que el código provincial es 45?

El otro día Casimiro me sugería un código:
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Código PHP:
CREATE PROCEDURE GEN_AFILIACION ( iProvincia INTEGER )
RETURNS (CODIGO INTEGER) 
AS
BEGIN
   Codigo 
= iProvincia || GEN_ID(ID_Afiliacion, 1); 
END 
Pero sigo sin entender, y por más que he leído no lo entiendo, como decirle a ese procedimiento que iProvincia vale 45. Y reitero mis dusculpas por ser tan bruto.
Responder Con Cita
  #4  
Antiguo 10-11-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.700
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Es que hay muchas formas de hacerlo y no sabemos cómo lo estás haciendo tú.
Supongamos que grabas el registro desde delphi/builder.
Código SQL [-]
insert into afiliacion (codproveedor, nombre) values (45,'Alguien')
El trigger before insert sabe qué código de proveedor estás grabando, el 45, no tienes que hacer nada.
Ummm... sigo sin entender el problema
Responder Con Cita
  #5  
Antiguo 10-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
El trigger before insert sabe qué código de proveedor estás grabando, el 45, no tienes que hacer nada.
Ummm... sigo sin entender el problema
Gracias. Ahora sí me has resuelto la duda.
Responder Con Cita
  #6  
Antiguo 10-11-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is online now
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.700
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Ten en cuenta que los triggers se "disparan" automáticamente. Una vez programados no hay que preocuparse por ellos, hacen el trabajo repetitivo y pesado, no se interactua con ellos desde delphi/builder, son independientes.
Por ejemplo, en el ejemplo anterior que he puesto (el insert), el trigger tiene acceso al registro que se está creando. Si necesitas hacer algo con el codprov, su valor está en new.codprov

Código SQL [-]
CREATE TRIGGER Afiliacion_New_Reg FOR Afiliacion
ACTIVE BEFORE INSERT
  POSITION 0
AS
  DECLARE WCODPRV AS INTEGER;
BEGIN
  IF (new.Codigo IS NULL) THEN new.Codigo = GEN_ID(ID_Afiliacion, 1);
  IF (new.CodPrv = 45) THEN 
  BEGIN
     /* hacer aquí lo que sea cuando sea un proveedor de la provincia 45 */
  END
END;

En los triggers Before/After update tienes disponible las variables new. y old.
Ejemplo, automáticamente vamos a mudar a los proveedores de Madrid hacia Toledo:
trigger before update ...
Código SQL [-]
if old.codigo=28 then new.codigo=45

Depende si es un trigger insert/update/delete tienes a disposición solamente new. / old. y new. / solamente old.
Responder Con Cita
  #7  
Antiguo 10-11-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
fjcg02 Va camino a la fama
Aqui el tema es que si pones a piñón el valor de la provincia, tendrás que tener un trigger diferente para cada BBDD de cada provincia.

Si coges el codigo de una tabla de parámetros, el trigger siempre será igual, y sólo tendrás que poner una pantalla de configuración que posibilite cambiar el valor para cambiarlo. Incluso podrías tener una tabla de provincias para hacer la selección más fácil.

Creo que es más fácil hacerlo así de cara al futuro mantenimiento de la BBDD y/o aplicación que acordarse de que hay que cambiar el trigger y poner el código correspondiente. Creo que es un ejemplo de la típica decisión chunga que haces al principio de la que luego te arrepientes toda la vida... , generalmente después de cagarla alguna vez que otra.

Cada uno puede hacer lo que quiera, pero ya tengo una cana, y más sabe el zorro por viejo que por zorro.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Usar objetos con variables. jularaXD Varios 3 14-05-2013 11:06:20
En que momentos usar variables? Gerson12 Varios 13 08-05-2012 03:49:43
procedure con parametros variables rruffino SQL 1 05-03-2009 01:58:55
usar un procedure en varios formularios adonai Varios 21 30-03-2007 17:42:34
Número máximo de variables en un Procedure Ana Tudela Firebird e Interbase 0 26-04-2005 12:32:35


La franja horaria es GMT +2. Ahora son las 10:44:37.


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