У меня есть хранимая процедура, которая обновляет элементы инвентаря в нескольких местах. То, что я в основном пытаюсь сделать, это обеспечить правильное ведение записей для переноса запасов между местоположениями.Обновить запись, если не удалось, вставить запись, а затем обновить
Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из этих мест не имеют записей для большинства типов предметов инвентаризации, поэтому, когда я пытаюсь обновить количества (-1 от места начала, +1 до нового местоположения), нет записи для обновления.
Вот моя хранимая процедура:
CREATE procedure dbo.Inv_Transfer (@p_hStock numeric,
@p_sFProp varchar(20), @p_hTProp numeric,
@p_dQuan numeric, @p_Date datetime,
@p_sUser1 varchar(1000),@p_sUser2 varchar(1000))
as
declare
@v_FInvhMy numeric,
@v_TInvhMy numeric,
@v_sStockCode varchar(10),
@v_hFProp numeric,
@v_ibegin int,
@v_iend int
begin
set @v_ibegin = charindex('(', @p_sFProp )
if @v_ibegin <= 0
begin
raiserror('From property string not readable',16,1, @p_sFProp)
return(0)
end
else
begin
set @v_iend = charindex (')',@p_sFProp)
set @v_hFProp = substring(@p_sFProp,@v_ibegin + 1,@v_iend - @v_ibegin -1)
end
select @v_sStockCode = sCode from mm2stock where hMy = @p_hStock
if @@ERROR<> 0
begin
raiserror('Stock read failed ',16,1)
return(0)
end
select @v_FInvhMy = hMy from mm2inventory where hStock = @p_hStock and hStoreProp = @v_hFprop
if @@ERROR<> 0
begin
raiserror('From inventory read failed ',16,1)
return(0)
end
select @v_TInvhMy = hMy from mm2inventory where hstock = @p_hStock and hStoreProp = @p_hTProp
if @@ERROR<> 0
begin
raiserror('To inventory read failed ',16,1)
return(0)
end
update mm2inventory set iQtyonHand = iQtyonHand - @p_dquan where hmy = @v_FInvhMy
if @@ERROR<> 0
begin
raiserror('Update from inventory failed ',16,1)
return(0)
end
update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
if @@ERROR<> 0
begin
raiserror('Update to inventory failed ',16,1)
return(0)
end
else
begin
INSERT INTO mm2inventory (scode, hstock, hstoreprop, dcosteach, dbillprice, ireorderlevel, ireorderqty, iqtyonorder, iqtyonhand, suser1, suser2, suser3, suser4, snotes)
SELECT (SELECT hmy + 1 where hmy in (select max(hmy) from mm2inventory)),@p_hStock,@p_hTProp,(SELECT dcosteach from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT dbillprice from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderlevel from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderqty from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),0,0,'','','','','' FROM mm2inventory
update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
end
insert into mm2InvXfer(sStock,hinvfrom,hinvto,dquant,dtdate,sUser1,sUser2)
values (@v_sStockCode,@v_FinvhMy, @v_TInvhMy, @p_dquan,
isnull(@p_Date,getdate()), @p_sUser1, @p_sUser2)
if @@ERROR<> 0
begin
raiserror('Insert into inventoryxfer table failed ',16,1)
return(0)
end
end
Отрывок, что я работаю на:
update mm2inventory set iQtyonHand = iQtyonHand - @p_dquan where hmy = @v_FInvhMy
if @@ERROR<> 0
begin
raiserror('Update from inventory failed ',16,1)
return(0)
end
update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
if @@ERROR<> 0
begin
raiserror('Update to inventory failed ',16,1)
return(0)
end
else
begin
INSERT INTO mm2inventory (scode, hstock, hstoreprop, dcosteach, dbillprice, ireorderlevel, ireorderqty, iqtyonorder, iqtyonhand, suser1, suser2, suser3, suser4, snotes)
SELECT (SELECT hmy + 1 where hmy in (select max(hmy) from mm2inventory)),@p_hStock,@p_hTProp,(SELECT dcosteach from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT dbillprice from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderlevel from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),(SELECT ireorderqty from mm2inventory where hstock = @p_hStock and hstoreprop = @v_hFProp),0,0,'','','','','' FROM mm2inventory
update mm2inventory set iQtyonHand = iQtyonHand + @p_dquan where hmy = @v_TInvhMy
end
Итак, как вы можете видеть выше, я пытаюсь обновить (который работает отлично если существуют записи для элемента инвентаря для обоих мест хранения), но если есть ошибка, я хочу вставить мою новую строку для этого конкретного элемента инвентаря, а затем обновить его с новым значением количества, но я делаю что-то неправильно.
Может ли кто-нибудь сказать мне, что я делаю неправильно? Благодаря
Рекомендация: использовать транзакции. Когда вам нужно обновлять несколько таблиц, и что-то пойдет не так, вы должны иметь возможность отменить (откат) все изменения, чтобы ваши данные были действительными. – ZippyV
Другое предложение: используйте ключевое слово 'EXISTS', чтобы проверить, существует ли строка. http://msdn.microsoft.com/en-us/library/ms188336.aspx – ZippyV
Спасибо за ваши предложения Zippy. Что касается 'EXISTS', может быть что-то вроде: IF (EXISTS (SELECT' record' FROM 'table' WHERE' inventory_Item_May_exist')) 'UPDATE' ELSE' INSERT_THEN_UPDATE'? – reubenCanowski