TRigger con campos calculados

11/09/2007 - 21:04 por Clara | Informe spam
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me dice
que no se puede poner una columna calculada en el cálculo de otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger en la
tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.

Preguntas similare

Leer las respuestas

#1 principiante
12/09/2007 - 00:09 | Informe spam
Yo te recomiendo que no te compliques con el trigger sino que simplemente
para el campo calculado C3 pongas la formula completa.
Ej. si C1 es A+B y C2 es B*2, por ejemplo. entonces define a C3 como
(A+B)+(B*2) en vez de poner c1+c2.

Pero si insistes con el trigger, haz lo mismo, no uses directamente C1 y C2
sino su formula (A+B) y (B*2) segun el ejemplo.


Jose TH



"Clara" escribió en el mensaje
news:
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me
dice que no se puede poner una columna calculada en el cálculo de otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger en
la tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.







Respuesta Responder a este mensaje
#2 Clara
12/09/2007 - 09:17 | Informe spam
Hola principiante,
Lo primero que hice antes del triger fué precisamente esto: en C3 la suma de
la formulas de los dos campos calculados. Pero haciéndolo así, un simple
select C1, C2, C3 from tabla tardaba un montón.

Gràcias.


"principiante" escribió en el mensaje
news:
Yo te recomiendo que no te compliques con el trigger sino que simplemente
para el campo calculado C3 pongas la formula completa.
Ej. si C1 es A+B y C2 es B*2, por ejemplo. entonces define a C3 como
(A+B)+(B*2) en vez de poner c1+c2.

Pero si insistes con el trigger, haz lo mismo, no uses directamente C1 y
C2 sino su formula (A+B) y (B*2) segun el ejemplo.


Jose TH



"Clara" escribió en el mensaje
news:
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me
dice que no se puede poner una columna calculada en el cálculo de otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger en
la tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.











Respuesta Responder a este mensaje
#3 principiante
12/09/2007 - 13:13 | Informe spam
No creo que "tarde un monton" por eso, a menos que tus formulas sean muy
complicadas. Que tienes en ellas? llamadas a funciones o algo asi?

Envianos las formulas a ver de que se trata y ver por que van a tardar un
monton.

Yo tengo por ejemplo en una tabla de facturas algo asi:

cSubtotalNeto=subtotal - descuento
cIVA=round((subtotal - descuento) * PorcIVA / 100,2)
cTotal=(subtotal - descuento) + (round((subtotal - descuento) * PorcIVA /
100,2))

Y no me da problemas de velocidad


Jose TH



"Clara" escribió en el mensaje
news:O%
Hola principiante,
Lo primero que hice antes del triger fué precisamente esto: en C3 la suma
de la formulas de los dos campos calculados. Pero haciéndolo así, un
simple select C1, C2, C3 from tabla tardaba un montón.

Gràcias.


"principiante" escribió en el mensaje
news:
Yo te recomiendo que no te compliques con el trigger sino que simplemente
para el campo calculado C3 pongas la formula completa.
Ej. si C1 es A+B y C2 es B*2, por ejemplo. entonces define a C3 como
(A+B)+(B*2) en vez de poner c1+c2.

Pero si insistes con el trigger, haz lo mismo, no uses directamente C1 y
C2 sino su formula (A+B) y (B*2) segun el ejemplo.


Jose TH



"Clara" escribió en el mensaje
news:
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me
dice que no se puede poner una columna calculada en el cálculo de otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger
en la tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.















Respuesta Responder a este mensaje
#4 Clara
12/09/2007 - 16:36 | Informe spam
Hola de nuevo,

Tenia 2 tablas. En 1 (T1) , la cabecera de un parte de trabajo. En la otra
(T2) , las lineas del parte de trabajo,.
En la cabecera T1, había campos calculados a partir de una formula que
llamaba a una funcion asi:

(aproximadamente)
funcion @codigo int
as
Select sum(curImporte) from T2 where T2.Codigo = @Codigo
end

El problema es que estos partes de trabajo manejan muchos importes
(importesLaborables, importesExtras, importesSabado, importesDomingo, )
y mi intención era no mantenerlos desde la apliación cliente, sino desde sql
server.
Además, la tabla de lineas de parte de trabajo (T2) hace de "cabecera" de
otra tabla (t3)
Y algunos campos de T2 eran a su vez calculados a partir de funciones que
recogian datos de T3

Hacer un select C1, C2, C3 de T1, al final, tardaba un montón.

Durante el dia de hoy, estoy modificando la aplicación cliente y la base de
datos para que no haya tantos campos calculados, y calcular parte de esta
información en la aplicación cliente.

Grácias por el interés






"principiante" escribió en el mensaje
news:%
No creo que "tarde un monton" por eso, a menos que tus formulas sean muy
complicadas. Que tienes en ellas? llamadas a funciones o algo asi?

Envianos las formulas a ver de que se trata y ver por que van a tardar un
monton.

Yo tengo por ejemplo en una tabla de facturas algo asi:

cSubtotalNeto=subtotal - descuento
cIVA=round((subtotal - descuento) * PorcIVA / 100,2)
cTotal=(subtotal - descuento) + (round((subtotal - descuento) * PorcIVA /
100,2))

Y no me da problemas de velocidad


Jose TH



"Clara" escribió en el mensaje
news:O%
Hola principiante,
Lo primero que hice antes del triger fué precisamente esto: en C3 la suma
de la formulas de los dos campos calculados. Pero haciéndolo así, un
simple select C1, C2, C3 from tabla tardaba un montón.

Gràcias.


"principiante" escribió en el mensaje
news:
Yo te recomiendo que no te compliques con el trigger sino que
simplemente para el campo calculado C3 pongas la formula completa.
Ej. si C1 es A+B y C2 es B*2, por ejemplo. entonces define a C3 como
(A+B)+(B*2) en vez de poner c1+c2.

Pero si insistes con el trigger, haz lo mismo, no uses directamente C1 y
C2 sino su formula (A+B) y (B*2) segun el ejemplo.


Jose TH



"Clara" escribió en el mensaje
news:
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me
dice que no se puede poner una columna calculada en el cálculo de otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger
en la tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.



















Respuesta Responder a este mensaje
#5 principiante
12/09/2007 - 20:16 | Informe spam
Ciertamente debes ver si cambiar ese diseño aunque tengas que desnormalizar
un poco teniendo campos redundantes que te almacenen los valores calculados.
Es lo que se acostumbra para ayudar un poco el performance porque si no
habria que hacer una subconsulta para todo. Puedes hacerlo desde tu
aplicacion o mas recomendable en el script o SP que salva los datos o
tambien en triggers.

O como otra opción, mira la posibilidad de armar vistas indexadas para tus
tablas de detalles. En cualquier caso, tratar de tener los índices
apropiados te va a ayudar bastante.


Jose TH

"Clara" escribió en el mensaje
news:%
Hola de nuevo,

Tenia 2 tablas. En 1 (T1) , la cabecera de un parte de trabajo. En la otra
(T2) , las lineas del parte de trabajo,.
En la cabecera T1, había campos calculados a partir de una formula que
llamaba a una funcion asi:

(aproximadamente)
funcion @codigo int
as
Select sum(curImporte) from T2 where T2.Codigo = @Codigo
end

El problema es que estos partes de trabajo manejan muchos importes
(importesLaborables, importesExtras, importesSabado, importesDomingo,
) y mi intención era no mantenerlos desde la apliación cliente, sino
desde sql server.
Además, la tabla de lineas de parte de trabajo (T2) hace de "cabecera" de
otra tabla (t3)
Y algunos campos de T2 eran a su vez calculados a partir de funciones que
recogian datos de T3

Hacer un select C1, C2, C3 de T1, al final, tardaba un montón.

Durante el dia de hoy, estoy modificando la aplicación cliente y la base
de datos para que no haya tantos campos calculados, y calcular parte de
esta información en la aplicación cliente.

Grácias por el interés






"principiante" escribió en el mensaje
news:%
No creo que "tarde un monton" por eso, a menos que tus formulas sean muy
complicadas. Que tienes en ellas? llamadas a funciones o algo asi?

Envianos las formulas a ver de que se trata y ver por que van a tardar un
monton.

Yo tengo por ejemplo en una tabla de facturas algo asi:

cSubtotalNeto=subtotal - descuento
cIVA=round((subtotal - descuento) * PorcIVA / 100,2)
cTotal=(subtotal - descuento) + (round((subtotal - descuento) * PorcIVA
/ 100,2))

Y no me da problemas de velocidad


Jose TH



"Clara" escribió en el mensaje
news:O%
Hola principiante,
Lo primero que hice antes del triger fué precisamente esto: en C3 la
suma de la formulas de los dos campos calculados. Pero haciéndolo así,
un simple select C1, C2, C3 from tabla tardaba un montón.

Gràcias.


"principiante" escribió en el mensaje
news:
Yo te recomiendo que no te compliques con el trigger sino que
simplemente para el campo calculado C3 pongas la formula completa.
Ej. si C1 es A+B y C2 es B*2, por ejemplo. entonces define a C3 como
(A+B)+(B*2) en vez de poner c1+c2.

Pero si insistes con el trigger, haz lo mismo, no uses directamente C1
y C2 sino su formula (A+B) y (B*2) segun el ejemplo.


Jose TH



"Clara" escribió en el mensaje
news:
Hola,

Tengo una tabla en la que hay 2 campos calculados. (C1 y C2) en SS2005
Queria poner un tercer campo (C3) calculado que fuera C1 + C2, pero me
dice que no se puede poner una columna calculada en el cálculo de
otra.
Los campos C1, C2 y C3 son de tipo money.

Así que para actualitzar C3 (que no es calculado) he creado un trigger
en la tabla (tblComunicats) así:
ALTER TRIGGER ActualitzaImporte
ON tblComunicats
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
UPDATE tblComunicats
SET C3 = INSERTED.C2 + INSERTED.C1 FROM INSERTED
END

Esto solo funciona si desde el management studio modifico una fila
manualmente (una que no sea ni C1 ni C2 por que son claculadas).
Pero no funciona si desde una aplicación en c# actualizo una fila.

He estado leyendo en los BOL pero no doy con ello.
Alguien podria ayudarme?

Grácias.























email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida