CREATE OR REPLACE TRIGGER TR_YF_YPCKD0_AFUPD AFTER UPDATE ON SD_YF.YF_YPCKD0 REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW WHEN (OLD.CKZT00='0' AND NEW.CKZT00='1' ) DECLARE V_CKBMMC BM_BMBM00.BMMC00%TYPE; V_SJKCSL YF_YPKCXX.SJKCSL%TYPE; v_CKLXMC YF_YPMXZ0.RCLXMC%TYPE; V_FYBZ00 BM_BMBM00.FYBZ00%TYPE; V_YKKCSL YF_YPKCXX.YKKCSL%TYPE; V_YKKCSL_PD YF_YPKCXX.YKKCSL%TYPE; V_SFZBYP BM_YD0000.SFZBYP%TYPE; V_LSJ000 YF_YPKCXX.LSDJ00%TYPE; v_GJJ000 YF_YPKCXX.GJDJ00%TYPE; V_LSJCK0 BM_YD0000.LSJ000%TYPE; V_GJJCK0 BM_YD0000.GJJ000%TYPE; v_LSJGL0 XT_XTCS00.VALUE0%TYPE; --药库药房零售价是否独立管理 v_LSJGL2 XT_XTCS00.VALUE0%TYPE; --药房零售价是否独立管理 V_K2J000 BM_YD0000.K2J000%TYPE; V_RKDH00 YF_YPRKD0.RKDH00%TYPE; V_PCSJKC YF_PCKCMX.SJKCSL%TYPE; --批次实际库存 V_PCYKKC YF_PCKCMX.YKKCSL%TYPE; --批次预扣库存 v_KHHCS0 XT_XTCS00.VALUE0%TYPE; --客户化参数:0默认;1莆二;2泉二;3省二;4南安;5七院;6铁路医院 V_ZDRKRQ XT_XTCS00.VALUE0%TYPE; V_ZY0000 YF_YPMXZ0.ZY0000%TYPE; V_ZY0001 YF_YPMXZ0.ZY0000%TYPE; V_CKJE00 YF_YPCKMX.CKJE00%TYPE; --出库金额 V_GJCKJE YF_YPCKMX.CKJE00%TYPE; --购进出库金额 V_KSJKC0 XT_XTCS00.VALUE0%TYPE; v_ZDGXLJ XT_XTCS00.VALUE0%TYPE; V_TEMP00 NUMBER(20,4); V_TEMP01 NUMBER(20,4); V_CKKCJY XT_XTCS00.VALUE0%TYPE; --出库是否校验库存 YF_PDQJSFYXFY XT_XTCS00.value0%type;--盘点期间是否允许发药 ,Y允许 N不允许 v_TEMPCS XT_XTCS00.VALUE0%TYPE; --剩余出库数量 V_SYCKSL YF_PCKCMX.SJKCSL%TYPE; --本次出库数量 V_BCCKSL YF_PCKCMX.SJKCSL%TYPE; V_PCKCSL YF_PCKCMX.YKKCSL%TYPE; V_KCSL00 BM_YD0000.KCSL00%TYPE; V_KCLSH0 YF_PCKCMX.KCLSH0%TYPE; V_EXIST0 CHAR(1); CURSOR c_YPCKMX IS SELECT * FROM YF_YPCKMX WHERE CKDH00=:NEW.CKDH00; v_YPCKMX c_YPCKMX%ROWTYPE; V_errmsg varchar2(255); --错误提示变量 E_custom exception; --错误变量 E_YKKCBZ exception; V_Count Number(2,0); V_errmsg1 varchar2(255); --错误提示变量 v_SCPH00 YF_PCKCMX.SCPH00%type; --批次库存批号 -- MODIFICATION HISTORY -- Person Date Comments -- JETHUA 2002.10.30 增加功能:避免库存留误差小数,增加判断后清零:74行 -- JETHUA 2003.06.05 增加判断,在完全出库时,避免预扣库存大于实际库存 86 -- JETHUA 2002.10.30 增加判断是否中标药品 -- JETHUA 2003.09.07 增加判断零售价是否单独管理,如单独管理判断入库单价,并判断调赢或亏 -- JETHUA 2003.09.19 账页结存数不应等于实际库存/转换率,而应等于实际库存/K2J 70行 -- JETHUA 2003.09.25 同时扣除批次库存,冲销就增加批次库存 -- JETHUA 2003.11.02 如果为调拨出库,则同时插入一入库单 -- JETHUA 2003.12.11 病区领药的预扣库存通过触发器处理 -- JETHUA 2004.02.18 处理零售价单位不同引发错误 -- JETHUA 2004.03.12 增加药房零售价单独管理处理 -- JETHUA 2004.07.01 零售价按小数点两位判断 -- JETHUA 2004.07.08 规范错误提示 -- JETHUA 2004.10.10 补充增加判断是否中标药品 -- JETHUA 2004.11.01 6铁路医院报损扣除预扣库存 -- JETHUA 2004.11.05 如药品隶属被删除,明确错误提示 -- JETHUA 2004.12.20 增加调拨入库单生成,增加插入批号和失效日期 -- JETHUA 2005.06.15 避免药品经过换算,后产生0.001的差额,使药品无法出库 -- JETHUA 2005.08.09 购进价为空 则付值 -- JETHUA 2005.08.26 单价计算,先承后除,避免误差 -- JETHUA 2005.08.31 购进价为空 不能在次付值,否则无法发药 -- JETHUA 2005.09.29 德化医院要求要求处方出库不显示科室名称 -- JETHUA 2006.02.23 铁路医院:通过参数可以控制调拨是否自动入库 -- JETHUA 2006.02.28 药房单价格管理,在出库确认前要更新最新零售价 -- csf 2006.03.30 住院退药审核出现bug -- YANGH 2007.06.13 南安:科室借药扣实际库存 -- YANGH 2007.10.21 多零售价情况下,根据参数YF_RKSFZDGXLSJ控制是否在入库的时候修改YF_YPKCXX.LSJ000,还是在出库的时候修改。 -- linzy 2010.02.25 增加变量V_Count。科研药品不扣除批次库存 -- CSF 2010.05.27 判断批次库存,转换单价比较时候,写法改成先乘后除 -- CSF 2010.07.01 中药生产批号允许为空,为空的话,系统用' '来处理,那么判断yf_pckcmx.scph00=trim(yf_ypckmx.scph00)是不正确的应改为nvl(trim(yf_pckcmx.scph00,' '))=nvl(trim(yf_ypckmx.scph00),' ') -- CSF 2010.08.27 处理预扣库存,也要避免药品经过换算,后产生0.001的差额,使药品无法出库 -- CSF 2010.09.14 处理预扣库存,也要避免药品经过换算,后产生0.001的差额的算法应该是计算出库数量先按保留4位计算大单位再与保留三位进行比较得到的差值小于0.001 -- zhangwz 2010.10.29 参数 YF_KSLYCKSFJXKCPD='N' 的情况下 科室领药 类出库单出库不判断库存. by YF-20101022-001 -- csf 2011.07.12 加参数YF_PDQJSFYXFY控制,盘点期间允许发药 -- laijg 2011.09.26 增加通用参数YF_SFJKSHYXRRKD按南安医院要求一样将科室还药写入库单 -- csf 2011.12.02 处理购进价,单价格取YF_YPKCXX,多价格取YF_PCKCMX YF-20111212-002 -- laijg 2012.04.27 除南安医院以外更新库存SJKCSL by YF-20120427-002 -- laijg 2012.06.11 select value0 into v_TEMPCS from xt_xtcs00 where name00='YF_SFJKSHYXRRKD' 写法不严谨,加异常处理 by YF-20120608-001 -- laijg 2012.07.16 该需求YF-20120427-002修改,未加参数控制,现YF_SFJKSHYXRRKD参数控制 by YF-20120716-001 -- laijg 2012.12.10 肺科导回约束ck_yf_ypkcxx,预扣库存不能小于0,增加异常E_YKKCBZ判断 by YF-20121101-001 -- csf 2013.01.15 上一条的修改记录有问题,医嘱出库预扣已经扣过了,不能重复 YF-20130115-003 -- daihq 2013.09.23 修正判断批次库存不足的条件 by YF-20130923-001 -- daihq 2014.05.06 修正部分代码分叉预扣库存小于0时没有跳转到异常E_YKKCBZ,给出具体的药品提示,并且增加提示药品的剩余预扣库存 by YF-20140331-001 -- daihq 2015.09.11 多零售价管理,增加药品生产批号,零售价,购进价都相同时的处理,按先进先出的规则 for YF-20150902-003 -- daihq 2016.06.02 避免药品经过换算,后产生0.001的差额,使药品无法出库 for YF-20160602-001 -- huangjy 2017.07.25 增加异常报错提示,定位异常点 for ZYYFQH-20170705-001 -- dsm 2018.11.27 药房退库库存没有减bug处理(天真) for YF-20181127-001 -- dsm 2019.06.09 YF_YPMXZ00.KSBH00 for YF-20190507-001 -- dsm 2020.04.22 当出库单是负数时YF_PCKCMX的数量不会加 for YF-20200422-001 -- huangjy 2020.12.23 非多零售价时,减少YF_YPRKMX对应退库批次的批次库存数量 for YF-20201216-001 -- huangjy 2021.08.16 增加多价格管理时,对应批次库存没有的情况下,先判断入库较早批次库存 for YF-20210806-001 -- --------- ---------- ------------------------------------------- BEGIN V_errmsg:=''; --取出药房零售价是否独立管理参数 JETHUA 2003.09.04 BEGIN SELECT Trim(VALUE0) INTO v_LSJGL0 FROM XT_XTCS00 WHERE NAME00='YK_YF_LSJSFDLGL'; EXCEPTION WHEN OTHERS THEN v_LSJGL0:='N'; END; --取出药房零售价是否独立管理参数 JETHUA 2003.09.04 BEGIN SELECT Trim(VALUE0) INTO v_LSJGL2 FROM XT_XTCS00 WHERE NAME00='YF_SFDLSJGL'; EXCEPTION WHEN OTHERS THEN v_LSJGL2:='N'; END; --取出客户化参数:0默认;1莆二;2泉二;3省二;4南安;5七院;6铁路医院 JETHUA 2004.11.01 BEGIN SELECT Trim(VALUE0) INTO v_KHHCS0 FROM XT_XTCS00 WHERE NAME00='YF_ZJKFDDDYGS'; EXCEPTION WHEN OTHERS THEN v_KHHCS0:='0'; END; --取系统参数:是否自动进行药房入库确认 BEGIN SELECT Trim(VALUE0) INTO V_ZDRKRQ FROM XT_XTCS00 WHERE NAME00='YK_YFZDRKRQ'; EXCEPTION WHEN OTHERS THEN V_ZDRKRQ:='N'; END; BEGIN SELECT Trim(VALUE0) INTO v_ZDGXLJ FROM XT_XTCS00 WHERE NAME00='YF_RKSFZDGXLSJ'; EXCEPTION WHEN OTHERS THEN v_ZDGXLJ:='Y'; END; --取系统参数:出库是否校验库存 by YF-20101022-001 BEGIN SELECT Trim(VALUE0) INTO V_CKKCJY FROM XT_XTCS00 WHERE NAME00='YF_KSLYCKSFJXKCPD'; EXCEPTION WHEN OTHERS THEN V_CKKCJY:='Y'; END; BEGIN select value0 into v_TEMPCS from xt_xtcs00 where name00='YF_SFJKSHYXRRKD'; --按南安医院做法增加通用参数 EXCEPTION WHEN OTHERS THEN v_TEMPCS:='N'; END; ----------------通过游标在明细表中循环实现修改库存 select nvl(max(trim(VALUE0)),'N') into YF_PDQJSFYXFY from XT_XTCS00 where NAME00='YF_PDQJSFYXFY'; if (YF_PDQJSFYXFY='N') or (:new.CKLXBH<>'03') then SELECT FYBZ00 INTO V_FYBZ00 FROM BM_BMBM00 WHERE BMBH00=:OLD.YFBMBH; IF ((V_FYBZ00='3') AND (:OLD.CKBMBH<>99999)) THEN V_errmsg:='药房正在盘点,不能进行进出库确认'; RAISE E_custom; END IF; end if; OPEN c_YPCKMX; FETCH c_YPCKMX INTO v_YPCKMX; V_errmsg1:='@1'; WHILE c_YPCKMX%FOUND LOOP --取基本信息 V_errmsg1:='@1'||'@'||v_YPCKMX.YPNM00; SELECT SFZBYP,LSJ000,K2J000 INTO V_SFZBYP,V_LSJ000,V_K2J000 FROM BM_YD0000 WHERE YPNM00=v_YPCKMX.YPNM00; V_errmsg1:='@2'||'@'||v_YPCKMX.YPNM00; SELECT LSDJ00,GJDJ00 INTO V_LSJ000,V_GJJ000 FROM YF_YPKCXX where YFBMBH=:NEW.YFBMBH and YPNM00=v_YPCKMX.YPNM00; V_errmsg1:='@3'||'@'||v_YPCKMX.YPNM00; ------判断库存是否充足--------- BEGIN SELECT NVL(SJKCSL,0),NVL(YKKCSL,0) INTO V_SJKCSL,V_YKKCSL FROM YF_YPKCXX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; EXCEPTION WHEN OTHERS THEN V_errmsg:='药品: ['||Trim(V_YPCKMX.YPMC00)||'] 在药品隶属中已删除'; RAISE E_custom; END; V_YKKCSL_PD:=V_YKKCSL; --预扣库存不能小于0 by YF-20121101-001 -- if v_LSJGL2='N' then -- end if; IF NOT ((:NEW.CKLXBH='08') AND (:NEW.HYSJ00<>:OLD.HYSJ00)) THEN --科室借药归还不判断库存 --避免药品经过换算,后产生0.001的差额,使药品无法出库 V_TEMP00:=ROUND(V_SJKCSL/v_YPCKMX.ZHL000,4)-v_YPCKMX.CKSL00; IF V_TEMP00<0 AND ABS(V_TEMP00)>=0.001 and (V_CKKCJY<>'N' or (V_CKKCJY='N' and :NEW.CKLXBH<>'01')) THEN --过滤科室领药类单据 CLOSE c_YPCKMX; V_errmsg:='药品:'||RTRIM(V_YPCKMX.YPMC00)||',库存不足 '||to_char(V_TEMP00)||','||to_char(ROUND(V_SJKCSL/v_YPCKMX.ZHL000,4))||' '||to_char(v_YPCKMX.CKSL00); RAISE E_custom; END IF; END IF; -------判断批次库存是否充足----------- IF v_LSJGL2='Y' AND :NEW.CKLXBH<>'03' and (V_CKKCJY<>'N' or (V_CKKCJY='N' and :NEW.CKLXBH<>'01')) THEN --批号为空即医嘱出库,不在这判断 --2018.11.27 许天真加nvl begin SELECT nvl(ROUND(sum(SJKCSL)/v_YPCKMX.ZHL000,3),0),nvl(sum(YKKCSL),0) INTO V_PCSJKC,V_PCYKKC FROM YF_PCKCMX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND ROUND(GJDJ00,2)=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ') ; EXCEPTION WHEN OTHERS THEN V_PCSJKC:=0; END; if V_PCSJKC=0 then SELECT nvl(ROUND(sum(SJKCSL)/v_YPCKMX.ZHL000,3),0),nvl(sum(YKKCSL),0),'NULL' INTO V_PCSJKC,V_PCYKKC,v_SCPH00 FROM YF_PCKCMX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND ROUND(GJDJ00,2)=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,2) and SJKCSL>0 order by KCLSH0 ; end if; BEGIN--避免药品经过换算,后产生0.001的差额,使药品无法出库 --2018.11.27 许天真加nvl SELECT nvl(ROUND(sum(SJKCSL)/v_YPCKMX.ZHL000,4),0)-v_YPCKMX.CKSL00 INTO V_TEMP01 FROM YF_PCKCMX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*v_K2J000/v_YPCKMX.ZHL000,2) AND ROUND(GJDJ00,2)=ROUND(V_YPCKMX.GJDJ00*v_K2J000/v_YPCKMX.ZHL000,2) AND ((nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ')) or v_SCPH00='NULL' ); EXCEPTION WHEN OTHERS THEN V_TEMP01:=0; END; IF (V_PCSJKC-v_YPCKMX.CKSL00)<0 THEN IF (V_TEMP01<0 AND ABS(V_TEMP01)>=0.001) or (V_PCSJKC=0 AND V_TEMP01=0) THEN CLOSE c_YPCKMX; V_errmsg:='药品:'||RTRIM(V_YPCKMX.YPMC00||'('||v_YPCKMX.SCPH00||v_SCPH00||')')||',批次库存不足'; RAISE E_custom; END IF; END IF; END IF; ----------修改库存-------------- -- select value0 into v_TEMPCS from xt_xtcs00 where name00='YF_SFJKSHYXRRKD'; --按南安医院做法增加通用参数 IF :NEW.CKLXBH='08' THEN IF (v_KHHCS0='4') or (trim(v_TEMPCS)='Y') THEN --参数控制南安医院科室借药,扣‘预扣库存’和'实际库存' IF :NEW.JYSFGH='N' THEN --避免药品经过换算,后产生0.001的差额,使库存为负 IF V_TEMP00<0 THEN UPDATE YF_YPKCXX SET YKKCSL=0,SJKCSL=0 WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; ELSE if V_YKKCSL_PD-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0 then V_errmsg:='出库单号:['||Trim(V_YPCKMX.ckdh00)||'],药品: ['||Trim(V_YPCKMX.YPMC00)||'] 预扣库存数量不能小于0,当前预扣库存数为'||to_char(round(V_YKKCSL_PD/v_YPCKMX.ZHL000,3))||',出库数量不能超过预扣库存'; RAISE E_YKKCBZ; end if; UPDATE YF_YPKCXX SET YKKCSL=NVL(YKKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; END IF; END IF; ELSE--(除南安医院以外) if v_TEMPCS='Y' then IF :NEW.JYSFGH='N' THEN --科室借药,也扣实际库存 --避免药品经过换算,后产生0.001的差额,使库存为负 IF V_TEMP00<0 THEN UPDATE YF_YPKCXX SET YKKCSL=0,SJKCSL=0 WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; ELSE if V_YKKCSL_PD-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0 then V_errmsg:='出库单号:['||Trim(V_YPCKMX.ckdh00)||'],药品: ['||Trim(V_YPCKMX.YPMC00)||'] 预扣库存数量不能小于0,当前预扣库存数为'||to_char(round(V_YKKCSL_PD/v_YPCKMX.ZHL000,3))||',出库数量不能超过预扣库存'; RAISE E_YKKCBZ; end if; UPDATE YF_YPKCXX SET YKKCSL=NVL(YKKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)---- WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; END IF; END IF; else IF :NEW.JYSFGH='N' THEN --科室借药,只扣‘预扣库存’ --避免药品经过换算,后产生0.001的差额,使库存为负 IF V_TEMP00<0 THEN UPDATE YF_YPKCXX SET YKKCSL=0 WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; ELSE if V_YKKCSL_PD-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0 then V_errmsg:='出库单号:['||Trim(V_YPCKMX.ckdh00)||'],药品: ['||Trim(V_YPCKMX.YPMC00)||'] 预扣库存数量不能小于0,当前预扣库存数为'||to_char(round(V_YKKCSL_PD/v_YPCKMX.ZHL000,3))||',出库数量不能超过预扣库存'; RAISE E_YKKCBZ; end if; UPDATE YF_YPKCXX SET YKKCSL=NVL(YKKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; END IF; END IF; end if; END IF; ELSIF (:NEW.CKLXBH ='03')OR(:NEW.CKLXBH='04' AND v_KHHCS0='6') THEN --病区医嘱领药出库,铁路医院报损出库 IF v_YPCKMX.CKSL00>0 THEN -- ‘预扣库存’不扣减 UPDATE YF_YPKCXX SET SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; --扣除批次库存 V_errmsg1:='@4'||'@'||v_YPCKMX.YPNM00; IF v_LSJGL2='N' THEN --多零售价管理不做入库单的批次库存 SP_YF_JSPCKC(:OLD.YFBMBH,v_YPCKMX.YPNM00,ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3),v_YPCKMX.SCPH00); END IF; ELSE --冲销预扣库存’加回去 UPDATE YF_YPKCXX SET SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; --增加批次库存 IF v_LSJGL2='N' THEN --多零售价管理不做入库单的批次库存 SP_YF_ZJPCKC(:OLD.YFBMBH,v_YPCKMX.YPNM00,-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)); END IF; END IF; ELSE --除借药和医嘱出库以为的其它出库方式 --2016.06.02 daihq 修改避免药品经过换算,后产生0.001的差额,使药品无法出库 V_TEMP01:=ROUND(V_YKKCSL/v_YPCKMX.ZHL000,4)-v_YPCKMX.CKSL00; if (ROUND(V_SJKCSL/v_YPCKMX.ZHL000,3)=v_YPCKMX.CKSL00) or ((V_YKKCSL-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0) and ((abs(v_temp01)<0.001)or(:NEW.CKLXBH='19')) ) then --2002.10.30 JETHUA --IF ROUND(V_SJKCSL/v_YPCKMX.ZHL000,3)=v_YPCKMX.CKSL00 THEN --避免药品经过换算,后产生0.001的差额,使药品无法出库 --V_TEMP01:=ROUND(V_YKKCSL/v_YPCKMX.ZHL000,4)-v_YPCKMX.CKSL00; V_YKKCSL:=V_YKKCSL-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3); IF V_YKKCSL>0 THEN V_YKKCSL:=0; ELSIF (V_YKKCSL<0) and ((abs(v_temp01)<0.001)or(:NEW.CKLXBH='19')) then V_YKKCSL:=0; END IF; if V_YKKCSL<0 then V_errmsg:='出库单号:['||Trim(V_YPCKMX.ckdh00)||'],药品: ['||Trim(V_YPCKMX.YPMC00)||'] 预扣库存数量不能小于0,当前预扣库存数为'||to_char(round(V_YKKCSL_PD/v_YPCKMX.ZHL000,3))||',出库数量不能超过预扣库存'; RAISE E_YKKCBZ; end if; UPDATE YF_YPKCXX SET YKKCSL=V_YKKCSL, SJKCSL=0 WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; --批次库存全清零 UPDATE YF_YPRKMX X SET X.PCKCSL=0 WHERE EXISTS (SELECT 1 FROM YF_YPRKD0 D WHERE X.RKDH00=D.RKDH00 AND YFBMBH=:OLD.YFBMBH) AND X.PCKCSL>0 AND YPNM00=v_YPCKMX.YPNM00; ELSE if V_YKKCSL_PD-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0 then V_errmsg:='出库单号:['||Trim(V_YPCKMX.ckdh00)||'],药品: ['||Trim(V_YPCKMX.YPMC00)||'] 预扣库存数量不能小于0,当前预扣库存数为'||to_char(round(V_YKKCSL_PD/v_YPCKMX.ZHL000,3))||',出库数量不能超过预扣库存'; RAISE E_YKKCBZ; end if; UPDATE YF_YPKCXX SET YKKCSL=NVL(YKKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; IF v_LSJGL2='N' THEN --多零售价管理不做入库单的批次库存 IF v_YPCKMX.CKSL00>0 THEN --扣除批次库存 select count(1) into V_Count from BM_YD0000 where YPNM00=v_YPCKMX.YPNM00 and SFKYYY='Y'; if V_Count=0 then --科研用药不减少入库明细表的批次库存 SP_YF_JSPCKC(:OLD.YFBMBH,v_YPCKMX.YPNM00,ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3),v_YPCKMX.SCPH00); end if; ELSE --增加批次库存 SP_YF_ZJPCKC(:OLD.YFBMBH,v_YPCKMX.YPNM00,-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)); END IF; END IF; END IF; END IF; --扣除批次库存 IF v_LSJGL2='Y' THEN IF :NEW.CKLXBH='03' THEN --处方出库 SP_YF_PCKCCK(:OLD.YFBMBH,v_YPCKMX.YPNM00,ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3),ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,4),:NEW.CKDH00,:NEW.QRRQ00,:NEW.QRSJ00,'1',ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,4)); V_errmsg1:='@5'||'@'||v_YPCKMX.YPNM00; ELSE V_errmsg1:='@6'||'@'||v_YPCKMX.YPNM00; IF v_YPCKMX.CXBZ00='Z' THEN --库存为零,删除 IF (V_PCSJKC-v_YPCKMX.CKSL00)=0 THEN UPDATE YF_PCKCMX SET SJKCSL=0 WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND ROUND(GJDJ00,2)=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND (nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ')or (:new.CKLXBH=19)); ELSE DECLARE CURSOR C_PCKC00 IS SELECT KCLSH0,SJKCSL,YKKCSL FROM YF_PCKCMX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND ROUND(GJDJ00,2)=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,2) AND (nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ')or (:new.CKLXBH=19)) ORDER BY TO_NUMBER(KCLSH0); BEGIN V_SYCKSL:=ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3); OPEN C_PCKC00; FETCH C_PCKC00 INTO V_KCLSH0,V_PCKCSL,V_PCYKKC; WHILE C_PCKC00%FOUND AND abs(V_SYCKSL)>0 LOOP --YF-20200422-001 abs IF V_SYCKSL-V_PCKCSL <=0 THEN --本批次够出剩余出库量 V_BCCKSL:=V_SYCKSL; V_SYCKSL:=0; ELSE V_BCCKSL:=V_PCKCSL; V_SYCKSL:=V_SYCKSL-V_BCCKSL; END IF; --如果预扣数小于零,以零记录 IF V_PCYKKC-V_BCCKSL<0 THEN V_PCYKKC:=0; ELSE V_PCYKKC:=V_PCYKKC-V_BCCKSL; END IF; UPDATE YF_PCKCMX SET YKKCSL=V_PCYKKC, SJKCSL=NVL(SJKCSL,0)-V_BCCKSL WHERE KCLSH0=V_KCLSH0; FETCH C_PCKC00 INTO V_KCLSH0,V_YKKCSL,V_PCYKKC; END LOOP; CLOSE C_PCKC00; END; --如果预扣数小于零,以零记录 --IF V_PCYKKC-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3)<0 THEN -- V_PCYKKC:=0; --ELSE -- V_PCYKKC:=V_PCYKKC-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3); --END IF; --修改批次库存 --UPDATE YF_PCKCMX -- SET YKKCSL=V_PCYKKC, -- SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) -- WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 -- AND ROUND(LSDJ00,2)=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2) -- AND ROUND(GJDJ00,2)=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,2) -- AND nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ') ; END IF; END IF; --零批次库存处理 SP_YF_CLLSL0(:OLD.YFBMBH,v_YPCKMX.YPNM00); IF (v_ZDGXLJ = 'N') AND (v_YPCKMX.CXBZ00='-') THEN UPDATE YF_YPKCXX SET LSDJ00=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,2),GJDJ00=ROUND(v_YPCKMX.GJDJ00*v_K2J000/v_YPCKMX.ZHL000,2) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; END IF; END IF; --------------退药 IF v_YPCKMX.CXBZ00='-' THEN --2 BEGIN SELECT '1' INTO V_EXIST0 FROM YF_PCKCMX WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND LSDJ00=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,4) AND GJDJ00=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,4) AND nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ') and rownum=1; EXCEPTION WHEN OTHERS THEN V_EXIST0:='0'; END; --存在则修改 IF V_EXIST0='1' THEN --1 UPDATE YF_PCKCMX SET YKKCSL=NVL(YKKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), SJKCSL=NVL(SJKCSL,0)-ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3) WHERE YFBMBH=:OLD.YFBMBH AND YPNM00=v_YPCKMX.YPNM00 AND LSDJ00=ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,4) AND GJDJ00=ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,4) AND nvl(trim(SCPH00),' ')=nvl(trim(v_YPCKMX.SCPH00),' ') and rownum=1; ELSE INSERT INTO YF_PCKCMX( KCLSH0, YFBMBH, YPNM00, LSDJ00, SCPH00, YKKCSL, SJKCSL, GJDJ00) VALUES( SQ_YF_PCKCMX_KCLSH0.NEXTVAL, :OLD.YFBMBH, v_YPCKMX.YPNM00, ROUND(v_YPCKMX.LSDJ00*V_K2J000/v_YPCKMX.ZHL000,4), nvl(trim(v_YPCKMX.SCPH00),' '), -ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), -ROUND(v_YPCKMX.CKSL00*v_YPCKMX.ZHL000,3), ROUND(v_YPCKMX.GJDJ00*V_K2J000/v_YPCKMX.ZHL000,4) ); END IF;--1 END IF; --2 END IF; --多批次处理 -----------------记账------------ IF :NEW.CKBMBH=99999 and :NEW.CKLXBH='07' THEN V_CKBMMC:='盘亏出库'; ELSIF :NEW.CKBMBH=99999 and :NEW.CKLXBH='19' THEN V_CKBMMC:='四舍五入'; ELSIF :NEW.CKBMBH=88888 THEN V_CKBMMC:='报损出库'; ELSE V_errmsg1:='@7'||'@'||v_YPCKMX.YPNM00; SELECT BMMC00 INTO V_CKBMMC FROM VW_YF_YPCKFX WHERE BMBH00=:NEW.CKBMBH; END IF; V_errmsg1:='@8'||'@'||v_YPCKMX.YPNM00; SELECT CKLXMC INTO v_CKLXMC FROM BM_YFCKLX WHERE CKLXBH=:NEW.CKLXBH; V_errmsg1:='@9'||'@'||v_YPCKMX.YPNM00; SELECT SJKCSL INTO V_SJKCSL FROM YF_YPKCXX WHERE YFBMBH=:NEW.YFBMBH AND YPNM00=v_YPCKMX.YPNM00; V_SJKCSL:=ROUND(V_SJKCSL/V_K2J000,3); V_errmsg1:='@10'||'@'||v_YPCKMX.YPNM00; --德化医院要求摘要显示病人姓名 IF v_KHHCS0='13' AND :NEW.CKLXBH='03' THEN V_ZY0000:=v_CKLXMC; ELSE V_ZY0000:=V_CKBMMC; END IF; --病区医嘱领药出库 IF :NEW.CKLXBH='03' THEN V_CKJE00:=v_YPCKMX.CKJE00; V_GJCKJE:=Round(v_YPCKMX.GJDJ00*v_YPCKMX.CKSL00,2); ELSE V_CKJE00:=ROUND(v_YPCKMX.CKSL00*v_YPCKMX.LSDJ00,2); V_GJCKJE:=Round(v_YPCKMX.GJDJ00*v_YPCKMX.CKSL00,2); END IF; BEGIN SELECT BMMC00 INTO V_ZY0001 FROM VW_YF_YPCKFX WHERE BMBH00=v_YPCKMX.KSBH00; EXCEPTION when others then V_ZY0001:=''; END; INSERT INTO YF_YPMXZ0( MXZLSH, --明细账流水号-->SQ_YF_YPMXZ0_MXZLSH YFBMBH, --药房部门编号 YPCKPC, --药品出库批次-->YF_YPCKMX YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 JZRQ00, --记账日期 JZSJ00, --记账时间 CRBMBH, --出入部门编号 ZY0000, --摘要(自动:出入部门名称) JZDW00, --记账单位 ZHL000, --转换率(记账单位/剂量单位) GJDJ00, --购进单价(记账单位) FCDJ00, --付出单价(零售价)(记账单位) FCSL00, --付出数量(记账单位) FCJE00, --付出金额(零售价) JCDJ00, --结存单价(结存金额/结存数量) JCSL00, --结存数量(记账单位)(药品总量) JCJE00, --结存金额(零售价)(药品总量) RCLXBH, --入出库类型编码:BM_YFRKLX,BM_YFCKLX RCLXMC, --入出库类型名称:BM_YFRKLX,BM_YFCKLX JZXZ00, --记账性质:'R',入库,'C',出库 DJH000, --单据号 SFZBYP, --是否中标 GJFCJE, KSBH00, ZY0001) VALUES (SQ_YF_YPMXZ0_MXZLSH.NEXTVAL, :NEW.YFBMBH, v_YPCKMX.YPCKPC, v_YPCKMX.YPNM00, v_YPCKMX.YPMC00, v_YPCKMX.YPGG00, TO_CHAR(SYSDATE,'YYYYMMDD'), TO_CHAR(SYSDATE,'HH24:MI:SS'), :NEW.CKBMBH, V_ZY0000, v_YPCKMX.CKDW00, v_YPCKMX.ZHL000, v_YPCKMX.GJDJ00, v_YPCKMX.LSDJ00, v_YPCKMX.CKSL00, V_CKJE00, v_YPCKMX.LSDJ00, V_SJKCSL, ROUND(V_SJKCSL*v_YPCKMX.LSDJ00,2), :NEW.CKLXBH, v_CKLXMC, 'C', :NEW.CKDH00, V_SFZBYP, V_GJCKJE, v_YPCKMX.KSBH00, V_ZY0001 ); --判断是否零售价单独管理 --暂将入库单价与药典零售价比较 --2004.03.12 JETHUA 增加判断:药房单零售价管理 IF v_LSJGL0='Y' AND v_LSJGL2='N' THEN V_LSJ000:=ROUND(V_LSJ000*v_YPCKMX.ZHL000/V_K2J000,2); V_GJJ000:=ROUND(V_GJJ000*v_YPCKMX.ZHL000/V_K2J000,2); V_LSJCK0:=ROUND(v_YPCKMX.LSDJ00,2); V_GJJCK0:=ROUND(v_YPCKMX.GJDJ00,2); IF (ROUND((v_LSJCK0-V_LSJ000)*v_YPCKMX.CKSL00,2)>0) OR (ROUND((v_GJJCK0-V_GJJ000)*v_YPCKMX.CKSL00,2)>0) THEN --报盈--v_LSJCK0-V_LSJ000 INSERT INTO YF_YPMXZ0( MXZLSH, --明细账流水号-->SQ_YF_YPMXZ0_MXZLSH YFBMBH, --药房部门编号 YPRKPC, --药品入库批次-->YF_YPRKMX YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 JZRQ00, --记账日期 JZSJ00, --记账时间 CRBMBH, --出入部门编号 ZY0000, --摘要(自动:出入部门名称) JZDW00, --记账单位 ZHL000, --转换率(记账单位/剂量单位) GJDJ00, --购进单价(记账单位) SLDJ00, --收入单价(零售价)(记账单位) SLSL00, --收入数量(记账单位) SLJE00, --收入金额(零售价) JCDJ00, --结存单价(结存金额/结存数量) JCSL00, --结存数量(记账单位)(药品总量) JCJE00, --结存金额(零售价)(药品总量) RCLXBH, --入出库类型编码:BM_YFRKLX,BM_YFCKLX RCLXMC, --入出库类型名称:BM_YFRKLX,BM_YFCKLX SFZBYP, --是否中标 JZXZ00, --记账性质:'R',入库,'C',出库 GJSLJE, KSBH00 ) VALUES (SQ_YF_YPMXZ0_MXZLSH.NEXTVAL, :NEW.YFBMBH, v_YPCKMX.YPCKPC, v_YPCKMX.YPNM00, v_YPCKMX.YPMC00, v_YPCKMX.YPGG00, TO_CHAR(SYSDATE,'YYYYMMDD'), TO_CHAR(SYSDATE,'HH24:MI:SS'), 77777, '调价报盈', v_YPCKMX.CKDW00, v_YPCKMX.ZHL000, v_YPCKMX.GJDJ00, v_LSJCK0, 0, ROUND((v_LSJCK0-V_LSJ000)*v_YPCKMX.CKSL00,2), DECODE(V_SJKCSL,0,0,V_LSJ000), V_SJKCSL, ROUND(V_SJKCSL*V_LSJ000,2), '07', '调价报盈', V_SFZBYP, 'R', ROUND((v_GJJCK0-V_GJJ000)*v_YPCKMX.CKSL00,2), v_YPCKMX.KSBH00 ); ELSIF (ROUND((v_LSJCK0-V_LSJ000)*v_YPCKMX.CKSL00,2)<0) OR (ROUND((v_GJJCK0-V_GJJ000)*v_YPCKMX.CKSL00,2)<0) THEN --报亏 INSERT INTO YF_YPMXZ0( MXZLSH, --明细账流水号-->SQ_YF_YPMXZ0_MXZLSH YFBMBH, --药房部门编号 YPCKPC, --药品出库批次-->YF_YPCKMX YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 JZRQ00, --记账日期 JZSJ00, --记账时间 CRBMBH, --出入部门编号 ZY0000, --摘要(自动:出入部门名称) JZDW00, --记账单位 ZHL000, --转换率(记账单位/剂量单位) GJDJ00, --购进单价(记账单位) FCDJ00, --付出单价(零售价)(记账单位) FCSL00, --付出数量(记账单位) FCJE00, --付出金额(零售价) JCDJ00, --结存单价(结存金额/结存数量) JCSL00, --结存数量(记账单位)(药品总量) JCJE00, --结存金额(零售价)(药品总量) RCLXBH, --入出库类型编码:BM_YFRKLX,BM_YFCKLX RCLXMC, --入出库类型名称:BM_YFRKLX,BM_YFCKLX SFZBYP, --是否中标 JZXZ00, --记账性质:'R',入库,'C',出库 GJFCJE, --购进付出金额 KSBH00 ) VALUES (SQ_YF_YPMXZ0_MXZLSH.NEXTVAL, :NEW.YFBMBH, v_YPCKMX.YPCKPC, v_YPCKMX.YPNM00, v_YPCKMX.YPMC00, v_YPCKMX.YPGG00, TO_CHAR(SYSDATE,'YYYYMMDD'), TO_CHAR(SYSDATE,'HH24:MI:SS'), 77777, '调价报亏', v_YPCKMX.CKDW00, v_YPCKMX.ZHL000, v_YPCKMX.GJDJ00, v_LSJCK0, 0, -ROUND((v_LSJCK0-V_LSJ000)*v_YPCKMX.CKSL00,2), DECODE(V_SJKCSL,0,0,V_LSJ000), V_SJKCSL, ROUND(V_SJKCSL*V_LSJ000,2), '06', '调价报亏', V_SFZBYP, 'C', -ROUND((v_GJJCK0-V_GJJ000)*v_YPCKMX.CKSL00,2), v_YPCKMX.KSBH00 ); END IF; END IF; FETCH c_YPCKMX INTO v_YPCKMX; END LOOP; CLOSE c_YPCKMX; --如果为调拨出库,则同时插入一入库单 JETHUA 2003.07.22 IF :NEW.CKLXBH='11' THEN V_RKDH00:=SF_YK_GETLSH('YFYPRKDH'); INSERT INTO YF_YPRKD0 (RKDH00, YFBMBH, RKBMBH, RKLXBH, RKZT00, CZY000, RKRQ00, RKSJ00) VALUES (V_RKDH00, :NEW.CKBMBH, :NEW.YFBMBH, '08', '0', :NEW.CZY000, TO_CHAR(SYSDATE,'YYYYMMDD'), TO_CHAR(SYSDATE,'HH24:MI:SS')) ; INSERT INTO YF_YPRKMX (YPRKPC, RKDH00, YPNM00, YPMC00, YPGG00, RKSL00, RKDW00, ZHL000, GJDJ00, PFDJ00, LSDJ00, SCPH00, YPSXRQ) SELECT SQ_YF_YPRKMX_YPRKPC.NEXTVAL, V_RKDH00, YPNM00, YPMC00, YPGG00, CKSL00, CKDW00, ZHL000, GJDJ00, PFDJ00, LSDJ00, SCPH00, YPSXRQ FROM YF_YPCKMX WHERE CKDH00=:NEW.CKDH00; --判断是否自动入库 JETHUA 2006.02.23 IF V_ZDRKRQ='Y' THEN UPDATE YF_YPRKD0 SET RKZT00='1',QRR000=:NEW.CZY000, QRRQ00=TO_CHAR(SYSDATE,'YYYYMMDD'), QRSJ00=TO_CHAR(SYSDATE,'HH24:MI:SS') WHERE RKDH00=V_RKDH00; END IF; END IF; /**/ EXCEPTION WHEN no_data_found THEN RAISE_APPLICATION_ERROR(-20001,substrb(V_errmsg1||'数据没有找到!*'||SQLERRM||',',1,120)); WHEN E_custom THEN RAISE_APPLICATION_ERROR(-20010,substrb(V_errmsg||'!*',1,120)); WHEN E_YKKCBZ THEN RAISE_APPLICATION_ERROR(-20011,substrb(V_errmsg||'!*',1,120)); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20266,substrb(nvl(SQLERRM, '原因不明出错。')||V_errmsg||'!*',1,120)); END;