CREATE OR REPLACE FUNCTION SF_YK_LYLJS0 ( p_ypnm00 in number, --药品内码 p_mcsl00 in number, --每次数量 p_z2j000 in number, --转换率 p_pcid00 in number, --频次id /贴数 p_zqs000 in number, --周期数 p_f2j000 in number default 1 , --门诊或住院开方单位转换率 p_mzzybz in char default '0' --门诊住院标志:0门诊,1住院 ) --函数返回NUMBER return number as --函数声明 v_return number(12,2); --函数返回值 v_zqcs00 number; --周期次数 v_zqs000 number; --周期数 v_qzfs00 BM_YD0000.MZQZFS%type;--门诊或住院取整方式0每次取整 1每日取整 2每方取整 3不取整 4周期顺延 v_m2j000 bm_yd0000.m2j000%type; v_lbbh00 bm_yd0000.lbbh00%type; v_K2J000 bm_yd0000.k2j000%type;--库存单位转化率 v_f2j000 bm_yd0000.f2j000%type; --门诊开方单位转换率 v_ZJJL2J BM_YD0000.ZJJL2J%type; Vcounter number(10);--临时变量 Verrmsg varchar2(255) ;--错误提示变量 Ecustom exception ;--错误变量 v_ZQDW00 BM_PC0000.ZQDW00%type; --周期单位 v_ZQCD00 BM_PC0000.ZQCD00%type; --周期长度 begin -- MODIFICATION HISTORY -- Person Date Comments -- qks 2019.11.12 create:计算药品门诊或住院领用量; for YK9-20191107-003 -- luowf 2024.06.20 周、小时、天,修改 -- ---------- ---------- --------------------------------------------------------------------- if p_mcsl00 is null then--每次数量 return 0; end if; if p_z2j000 is null then--转换率 select m2j000,decode(p_mzzybz,'0',mzqzfs,qzfs00),lbbh00,k2j000,ZJJL2J into v_m2j000,v_qzfs00,v_lbbh00,v_k2j000,v_ZJJL2J from bm_yd0000 where ypnm00=p_ypnm00; else v_m2j000:=p_z2j000; select decode(p_mzzybz,'0',mzqzfs,qzfs00),lbbh00,k2j000,ZJJL2J into v_qzfs00,v_lbbh00,v_k2j000,v_ZJJL2J from bm_yd0000 where ypnm00=p_ypnm00; end if; if p_f2j000 is null then--门诊开方单位转换率 select f2j000 into v_f2j000 from bm_yd0000 where ypnm00=p_ypnm00; else v_f2j000:=p_f2j000; end if; if v_lbbh00='2' then v_zqcs00 := 1;--中药不按频次算药量 elsif p_pcid00 is null then--周期次数 v_zqcs00 := 1; else begin select zqcs00,ZQDW00,ZQCD00 into v_zqcs00,v_ZQDW00,v_ZQCD00 from bm_pc0000 where pcid00=p_pcid00; exception WHEN OTHERS THEN v_zqcs00 := 1; end; end if; if p_zqs000 is null then--周期数 v_zqs000 := 1; else v_zqs000 := round(p_zqs000/v_ZQCD00,4); if v_ZQDW00 = '周' then v_zqs000 := round(p_zqs000/7,4); elsif v_ZQDW00 = '小时' then v_zqs000 := p_zqs000*24; end if; end if; if v_qzfs00 = '0' then--每次取整 先取整到中间计量单位,再取整到门诊发药单位 v_return := ceil(ceil(p_mcsl00*v_f2j000/v_ZJJL2J)*v_ZJJL2J/v_m2j000*v_zqcs00*v_zqs000); elsif v_qzfs00 = '1' then--每日取整 v_return := ceil(p_mcsl00*v_f2j000/v_m2j000*v_zqcs00)*v_zqs000; elsif v_qzfs00 = '2' then--每方取整 v_return := ceil(p_mcsl00*v_f2j000*v_zqcs00*v_zqs000/v_m2j000); elsif v_qzfs00 = '3' then--不取整 v_return := round(p_mcsl00*v_f2j000/v_m2j000*v_zqcs00*v_zqs000 + 0.0049,2); elsif v_qzfs00 = '4' then--周期顺延 v_return := ceil(p_mcsl00*v_f2j000/v_m2j000*v_zqcs00*v_zqs000); else--其他 v_return := p_mcsl00*v_f2j000/v_m2j000*v_zqcs00*v_zqs000; end if; --函数返回 return v_return; exception when Ecustom then raise_application_error(-20010,substrb(Verrmsg||'!*',1,220)); end;