NFIB#21853: Tool voor koppelen artikel aan product

svn path=/Customer/trunk/; revision=15123
This commit is contained in:
Marcel Bourseau
2012-02-20 09:15:48 +00:00
parent cd5734fe4e
commit 05bcf9562a

View File

@@ -1,7 +1,7 @@
-- Script containing customer specific configuration sql statements for NFIB
-- (c) 2011 SG|facilitor bv
-- $Revision: 5 $
-- $Modtime: 7-12-11 11:23 $
-- $Revision: 6 $
-- $Modtime: 20-01-12 14:54 $
--
-- Support: +31 53 4800710
@@ -141,6 +141,33 @@ END;
/
CREATE OR REPLACE PROCEDURE nfib_copy_melding_2_bedrijf (
p_melding_key IN NUMBER
)
IS
l_prs_bedrijf_naam VARCHAR2 (1000);
BEGIN
-- key 61 = bedrijfsnaam/prospect naam
SELECT mld_kenmerkmelding_waarde
INTO l_prs_bedrijf_naam
FROM mld_kenmerkmelding km
WHERE mld_kenmerk_key = 61
AND mld_melding_key=p_melding_key;
INSERT INTO prs_bedrijf (prs_bedrijf_naam, prs_bedrijf_intern)
SELECT l_prs_bedrijf_naam, 1 FROM DUAL;
EXCEPTION
WHEN OTHERS
THEN
raise_application_error (-20000, 'Naam van klant/prospect bestaat al.');
END;
/
-----------------------------------------------------------------------------------------------------------
-- Het klantenbestand, oftewel de NeFib abonnees.
@@ -155,7 +182,7 @@ FROM prs_v_aanwezigbedrijf b
WHERE b.prs_bedrijf_intern = 1
AND b.prs_bedrijf_ingids = 1;
-- Prospects die door administratie (Penny) in het klantenbestand zijn ingevoerd.
-- Prospects die door administratie (Penny) in het klantenbestand zijn ingevoerd, en (nog) geen klant zijn. Ook eventuele prospects door sales komen in deze view...
CREATE OR REPLACE FORCE view nfib_v_prs_prospect
(nfib_prospect_key, nfib_prospect_naam)
AS
@@ -164,13 +191,17 @@ FROM prs_v_aanwezigbedrijf b
WHERE b.prs_bedrijf_intern = 1
AND b.prs_bedrijf_ingids is null;
-- Prospects die door vertegenwoordiger worden opgevoerd via de melding 'Nieuwe prospect'
CREATE OR REPLACE FORCE view nfib_v_mld_prospect
(nfib_prospect_key, nfib_prospect_naam)
-- Prospects die door vertegenwoordiger worden opgevoerd via de melding 'Nieuwe prospect' en nog niet in het klantenbestand (prs_bedrijf) staan.
-- Dit rapport is voor de vertegenwoordiger om een prospect in het klantenbestand in te schieten (om een quickscan te kunnen doen).
CREATE OR REPLACE FORCE view nfib_v_rap_my_prospects
(fclt_3d_user_key, nfib_prospect_naam)
AS
select distinct mld_kenmerkmelding_key , mld_kenmerkmelding_waarde
select m.prs_perslid_key, mld_kenmerkmelding_waarde
from mld_kenmerkmelding km, mld_melding m
where mld_kenmerk_key = 61;
where mld_kenmerk_key = 61
and m.mld_melding_key = km.mld_melding_key
and not exists (select 'x' from prs_bedrijf b where UPPER(b.prs_bedrijf_naam) = UPPER(mld_kenmerkmelding_waarde));
CREATE OR REPLACE VIEW nfib_v_ketenmoeder (
@@ -190,13 +221,6 @@ AND EXISTS (select 'x' FROM prs_kenmerklink kl
CREATE OR REPLACE FORCE view nfib_v_prospect
(nfib_prospect_key, nfib_prospect_naam)
AS
select distinct mld_kenmerkmelding_key , mld_kenmerkmelding_waarde
from mld_kenmerkmelding km, mld_melding m
where mld_kenmerk_key = 61;
CREATE OR REPLACE FORCE VIEW nfib_v_rap_bes_prod
(
@@ -249,10 +273,367 @@ AS
AND sd.prs_bedrijf_key = b.prs_bedrijf_key(+);
CREATE OR REPLACE FORCE VIEW nfib_v_rap_art_2_prod_75
(
fclt_f_leverancier,
fclt_f_catalogus,
fclt_f_groep,
hide_f_bes_srtdeel_key,
artikelnr,
omschrijving,
eenheid,
hide_f_match,
fclt_f_prodnr,
product
)
AS
SELECT p1.prs_bedrijf_naam, c1.ins_discipline_omschrijving, g1.bes_srtgroep_omschrijving, d1.bes_srtdeel_key, d1.bes_srtdeel_nr, d1.bes_srtdeel_omschrijving, d1.bes_srtdeel_eenheid,
ROUND(utl_match.jaro_winkler( d1.bes_srtdeel_omschrijving, pd1.bes_srtprod_omschrijving),2),
COALESCE(pd1.bes_srtprod_nr, 'NEE'), pd1.bes_srtprod_omschrijving
FROM bes_srtdeel d1, prs_bedrijf p1, bes_srtgroep g1, bes_discipline c1, bes_srtprod pd1
WHERE d1.prs_bedrijf_key = p1.prs_bedrijf_key
AND utl_match.jaro_winkler( UPPER(d1.bes_srtdeel_omschrijving), UPPER(pd1.bes_srtprod_omschrijving)) >= 0.75
AND d1.bes_srtgroep_key = g1.bes_srtgroep_key
AND c1.ins_discipline_key = g1.ins_discipline_key
AND d1.bes_srtprod_key = pd1.bes_srtprod_key (+);
CREATE OR REPLACE FORCE VIEW nfib_v_rap_art_2_art_75
(
hide_f_match,
fclt_f_matchpercentage,
fclt_f_leverancier1,
fclt_f_catalogus1,
fclt_f_groep1,
hide_f_bes_srtdeel_key1,
artikelnr1,
omschrijving1,
eenheid,
fclt_f_prodnr1,
product1,
prijs1,
prijs2,
fclt_f_leverancier2,
fclt_f_catalogus2,
fclt_f_groep2,
hide_f_bes_srtdeel_key2,
artikelnr2,
omschrijving2,
eenheid2,
fclt_f_prodnr2,
product2
)
AS
SELECT 1-ROUND(utl_match.jaro_winkler( d2.bes_srtdeel_omschrijving, d1.bes_srtdeel_omschrijving),2),
CASE
WHEN ROUND(utl_match.jaro_winkler( d2.bes_srtdeel_omschrijving, d1.bes_srtdeel_omschrijving),2) >= 0.99
THEN
'>= 99%'
WHEN ROUND(utl_match.jaro_winkler( d2.bes_srtdeel_omschrijving, d1.bes_srtdeel_omschrijving),2) >= 0.95
THEN
'95-99%'
WHEN ROUND(utl_match.jaro_winkler( d2.bes_srtdeel_omschrijving, d1.bes_srtdeel_omschrijving),2) >= 0.90
THEN
'90-95%'
ELSE
'80-90%'
END,
p1.prs_bedrijf_naam, c1.ins_discipline_omschrijving, g1.bes_srtgroep_omschrijving, d1.bes_srtdeel_key, d1.bes_srtdeel_nr, d1.bes_srtdeel_omschrijving, d1.bes_srtdeel_eenheid,
COALESCE(pd1.bes_srtprod_nr, 'NEE'), pd1.bes_srtprod_omschrijving,
pr1.bes_srtdeel_prijs_prijs,pr2.bes_srtdeel_prijs_prijs,
p2.prs_bedrijf_naam, c2.ins_discipline_omschrijving, g2.bes_srtgroep_omschrijving, d2.bes_srtdeel_key, d2.bes_srtdeel_nr, d2.bes_srtdeel_omschrijving, d2.bes_srtdeel_eenheid,
COALESCE(pd2.bes_srtprod_nr, 'NEE'), pd2.bes_srtprod_omschrijving
FROM bes_srtdeel d1, prs_bedrijf p1, bes_srtdeel d2, prs_bedrijf p2, bes_srtgroep g1, bes_srtgroep g2, bes_discipline c1,bes_discipline c2, bes_srtprod pd1, bes_srtprod pd2,
bes_srtdeel_prijs pr1, bes_srtdeel_prijs pr2
WHERE d1.prs_bedrijf_key = p1.prs_bedrijf_key
AND utl_match.jaro_winkler( UPPER(d2.bes_srtdeel_omschrijving), UPPER(d1.bes_srtdeel_omschrijving)) >= 0.80
AND d2.prs_bedrijf_key = p2.prs_bedrijf_key
AND d1.bes_srtdeel_key <> d2.bes_srtdeel_key
AND d1.bes_srtdeel_key = pr1.bes_srtdeel_key
AND COALESCE(pr1.bes_srtdeel_prijs_vervaldatum, SYSDATE) >= SYSDATE
AND COALESCE(pr2.bes_srtdeel_prijs_vervaldatum, SYSDATE) >= SYSDATE
AND d2.bes_srtdeel_key = pr2.bes_srtdeel_key
AND p1.prs_bedrijf_key <> p2.prs_bedrijf_key
AND d1.bes_srtgroep_key = g1.bes_srtgroep_key
AND d2.bes_srtgroep_key = g2.bes_srtgroep_key
AND c1.ins_discipline_key = g1.ins_discipline_key
AND c2.ins_discipline_key = g2.ins_discipline_key
AND d1.bes_srtprod_key = pd1.bes_srtprod_key (+)
AND d2.bes_srtprod_key = pd2.bes_srtprod_key (+);
--CREATE OR REPLACE PROCEDURE nfib_import_catalogus_prd (
-- p_applname IN VARCHAR2,
-- p_applrun IN VARCHAR2,
-- p_filedir IN VARCHAR2,
-- p_filename IN VARCHAR2
--)
--IS
--BEGIN
-- fac_import_catalogus(p_applname, p_applrun, p_filedir, p_filename, NULL, NULL);
--END;
--/
--CREATE OR REPLACE PROCEDURE nfib_update_catalogus_prd (
-- p_applname IN VARCHAR2,
-- p_applrun IN VARCHAR2
--)
--IS
-- CURSOR c_distinct_bedrijven
-- IS
-- SELECT DISTINCT prs_bedrijf_key from fac_imp_catalogus;
--
--BEGIN
-- fac_update_catalogus(p_applname, p_applrun, NULL, NULL);
--
-- FOR rec IN c_distinct_bedrijven
-- LOOP
-- BEGIN
-- nfib_update_catalogus(p_applname, p_applrun, NULL, rec.prs_bedrijf_key);
-- END;
-- END LOOP;
--END;
--/
CREATE OR REPLACE PROCEDURE nfib_update_catalogus (
p_applname IN VARCHAR2,
p_applrun IN VARCHAR2,
p_discipline_key IN NUMBER,
p_bedrijf_key IN NUMBER
)
IS
l_bes_srtprod_key bes_srtprod.bes_srtprod_key%TYPE;
l_maak_new_prod NUMBER;
v_errormsg VARCHAR2 (1000);
v_errorhint VARCHAR2 (1000);
oracle_err_num NUMBER;
oracle_err_mes VARCHAR2 (200);
v_aanduiding VARCHAR2 (200);
-- Cursor c_prd_naam_eenheid bevat de artikelen van levernacier p_bedrijf_key (zojuist ingelezen) die een match hebben met 1 of meer artikelen van andere leveranciers.
-- De match bestaat uit 100% overeenkomst in naam en eenheid (merk van artikel kent nu (nog) geen eigen kolom, zou nog sterkere match zijn geweest).
CURSOR c_prd_naam_eenheid (
p_bedrijf_key IN NUMBER
)
IS
SELECT
p1.prs_bedrijf_naam leverancier1,
c1.ins_discipline_omschrijving catalogus1,
g1.bes_srtgroep_omschrijving groep1,
d1.bes_srtdeel_key bes_srtdeel_key1,
d1.bes_srtdeel_nr artikelnr1,
d1.bes_srtdeel_omschrijving omschrijving1,
d1.bes_srtdeel_eenheid eenheid1,
pd1.bes_srtprod_key bes_srtprod_key1,
pd1.bes_srtprod_nr prodnr1,
pd1.bes_srtprod_omschrijving product1,
pr1.bes_srtdeel_prijs_prijs prijs1,
p2.prs_bedrijf_naam leverancier2,
c2.ins_discipline_omschrijving catalogus2,
g2.bes_srtgroep_omschrijving groep2,
d2.bes_srtdeel_key bes_srtdeel_key2,
d2.bes_srtdeel_nr artikelnr2,
d2.bes_srtdeel_omschrijving omschrijving2,
d2.bes_srtdeel_eenheid eenheid2,
pd1.bes_srtprod_key bes_srtprod_key2,
pd2.bes_srtprod_nr prodnr2,
pd2.bes_srtprod_omschrijving product2,
pr2.bes_srtdeel_prijs_prijs prijs2
FROM bes_srtdeel d1, prs_bedrijf p1, bes_srtdeel d2, prs_bedrijf p2, bes_srtgroep g1, bes_srtgroep g2, bes_discipline c1,bes_discipline c2, bes_srtprod pd1, bes_srtprod pd2,
bes_srtdeel_prijs pr1, bes_srtdeel_prijs pr2
WHERE d1.prs_bedrijf_key = p_bedrijf_key
AND p1.prs_bedrijf_key <> p2.prs_bedrijf_key
AND d1.prs_bedrijf_key = p1.prs_bedrijf_key
AND d2.prs_bedrijf_key = p2.prs_bedrijf_key
AND d1.bes_srtdeel_key <> d2.bes_srtdeel_key
AND d1.bes_srtdeel_key = pr1.bes_srtdeel_key
AND d2.bes_srtdeel_key = pr2.bes_srtdeel_key
AND d1.bes_srtgroep_key = g1.bes_srtgroep_key
AND d2.bes_srtgroep_key = g2.bes_srtgroep_key
AND c1.ins_discipline_key = g1.ins_discipline_key
AND c2.ins_discipline_key = g2.ins_discipline_key
AND UPPER(d2.bes_srtdeel_omschrijving) = UPPER(d1.bes_srtdeel_omschrijving)
AND UPPER(d2.bes_srtdeel_eenheid) = UPPER(d1.bes_srtdeel_eenheid)
AND COALESCE(pr1.bes_srtdeel_prijs_vervaldatum, SYSDATE) >= SYSDATE
AND COALESCE(pr2.bes_srtdeel_prijs_vervaldatum, SYSDATE) >= SYSDATE
AND d1.bes_srtprod_key = pd1.bes_srtprod_key (+)
AND d2.bes_srtprod_key = pd2.bes_srtprod_key (+);
-- Cursor c_art_without_prd bevat de artikelen van leverancier 'p_bedrijf_key' (zojuist ingelezen) die:
-- a)geen koppeling hebben met een product
-- b)een match hebben met 1 of meer artikelen van andere leveranciers
-- De match bestaat uit 100% overeenkomst in naam en eenheid (merk van artikel kent nu (nog) geen eigen kolom, zou nog sterkere match zijn geweest).
CURSOR c_matching_art_without_prd (
p_bedrijf_key IN NUMBER
)
IS
SELECT d1.bes_srtdeel_key, MIN(d1.bes_srtdeel_nr) artikelnr, MIN(d1.bes_srtdeel_omschrijving) omschrijving, MIN(d1.bes_srtdeel_eenheid) eenheid, MIN(d1.bes_srtgroep_key) bes_srtgroep_key
FROM bes_srtdeel d1, bes_srtgroep g1, bes_discipline c1, bes_srtdeel_prijs pr1, bes_srtdeel d2
WHERE d1.prs_bedrijf_key = p_bedrijf_key
AND d1.bes_srtdeel_key = pr1.bes_srtdeel_key
AND d1.bes_srtgroep_key = g1.bes_srtgroep_key
AND c1.ins_discipline_key = g1.ins_discipline_key
AND UPPER(d2.bes_srtdeel_omschrijving) = UPPER(d1.bes_srtdeel_omschrijving)
AND UPPER(d2.bes_srtdeel_eenheid) = UPPER(d1.bes_srtdeel_eenheid)
AND d1.prs_bedrijf_key <> d2.prs_bedrijf_key
AND d1.bes_srtdeel_key <> d2.bes_srtdeel_key
AND d1.bes_srtdeel_verwijder is null
AND d2.bes_srtdeel_verwijder is null
AND COALESCE(pr1.bes_srtdeel_prijs_vervaldatum, SYSDATE) >= SYSDATE
AND d1.bes_srtprod_key IS NULL
GROUP BY d1.bes_srtdeel_key;
CURSOR c_art_match_art_without_prod (
p_bes_srtdeel_key IN NUMBER
)
IS
SELECT d2.bes_srtdeel_key
FROM bes_srtdeel d1, bes_srtdeel d2
WHERE d1.bes_srtdeel_key = p_bes_srtdeel_key
AND UPPER(d2.bes_srtdeel_omschrijving) = UPPER(d1.bes_srtdeel_omschrijving)
AND UPPER(d2.bes_srtdeel_eenheid) = UPPER(d1.bes_srtdeel_eenheid)
AND d1.prs_bedrijf_key <> d2.prs_bedrijf_key
AND d1.bes_srtdeel_key <> d2.bes_srtdeel_key
AND d1.bes_srtdeel_verwijder is null
AND d2.bes_srtdeel_verwijder is null
AND d2.bes_srtprod_key IS NULL;
BEGIN
-- Voor ieder geimporteerd artikel van leverancier 'p_bedrijf_key' dat nog niet gekoppeld is aan product (als die in eerdere imports gekoppeld was, dan nu met rust laten)
FOR rec IN c_matching_art_without_prd (p_bedrijf_key)
LOOP
BEGIN
v_aanduiding := '[' || rec.artikelnr || ' - ' || rec.omschrijving || '( ' || rec.eenheid || ') ' || '] ';
v_errormsg := 'Eenduidigheid mist: meerdere artikelen matchen maar hebebn verschillende producten';
-- Artikel is niet gekoppeld aan product, laten we proberen deze te koppelen:
-- Zoek aan product-gekoppelde-artikelen van andere leverancier(s), en knoop hem aan die...
SELECT d2.bes_srtprod_key
INTO l_bes_srtprod_key
FROM bes_srtdeel d1, bes_srtdeel d2
WHERE d1.bes_srtdeel_key = rec.bes_srtdeel_key
AND UPPER(d2.bes_srtdeel_omschrijving) = UPPER(d1.bes_srtdeel_omschrijving)
AND UPPER(d2.bes_srtdeel_eenheid) = UPPER(d1.bes_srtdeel_eenheid)
AND d1.prs_bedrijf_key <> d2.prs_bedrijf_key
AND d1.bes_srtdeel_key <> d2.bes_srtdeel_key
AND d1.bes_srtdeel_verwijder is null
AND d2.bes_srtdeel_verwijder is null
AND d2.bes_srtprod_key IS NOT NULL
GROUP BY d2.bes_srtprod_key;
-- Hier eenduidig 1 product gevonden die aan de gematch-te artikel(en) zijn gekoppeld.
UPDATE bes_srtdeel d1
SET d1.bes_srtprod_key = l_bes_srtprod_key
WHERE d1.bes_srtdeel_key = rec.bes_srtdeel_key;
EXCEPTION
-- Geen (=0) of meer (>1) producten gevonden..
WHEN NO_DATA_FOUND
THEN
-- Geen artikel die aan product is gekoppeld gevonden, dus dan is gematch-te artikel nog ongekoppeld
-- We gaan dan alle productloze artikelen die matchen alsnog bombaderen tot product-koppeling door 1 product aan te maken en ze allemaal daaraan te koppelen...
-- Default geen product maken, tenzij er een productloos match-artikel bestaat
l_maak_new_prod := 0;
FOR rec2 IN c_art_match_art_without_prod (rec.bes_srtdeel_key)
LOOP
-- Productloos match-artikel bestaat!
l_maak_new_prod := l_maak_new_prod + 1;
IF l_maak_new_prod = 1
THEN
-- Alleen de 1e keer een product maken...
-- Maar eerst ff checken of toevallig/theoretisch/handmatig toch niet het product al bestaat met dezelfde naam en eenheid, want dan hoef ik die niet aan te maken...
BEGIN
SELECT bes_srtprod_key
INTO l_bes_srtprod_key
FROM bes_srtprod
WHERE UPPER(bes_srtprod_omschrijving) = UPPER(rec.omschrijving)
AND UPPER(bes_srtprod_eenheid) = UPPER(rec.eenheid);
EXCEPTION
WHEN OTHERS
THEN
SELECT bes_s_bes_srtprod_key.NEXTVAL
INTO l_bes_srtprod_key
FROM DUAL;
-- bes_srtgroep_key = 1 (harde key), dit is de default/standaard groep onder de standaard productencatalogus (met key 3): zie nfib003.sql
INSERT INTO bes_srtprod (bes_srtprod_key, bes_srtgroep_key, bes_srtprod_omschrijving, bes_srtprod_eenheid)
SELECT l_bes_srtprod_key, 1, rec.omschrijving, rec.eenheid FROM DUAL;
END;
END IF;
-- Elk productloos artikel nu aan product koppelen
UPDATE bes_srtdeel d1
SET d1.bes_srtprod_key = l_bes_srtprod_key
WHERE d1.bes_srtdeel_key = rec2.bes_srtdeel_key;
END LOOP;
-- En tenslotte het artikel van leverancier p_prs_bedrijf_key zelf nog
UPDATE bes_srtdeel d1
SET d1.bes_srtprod_key = l_bes_srtprod_key
WHERE d1.bes_srtdeel_key = rec.bes_srtdeel_key;
WHEN OTHERS
THEN
-- Er zijn meerdere artikelen met 100% match, die aan verschillende producten hangen.
-- Vanwege deze arbitriare situatie niet koppelen, maar rapporteren.
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
v_errormsg
|| ' ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_applname,
p_applrun,
'W',
v_aanduiding || v_errormsg,
'');
END;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS
THEN
oracle_err_num := SQLCODE;
oracle_err_mes := SUBSTR (SQLERRM, 1, 200);
v_errormsg :=
v_errormsg
|| ' ORACLE (error '
|| oracle_err_num
|| '/'
|| oracle_err_mes
|| ')';
fac.imp_writelog (p_applname,
p_applrun,
'E',
v_aanduiding || v_errormsg,
'Verwerken catalogus afgebroken!');
END;
/
BEGIN adm.systrackscript('$Workfile: nfib.sql $', '$Revision: 5 $', 0); END;
BEGIN adm.systrackscript('$Workfile: nfib.sql $', '$Revision: 6 $', 0); END;
/
BEGIN fac.registercustversion('NFIB', 1); END;