-- D:\misH_CVS\mish_skripte\rm_gas5790.pkb -- -- Generated for Oracle 10g on Thu Sep 05 12:20:04 2024 by Server Generator 6.5.96.5.6 PROMPT Creating Package Body 'RM_GAS5790' CREATE OR REPLACE PACKAGE BODY RM_GAS5790 IS PROCEDURE PRERACUN_NARUDZBE (MT_SIFRA1_P IN M_MT.SIFRA%TYPE ,DATUM1_P IN DATE ,RBR_OBRADE_P IN VARCHAR2 ) IS brojac_l NUMBER(5); rowid_l ROWID; kolicina_l p_planpot1.kolicina%TYPE; kol_proizvoda_l p_planpot1.kolicina%TYPE; kol_recepture_l m_proizvodi.kol_recepture%TYPE; razina_l m_proizvodi.razina%TYPE; BEGIN FOR rnal IN ( SELECT rnal.id, datum, mt_id mt_id, mtdaje.sifra mt_sifra, prip_id FROM tgas_rnalog rnal, m_mt mtdaje WHERE datum = datum1_p AND mtdaje.sifra = mt_sifra1_p AND rnal.rbr_obrade = NVL(rbr_obrade_p, rbr_obrade) AND mt_id = mtdaje.id) LOOP /* sirovine se ne rastavljaju na namirnice */ FOR rnalart IN ( SELECT rnalart.nam_id nam_id, rnalart.pro_id pro_id, DECODE(rnalart.nam_id, NULL, pro.razina, 0) razina, rnalart.kolicina kolicina FROM tgas_rnalog_art rnalart, m_proizvodi pro WHERE rnal.id = rnalart.rnal_id AND rnalart.pro_id = pro.id(+) AND rnalart.sir_id IS NULL) LOOP SELECT COUNT (*) INTO brojac_l FROM p_planpot WHERE mt_id = rnal.mt_id AND NVL (prip_id, 0) = NVL(rnal.prip_id, 0) AND NVL (nam_id, 0) = NVL (rnalart.nam_id, 0) AND NVL (pro_id, 0) = NVL (rnalart.pro_id, 0); IF brojac_L = 0 THEN INSERT INTO p_planpot ( mt_id, nac_id, nam_id, pro_id, kolicina, razina_proizvoda, prip_id) VALUES ( rnal.mt_id, NULL, rnalart.nam_id, rnalart.pro_id, rnalart.kolicina, rnalart.razina, rnal.prip_id); ELSE UPDATE p_planpot SET kolicina = kolicina + rnalart.kolicina WHERE mt_id = rnal.mt_id AND NVL (prip_id, 0) = NVL(rnal.prip_id, 0) AND NVL(nam_id, 0) = NVL (rnalart.nam_id, 0) AND NVL(pro_id, 0) = NVL (rnalart.pro_id, 0); END IF; END LOOP; END LOOP; LOOP SELECT COUNT (1) INTO brojac_L FROM p_planpot WHERE razina_proizvoda > 0; /* izlazi kada više nema proizvoda u pomoćnoj tablici */ EXIT WHEN brojac_L = 0; FOR planpot IN ( SELECT ROWID, mt_id, pro_id, kolicina, prip_id FROM p_planpot WHERE razina_proizvoda > 0 ORDER BY razina_proizvoda DESC) LOOP /* Čita se ovdje, a ne u FOR, jer se uvijek vidi početna vrijednost polja iz FOR kurzora, a možda je mijenjana u petlji! */ SELECT kolicina INTO kol_proizvoda_L FROM p_planpot WHERE ROWID = planpot.ROWID; SELECT kol_recepture INTO kol_recepture_L FROM m_proizvodi WHERE id = planpot.pro_id; FOR sas IN ( SELECT * FROM m_sastav WHERE pro_id = planpot.pro_id) LOOP kolicina_L := zaj_obr.kolicina_normativ ( kol_proizvoda_L, sas.normativ, kol_recepture_L); IF sas.pro_id_poluproizvod IS NULL THEN /* ako je namirnica */ SELECT COUNT (1) INTO brojac_L FROM p_planpot WHERE mt_id = planpot.mt_id AND NVL (prip_id, 0) = NVL(planpot.prip_id, 0) AND nam_id = sas.nam_id AND pro_id IS NULL; IF brojac_L = 0 THEN INSERT INTO p_planpot ( mt_id, nac_id, nam_id, pro_id, kolicina, razina_proizvoda, prip_id) VALUES ( planpot.mt_id, NULL, sas.nam_id, NULL, kolicina_L, 0, planpot.prip_id); ELSIF brojac_L = 1 THEN UPDATE p_planpot SET kolicina = kolicina + kolicina_L WHERE mt_id = planpot.mt_id AND NVL (prip_id, 0) = NVL(planpot.prip_id, 0) AND nam_id = sas.nam_id AND pro_id IS NULL; ELSE gas_zaj.vrati_poruku (-20036); -- upozorenje za programera, može se izbaciti END IF; ELSE /* ako je poluproizvod */ SELECT COUNT (ROWID) INTO brojac_L FROM p_planpot WHERE mt_id = planpot.mt_id AND NVL (prip_id, 0) = NVL(planpot.prip_id, 0) AND nam_id IS NULL AND pro_id = sas.pro_id_poluproizvod; IF brojac_L = 0 THEN SELECT razina INTO razina_L FROM m_proizvodi WHERE id = sas.pro_id_poluproizvod; INSERT INTO p_planpot ( mt_id, nac_id, nam_id, pro_id, kolicina, razina_proizvoda, prip_id) VALUES ( planpot.mt_id, NULL, NULL, sas.pro_id_poluproizvod, kolicina_L, razina_L, planpot.prip_id); ELSIF brojac_L = 1 THEN UPDATE p_planpot SET kolicina = kolicina + kolicina_L WHERE mt_id = planpot.mt_id AND NVL (prip_id, 0) = NVL(planpot.prip_id, 0) AND nam_id IS NULL AND pro_id = sas.pro_id_poluproizvod; ELSE gas_zaj.vrati_poruku (-20036); -- upozorenje za programera, može se izbaciti END IF; END IF; END LOOP; /* FOR petlja za sastav jednog poluproizvoda */ DELETE p_planpot WHERE ROWID = planpot.ROWID; END LOOP; /* FOR petlja za sve poluproizvode */ END LOOP; END; PROCEDURE PROIZVODI_PRIP (DATUM_P IN T_IZLAZ.DATUM%TYPE ,MT_ID_P IN M_MT.ID%TYPE ,RBR_OBRADE_P IN TGAS_RNALOG.RBR_OBRADE%TYPE ) IS CURSOR prip_c (mt_id_p NUMBER) IS SELECT mt_id FROM m_mt_art WHERE mt_id = mt_id_p; razina_l NUMBER:= 0; brojac_l NUMBER; mt_id_l m_mt.id%TYPE; BEGIN /* redni broj obrade može biti NULL */ IF mt_id_p IS NULL OR datum_p IS NULL THEN RETURN; END IF; DELETE p_prip_pro; /* U pomoćnu tablicu se prepisuje sve iz radnog naloga (sirovine i namirnice). Prepisano ima razinu 1 */ INSERT INTO p_prip_pro ( datum, mt_id, prip_id, prip1_id, nam_id, pro_id, sir_id, razina, kolicina ) SELECT rn.datum, rn.mt_id, rn.prip_id, rn.prip_id, rnart.nam_id, rnart.pro_id, rnart.sir_id, 1, rnart.kolicina FROM tgas_rnalog rn, tgas_rnalog_art rnart, m_proizvodi pro WHERE rn.datum = datum_p AND rn.mt_id = mt_id_p AND rn.rbr_obrade = NVL (rbr_obrade_p, rbr_obrade) AND rn.id = rnart.rnal_id AND rnart.pro_id = pro.id(+); OPEN prip_c (mt_id_p); FETCH prip_c INTO mt_id_l; CLOSE prip_c; razina_l := 1; /* Proizvodi su zapisani u asortimanu pripremnice*/ IF mt_id_l IS NOT NULL THEN LOOP SELECT COUNT (1) INTO brojac_L FROM p_prip_pro p, m_sastav sas WHERE razina = razina_l AND p.pro_id = sas.pro_id AND sas.pro_id_poluproizvod IS NOT NULL; /* izlazi kada više nema poluproizvoda*/ EXIT WHEN brojac_L = 0; /* rastavljanje proizvoda na poluproizvode (poluproizvodi mogu i ne moraju biti u asortimanu pripremnice */ FOR i IN ( /* Poluproizvodi koji su upisani u asortiman pripremnice (M_MT_ART) */ SELECT p.datum datum, p.mt_id mt_id, prip.id prip_id, -- pripremnica koja proizvodi p.prip_id prip1_id, -- pripremnica koja treba sas.pro_id_poluproizvod pro_id, pro.id pro2_id, p.razina razina, ROUND(zaj_obr.kolicina_normativ( p.kolicina, sas.normativ, pro.kol_recepture),5) kolicina FROM p_prip_pro p, m_sastav sas, m_proizvodi pro, m_proizvodi pro1, m_mt_art mtart, m_pripremnice prip WHERE p.pro_id IS NOT NULL AND sas.pro_id = p.pro_id AND p.pro_id = pro.id AND mtart.prip_id = prip.id AND mtart.mt_id = p.mt_id AND sas.pro_id_poluproizvod = mtart.pro_id AND sas.pro_id_poluproizvod IS NOT NULL AND sas.pro_id_poluproizvod = pro1.id AND p.razina = razina_l UNION ALL /* Poluproizvodi koji NISU upisani u asortiman pripremnice (M_MT_ART) */ SELECT p.datum datum, p.mt_id mt_id, NULL prip_id, -- pripremnica koja proizvodi p.prip_id prip1_id, -- pripremnica koja treba sas.pro_id_poluproizvod pro_id, pro.id pro2_id, p.razina razina, SUM(ROUND(zaj_obr.kolicina_normativ( p.kolicina, sas.normativ, pro.kol_recepture),5)) kolicina FROM p_prip_pro p, m_sastav sas, m_proizvodi pro WHERE p.pro_id IS NOT NULL AND sas.pro_id = p.pro_id AND sas.pro_id = pro.id AND sas.pro_id_poluproizvod IS NOT NULL AND sas.pro_id_poluproizvod NOT IN (SELECT DISTINCT(pro_id) FROM m_mt_art WHERE pro_id IS NOT NULL) AND p.razina = razina_l GROUP BY p.datum, p.mt_id, sas.pro_id_poluproizvod, pro.id, p.razina, p.prip_id) LOOP INSERT INTO p_prip_pro ( datum, mt_id, prip_id, prip1_id, pro_id, pro2_id, razina, kolicina) VALUES (i.datum, i.mt_id, i.prip_id, i.prip1_id, i.pro_id, i.pro2_id, i.razina + 1, i.kolicina); END LOOP; -- petlja FOR razina_l := razina_l + 1; END LOOP; -- petlja WHILE /* iz sastava poluproizvoda (razina > 1) traže se namirnice koje su asortimanu pripremnice takve namirnice su npr: CK MESO GOV.KOCKE koja u sastavu je puno poluproizvoda drugih pripremnica i sadrži obradu. */ INSERT INTO p_prip_pro (datum, mt_id, prip_id, prip1_id, nam_id, razina, kolicina,pro2_id) SELECT p.datum datum, p.mt_id mt_id, mtart.prip_id prip_id, -- pripremnica koja proizvodi p.prip_id prip1_id, -- pripremnica koja treba sas.nam_id, (p.razina + 1) razina, ROUND(zaj_obr.kolicina_normativ( p.kolicina, sas.normativ, pro.kol_recepture),5) kolicina, sas.pro_id FROM p_prip_pro p, m_sastav sas, m_proizvodi pro, m_mt_art mtart WHERE p.pro_id IS NOT NULL AND p.pro_id = sas.pro_id AND p.pro_id = pro.id AND mtart.mt_id = p.mt_id AND sas.nam_id = mtart.nam_id AND sas.nam_id IS NOT NULL; /* Proizvodi nisu zapisani u asortimanu pripremnice: Slastičara rubin i CK Dubrovnik */ ELSE LOOP SELECT COUNT (1) INTO brojac_L FROM p_prip_pro p, m_sastav sas WHERE razina = razina_l AND p.pro_id = sas.pro_id AND sas.pro_id_poluproizvod IS NOT NULL; /* izlazi kada više nema poluproizvoda*/ EXIT WHEN brojac_L = 0; /* rastavljanje proizvoda na poluproizvode */ FOR i IN ( SELECT p.datum datum, p.mt_id mt_id, NULL prip_id, -- pripremnica koja proizvodi NULL prip1_id, -- pripremnica koja treba sas.pro_id_poluproizvod pro_id, pro.id pro2_id, p.razina razina, ROUND(zaj_obr.kolicina_normativ( p.kolicina, sas.normativ, pro.kol_recepture),5) kolicina FROM p_prip_pro p, m_sastav sas, m_proizvodi pro, m_proizvodi pro1 WHERE p.pro_id IS NOT NULL AND sas.pro_id = p.pro_id AND p.pro_id = pro.id AND sas.pro_id_poluproizvod IS NOT NULL AND sas.pro_id_poluproizvod = pro1.id AND p.razina = razina_l ) LOOP INSERT INTO p_prip_pro ( datum, mt_id, prip_id, prip1_id, pro_id, pro2_id, razina, kolicina) VALUES (i.datum, i.mt_id, i.prip_id, i.prip1_id, i.pro_id, i.pro2_id, i.razina + 1, i.kolicina); END LOOP; -- petlja FOR razina_l := razina_l + 1; END LOOP; END IF; COMMIT; END; END RM_GAS5790; / SHOW ERROR