CREATE OR REPLACE PROCEDURE SP_YK_CKPCCX( P_BCQLDH IN CHAR, --请领单号(被冲销领单号) PS_YPQLPC IN VARCHAR2, --药品请领批次组合字符窜(格式 'xxxx*xxxx*xxxx...*') P_SFCP IN NUMBER, --是否需要拷贝被冲销的出库批次0--否,1,是 P_CZYBH0 IN NUMBER, --操作员编码 P_OUT_QLDH OUT VARCHAR2, --输出:拷贝的请领单号 P_OUT_CXDH OUT VARCHAR2 --输出:冲销单号 )AS V_YPQLD0 YK_YPQLD0%ROWTYPE; V_YPQLPC YK_YPQLMX.YPQLPC%TYPE; V_YPQLMX YK_YPQLMX%ROWTYPE; V_YPQLDH YK_YPQLD0.YPQLDH%TYPE; V_QLDHCP YK_YPQLD0.YPQLDH%TYPE; V_LSDJ00 BM_YD0000.LSJ000%TYPE; V_QLDJ00 BM_YD0000.LSJ000%TYPE; V_SFSH00 XT_XTCS00.VALUE0%TYPE; V_SSWRGZ XT_XTCS00.VALUE0%TYPE; V_ZRJRCJ XT_XTCS00.VALUE0%TYPE; V_CXZK00 YK_YPQLD0.ZKJE00%TYPE; --JETHUA 2003.03.07 V_YKGXH0 XT_XTCS00.VALUE0%TYPE; V_CKLXBH YK_YPQLD0.CKLXBH%TYPE; V_QLCKXZ XT_XTCS00.VALUE0%TYPE; V_BMXZ00 BM_BMBM00.BMXZ00%TYPE; YK_THDQRSFYXXGGJJ XT_XTCS00.VALUE0%TYPE; --退货单输入是否调整购进价 V_YKTHFS CHAR(1); --药库退货方式 '0' 最现行零售单价退货 '1'按入库时候的单价进行退货 V_DQRQ00 CHAR(8); V_DQSJ00 CHAR(8); V_RECORD number; V_EMessage VARCHAR2(100); L NUMBER; I NUMBER; J NUMBER; V_COUNT NUMBER; n_ypqlpc number(16,0); E_NoEdit EXCEPTION; E_NoEdit2 EXCEPTION; E_tjerror EXCEPTION; -- MODIFICATION HISTORY -- Person Date Comments -- JETHUA 2003.11.19 冲销时应用当前的零售价和批发价 -- JETHUA 2003.12.12 入药房已做入库,不允许冲销,并提示退库 -- JETHUA 2005.01.26 冲销也冲折扣金额 -- JETHUA 2005.03.07 冲销金额:如果不完全冲销则计算,如果完全冲销则带走所有金额 -- JETHUA 2005.03.30 冲销增加插入发票号 -- JETHUA 2005.05.18 考虑药库多零价管理,冲销零售价去对应入库单的现行零售价 -- CSF 2006.09.01 存在bug 若要冲肖的单据存在同样的药品,冲销时翻倍 -- CSF 2006.10.19 原来广东中医院退货不能退相同批次,先允许退相同批次,冲销必须做相应修改 -- YANGH 2007.06.12 漳平:退货单产生的冲消单上的零售价取直要取原来那张退货单的零售价 -- CSF 2011.07.06 YK_RCKYKSFSH,为Y时候更正单的审核日期没有填写,导致数据错误 -- zhengzk 2017.03.23 增加变量V_BMXZ00及参数YK_SFXZKSLYCWGZ for YK-20170322-001 -- dsm 2017.05.25 YK-20170322-001需求获取V_BMXZ00写法有错误,当退到院外时会报错误 for YK-20170510-001 -- huangjy 2017.11.17 YK-20171110-001 增加调价时退库更正记录 -- --------- ---------- ------------------------------------------- BEGIN SELECT TO_CHAR(SYSDATE,'YYYYMMDD'),TO_CHAR(SYSDATE,'HH24:MI:SS') INTO V_DQRQ00,V_DQSJ00 FROM DUAL; --取药库个性化参数 BEGIN SELECT VALUE0 INTO V_YKGXH0 FROM XT_XTCS00 WHERE NAME00='YK_YYGXH'; EXCEPTION WHEN OTHERS THEN V_SFSH00:='0'; END; --取系统参数:入出库药会是否审核 BEGIN SELECT VALUE0 INTO V_SFSH00 FROM XT_XTCS00 WHERE NAME00='YK_RCKYKSFSH'; EXCEPTION WHEN OTHERS THEN V_SFSH00:='N'; END; --取系统参数:入出库药会是否审核 BEGIN SELECT VALUE0 INTO V_SSWRGZ FROM XT_XTCS00 WHERE NAME00='YK_RKZKJESFXSSWR'; EXCEPTION WHEN OTHERS THEN V_SSWRGZ:='N'; END; --取系统参数:折让是否计入差价 BEGIN SELECT VALUE0 INTO V_ZRJRCJ FROM XT_XTCS00 WHERE NAME00='YK_ZRJRCJ'; EXCEPTION WHEN OTHERS THEN V_ZRJRCJ:='N'; END; BEGIN SELECT VALUE0 INTO V_QLCKXZ FROM XT_XTCS00 WHERE NAME00='YK_SFXZKSLYCWGZ'; EXCEPTION WHEN OTHERS THEN V_QLCKXZ:='N'; END; --取系统参数:退货方式 BEGIN SELECT Trim(VALUE0) INTO YK_THDQRSFYXXGGJJ FROM XT_XTCS00 WHERE NAME00='YK_THDQRSFYXXGGJJ'; EXCEPTION WHEN OTHERS THEN YK_THDQRSFYXXGGJJ:='N'; END; --取系统参数:退货方式 BEGIN SELECT Trim(VALUE0) INTO V_YKTHFS FROM XT_XTCS00 WHERE NAME00='YK_YKTHFS'; EXCEPTION WHEN OTHERS THEN V_YKTHFS:='0'; END; P_OUT_QLDH:=''; P_OUT_CXDH:=''; ------复制一条请领单,将选择的请领批次现有库存全部冲销掉 SELECT * INTO V_YPQLD0 FROM YK_YPQLD0 WHERE YPQLDH=P_BCQLDH; V_CKLXBH:=V_YPQLD0.CKLXBH; --SELECT BMXZ00 INTO V_BMXZ00 FROM BM_BMBM00 WHERE BMBH00=V_YPQLD0.CKQXBH; SELECT nvl(max(BMXZ00),'0') INTO V_BMXZ00 FROM BM_BMBM00 WHERE BMBH00=V_YPQLD0.CKQXBH; --如果为'2'领用部门入库,不允许冲销 IF V_QLCKXZ='Y' THEN IF V_YPQLD0.QLZT00='2' AND (V_BMXZ00='2' or V_BMXZ00='3') THEN RAISE E_NoEdit2; END IF; ELSE IF V_YPQLD0.QLZT00='2' THEN RAISE E_NoEdit2; END IF; END IF; V_YPQLDH:=SF_YK_GETLSH('YKYPQLDH'); ----插入药品请领单主表一条记录(确认状态) IF TRIM(V_SFSH00)='Y' THEN INSERT INTO YK_YPQLD0( YPQLDH, --药品请领单号-->SQ_YK_YPQLD0_YPQLDH YKBMBH, --药库部门编号 CKQXBH, --出库去向编号:出库去向-->VW_YK_YPCKFX CKLXBH, --出库类型编码 -->BM_YKCKLX QLRQ00, --请领日期 QLSJ00, --请领时间 CZYBH0, --操作员编码 QRRBH0, --确认入编号 LYRBH0, --领药入编号 QLZT00, --请领状态 '0'请领状态'1'药库出库'2'领用部门入库 QRRQ00, --确认日期 QRSJ00, --确认时间,格式00:00:00 SFSH00, BZ0000 ) VALUES( V_YPQLDH, V_YPQLD0.YKBMBH, V_YPQLD0.CKQXBH, V_YPQLD0.CKLXBH, V_DQRQ00, V_DQSJ00, P_CZYBH0, P_CZYBH0, V_YPQLD0.LYRBH0, '0', V_DQRQ00, V_DQSJ00, 'N', '被冲单据号:'||V_YPQLD0.YPQLDH ); ELSE INSERT INTO YK_YPQLD0( YPQLDH, --药品请领单号-->SQ_YK_YPQLD0_YPQLDH YKBMBH, --药库部门编号 CKQXBH, --出库去向编号:出库去向-->VW_YK_YPCKFX CKLXBH, --出库类型编码 -->BM_YKCKLX QLRQ00, --请领日期 QLSJ00, --请领时间 CZYBH0, --操作员编码 QRRBH0, --确认入编号 LYRBH0, --领药入编号 QLZT00, --请领状态 '0'请领状态'1'药库出库'2'领用部门入库 QRRQ00, --确认日期 QRSJ00, --确认时间,格式00:00:00 SFSH00, BZ0000, SHRQ00, SHSJ00) VALUES( V_YPQLDH, V_YPQLD0.YKBMBH, V_YPQLD0.CKQXBH, V_YPQLD0.CKLXBH, V_DQRQ00, V_DQSJ00, P_CZYBH0, P_CZYBH0, V_YPQLD0.LYRBH0, '0', V_DQRQ00, V_DQSJ00, 'Y', '被冲单据号:'||V_YPQLD0.YPQLDH, V_DQRQ00, V_DQSJ00); END IF; IF P_SFCP=1 THEN V_QLDHCP:=SF_YK_GETLSH('YKYPQLDH'); ----插出药品出库单主表一条记录(待确认) INSERT INTO YK_YPQLD0( YPQLDH, --药品请领单号-->SQ_YK_YPQLD0_YPQLDH YKBMBH, --药库部门编号 CKQXBH, --出库去向编号:出库去向-->VW_YK_YPCKFX CKLXBH, --出库类型编码 -->BM_YKCKLX QLRQ00, --请领日期 QLSJ00, --请领时间 CZYBH0, --操作员编码 QRRBH0, --确认入编号 LYRBH0, --领药入编号 QLZT00 --请领状态 '0'请领状态'1'药库出库'2'领用部门入库 ) VALUES( V_QLDHCP, V_YPQLD0.YKBMBH, V_YPQLD0.CKQXBH, V_YPQLD0.CKLXBH, V_DQRQ00, V_DQSJ00, P_CZYBH0, P_CZYBH0, V_YPQLD0.LYRBH0, '0'); END IF; --I,记录出现'*'的上一次的位置, --J,计数器, --K,记录出现'*'的当前位置 I:=0; J:=1; SELECT INSTR(PS_YPQLPC,'*',1,J) INTO L FROM DUAL; --取出第J次出现'*'的位置 WHILE L>0 LOOP --取出请领明细批次组合字符窜中的请领批次 V_YPQLPC:=TO_NUMBER(SUBSTR(PS_YPQLPC,I+1,L-I-1)); SELECT * INTO V_YPQLMX FROM YK_YPQLMX WHERE YPQLPC=V_YPQLPC; IF (V_YKGXH0='16') AND (V_CKLXBH='09') THEN --漳平医院:零售价取直要取原来那张退货单的零售价的价格 SELECT QLDJ00 INTO V_QLDJ00 FROM YK_YPQLMX A WHERE YPQLDH=P_BCQLDH AND YPNM00=V_YPQLMX.YPNM00; ELSE --改成调价出货单的请领单价 by YK-20171110-001 SELECT QLDJ00 INTO V_QLDJ00 FROM YK_YPQLMX A WHERE YPQLDH=P_BCQLDH AND YPNM00=V_YPQLMX.YPNM00 and rownum=1; -- SELECT ROUND(LSJ000/K2J000*V_YPQLMX.ZHL000,4) -- INTO V_QLDJ00 FROM BM_YD0000 WHERE YPNM00=V_YPQLMX.YPNM00; END IF; IF UPPER(V_YPQLMX.CXBZ00)<>'Z' THEN V_EMessage:=V_YPQLMX.YPMC00; RAISE E_NoEdit; END IF; --取变量 select SQ_YK_YPQLMX_YPQLPC.NEXTVAL into n_ypqlpc from dual; INSERT INTO YK_YPQLMX( YPQLPC, --药品请领批次-->SQ_YK_YPQLMX_YPQLPC YPQLDH, --请领单号-->YK_YPQLD0 YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 QLDW00, --请领单位 GJDJ00, --购进单价(请领单位)(最近一批) QLDJ00, --请领单价(请领单位) ZHL000, --转换率(请领单位/剂量单位) KL0000, --扣率 QLSL00, --请领数量(请领单位) SFSL00, --实发数量(请领单位) CXBZ00, --冲销标志 --'Z'-->正常'-'-->冲销记录--'+'-->被冲记录 CXQLPC, --冲销请领批次(自动) FPH000, --发票号 BZ0000, --备注,如果为报损出库记录报损原因 RKPC00) --入库批次 VALUES( n_ypqlpc, V_YPQLDH, V_YPQLMX.YPNM00, V_YPQLMX.YPMC00, V_YPQLMX.YPGG00, V_YPQLMX.QLDW00, V_YPQLMX.GJDJ00, V_QLDJ00, --最新零售价 --V_YPQLMX.QLDJ00, V_YPQLMX.ZHL000, V_YPQLMX.KL0000, --扣率 -V_YPQLMX.QLSL00, -V_YPQLMX.SFSL00, '-', V_YPQLMX.YPQLPC, V_YPQLMX.FPH000, P_BCQLDH, V_YPQLMX.RKPC00); -----------向药库出库明细表 YK_YPCKMX插入出库批次-------------- ---------触发器TR_YK_YPCKMX_AFINT将修改库存与记账------------- --/*只有广东省的退货单,有批次的概念*/ DECLARE CURSOR C_YPCKMX IS --定义药品出库明细数据集游标 SELECT * FROM YK_YPCKMX WHERE YPQLDH=P_BCQLDH AND YPNM00=V_YPQLMX.YPNM00 AND (YPRKPC=V_YPQLMX.RKPC00 OR V_YPQLMX.RKPC00 is null) AND (YPQLPC=V_YPQLMX.YPQLPC OR YPQLPC IS NULL); V_YPCKMX C_YPCKMX%ROWTYPE; BEGIN OPEN C_YPCKMX; --打开游标 FETCH C_YPCKMX INTO V_YPCKMX; WHILE C_YPCKMX%FOUND LOOP --2005.05.18 考虑药库多零价管理,冲销零售价去对应入库单的现行零售价 IF (V_YKGXH0='16') AND (V_CKLXBH='09') THEN --漳平医院:零售价取直要取原来那张退货单的零售价的价格 V_LSDJ00:=V_YPCKMX.LSDJ00; ELSE --改成调价出货单 YK-20171110-001 V_LSDJ00:=V_YPCKMX.LSDJ00; --SELECT ROUND(XXLSDJ/ZHL000*V_YPCKMX.ZHL000,4) -- INTO V_LSDJ00 FROM YK_YPRKMX WHERE YPRKPC=V_YPCKMX.YPRKPC; END IF; INSERT INTO YK_YPCKMX( YPCKPC, --药品出库批次-->SQ_YK_YPCKMX_YPCKPC YPQLDH, --请领单号-->YK_YPQLD0 YPRKPC, --药品入库批次--> YK_YPRKMX YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 CKSL00, --出库数量(出库单位) CKDW00, --出库单位 ZHL000, --转换率(出库单位/剂量单位) GJDJ00, --购进单价(出库单位) LSDJ00, --零售单价(出库单位) PFDJ00, --批发单价(出库单位) CXBZ00, --冲销标志 --'Z'-->正常--'-'-->冲销记录--'+'-->被冲记录 CXCKPC, --冲销出库批次(自动) BZ0000, --备注 YPQLPC) --药品请领批次 VALUES( SQ_YK_YPCKMX_YPCKPC.NEXTVAL, V_YPQLDH, V_YPCKMX.YPRKPC, V_YPCKMX.YPNM00, V_YPCKMX.YPMC00, V_YPCKMX.YPGG00, -V_YPCKMX.CKSL00, V_YPCKMX.CKDW00, V_YPCKMX.ZHL000, V_YPCKMX.GJDJ00, V_LSDJ00, --最新零售价 V_YPCKMX.PFDJ00, '-', V_YPCKMX.YPCKPC, P_BCQLDH, n_ypqlpc); --修改被冲销出库批次标志 UPDATE YK_YPCKMX SET CXBZ00='+' WHERE YPCKPC=V_YPCKMX.YPCKPC; FETCH C_YPCKMX INTO V_YPCKMX; END LOOP; ---FOR WHILE ... LOOP OUTER CLOSE C_YPCKMX; END; IF P_SFCP=1 THEN INSERT INTO YK_YPQLMX( YPQLPC, --药品请领批次-->SQ_YK_YPQLMX_YPQLPC YPQLDH, --请领单号-->YK_YPQLD0 YPNM00, --药品内码 YPMC00, --药品名称 YPGG00, --规格 QLDW00, --请领单位 GJDJ00, --购进单价(请领单位)(最近一批) QLDJ00, --请领单价(请领单位) KL0000, --扣率 ZHL000, --转换率(请领单位/剂量单位) QLSL00, --请领数量(请领单位) SFSL00, --实发数量(请领单位) CXBZ00, --冲销标志 --'Z'-->正常'-'-->冲销记录--'+'-->被冲记录 BZ0000) --备注,如果为报损出库记录报损原因 VALUES( SQ_YK_YPQLMX_YPQLPC.NEXTVAL, V_QLDHCP, V_YPQLMX.YPNM00, V_YPQLMX.YPMC00, V_YPQLMX.YPGG00, V_YPQLMX.QLDW00, V_YPQLMX.GJDJ00, V_QLDJ00, --最新零售价 --V_YPQLMX.QLDJ00, V_YPQLMX.KL0000, --扣率 V_YPQLMX.ZHL000, V_YPQLMX.QLSL00, V_YPQLMX.SFSL00, 'Z', V_YPQLMX.BZ0000); END IF; ---修改原请领单明细标志 UPDATE YK_YPQLMX SET CXBZ00='+' WHERE YPQLPC=V_YPQLMX.YPQLPC; I:=L; J:=J+1; SELECT INSTR(PS_YPQLPC,'*',1,J) INTO L FROM DUAL; --取出第J次出现'*'的位置 END LOOP; ---FOR WHILE ... LOOP OUTER --折让不计入差价才计算折让金额 --增加一情况:如处方明细只有一条,折扣率为1,而总折扣金额不为零 2003.04.10 JETHUA SELECT COUNT(1) INTO V_COUNT FROM YK_YPQLMX WHERE YPQLDH=P_BCQLDH AND CXBZ00='Z'; IF V_COUNT=0 THEN SELECT SUM(ZKJE00) INTO V_CXZK00 FROM YK_YPQLD0 WHERE YPQLDH IN(SELECT YPQLDH FROM YK_YPQLMX WHERE CXQLPC IN (SELECT YPQLPC FROM YK_YPQLMX WHERE YPQLDH=P_BCQLDH AND CXBZ00='+')); --将剩余的折扣金额全部记录最后一次的冲销单上 V_CXZK00:=ABS(V_YPQLD0.ZKJE00+NVL(V_CXZK00,0)); UPDATE YK_YPQLD0 D SET D.QLZT00='1',D.ZKJE00=-V_CXZK00 WHERE D.YPQLDH=V_YPQLDH; ELSE --插入折扣总金额 UPDATE YK_YPQLD0 D SET D.QLZT00='1',D.ZKJE00=(SELECT SUM(ROUND(ROUND((1-C.KL0000)*C.GJDJ00,2)*C.SFSL00,2)) FROM YK_YPQLMX C WHERE C.YPQLDH=D.YPQLDH) WHERE D.YPQLDH=V_YPQLDH; /*IF V_SSWRGZ='Y' THEN --是否先四舍五入再承数量 UPDATE YK_YPQLD0 D SET D.QLZT00='1',D.ZKJE00=(SELECT SUM(ROUND(ROUND((1-R.KL0000)*C.GJDJ00,2)*C.CKSL00,2)) FROM YK_YPCKMX C,YK_YPRKMX R WHERE C.YPRKPC=R.YPRKPC AND C.YPQLDH=D.YPQLDH) WHERE D.YPQLDH=V_YPQLDH; ELSE UPDATE YK_YPQLD0 D SET D.QLZT00='1',D.ZKJE00=(SELECT SUM(ROUND((1-R.KL0000)*C.GJDJ00*C.CKSL00,2)) FROM YK_YPCKMX C,YK_YPRKMX R WHERE C.YPRKPC=R.YPRKPC AND C.YPQLDH=D.YPQLDH) WHERE D.YPQLDH=V_YPQLDH; END IF;*/ END IF; --退货单冲销 if (V_YKTHFS='0') and (YK_THDQRSFYXXGGJJ='N') then V_EMessage:=''; else begin SP_YK_THTJCXCL(P_CZYBH0,P_BCQLDH); exception when others then V_EMessage:=V_EMessage||'中间执行过程: SP_YK_THTJCXCL('||TO_CHAR(P_CZYBH0)||','||P_BCQLDH||')出现意外错误! ; '; raise E_tjerror; end; end if; P_OUT_QLDH:=V_QLDHCP; P_OUT_CXDH:=V_YPQLDH; COMMIT; EXCEPTION WHEN E_NoEdit THEN RAISE_APPLICATION_ERROR(-20001, '药品:'||V_EMessage||'已经被冲过,不能再冲销!*返回信息:'|| '调用过程: SP_YK_CKPCCX('||P_BCQLDH||','||PS_YPQLPC||','||TO_CHAR(P_SFCP)|| ','||TO_CHAR(P_CZYBH0)||','||P_OUT_QLDH||') ; '||SQLERRM); ROLLBACK; WHEN E_tjerror THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20010,substrb(V_EMessage,1,120)); WHEN E_NoEdit2 THEN RAISE_APPLICATION_ERROR(-20001, '药房已经入库,不能再冲销,请进行退库处理!*返回信息:'|| '调用过程: SP_YK_CKPCCX('||P_BCQLDH||','||PS_YPQLPC||','||TO_CHAR(P_SFCP)|| ','||TO_CHAR(P_CZYBH0)||','||P_OUT_QLDH||') ; '||SQLERRM); ROLLBACK; WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20004, '冲销时时发生未找到数据错误!*返回信息:'|| '调用过程: SP_YK_CKPCCX('||P_BCQLDH||','||PS_YPQLPC||','||TO_CHAR(P_SFCP)|| ','||TO_CHAR(P_CZYBH0)||','||P_OUT_QLDH||') ; '||SQLERRM); ROLLBACK; WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20009, '冲销时发生意外错误!*返回信息:'|| '调用过程: SP_YK_CKPCCX('||P_BCQLDH||','||PS_YPQLPC||','||TO_CHAR(P_SFCP)|| ','||TO_CHAR(P_CZYBH0)||','||P_OUT_QLDH||') ; '||SQLERRM); ROLLBACK; END; /