建类型
create or replace type char_table is table of varchar2(4000);--创建自定义类型脚本
包头
create or replace package PriceManager_Vassign is
Procedure verify;
Procedure saveData(formKind_in in varchar2, createuser_in in varchar2);end PriceManager_Vassign;
包体
create or replace package body PriceManager_Vassign is /* ============================================= * FUNCTION * NAME :verifyCompany * * DESCRIPTION: 验证公司代码 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyCompany(fv_companycode in varchar2) return varchar2 is re number; begin select count(*) into re from plant2item where companycode = fv_companycode; if re = 0 then return '公司:' || fv_companycode || '不存在;'; else return ''; end if; end verifyCompany; /* ============================================= * FUNCTION * NAME :verifyPlant * * DESCRIPTION: 验证工厂代码 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyPlant(fv_plantcode in varchar2) return varchar2 is re number; begin select count(*) into re from plant where plantcode = fv_plantcode; if re = 0 then return '工厂:' || fv_plantcode || '不存在;'; else return ''; end if; end verifyPlant; /* \* ============================================= * FUNCTION * NAME :verifyItem * * DESCRIPTION: 验证物料是否存在和是否重复 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*\ function verifyItem(fv_itemcode in varchar2) return varchar2 is re number; begin select count(*) into re from plant2item where itemcode = fv_itemcode; if re = 0 then return '该物料不存在于工厂物料;'; else select count(*) into re from vendorvassignbatch vvb where vvb.itemcode = fv_itemcode and vvb.batchid = (select max(y.batchid) from vendorvassignbatch y); if re > 1 then return '物料有重复的供货比例;'; else return ''; end if; end if; end verifyItem;*/ /* ============================================= * FUNCTION * NAME :verifyItem * * DESCRIPTION: 验证物料是否存在和是否重复 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyItem(fv_itemcode in varchar2) return varchar2 is re number; isUserMsg varchar2(3); v_itemname varchar2(400); v_itemnameCount number; begin select count(*) into re from plant2item where itemcode = fv_itemcode; if re = 0 then select count(*) into v_itemnameCount from vendorvassignbatch t where t.batchid = (select max(y.batchid) from vendorvassignbatch y) and t.itemcode = fv_itemcode; if v_itemnameCount <> 0 then v_itemname := ''; select distinct t.itemname into v_itemname from vendorvassignbatch t where t.batchid = (select max(y.batchid) from vendorvassignbatch y) and t.itemcode = fv_itemcode; return '该物料,物料描述为【' || v_itemname || '】不存在于工厂物料;'; else return '该物料不存在于工厂物料;'; end if; else /* select bbkedu_po_pkg.get_itemvendorstatus_flag@BBKERP('' || fv_itemcode || '', null, 106) into isUserMsg from dual; if isUserMsg = 'Y' then return '该物料被在erp中被禁用或限制,不能进行供货比例调整'; else*/ select count(*) into re from vendorvassignbatch vvb where vvb.itemcode = fv_itemcode and vvb.batchid = (select max(y.batchid) from vendorvassignbatch y); if re > 1 then return '物料有重复的供货比例;'; else return ''; /* end if;*/ end if; end if; end verifyItem; /* function verifyItem(fv_itemcode in varchar2) return varchar2 is re number; begin select count(*) into re from plant2item where itemcode = fv_itemcode; if re = 0 then return '该物料不存在于工厂物料;'; else select count(*) into re from vendorvassignbatch vvb where vvb.itemcode = fv_itemcode and vvb.batchid = (select max(y.batchid) from vendorvassignbatch y); if re > 1 then return '物料有重复的供货比例;'; else return ''; end if; end if; end verifyItem;*/ /* ============================================= * FUNCTION * NAME :verifyItem * * DESCRIPTION: 验证生效日期 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyEffectiveDate(fv_EffectiveDate in date) return varchar is begin if fv_EffectiveDate < to_date(TO_CHAR(SYSDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') then return '生效日期不能小于当前日期;'; else return ''; end if; end verifyEffectiveDate; /* ============================================= * FUNCTION * NAME :verifyItem * * DESCRIPTION: 验证失效日期 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyIneffectiveDate(fv_EffectiveDate in date, fv_ineffectivedate in date) return varchar is begin if fv_EffectiveDate > fv_ineffectivedate then return '生效日期大于失效日期;'; else return ''; end if; end verifyIneffectiveDate; /* ============================================= * FUNCTION * NAME :verifyBuyer * * DESCRIPTION: 验证采购员 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyBuyer(fv_buyer in varchar2) return varchar is re number; begin select count(*) into re from sysuser sysu where sysu.USERNAME = fv_buyer and sysu.usertype = 'Buyer'; if re = 0 then return '采购员' || fv_buyer || '不存在'; else return ''; end if; end verifyBuyer; /* ============================================= * FUNCTION * NAME :verifyHadVassign * * DESCRIPTION: 验证供货比例是否写有供应商 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyHadVassign(fv_vassign in varchar2) return varchar is re number; begin re := 0; re := instr(fv_vassign, '='); if re < 1 then return '供货比例为空或者没有写等号;'; else return ''; end if; end verifyHadVassign; /* ============================================= * FUNCTION * NAME :verifyIsVendor * * DESCRIPTION: 验证供应商是否存在于货源下 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyIsVendor(fv_vendorCode in varchar2, fv_Itemcode in varchar2) return number is re number; begin select count(vend.vendorcode) into re from plantitem2vendor vend, po_vendors@bbkerp pv, mtl_system_items_b@bbkerp msi where vend.vendorcode = fv_vendorCode and vend. ITEMCODE = fv_Itemcode and pv.segment1 = vend.vendorcode and msi.organization_id = 106 and msi.segment1 = vend. ITEMCODE and not exists (SELECT 1 FROM BBKEDU_MINPO_T@bbkerp BMT WHERE (BMT.RESTRICT_FLAG = 'Y' OR BMT.DISABLE_FLAG = 'Y') and BMT.Vendor_Id is not null and BMT.Vendor_Site_Id is not null and BMT.item_id = msi.inventory_item_id and BMT.vendor_id = pv.vendor_id); return re; end verifyIsVendor; /* function verifyIsVendor(fv_vendorCode in varchar2, fv_Itemcode in varchar2) return number is re number; begin select count(*) into re from plantitem2vendor vend where vend.vendorcode = fv_vendorCode and vend. ITEMCODE = fv_Itemcode; return re; end verifyIsVendor;*/ /* ============================================= * FUNCTION * NAME :verifyBuyer * * DESCRIPTION: 验证供货比例格式,以及一个供应商的的清空下,比例是否漏写,供应商是否存在 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyVendor(fv_vassign in varchar2, fv_Itemcode in varchar2) return varchar is re number; vendors varchar2(100); Msg varchar2(500); vendor_Total number; vendors_len number; scales varchar2(100); rev varchar2(600); begin vendor_Total := 0; vendors_len := 0; Msg := verifyHadVassign(fv_vassign); rev := ''; if Msg is null then vendors := substr(fv_vassign, 1, instr(fv_vassign, '=') - 1); scales := substr(fv_vassign, instr(fv_vassign, '=') + 1, length(fv_vassign)); if scales is null then rev := rev || '供货比例有错:没有写比例'; else if instr(scales, ':') = 0 then begin if to_number(scales) <> 100 then rev := rev || '供货比例有错:比例之和不等于100'; end if; Exception When Others Then rev := rev || '有不为数字的比例'; end; end if; end if; if vendors is null then rev := rev || '供货比例有错:没有写供应商'; else if instr(vendors, ':') = 0 then --只有一个供应商 --验证供应商是否存在货源下 if verifyIsVendor(vendors, fv_Itemcode) < 1 then rev := rev || vendors || '供应商 被禁用限制下单,或不在货源下'; end if; end if; end if; end if; return rev; end verifyVendor; /* ============================================= * FUNCTION * NAME :verifyBuyer * * DESCRIPTION: 验证供验证多个供应商的情况 * * ARGUMENT: * * * * HISTORY: * 1.00 2011-11-02 cx Creation * =============================================*/ function verifyMoreVendor(fv_vassign in varchar2, fv_Itemcode in varchar2) return varchar is /* TYPE vassign IS RECORD( venderCode varchar2(100), scale varchar2(100)); TYPE vassign_array IS TABLE OF vassign INDEX BY BINARY_INTEGER; v_vassign_array vassign_array; v_vassign vassign;*/ TYPE scale IS TABLE OF varchar2(100) INDEX BY BINARY_INTEGER; a_scale scale; TYPE vendor IS TABLE OF varchar2(100) INDEX BY BINARY_INTEGER; a_vendor vendor; vendors varchar2(100); scales varchar2(100); str_vendors varchar2(100); str_scales varchar2(100); rev varchar2(600); vendorsCount number; vendorsLen number; scalesCount number; scalesLen number; sumscales number; begin rev := ''; if verifyHadVassign(fv_vassign) is null then str_vendors := substr(fv_vassign, 1, instr(fv_vassign, '=') - 1); str_scales := substr(fv_vassign, instr(fv_vassign, '=') + 1, length(fv_vassign)); vendors := str_vendors; scales := str_scales; vendorsCount := 0; vendorsLen := 0; scalesCount := 0; scalesLen := 0; if instr(str_vendors, ':') > 0 then loop vendorsCount := vendorsCount + 1; a_vendor(vendorsCount) := substr(str_vendors, 1, instr(str_vendors, ':') - 1); vendorsLen := instr(str_vendors, ':'); str_vendors := substr(str_vendors, vendorsLen + 1, length(str_vendors) - vendorsLen); Exit when instr(str_vendors, ':') = 0; end loop; vendorsCount := vendorsCount + 1; a_vendor(vendorsCount) := str_vendors; end if; if instr(str_scales, ':') > 0 then loop scalesCount := scalesCount + 1; scalesLen := scalesLen + 1; a_scale(scalesCount) := substr(str_scales, 1, instr(str_scales, ':') - 1); scalesLen := instr(str_scales, ':'); str_scales := substr(str_scales, scalesLen + 1, length(str_scales) - scalesLen); Exit when instr(str_scales, ':') = 0; end loop; scalesCount := scalesCount + 1; a_scale(scalesCount) := str_scales; end if; if instr(vendors, ':') > 0 then if instr(scales, ':') > 0 then if vendorsCount <> scalesCount then rev := rev || '供应商代码与比例不匹配'; else begin sumscales := 0; FOR i IN 1 .. a_scale.count LOOP sumscales := sumscales + to_number(a_scale(i)); end loop; Exception When Others Then rev := rev || '有不为数字的比例'; end; if sumscales <> 100 then rev := rev || '比例之和不等于100'; end if; FOR i IN 1 .. a_vendor.count LOOP if verifyIsVendor(a_vendor(i), fv_Itemcode) < 1 then rev := rev || '供应商' || a_vendor(i) || ' 被禁用限制下单,或不在货源下 '; end if; end loop; end if; end if; end if; end if; return rev; end verifyMoreVendor; /* ============================================= * FUNCTION / PROCEDURE * NAME :verify * * DESCRIPTION: 供货比例数据验证 * * ARGUMENT: * * RETURN: * * HISTORY: * 1.00 2011-10-14 cx Creation * =============================================*/ procedure verify is r_vendorvassignbatch vendorvassignbatch%ROWTYPE; Msg varchar2(1000); CURSOR c_vendorvassignbatch IS select t.* from vendorvassignbatch t where t.batchid = (select max(y.batchid) from vendorvassignbatch y); BEGIN OPEN c_vendorvassignbatch; LOOP Msg := ''; FETCH c_vendorvassignbatch INTO r_vendorvassignbatch; Exit when(c_vendorvassignbatch%NOTFOUND); --验证公司代码 Msg := Msg || verifyCompany(r_vendorvassignbatch.companycode); --验证工厂代码 Msg := Msg || verifyPlant(r_vendorvassignbatch.plantcode); --验证物料是否存在和是否重复 Msg := Msg || verifyItem(r_vendorvassignbatch.itemcode); --验证生效日期 Msg := Msg || verifyEffectiveDate(r_vendorvassignbatch.effectivedate); --验证失效日期 Msg := Msg || verifyIneffectiveDate(r_vendorvassignbatch.effectivedate, r_vendorvassignbatch.ineffectivedate); --验证采购员 Msg := Msg || verifyBuyer(r_vendorvassignbatch.buyer); --验证是否写供货比例 Msg := Msg || verifyHadVassign(r_vendorvassignbatch.itemvassign); --验证供应商 Msg := Msg || verifyVendor(r_vendorvassignbatch.itemvassign, r_vendorvassignbatch.itemcode); Msg := Msg || verifyMoreVendor(r_vendorvassignbatch.itemvassign, r_vendorvassignbatch.itemcode); --插入数据 if Msg is null then update vendorvassignbatch vvb set vvb.VERIFYFLAG = 1, vvb.VERIFYMSG = Msg where vvb.batchid = r_vendorvassignbatch.batchid and vvb.ITEMCODE = r_vendorvassignbatch.itemcode; else update vendorvassignbatch vvb set vvb.VERIFYFLAG = 0, vvb.VERIFYMSG = Msg where vvb.batchid = r_vendorvassignbatch.batchid and vvb.ITEMCODE = r_vendorvassignbatch.itemcode; end if; END LOOP; CLOSE c_vendorvassignbatch; commit; end; Procedure setOldAssign(v_fromno in varchar2, v_itemcode in varchar2) is V_Result varchar2(255); vendor varchar2(255); scale varchar2(255); r_vassignformdetail vassignformdetail%ROWTYPE; CURSOR c_vassignformdetail IS select * from vassignformdetail p where p.formid = (select max(vf.formid) from vassignform vf left join formhead fh on vf.formno = fh.formno left join flowdefine ff on (ff.formkind = fh.formkind and ff.signlevel = fh.currentlevel) where vf.itemcode = v_itemcode and fh.formstatus = 'Approve' and fh.formkind = 'VassignForm' and vf.formno <> v_fromno) order by SEQ; begin vendor := ''; scale := ''; for r_vassignformdetail in c_vassignformdetail loop vendor := vendor || r_vassignformdetail.vendorcode; vendor := vendor || ':'; scale := scale || r_vassignformdetail.assignscale; scale := scale || ':'; end loop; vendor := substr(vendor, 0, length(vendor) - 1); vendor := vendor || '='; scale := substr(scale, 0, length(scale) - 1); V_Result := vendor || scale; if V_Result = '=' then V_Result := ''; end if; update vassignform v set v.oldvassign = V_Result where v.formno = v_fromno; end setOldAssign; /* ============================================= * FUNCTION / PROCEDURE * NAME :CreateNewSignForm * * DESCRIPTION: 送签新单据 * * ARGUMENT: * * RETURN: * * HISTORY: * 1.00 2011-10-14 Chase.Cai Creation * =============================================*/ procedure setNewAssign(v_fromno in varchar2) is V_Result varchar2(255); vendor varchar2(255); scale varchar2(255); r_vassignformdetail vassignformdetail%ROWTYPE; CURSOR c_vassignformdetail IS select * from vassignformdetail vf where vf.formno = v_fromno order by SEQ; begin vendor := ''; scale := ''; for r_vassignformdetail in c_vassignformdetail loop vendor := vendor || r_vassignformdetail.vendorcode; vendor := vendor || ':'; scale := scale || r_vassignformdetail.assignscale; scale := scale || ':'; end loop; vendor := substr(vendor, 0, length(vendor) - 1); vendor := vendor || '='; scale := substr(scale, 0, length(scale) - 1); V_Result := vendor || scale; if V_Result = '=' then V_Result := ''; end if; update vassignform v set v.newvassign = V_Result where v.formno = v_fromno; end setNewAssign; /* ============================================= * FUNCTION / PROCEDURE * NAME :saveData * * DESCRIPTION: 数据验证通过写入VASSIGNFORM 和VASSIGNFORMdetail表 * * ARGUMENT: * * RETURN: * * HISTORY: * 1.00 2011-10-14 cx Creation * =============================================*/ procedure saveData(formKind_in in varchar2, createuser_in in varchar2) is r_vendorvassignbatch vendorvassignbatch%ROWTYPE; r_VASSIGNFORMDETAIL VASSIGNFORMDETAIL%ROWTYPE; ErrMsg varchar2(1024); str_index number; str_vendors varchar2(500); str_vendor varchar2(20); vendors_len number; str_VASSIGNs varchar2(500); str_VASSIGN varchar2(20); VASSIGN_len number; vendor_index number; vassign_index number; vendor_Total number; vassign_total number; vassign_sum number; i number; t number; str_vassignformid varchar2(40); str_ASSIGNCODE varchar2(40); str_LINEID varchar2(40); maxSEQ number; countMaxSEQ number; SEQIndex number; TYPE scale IS TABLE OF varchar2(100) INDEX BY BINARY_INTEGER; a_scale scale; TYPE vendor IS TABLE OF varchar2(100) INDEX BY BINARY_INTEGER; a_vendor vendor; vendors varchar2(100); scales varchar2(100); str_scales varchar2(100); rev varchar2(600); vendorsCount number; vendorsLen number; scalesCount number; scalesLen number; sumscales number; v_dd number; CURSOR c_vendorvassignbatch IS select t.* from vendorvassignbatch t where t.batchid = (select max(y.batchid) from vendorvassignbatch y) and verifyflag = 1; CURSOR c_temp(str_vassignformid2 varchar2, str_ASSIGNCODE2 varchar2) IS select t.* from VASSIGNFORMDETAIL t where FORMID = str_vassignformid2 and FORMNO = str_ASSIGNCODE2 and ASSIGNCODE = str_ASSIGNCODE2 order by ASSIGNSCALE desc; BEGIN for r_vendorvassignbatch in c_vendorvassignbatch LOOP --插入主表数据 select seq_vassignformid.nextval into str_vassignformid from dual; str_ASSIGNCODE := 'VF' || to_char(sysdate, 'yymmdd') || str_vassignformid; insert into VASSIGNFORM (FORMID, FORMNO, VASSIGNCODE, EFFECTDATE, INVALIDDATE, COMPANYCODE, PLANTCODE, ITEMCODE, CREATEUSER, CREATEDATE, CREATETIME, COMMITDATE, COMMITTIME, FORMKIND, REMARK, BUYER, --REMARK1, REMARK2, linkitemcode) values (str_vassignformid, str_ASSIGNCODE, str_ASSIGNCODE, to_number(to_char(r_vendorvassignbatch.effectivedate, 'yyyymmdd')), to_number(to_char(r_vendorvassignbatch.ineffectivedate, 'yyyymmdd')), r_vendorvassignbatch.COMPANYCODE, r_vendorvassignbatch.PLANTCODE, r_vendorvassignbatch.ITEMCODE, createuser_in, to_number(to_char(sysdate, 'yyyymmdd')), to_number(to_char(sysdate, 'hh24MMSS')), to_number(to_char(sysdate, 'yyyymmdd')), to_number(to_char(sysdate, 'hh24MMSS')), formKind_in, r_vendorvassignbatch.remark1, --to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') || '批量导入', r_vendorvassignbatch.buyer, --r_vendorvassignbatch.remark1, r_vendorvassignbatch.remark2, r_vendorvassignbatch.linkitemcode); ---插入从表 str_vendors := substr(r_vendorvassignbatch.itemvassign, 1, instr(r_vendorvassignbatch.itemvassign, '=') - 1); str_scales := substr(r_vendorvassignbatch.itemvassign, instr(r_vendorvassignbatch.itemvassign, '=') + 1, length(r_vendorvassignbatch.itemvassign)); if instr(str_vendors, ':') = 0 then --一个供应商 select SEQ_VASSIGNLINEID.nextval into str_LINEID from dual; insert into VASSIGNFORMDETAIL (ASSIGNSCALE, VENDORCODE, ASSIGNCODE, ASSIGNPERCENT, CREATEUSER, CREATEDATE, CREATETIME, FORMID, FORMNO, LINEID) values (to_number(str_scales), str_vendors, str_ASSIGNCODE, decode(to_number(str_scales), 0, 0, to_number(str_scales) / 100), --要0.4而不是4 createuser_in, to_number(to_char(sysdate, 'yyyymmdd')), to_number(to_char(sysdate, 'hh24MMSS')), str_vassignformid, str_ASSIGNCODE, str_LINEID); else vendorsCount := 0; vendorsLen := 0; scalesCount := 0; scalesLen := 0; --清空数组 a_vendor.DELETE; a_scale.DELETE; if instr(str_vendors, ':') > 0 then loop vendorsCount := vendorsCount + 1; a_vendor(vendorsCount) := substr(str_vendors, 1, instr(str_vendors, ':') - 1); vendorsLen := instr(str_vendors, ':'); str_vendors := substr(str_vendors, vendorsLen + 1, length(str_vendors) - vendorsLen); Exit when instr(str_vendors, ':') = 0; end loop; vendorsCount := vendorsCount + 1; a_vendor(vendorsCount) := str_vendors; end if; if instr(str_scales, ':') > 0 then loop scalesCount := scalesCount + 1; scalesLen := scalesLen + 1; a_scale(scalesCount) := substr(str_scales, 1, instr(str_scales, ':') - 1); scalesLen := instr(str_scales, ':'); str_scales := substr(str_scales, scalesLen + 1, length(str_scales) - scalesLen); Exit when instr(str_scales, ':') = 0; end loop; scalesCount := scalesCount + 1; a_scale(scalesCount) := str_scales; end if; FOR i IN 1 .. a_vendor.count LOOP select SEQ_VASSIGNLINEID.nextval into str_LINEID from dual; insert into VASSIGNFORMDETAIL (ASSIGNSCALE, VENDORCODE, ASSIGNCODE, ASSIGNPERCENT, CREATEUSER, CREATEDATE, CREATETIME, FORMID, FORMNO, LINEID) values (to_number(a_scale(i)), a_vendor(i), str_ASSIGNCODE, decode(to_number(a_scale(i)), 0, 0, to_number(a_scale(i)) / 100), createuser_in, to_number(to_char(sysdate, 'yyyymmdd')), to_number(to_char(sysdate, 'hh24MMSS')), str_vassignformid, str_ASSIGNCODE, str_LINEID); end loop; end if; ---优先级 SEQIndex := 1; for r_VASSIGNFORMDETAIL in c_temp(str_vassignformid, str_ASSIGNCODE) LOOP update VASSIGNFORMDETAIL set SEQ = SEQIndex where FORMID = str_vassignformid and FORMNO = str_ASSIGNCODE and ASSIGNCODE = str_ASSIGNCODE and LINEID = r_VASSIGNFORMDETAIL.Lineid; SEQIndex := SEQIndex + 1; END LOOP; ---送签 insert into FormHead (formno, formkind, Formstatus, Createuser, Billcode, Createdate, Createtime, Currentlevel) values (str_ASSIGNCODE, formKind_in, 'Checking', createuser_in, str_ASSIGNCODE, to_number(to_char(sysdate, 'yyyymmdd')), to_number(to_char(sysdate, 'hh24MMSS')), 1); commit; setOldAssign(str_ASSIGNCODE, r_vendorvassignbatch.itemcode); -- dbms_output.put_line('44444444444444444444'); commit; setNewAssign(str_ASSIGNCODE); commit; END LOOP; commit; end saveData; -----------------------------------------end PriceManager_Vassign;