Foros del Web » Programación para mayores de 30 ;) » Programación General »

sobre un trigger en sql server

Estas en el tema de sobre un trigger en sql server en el foro de Programación General en Foros del Web. Wenas he diseñado este trigger en la bd de sql server para que cada vez que haga una compra, reste las unidades de mi tabla ...
  #1 (permalink)  
Antiguo 03/03/2004, 17:28
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
sobre un trigger en sql server

Wenas he diseñado este trigger en la bd de sql server para que cada vez que haga una compra, reste las unidades de mi tabla articulos a la tabla Numero_Linea (ke es la linea de la factura donde entre otros campos estan las unidades k compro) pero me da un error, me dice ke la subconsulta ha devuelto mas de un valor, lo queno es correcto cuando va a continuacion de =,!=,etc.
Este es el trigger en cuestion:

CREATE TRIGGER tg_act_un ON dbo.Numero_Linea
AFTER INSERT
AS
update articulos
set articulos.cantidad_total_articulos = (select (articulos.cantidad_total_articulos - Numero_linea.unidades)
from articulos,Numero_Linea
where Numero_linea.Codigo_Articulo=Articulos.codigo_Arti culo);

Nose si habre cometido un fallo garrafal pq nose apenas nada de triggers, me dijeron ke si la subconsulta tiene ke estar en una variable pero no toy seguro de como se pondria.
  #2 (permalink)  
Antiguo 03/03/2004, 17:30
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
joer k torpe soy he contestado en el apartado progamacion en vez de bases de datos... sorry
  #3 (permalink)  
Antiguo 03/03/2004, 17:56
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 22 años
Puntos: 7
update articulos
set articulos.cantidad_total_articulos = (select top 1(articulos.cantidad_total_articulos - Numero_linea.unidades)
from articulos,Numero_Linea
where Numero_linea.Codigo_Articulo=Articulos.codigo_Arti culo);
__________________
No tengo firma ahora... :(
  #4 (permalink)  
Antiguo 03/03/2004, 18:07
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
mmm de esa forma no me va, No me da error y efectivamente me resta lo unico es que me resta a todos los articulos y no al articulo al que se le hace la insercion en Numero Linea.

Por cierto que significa select top 1 ?

Gracias..
  #5 (permalink)  
Antiguo 03/03/2004, 19:30
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 22 años
Puntos: 7
Te resta porque no has puesto el WHERE en la clausula UPDATE. Deberia ser algo como
update articulos
set articulos.cantidad_total_articulos = (select (articulos.cantidad_total_articulos - Numero_linea.unidades)
from articulos,Numero_Linea
where Numero_linea.Codigo_Articulo=Articulos.codigo_Arti culo)
where articulos.codigo_articulo=(select codigo_articulo from inserted);

algo asi, disculpame, no me acuerdo claramente de la sintaxis en ORACLE. Es ORACLE, no?

TOP 1 lo que hace es que tome el primer registro de varios. Al devolverte un valor unico entonces ya no tienes el error de que el subquery devuelva mas de un valor. La otra solucion hubiese sido que no hagas un = si no un IN
__________________
No tengo firma ahora... :(
  #6 (permalink)  
Antiguo 04/03/2004, 05:23
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
No, estoy hablando de sql server (lo puse en el titulo del post), si pongo in en la subconsulta esta me da error de sintaxis :S
  #7 (permalink)  
Antiguo 04/03/2004, 15:23
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Código:
CREATE TRIGGER tg_act_un ON dbo.Numero_Linea 
AFTER INSERT
AS
update articulos 
set articulos.cantidad_total_articulos = (select (articulos.cantidad_total_articulos - INSERTED.unidades)
from articulos, INSERTED
where INSERTED.Codigo_Articulo=Articulos.codigo_Articulo);
Tenias mal el valor, no debes referencia la tabla directamente, sino que solo los registros modificados, usa la palabra INSERTED para datos que acabas de insertar o modificar con un UPDATE
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 04/03/2004, 16:04
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
Hola, no me da error el trigger ahora lo malo que me resta unidades a todos los articulos no al articulo que estoy insertando.Numero_linea.Codigo_articulo aqui pongo cualquier numero y deberia cumplirse que Numero_linea.codigo_articulo=Articulos.codigo articulo pero no, me resta unidades a todos los articulos, sabrias decirme que es lo que falla plz.

No sabia que habia que poner inserted en vez d la tabla, lo mismo pasara con delete y update (deleted,updated).

Gracias
  #9 (permalink)  
Antiguo 05/03/2004, 15:36
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Precisamente para eso se usa INSERTED y DELETED, para que no se afecte toda tu tabla.

Estas en lo cierto con UPDATED y DELETED, pero en el caso de la sentencia UPDATE tienes 2, UPDATED y DELETED (no hay un "updated"), son los nuevos datos y los ex-datos, si lo reflexionas tiene logica.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #10 (permalink)  
Antiguo 07/03/2004, 07:20
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
Pero una cosa aun poniendo inserted (igual que en el codigo que das) me sigue restando la cantidad a TODOS los articulos no solo al articulo que vendemos. No sabes que puede fallar plz?
  #11 (permalink)  
Antiguo 08/03/2004, 15:27
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Tienes una sintaxis un poco rara (aunque parece que deberia funcionar), la reescribi y creo que lo que se acerca a lo que quieres es algo como esto:
Código:
CREATE TRIGGER tg_act_un ON dbo.Numero_Linea 
AFTER INSERT
AS
update articulos 
set articulos.cantidad_total_articulos = articulos.cantidad_total_articulos - INSERTED.unidades
from articulos 
	INNER JOIN INSERTED
		ON INSERTED.Codigo_Articulo=Articulos.codigo_Articulo)
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #12 (permalink)  
Antiguo 08/03/2004, 17:10
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
Si ahora va a la perfeccion muchas gracias, el fallo debia estar en que yo ponia el select y parece ser que no hay que ponerlo. Porque pobre a relacionar las tablas con inner join o en las condiciones del where y si que funciona bien.
  #13 (permalink)  
Antiguo 30/01/2009, 19:01
 
Fecha de Ingreso: enero-2009
Mensajes: 1
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: sobre un trigger en sql server

Por favor podrias ingresar el codigo de como lograste resolver tu problema.

Gracias de antemano
  #14 (permalink)  
Antiguo 31/01/2009, 04:38
Avatar de sowhat  
Fecha de Ingreso: mayo-2002
Ubicación: España, Valladolid
Mensajes: 152
Antigüedad: 22 años
Puntos: 0
Respuesta: sobre un trigger en sql server

Bufff lo siento, acabo de leer el post y no me acuerdo absolutamente de nada ni tengo el programa, estudie el modulo de DAI pero luego me he dedicado a otra cosa profesionalmente, un saludo!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:57.