А теперь все одной процедурой и без временных таблиц как хотели многие :) ...
IF OBJECT_ID ( '_data_look', 'P' ) IS NOT NULL
DROP PROCEDURE _data_look;
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE _data_look (@item int,@item_in int,@item_out int,@v int,@x nvarchar(max))
AS
BEGIN
if @x = 'движение'
if (@item_in <> @item_out) and (@item_in + @item_out > 0) and (@v >= 0)
begin
DECLARE @follow int
SET @follow = (
case
when @item_in = 0 and @item_out > 0 then 1
when @item_in > 0 and @item_out = 0 then -1
when @item_in > 0 and @item_out > 0 then 0
end
)
if @follow = 1
if (select SUM(Количество) from _Размещение where Место = @item_out) is null
begin
BEGIN TRANSACTION;
insert into _Движение values (@item,@item_in,@item_out,@v)
insert into _Размещение values (@item,@item_out,@v)
COMMIT TRANSACTION;
end
else
begin
BEGIN TRANSACTION;
insert into _Движение values (@item,@item_in,@item_out,@v)
update _Размещение
set Количество = Количество + @v
where Место = @item_out
COMMIT TRANSACTION;
end
if @follow = -1
if (select SUM(Количество) from _Размещение where Место = @item_in) is null return;
else
begin
if (select Количество - @v from _Размещение where Место = @item_in) < 0 return;
BEGIN TRANSACTION;
insert into _Движение values (@item,@item_in,@item_out,@v)
update _Размещение
set Количество = Количество - @v
where Место = @item_in
COMMIT TRANSACTION;
end
if @follow = 0
if (select SUM(Количество) from _Размещение where Место = @item_in) is null or (select Количество - @v from _Размещение where Место = @item_in) < 0 return;
else
begin
if (select SUM(Количество) from _Размещение where Место = @item_out) is null
begin
BEGIN TRANSACTION;
insert into _Размещение values (@item,@item_out,0)
COMMIT TRANSACTION;
end
BEGIN TRANSACTION;
insert into _Движение values (@item,@item_in,@item_out,@v)
update _Размещение
set Количество = Количество - @v
where Место = @item_in
update _Размещение
set Количество = Количество + @v
where Место = @item_out
COMMIT TRANSACTION;
end
end
else
return;
if @x = 'изменение'
begin
BEGIN TRANSACTION;
update _Движение
set Количество = @v
where Товар = @item and
Откуда = @item_in and
Куда = @item_out
update _Размещение
set Количество =
(select case when sum(Количество) is null then 0 else sum(Количество) end from _Движение where Куда = @item_out)
-
(select case when sum(Количество) is null then 0 else sum(Количество) end from _Движение where Откуда = @item_in)
where Место = @item_out
COMMIT TRANSACTION;
end
if @x = 'снести N'
begin
BEGIN TRANSACTION;
delete from _Движение
where
Товар = @item and
(
Откуда = @item_out
or
Куда = @item_out
)
delete from _Размещение
where
Товар = @item and
Место = @item_out
COMMIT TRANSACTION;
end
END
GO
/*=================================*/
/*=================================*/
/* собственно психи одиночки, а можно в цикле + табличка */
exec _data_look 1, 0, 3, 10, 'движение'
exec _data_look 1, 0, 2, 5, 'движение'
exec _data_look 1, 2, 3, 5, 'движение'
exec _data_look 1, 0, 3, 100, 'изменение'
/* а тут меняем данные первого exec на 100 и пересчитываем результат,
но тут на отрицательное не ставил условие- забил :) */
exec _data_look 1, 2, 3, 4, 'снести N'
/* сносим вообще всю историю со складом 3 */
select * from _Движение
select * from _Размещение
/*
truncate table _Движение
truncate table _Размещение
*/