「相鄰庫存查詢」的應用場景:主要是實現門店間,相互查看商品庫存情況,但出於公司對門店的查看權限控制要求,不能一次性查看到相關店鋪的全部庫存,因此產生了「相鄰庫存查詢」的功能,經過後臺系統給指定門店定義相關聯的店倉,讓門店能夠按照單款查詢到的方式查詢到已定義的「相鄰店鋪」的商品庫存分佈情況。sql
可是標準產品裏面設計的「相鄰庫存查詢」,因對查詢條件的匹配限制(當輸入「款號」能查詢全部尺碼的庫存分佈狀況,輸入「條碼」時只能查詢次條碼的庫存狀況),這樣的方式下降「相鄰看下查詢」的功能效果,接收不少客戶的反饋以後,從新調整自定義了相關程序(getBarcodeQtyCanByUserId_C.jsp),添加條碼解析函數(oracle數據庫自定義函數get_mpda_no_mpt),實現了掃入條碼,直接查詢全部尺碼的庫存狀況。數據庫
修改後的jsp
oracle
自定義函數get_mpda_no_mpt的代碼app
create or replace function get_mpda_no_mpt(p_no in varchar2) return number as v_seqname varchar2(80); pos number(10); m_pda_id number(10); begin --1條碼 begin EXECUTE IMMEDIATE ' select t.m_product_id from m_product_alias t where t.no = :1' into m_pda_id using p_no; exception when no_data_found then m_pda_id := null; end; if m_pda_id is not null then return m_pda_id; end if; --2條碼 begin EXECUTE IMMEDIATE ' select t.id from m_product t where t.name = :1' into m_pda_id using p_no; exception when no_data_found then m_pda_id := null; end; if m_pda_id is not null then return m_pda_id; end if; --3流水碼(截取位數) pos := ad_param_value(37, 'portal.6001', 0); begin --raise_application_error(-20201,pos); FOR v IN (SELECT regexp_substr(pos, '[^,]+', 1, LEVEL, 'i') AS text FROM dual CONNECT BY LEVEL <= length(pos) - length(REPLACE(pos, ',')) + 1) LOOP EXECUTE IMMEDIATE 'select max(m_product_id) from m_product_alias where no=:1' INTO m_pda_id USING substr(p_no, 1, length(p_no) - v.text); IF m_pda_id > 0 THEN return m_pda_id; END IF; END LOOP; exception when no_data_found then m_pda_id := null; end; if m_pda_id is not null then return m_pda_id; end if; --4國標碼 begin EXECUTE IMMEDIATE ' select t.m_product_id from m_product_alias t where t.INTSCODE = :1' into m_pda_id using p_no; exception when no_data_found then m_pda_id := null; end; if m_pda_id is not null then return m_pda_id; end if; --5新舊條碼對照 begin EXECUTE IMMEDIATE ' select a.m_product_id from m_pdt_alias_con t, m_product_alias g,m_product_alias a where t.m_pda_old_id = g.id and t.m_pda_new_id=a.id and g.no = :1' into m_pda_id using p_no; exception when no_data_found then m_pda_id := null; end; if m_pda_id is not null then return m_pda_id; end if; return m_pda_id; end;
後臺「相鄰店鋪」維護調整,標準的「相鄰店鋪」維護只能是一一對應維護,例如定義A店鋪的「相鄰店鋪」爲B、C店鋪,則須要再A店鋪的店倉檔案下的「相鄰店鋪」table也頁添加B、C店鋪後,再到B、C店鋪的店倉檔案下添加A店鋪,維護起來非常不方便。jsp
解決方案:經過給店倉檔案添加新的標籤,修改對應的店倉檔案程序,在對店倉檔案修改的時候,識別將統一標籤的店倉直接相互更新到對應的「相鄰店鋪」。
函數
1 /*根據店倉性質更新相鄰店鋪*/ 2 --先刪除原明細 3 delete from C_STORENEB; 4 5 for v in (select a.id, a.c_storekind_id 6 from c_store a 7 where a.isactive='Y') loop 8 9 --插入新的明細 10 insert into C_STORENEB t 11 (id, 12 ad_client_id, 13 ad_org_id, 14 c_neb_store_id, 15 c_store_id, 16 ownerid, 17 modifierid, 18 creationdate, 19 modifieddate, 20 isactive) 21 select get_sequences('C_STORENEB'), 22 a.ad_client_id, 23 a.ad_org_id, 24 a.id, 25 v.id, 26 ownerid, 27 modifierid, 28 creationdate, 29 modifieddate, 30 isactive 31 from c_store a 32 where a.isactive='Y'; 33 end loop;