Stock con vista indexada

27/05/2007 - 02:15 por principiante | Informe spam
Tengo una tabla de movimientos de articulos:

movimientos (codart, fecha, cantidad,...)

y una vista indexada (por codart):

vexistencias (select codart, sum(cantidad) as existencia, count_big(*) as
cnt from movimientos group by codart)


Pero necesito controlar que nunca me quede una existencia negativa. Estoy
pensando en triggers pero no logro como implementarlo y donde..

Tambien pienso en una restriccion check pero tampoco lo entiendo bien.


Que opciones tengo para lograr eso?


Gracias

Jose TH

Preguntas similare

Leer las respuestas

#6 principiante
28/05/2007 - 14:25 | Informe spam
Muchisimas gracias!!!

"Jesús López" escribió en el mensaje
news:O68$

Supongamos que la tabla es esta:

CREATE TABLE movimientos (
IdMovimiento int IDENTITY(1,1) PRIMARY KEY,
CodArticulo int NOT NULL,
Fecha smalldatetime NOT NULL DEFAULT GETDATE(),
Cantidad int NOT NULL
)
GO


CREATE VIEW vExistencias WITH SCHEMABINDING
AS
SELECT CodArticulo, SUM(cantidad) AS Existencias, COUNT_BIG(*) AS Cuenta
FROM dbo.movimientos
GROUP BY CodArticulo

GO
CREATE UNIQUE CLUSTERED INDEX UK_vExistencias ON vExistencias(CodArticulo)

GO


negativas

CREATE TRIGGER Movimientos_Insert ON movimientos FOR INSERT
AS
BEGIN
IF EXISTS( SELECT *
FROM inserted i JOIN vExistencias V WITH(NOEXPAND)
ON i.CodArticulo = V.CodArticulo
WHERE v.Existencias < 0)
BEGIN
RAISERROR('Las existencias no pueden ser negativas', 16, -1, -1)
ROLLBACK
END
END
GO

fallan

INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)




(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

Msg 50000, Level 16, State 1, Procedure Movimientos_Insert, Line 9
Las existencias no pueden ser negativas


Saludos:


Jesús López
www.solidq.com



"principiante" escribió en el mensaje
news:%230WjxQ$
Tengo una tabla de movimientos de articulos:

movimientos (codart, fecha, cantidad,...)

y una vista indexada (por codart):

vexistencias (select codart, sum(cantidad) as existencia, count_big(*) as
cnt from movimientos group by codart)


Pero necesito controlar que nunca me quede una existencia negativa.
Estoy pensando en triggers pero no logro como implementarlo y donde..

Tambien pienso en una restriccion check pero tampoco lo entiendo bien.


Que opciones tengo para lograr eso?


Gracias

Jose TH





Respuesta Responder a este mensaje
#7 principiante
28/05/2007 - 14:44 | Informe spam
Una preguntita final.

El WITH(EXPAND) es estrictamente necesario?

Gracias again.


"Jesús López" escribió en el mensaje
news:O68$

Supongamos que la tabla es esta:

CREATE TABLE movimientos (
IdMovimiento int IDENTITY(1,1) PRIMARY KEY,
CodArticulo int NOT NULL,
Fecha smalldatetime NOT NULL DEFAULT GETDATE(),
Cantidad int NOT NULL
)
GO


CREATE VIEW vExistencias WITH SCHEMABINDING
AS
SELECT CodArticulo, SUM(cantidad) AS Existencias, COUNT_BIG(*) AS Cuenta
FROM dbo.movimientos
GROUP BY CodArticulo

GO
CREATE UNIQUE CLUSTERED INDEX UK_vExistencias ON vExistencias(CodArticulo)

GO


negativas

CREATE TRIGGER Movimientos_Insert ON movimientos FOR INSERT
AS
BEGIN
IF EXISTS( SELECT *
FROM inserted i JOIN vExistencias V WITH(NOEXPAND)
ON i.CodArticulo = V.CodArticulo
WHERE v.Existencias < 0)
BEGIN
RAISERROR('Las existencias no pueden ser negativas', 16, -1, -1)
ROLLBACK
END
END
GO

fallan

INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)




(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

Msg 50000, Level 16, State 1, Procedure Movimientos_Insert, Line 9
Las existencias no pueden ser negativas


Saludos:


Jesús López
www.solidq.com



"principiante" escribió en el mensaje
news:%230WjxQ$
Tengo una tabla de movimientos de articulos:

movimientos (codart, fecha, cantidad,...)

y una vista indexada (por codart):

vexistencias (select codart, sum(cantidad) as existencia, count_big(*) as
cnt from movimientos group by codart)


Pero necesito controlar que nunca me quede una existencia negativa.
Estoy pensando en triggers pero no logro como implementarlo y donde..

Tambien pienso en una restriccion check pero tampoco lo entiendo bien.


Que opciones tengo para lograr eso?


Gracias

Jose TH





Respuesta Responder a este mensaje
#8 Jesús López
28/05/2007 - 17:16 | Informe spam
Si tienes la edición empresarial el WITH (NOEXPAND) no es necesario, pero
si tienes cualquier otra como estándar, workgroup, msde, etc, es necesario
para que SQL Server use el índice de la vista indexada.

Saludos:

Jesús López
www.solidq.com



"principiante" escribió en el mensaje
news:%
Una preguntita final.

El WITH(EXPAND) es estrictamente necesario?

Gracias again.


"Jesús López" escribió en el mensaje
news:O68$

Supongamos que la tabla es esta:

CREATE TABLE movimientos (
IdMovimiento int IDENTITY(1,1) PRIMARY KEY,
CodArticulo int NOT NULL,
Fecha smalldatetime NOT NULL DEFAULT GETDATE(),
Cantidad int NOT NULL
)
GO


CREATE VIEW vExistencias WITH SCHEMABINDING
AS
SELECT CodArticulo, SUM(cantidad) AS Existencias, COUNT_BIG(*) AS Cuenta
FROM dbo.movimientos
GROUP BY CodArticulo

GO
CREATE UNIQUE CLUSTERED INDEX UK_vExistencias ON
vExistencias(CodArticulo)

GO


existencias negativas

CREATE TRIGGER Movimientos_Insert ON movimientos FOR INSERT
AS
BEGIN
IF EXISTS( SELECT *
FROM inserted i JOIN vExistencias V
WITH(NOEXPAND)
ON i.CodArticulo = V.CodArticulo
WHERE v.Existencias < 0)
BEGIN
RAISERROR('Las existencias no pueden ser negativas', 16, -1, -1)
ROLLBACK
END
END
GO

no fallan

INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)
INSERT INTO movimientos(CodArticulo, Cantidad) VALUES(1,-10)




(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

Msg 50000, Level 16, State 1, Procedure Movimientos_Insert, Line 9
Las existencias no pueden ser negativas


Saludos:


Jesús López
www.solidq.com



"principiante" escribió en el mensaje
news:%230WjxQ$
Tengo una tabla de movimientos de articulos:

movimientos (codart, fecha, cantidad,...)

y una vista indexada (por codart):

vexistencias (select codart, sum(cantidad) as existencia, count_big(*)
as cnt from movimientos group by codart)


Pero necesito controlar que nunca me quede una existencia negativa.
Estoy pensando en triggers pero no logro como implementarlo y donde..

Tambien pienso en una restriccion check pero tampoco lo entiendo bien.


Que opciones tengo para lograr eso?


Gracias

Jose TH









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