Triggers

23/04/2004 - 19:18 por Leonardo Azpurua | Informe spam
Hola.

Alguien preguntó acerca de la utilidad de los Triggers en el grupo de vb. Lo
referí aquí, pero para darle una idea, le describí el siguiente ejemplo:

"Supón que tienes una tabla de artículos (A) y una de detalles de
movimientos
para esos artículos (D).

Se quiere:
1.- Que las existencias de los articulos en la tabla (A) sólo puedan
variar a consecuencia del registro de un movimiento.
2.- Que el registro de un movimiento actualice automáticamente la
existencia de las tablas de productos.

discúlpame por no utilizar la sintaxis de ningun SGBD, pero no se ninguna lo
suficientemente bien (me gusta que mis aplicaciones trabajen con cualquiera)
de manera que describo los procedimientos en seudocódigo:

Defines un Trigger para el UPDATE de la tabla A:
Si Nuevo.Existencia <> Original.Existencia THEN
Si varTriggerDetalles = Falso
Rechazar el Cambio y Dar Error
De Lo Contrario
varTriggerDetalles = Falso
Fin Si
Fin Si

y defines un Trigger para el INSERT de la tabla D:
varTriggerDetalles = VERDADERO
Ejecutar UPDATE A SET Existencia = Existencia + D.Entradas - D.Salidas"

pero me quedé con la curiosidad de cómo se escribiría eso mismo en Transact
(además que no entiendo como se pueden definir variables persistentes (el
"varTriggerDetalles" que se setea en el INSERT y se lee en el UPDATE).

Claro que podría revisar los BOL y consultar algunos ejemplos, pero para
Uds., viejos zorros de Transact, debe ser un paseo escribir los dos ejemplos
con la sintaxis debida, y ando un poco flojo estos días.

Gracias de antemano

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
23/04/2004 - 19:29 | Informe spam
Hola un trigger es simple de hacer, pero no entiendo el ejemplo que queres
representar :(

Si yo tengo un maestro de Articulos y luego una tabla de movimientos de
Stock, vos decis que no se puedan hacer movimientos de articulos que no
existan en la tabla Art y que cuando se haga un movimiento se actualice la
cabecera del articulo con el nuevo saldo?

Decime si es esta tu idea si¡?

Gracias


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:
Hola.

Alguien preguntó acerca de la utilidad de los Triggers en el grupo de vb.


Lo
referí aquí, pero para darle una idea, le describí el siguiente ejemplo:

"Supón que tienes una tabla de artículos (A) y una de detalles de
movimientos
para esos artículos (D).

Se quiere:
1.- Que las existencias de los articulos en la tabla (A) sólo puedan
variar a consecuencia del registro de un movimiento.
2.- Que el registro de un movimiento actualice automáticamente la
existencia de las tablas de productos.

discúlpame por no utilizar la sintaxis de ningun SGBD, pero no se ninguna


lo
suficientemente bien (me gusta que mis aplicaciones trabajen con


cualquiera)
de manera que describo los procedimientos en seudocódigo:

Defines un Trigger para el UPDATE de la tabla A:
Si Nuevo.Existencia <> Original.Existencia THEN
Si varTriggerDetalles = Falso
Rechazar el Cambio y Dar Error
De Lo Contrario
varTriggerDetalles = Falso
Fin Si
Fin Si

y defines un Trigger para el INSERT de la tabla D:
varTriggerDetalles = VERDADERO
Ejecutar UPDATE A SET Existencia = Existencia + D.Entradas -


D.Salidas"

pero me quedé con la curiosidad de cómo se escribiría eso mismo en


Transact
(además que no entiendo como se pueden definir variables persistentes (el
"varTriggerDetalles" que se setea en el INSERT y se lee en el UPDATE).

Claro que podría revisar los BOL y consultar algunos ejemplos, pero para
Uds., viejos zorros de Transact, debe ser un paseo escribir los dos


ejemplos
con la sintaxis debida, y ando un poco flojo estos días.

Gracias de antemano

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
#2 Liliana Sorrentino
23/04/2004 - 19:48 | Informe spam
Hola Leonardo,
El ejemplo tiene incluídas todas las operaciones sobre la tabla de detalle,
pero podría separarse en tres, según las necesidades.
Con respecto a la actualización de artículos solo por detalle, simplemente
no le daría al operador la posibilidad de modificar ese dato, no veo
necesario hacer un trigger para eso, siempre y cuando haya entendido tu
objetivo.
Saludos... Liliana.

CREATE TRIGGER t_detalle
ON detalle
FOR DELETE, UPDATE, INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM deleted) > 0 AND
(SELECT COUNT(*) FROM inserted) > 0
UPDATE articulos
SET a.existencias = a.existencias - d.cantidad + i.cantidad
FROM articulos a
INNER JOIN deleted d ON d.art = a.art
INNER JOIN inserted i ON i.art = a.art

IF (SELECT COUNT(*) FROM deleted) = 0 AND
(SELECT COUNT(*) FROM inserted) > 0
UPDATE articulos
SET a.existencias = a.existencias + i.cantidad
FROM articulos a
INNER JOIN inserted i ON i.art = a.art

IF (SELECT COUNT(*) FROM deleted) > 0 AND
(SELECT COUNT(*) FROM inserted) = 0
UPDATE articulos
SET a.existencias = a.existencias - d.cantidad
FROM articulos a
INNER JOIN deleted d ON d.art = a.art



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:
Hola.

Alguien preguntó acerca de la utilidad de los Triggers en el grupo de vb.


Lo
referí aquí, pero para darle una idea, le describí el siguiente ejemplo:

"Supón que tienes una tabla de artículos (A) y una de detalles de
movimientos
para esos artículos (D).

Se quiere:
1.- Que las existencias de los articulos en la tabla (A) sólo puedan
variar a consecuencia del registro de un movimiento.
2.- Que el registro de un movimiento actualice automáticamente la
existencia de las tablas de productos.

discúlpame por no utilizar la sintaxis de ningun SGBD, pero no se ninguna


lo
suficientemente bien (me gusta que mis aplicaciones trabajen con


cualquiera)
de manera que describo los procedimientos en seudocódigo:

Defines un Trigger para el UPDATE de la tabla A:
Si Nuevo.Existencia <> Original.Existencia THEN
Si varTriggerDetalles = Falso
Rechazar el Cambio y Dar Error
De Lo Contrario
varTriggerDetalles = Falso
Fin Si
Fin Si

y defines un Trigger para el INSERT de la tabla D:
varTriggerDetalles = VERDADERO
Ejecutar UPDATE A SET Existencia = Existencia + D.Entradas -


D.Salidas"

pero me quedé con la curiosidad de cómo se escribiría eso mismo en


Transact
(además que no entiendo como se pueden definir variables persistentes (el
"varTriggerDetalles" que se setea en el INSERT y se lee en el UPDATE).

Claro que podría revisar los BOL y consultar algunos ejemplos, pero para
Uds., viejos zorros de Transact, debe ser un paseo escribir los dos


ejemplos
con la sintaxis debida, y ando un poco flojo estos días.

Gracias de antemano

Salud!

Leonardo
[MVP Visual Basic]
[Maicrosoft LVP - MOP Certified]
leonardo<arroba>mvps<punto>org


Respuesta Responder a este mensaje
#3 Leonardo Azpurua
23/04/2004 - 20:30 | Informe spam
"Maximiliano D. A." escribió en el
mensaje news:
Hola un trigger es simple de hacer, pero no entiendo el ejemplo que queres
representar :(

Si yo tengo un maestro de Articulos y luego una tabla de movimientos de
Stock, vos decis que no se puedan hacer movimientos de articulos que no
existan en la tabla Art y que cuando se haga un movimiento se actualice la
cabecera del articulo con el nuevo saldo?

Decime si es esta tu idea si¡?



Hola.

La segunda parte sí: al insertar un movimiento se debe actualizar la
existencia del maestro.

Pero la primera no, lo que describes es una regla de integridad, y el
objetivo es que si alguien o algo intenta modificar directamente la
existencia del articulo se rechace el cambio y se produzca un error. Es
decir, garantizar mediante el uso de triggers que la columna Existencia de
la tabla de artículos no se altere salvo como consecuencia del registro de
un nuevo movimiento.

En este caso, como ves, es MUY conveniente el uso de procedimientos
almacenados. Pero "el ejercicio" actual es con triggers :-)

Gracias.

Leonardo
Respuesta Responder a este mensaje
#4 Leonardo Azpurua
23/04/2004 - 20:33 | Informe spam
"Liliana Sorrentino" escribió en el mensaje
news:
Hola Leonardo,
El ejemplo tiene incluídas todas las operaciones sobre la tabla de


detalle,
pero podría separarse en tres, según las necesidades.
Con respecto a la actualización de artículos solo por detalle, simplemente
no le daría al operador la posibilidad de modificar ese dato, no veo
necesario hacer un trigger para eso, siempre y cuando haya entendido tu
objetivo.



Hola, Liliana:

Muchas gracias por tu ejemplo: sirvió para comenzar a "desasnarme" sobre el
tema.

El asunto de la restricción no es tan simple. Para seguir con la suposición,
los niños del departamento de desarrollo tienen pleno acceso a la BD, y no
queremos que ninguno de ellos -que no son operadores sino usuarios
privilegiados de la BD- modifique "accidentalmente" la existencia de un
artículo. No es una necesidad real, sino un ejercicio, y con ellos no vale
el "pensamiento lateral" :-)))

Salud, y Gracias

Leonardo
Respuesta Responder a este mensaje
#5 Maximiliano D. A.
23/04/2004 - 20:48 | Informe spam
perfecto!! ahora te entiendo pero no usaria un trigger para eso ni loco :-)

Es dificil de mantener y lento.

Yo haria esto:

Me creo una vista con los saldos de los art y a esta vista le pongo un
indice

Algo asi como (si qty es positivo y negativo)


Select articulo,sum(qty) as saldo from movimientos group by articulo

Si hay un campo Tipo y supongamos que I para las entradas y O para las
salidas entonces:


Select articulo,sum(CASE WHEN TIPO='I' qty ELSE -QTY END) as saldo from
movimientos group by articulo

Esto es mucho mas optimo que lo que queres proponer vos y mucho mas facil de
mantener.

claro lo debes poner en una vista y luego la indexas por Articulo :-), no
uso para nada un Store en este caso.

Claro se que tu pregunta era como armar el trigger y yo te sali que no lo
armaria ;-), si queres de todos modos te puedo dar un ejemplo de como armar
el Trigger :-)

Suerte


pd: no soy ningun ZORRO de Tsql, soy de .NET :-))))))) Fox es para otros ;-)


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:

"Maximiliano D. A." escribió en el
mensaje news:
> Hola un trigger es simple de hacer, pero no entiendo el ejemplo que


queres
> representar :(
>
> Si yo tengo un maestro de Articulos y luego una tabla de movimientos de
> Stock, vos decis que no se puedan hacer movimientos de articulos que no
> existan en la tabla Art y que cuando se haga un movimiento se actualice


la
> cabecera del articulo con el nuevo saldo?
>
> Decime si es esta tu idea si¡?

Hola.

La segunda parte sí: al insertar un movimiento se debe actualizar la
existencia del maestro.

Pero la primera no, lo que describes es una regla de integridad, y el
objetivo es que si alguien o algo intenta modificar directamente la
existencia del articulo se rechace el cambio y se produzca un error. Es
decir, garantizar mediante el uso de triggers que la columna Existencia de
la tabla de artículos no se altere salvo como consecuencia del registro de
un nuevo movimiento.

En este caso, como ves, es MUY conveniente el uso de procedimientos
almacenados. Pero "el ejercicio" actual es con triggers :-)

Gracias.

Leonardo







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida