desencadenadores

11/11/2003 - 22:06 por Tolo | Informe spam
hola,

según he comentado en el msg anterior, tengo una tabla de lineas de facturas
con los campos: unidades, precio_unitario y total y mi intención es que el
desencadenador insert/update me calcule el total a partir de los valores de
unidades y precio_unitario.

para ello he creado el desencadenador:

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update t_linies set total_bi=(unitats*preu_unitari)


pero el problema está en que esto no me modifica solamente el registro
actual, sino me modifica todos los registros de la BD y lo que mas miedo me
da es que me pueda mezclar los valores de las líneas.

muchísimas gracias

Preguntas similare

Leer las respuestas

#6 Javier Loria
11/11/2003 - 22:44 | Informe spam
Tolo escribio:
hola,

según he comentado en el msg anterior, tengo una tabla de lineas de
facturas con los campos: unidades, precio_unitario y total y mi
intención es que el desencadenador insert/update me calcule el total
a partir de los valores de unidades y precio_unitario.

para ello he creado el desencadenador:

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update t_linies set total_bi=(unitats*preu_unitari)


pero el problema está en que esto no me modifica solamente el registro
actual, sino me modifica todos los registros de la BD y lo que mas
miedo me da es que me pueda mezclar los valores de las líneas.

muchísimas gracias
Respuesta Responder a este mensaje
#7 Javier Loria
11/11/2003 - 22:55 | Informe spam
Hola Tolo:
Necesita ser un Trigger?, Porque tal vez logras el mismo impacto con una
tabla asi:
/* Codigo de Creacion de Tabla *.
CREATE TABLE LineasFactura(
NumeroLinea INT NOT NULL PRIMARY KEY,
Unidades INT NOT NULL ,
PrecioUnitario DECIMAL(9,2) NOT NULL,
TotalLinea AS PrecioUnitario*Unidades
)

/* Ingresa Valores */
INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (1,10,12.5)

INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (2,11,23)

/* Pruebas el Calculo *.
SELECT * FROM LineasFactura
/* Fin */

Estas mucho mas seguro con una columna calculada que con un Trigger.
En todo caso tu trigger no funciona porque le falta el JOIN. Algo como:

UPDATE T_Linies
SET Total=INSERTED.unitas*INSERTED.preu_unitari
FROM T_Linies JOIN Inserted ON
T_Linies.MiLLavePrimaria=Inserted.MiLlavePrimaria

Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.



Tolo escribio:
hola,

según he comentado en el msg anterior, tengo una tabla de lineas de
facturas con los campos: unidades, precio_unitario y total y mi
intención es que el desencadenador insert/update me calcule el total
a partir de los valores de unidades y precio_unitario.

para ello he creado el desencadenador:

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update t_linies set total_bi=(unitats*preu_unitari)


pero el problema está en que esto no me modifica solamente el registro
actual, sino me modifica todos los registros de la BD y lo que mas
miedo me da es que me pueda mezclar los valores de las líneas.

muchísimas gracias
Respuesta Responder a este mensaje
#8 Tolo
11/11/2003 - 22:59 | Informe spam
Hola,

mi duda, está en el tema de rendimiento, pues a parte de este campo tengo
otros y no se si ello me podría sobrecargar el servidor, sobretodo al
realizar una consulta de varias líneas. O acaso los campos calculados se
calculan solamente cuando se modifica o inserta una línea ?

gracias

"Javier Loria" escribió en el mensaje
news:#
Hola Tolo:
Necesita ser un Trigger?, Porque tal vez logras el mismo impacto con


una
tabla asi:
/* Codigo de Creacion de Tabla *.
CREATE TABLE LineasFactura(
NumeroLinea INT NOT NULL PRIMARY KEY,
Unidades INT NOT NULL ,
PrecioUnitario DECIMAL(9,2) NOT NULL,
TotalLinea AS PrecioUnitario*Unidades
)

/* Ingresa Valores */
INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (1,10,12.5)

INSERT LineasFactura(NumeroLinea, Unidades, PrecioUnitario)
VALUES (2,11,23)

/* Pruebas el Calculo *.
SELECT * FROM LineasFactura
/* Fin */

Estas mucho mas seguro con una columna calculada que con un Trigger.
En todo caso tu trigger no funciona porque le falta el JOIN. Algo como:

UPDATE T_Linies
SET Total=INSERTED.unitas*INSERTED.preu_unitari
FROM T_Linies JOIN Inserted ON
T_Linies.MiLLavePrimaria=Inserted.MiLlavePrimaria

Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.



Tolo escribio:
> hola,
>
> según he comentado en el msg anterior, tengo una tabla de lineas de
> facturas con los campos: unidades, precio_unitario y total y mi
> intención es que el desencadenador insert/update me calcule el total
> a partir de los valores de unidades y precio_unitario.
>
> para ello he creado el desencadenador:
>
> CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> FOR INSERT, UPDATE
> AS
>
> update t_linies set total_bi=(unitats*preu_unitari)
>
>
> pero el problema está en que esto no me modifica solamente el registro
> actual, sino me modifica todos los registros de la BD y lo que mas
> miedo me da es que me pueda mezclar los valores de las líneas.
>
> muchísimas gracias


Respuesta Responder a este mensaje
#9 Tolo
11/11/2003 - 23:13 | Informe spam
hola,

perdona, pero creo que el update sería:

update dbo.T_linies
set T_LINIES.total_bi=(inserted.unitats*inserted.preu_unitari) ...

no?

muchas gracias de nuevo



"Accotto Maximiliano D." escribió en el
mensaje news:
deberias hacerlo asi para q no te haga eso: TE PUSE EN MAYUSCULAS LOS
CAMBIOS

CREATE TRIGGER Control_stock_linea ON dbo.T_linies
FOR INSERT, UPDATE
AS

update dbo.T_linies
set INSERTED.total_bi=(INSERTED.unitats*INSERTED.preu_unitari)
FROM dbo.T_linies INNER JOIN INSERTED ON
(AQUI EL VINCULO ENTRE AMBAS TABLAS, SEGURO Q DEBERAS PONER NRO FACTURA Y
NUMERO LINEA)

Espero q te halla sido util

Un abrazo


Accotto Maximiliano Damian
> hola,
>
> según he comentado en el msg anterior, tengo una tabla de lineas de
facturas
> con los campos: unidades, precio_unitario y total y mi intención es que


el
> desencadenador insert/update me calcule el total a partir de los valores
de
> unidades y precio_unitario.
>
> para ello he creado el desencadenador:
>
> CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> FOR INSERT, UPDATE
> AS
>
> update t_linies set total_bi=(unitats*preu_unitari)
>
>
> pero el problema está en que esto no me modifica solamente el registro
> actual, sino me modifica todos los registros de la BD y lo que mas miedo
me
> da es que me pueda mezclar los valores de las líneas.
>
> muchísimas gracias
>
>
>


Respuesta Responder a este mensaje
#10 Eladio Rincón
11/11/2003 - 23:39 | Informe spam
Hola Accoto,

me gustaría puntualizar un par de cosas:
- cuando se realiza un update, SQL Server no siempre realiza un borrado y una inserción de un registro para modificar el dato en la página; habrá ocasiones en que sólo modifique la columna afectada sin realizar borrado/inserción. Por ejemplo en muchas actualizaciones sencillas SOLO se modifica las columnas afectadas: con el LogExplorer de Lumigent (http://www.lumigent.com) puedes ver el proceso (también lo puedes con select * from ::fn_dblog(null, null).

-desde el punto de vista de un SGBD, no debemos pensar el orden en que se va a realizar la operación; si actualizo un registro, para mí será transparente el modo en que el SGBD ha gestionado la modificación ... yo debo saber que al final tendré el registro modificado con el valor que he especificado.

Espero haber sido de ayuda.

Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net

"Comparte lo que sabes, aprende lo que no sepas." FGG

"Accotto Maximiliano D." escribió en el mensaje news:
yes!! un update hace esto:

Primero un delete y luego un insert

por eso la tabla inserted es la tabla con los valores insertados (me
explico?)



Accotto Maximiliano Damian
" Tolo" escribió en el mensaje
news:
> hola,
>
> entiendo que inserted se usa tanto para updates como inserts en la tabla,
> no?
>
> muchísimas gracias
>
> "Accotto Maximiliano D." escribió en
el
> mensaje news:
> > deberias hacerlo asi para q no te haga eso: TE PUSE EN MAYUSCULAS LOS
> > CAMBIOS
> >
> > CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> > FOR INSERT, UPDATE
> > AS
> >
> > update dbo.T_linies
> > set INSERTED.total_bi=(INSERTED.unitats*INSERTED.preu_unitari)
> > FROM dbo.T_linies INNER JOIN INSERTED ON
> > (AQUI EL VINCULO ENTRE AMBAS TABLAS, SEGURO Q DEBERAS PONER NRO FACTURA
Y
> > NUMERO LINEA)
> >
> > Espero q te halla sido util
> >
> > Un abrazo
> >
> >
> > Accotto Maximiliano Damian
> > > hola,
> > >
> > > según he comentado en el msg anterior, tengo una tabla de lineas de
> > facturas
> > > con los campos: unidades, precio_unitario y total y mi intención es
que
> el
> > > desencadenador insert/update me calcule el total a partir de los
valores
> > de
> > > unidades y precio_unitario.
> > >
> > > para ello he creado el desencadenador:
> > >
> > > CREATE TRIGGER Control_stock_linea ON dbo.T_linies
> > > FOR INSERT, UPDATE
> > > AS
> > >
> > > update t_linies set total_bi=(unitats*preu_unitari)
> > >
> > >
> > > pero el problema está en que esto no me modifica solamente el registro
> > > actual, sino me modifica todos los registros de la BD y lo que mas
miedo
> > me
> > > da es que me pueda mezclar los valores de las líneas.
> > >
> > > muchísimas gracias
> > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida