表:库存med_kucun(药品编号medid,单价price,数量medsum)
    入库单med_insheet (入库单号insheetid,入库标志flag(0为暂存,1为入库)......)
    入库单明细(入库单号insheetid,药品编号medid,单价price,数量number......)想法,1、库存表在入库单flag变为1时对库存进行增加。
      2、未在药品基础信息表增加时建立为0库存,想在入库时直接建立库存。
      3、根据入库单明细的药品编号与单价来判断,如果有相同编号与单价则为增加,如果无均相同的则新增。
请问有什么思路,如果用触发器该怎么写?

解决方案 »

  1.   

    create trigger [dbo].[tr_med_insert_upd] on [dbo].[med_insheet ]
    after update 
    as
    begin 
    set nocount on
    if not update(flag) return  
    declare @flag char(01) declare @insheetid varchar(10) declare @price decimal(18,4) 
    declare @number decimal(18,4) declare @medid varchar(10)
    select  @flag = flag , @insheetid = insheetid from inserted
    if @flag <> '1' return
    select @price = price , @number = number , @medid = medid from 入库单明细  where insheetid = @insheetid
    if exists(slect 1 from med_kucun where medid = @medid and price = @price)
    update medsum = medsum + @number where medid = @medid and price = @price
    else
    insert into med_kucun (medid , price , medsum ......) values (@medid , @price , @number)
    set nocount off
    endGO
      

  2.   

    建议你去下个ERP或进销存系统看看人家怎么设计的.
      

  3.   


    1、因为一直说用触发器不是太好,因此想能不能有别的方法。
    2、触发器对应的deleted,inserted是个表集,select    @price = price 。这种方式可行?不需要用游标即可吗?一直没敢用变量赋值,想着用sql语句表对表操作。能不能解说一下这种方式的工作原理。
      

  4.   


    根本不需要入库单的flag变为1时,就对库存进行增加,直接用sql语句进行统计库存不就行了,没必要写入库存表里。如果真的做对库存增加,也不能用触发器,在审核单据的时候直接写入库存就行了。
      

  5.   

    审核单据的按钮用PB进行了封装,直接写还不如写触发器或存储过程方便。
    2楼的方法我试了只能更新一条数据。
    我这样写的
    update medkucun set medsum=medsum+c.number from (select a.medid,a.price,a.number from insheet_detail a ,inserted b where a.insheetid=b.insheetid and b.flag=1) c where medkucun.medid=c.medid and medkucun.price = c.priceinsert into medkucun select a.medid,a.price,a.number from insheet_detail a ,inserted b where a.insheedid=b.insheetid and b.flag=1 and a.medid+convert(char(50),a.price) not in (select b.medid+convert(char(50),b.price) from inserted)
    库存能按要求进行入库改变,但是PB运行后报row retrieve与update错误,不知什么原因。