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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-08-2016
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
trigger y ¿Quien los dispara?

Buenas amigos del Foro; aquí les traigo una consulta sobre Disparadores en Firebird.

De antemano decirles gracias pues siempre se toman la molestia de ayudar.

El asunto es: ¿Es posible saber QUIEN inicio la jecucion de un trigger?

¿Es posible saber desde que procedimeinto almacenado se ha disparado un trigger?

ADVERTENCIA SI NO ERES AFECTO A CUENTOS LARGOS NO CONTINUES.........

Mi problema: En si podría hacerlo con un Procedimiento almacenado, pero contar con las variables de entorno OLD y NEW para los campos es algo fantástico para hacer cálculos cuando se trata de ventas, compras, devoluciones etc etc.

Vuelvo al tema, estoy implementando una bitácora para almacén (Entre otras cosas) los cambios en los "precios de venta" que se realizan de los ítems de una tienda, la tabla tiene esta estructura:

Código SQL [-]
create table tb_bitacora_precios_items(
codigo tcod not null primary key, 
old_precio_compra tmoneda,
new_precio_compra  tmoneda,
old_porcentaje_utilidad tmoneda,
new_porcentaje_utilidad tmoneda,
old_precio_venta tmoneda,
new_precio_venta tmoneda,
old_cantidad tcod,
new_cantidad tcod,
ref_item tcod, 
foreign key (ref_item) references tb_items (codigo) on delete no action on update cascade, 
fecha_hora tfechahora default 'now',
observaciones varchar(30))

La TB_ITEMS almacena los todos estos campos excepto OBSERVACIONES y FECHA.

Como es obvio usar un trigger afteredit en la TB_ITEMS puede extraerme todos los valores para los campos, pero el campo observaciones (o incluso podría usar un campo de otro tipo como ser char ['A','M'] donde A=cambio automático M=cambio manual),
como decía, el campo OBSERVACIONES solo debe guardar si el cambio de PRECIOS se hizo automáticamente (desde un procedimiento almacenado llamado por ejemplo 1) o se hizo manualmente (desde otro procedimiento almacenado)
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel

Última edición por ronalg fecha: 23-08-2016 a las 23:11:49.
Responder Con Cita
  #2  
Antiguo 24-08-2016
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.457
Poder: 20
newtron Va camino a la fama
Hola.

Que yo sepa los triggers se ejecutan de forma automática cuando hay un cambio en la base de datos, es decir, no puedes llamarlos ni desde el código ni desde un procedimiento almacenado. Cuando se inserta, edita o anula un registro se dispara el trigger correspondiente pero no de otra manera.

Si quieres que se ejecute algo cuando se inserta, edita o anula un registro desde un procedimiento almacenado lo que se me ocurre es marcar ese registro para que el trigger pueda detectarlo y actuar en consecuencia.

Saludos
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 24-08-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
No veo para que quieres hacer esa distincion. Podrias explicar?
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 24-08-2016
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Gracias por su apoyo

Cuando registro la compra de un producto con un precio diferente al actual el usuario tiene las opciones de recalcular el nuevo precio de venta con prorrateo, pero también el administrador puede cambiar los precios de venta directamente (sin realizar una compra) cada uno de estos posibles cambios de precio se hacen desde dos procedimientos almacenados; para insertar los campos de la tabla me gustaría a aprovechar NEW y OLD de mi tabla items para capturar en una sola vez los campos que van a la bitácora para esto sería necesario saber cual de los dos procedimientos almacenados "disparó" el trigger (alfter edit o before edit) y así poder registrar en el campo observaciones de la tabla bitácora si el cambio se hizo por una compra o lo hicieron manualmente.

SI NO existe forma de saber que procedimiento almacenado "disparo" el trigger deberé modificar ambos procedimientos para que registren en la bitácora el cambio realizado.

Espero haberme explicado.

Gracias de antemano.
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #5  
Antiguo 24-08-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Presta atencion a tu propia descripcion. La regla de negocio que indicas no es lo que estas tratando de programar.

Entonces no necesitas diferenciar entre el codigo que invoca. Sino entre QUE usuario lo invoca.

En ese caso o agregas un campo indicando quien invoca, o usas los login de la BD para diferencia entre conexion por admin y por otro usuario.
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 24-08-2016
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Solucionado

Bueno aumente un campo TIPO_ULTIMO_CAMBIO VARCHAR(1) a mi tb_items, el valor de este campo cambia, según desde que procedimiento almacenado sea llamada la actualización del precio, así en el trigger AfterEdit de la misma tabla puedo saber quien modificó el precio y almacenar en la bitácora aprovechando OLD y NEW y con un simple "if" puedo saber desde que procedimiento se hizo el cambio y colocar en las observaciones de la bitácora.

Gracias (talvez me este enredando mucho pero PARCHAR un sistema que no diseñaste es un poco complicado)
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #7  
Antiguo 24-08-2016
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 21
ronalg Va por buen camino
Gracias mamcx

Bueno la compra de ítems y la modificación de precios solo pueden hacerlos los administradores pero el punto era que necesitaba registrar en la bitácora si el cambio de precio era porque se lo hizo "manualmente" desde la ventana de edición del ítem (cosa que solo puede hacer el administrador) o desde el registro de una compra de ítem (con nuevo precio usando uno de dos métodos que me indicó el contador de la tienda – solo lo puede hacer el administrador). Mil Gracias, estoy empolvado en la programación y cuesta un poco analizar, gracias por la paciencia .......
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
  #8  
Antiguo 09-09-2016
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Automatico o manual

Que es para ti automatico o manual?.
Manual una vez entrea la trigger o desde uan aplaicaion?.
O simplemente que usuario lo hizo?.
O sis fue desde una palaicacion para la que fue diseñada?
O unaplicaicon tipo ib expert?.

Bueno a mi me toco alago asi, pero mi aplicacion usaba plugin, y mantenia registro de lso cambio echos en l abase de datos y y para protegerme, por eso registraba si los cambio se habian echo desde un plugin, desde la aplicacion o algun f¿gestor externo. Eso lo hacia registrnado una variable, y cada tabla le ponia un tio para ver desde donde se hacia el cambio.

espero eso sea lo que quieres, aunque de verdad lo deseche mas adelante por que aunque tenias control, es preferible controlar a los usuaris, esn mi caso.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
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
Evento OnChange ComboBox no se dispara Jose Roman OOP 6 29-08-2014 20:01:38
Despues de un post se dispara el Afterscroll kalimero Firebird e Interbase 0 13-12-2008 12:31:33
Un trigger que dispara un procedimiento que dispara un trigger... sitrico Firebird e Interbase 5 04-06-2007 23:05:13
No se dispara mas KeyDown con TAB Monchi Varios 0 28-03-2007 18:47:42
Trigger se dispara sin Commit jevo19100 Firebird e Interbase 5 13-03-2007 19:00:09


La franja horaria es GMT +2. Ahora son las 18:38:11.


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