Generare comenzi de aprovizionare pentru furnizori
Funcțiile customizate de tipul "Generare comenzi de aprovizionare pentru furnizori" sunt de două tipuri: STANDARD și INLINE și au fost create cu scopul de a genera comenzile de aprovizionare pentru furnizori, cu posibilitatea de stabilire a unor filtre noi. În cazul în care există funcții custom de tipul "Generare comenzi de aprovizionare pentru furnizori", meniul Asistent din modulul "Comenzi pentru furnizori" va conține itemi pentru fiecare funcție existentă. De asemenea, există posibilitatea de a genera comenzi pentru furnizori prin crearea unui task programat, din Execuție proceduri (procedura "Comanda furnizor aprovizionare - funcție custom").
Pentru funcțiile INLINE se va realiza un select care să returneze structura prezentată, iar pentru funcțiile STANDARD se va realiza un INSERT INTO @ret_table, respectând aceeași structură.
Parametri funcție customizată
Parametru | Tip | Descriere |
---|---|---|
@data_ini | DATE | Data de început a perioadei de căutare |
@data_fin | DATE | Data de sfârșit a perioadei de căutare |
@nr_zile_aprov | INT | Numărul de zile pentru calculul necesarului de marfă (OPȚIONAL) |
Structura returnată de funcția customizată
Structură | Tip | Descriere |
---|---|---|
data_doc | DATE | Data comenzii de furnizor |
id_furnizor | VARCHAR(25) | Codul furnizorului, în format ID(PCT_LCR) |
id_gestiune | VARCHAR(25) | Codul gestiunii, în format ID(PCT_LCR) |
id_produs | VARCHAR(25) | Codul produsului, în format ID(PCT_LCR) |
tip_produs | CHAR(3) | Codul contului articolului (din nomenclator bunuri și servicii: FAA, GAA, etc.) |
cantitate | NUMERIC(13,3) | Cantitatea comandată |
pret_achizitie | MONEY | Prețul de achiziție |
moneda | CHAR(3) | Codul valutei în care e exprimat prețul de achiziție (OPȚIONAL, implicit RON) |
denumire_sup | VARCHAR(500) | Denumirea suplimentară ce sa va salva pe linia comenzii |
Exemplu de funcție customizată INLINE pentru generarea comenzilor de aprovizionare pentru furnizori
Pentru funcția STANDARD se va insera în tabela @ret_table, urmat de același select:
INSERT INTO @ret_table(data_document, id_carnet, id_gestiune, id_produs, tip_produs, id_furnizor, pret_achizitie, cantitate)
SELECT data_document = CAST(GETDATE() AS DATE),
id_carnet = CAST(g.id_car_cmdfrn AS NUMERIC(18,0)),
id_gestiune = dbo.id2cod(pg.pl_gest, pg.id_gest),
id_produs = dbo.id2cod(n.pct_lcr, n.id),
tip_produs = m.cod_bs,
id_furnizor = dbo.id2cod(n.pl_ft, n.id_ft),
pret_achizitie = CAST(ISNULL(o.pu, n.pu_furn) AS money),
cantitate = IIF(n.ambalare = 0, IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0)),
CEILING((IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0))) / n.ambalare) * n.ambalare)
FROM nomen1 c
INNER JOIN nomen3 n ON n.pl_clasa = c.pct_lcr AND n.id_clasa = c.id
INNER JOIN preturi_ma_linii p ON n.pct_lcr = p.pl_pr AND n.id = p.id_pr
INNER JOIN preturi_ma m ON p.pl_ant = m.pct_lcr AND p.id_ant = m.id
INNER JOIN preturi_ma_gestiuni pg ON p.pl_ant = pg.pl_lista AND p.id_ant = pg.id_lista
INNER JOIN gestiuni g ON pg.pl_gest = g.pct_lcr AND pg.id_gest = g.id
LEFT JOIN
(SELECT l.pl_pr, l.id_pr, l.pu, d.presc, l.pl_dev, l.id_dev, ROW_NUMBER() OVER(PARTITION BY l.pl_pr, l.id_pr ORDER BY a.data_doc DESC, l.pu) AS rowNo
FROM oferte_furnizori_lin l
INNER JOIN oferte_furnizori a ON l.pl_ofr = a.pct_lcr AND l.id_ofr = a.id
INNER JOIN devize d ON l.pl_dev = d.pct_lcr AND l.id_dev = d.id
WHERE a.valid = 1 AND a.anulat = 0 AND CAST(GETDATE() AS date) BETWEEN a.data_doc AND a.data_exp AND l.pu != 0) o ON o.pl_pr = n.pct_lcr AND o.id_pr = n.id AND o.rowNo = 1
LEFT JOIN dbo.cant_limite l ON l.pl_pr = n.pct_lcr AND l.id_pr = n.id AND l.pl_gest = pg.pl_gest AND l.id_gest = pg.id_gest
LEFT JOIN
(SELECT pl_gest, id_gest, pl_pr, id_pr, cod_pr, SUM(cantitate) AS cantitate
FROM dbo.sel_stoc(dbo.anluna(GETDATE()))
WHERE pl_cmd IS NULL AND id_cmd IS NULL
GROUP BY pl_gest, id_gest, pl_pr, id_pr, cod_pr
HAVING (SUM(cantitate) > 0)) s ON s.pl_gest = pg.pl_gest AND s.id_gest = pg.id_gest AND s.pl_pr = n.pct_lcr AND s.id_pr = n.id AND s.cod_pr = m.cod_bs
OUTER APPLY
(SELECT l.pl_pr, l.id_pr, SUM(l.cantitate - l.onorat) AS comandafrn
FROM lincomnzfurnizori_view l
INNER JOIN comenzifurnizori a ON l.anluna = a.anluna AND l.pl_cmd = a.pct_lcr AND l.id_cmd = a.id
AND l.cod_pr = m.cod_bs AND a.valid = 1 AND a.anulat = 0 AND a.inchis = 0 AND l.cantitate - l.onorat > 0
WHERE g.pct_lcr = a.pl_gest AND g.id = a.id_gest AND n.pct_lcr = l.pl_pr AND n.id = l.id_pr
GROUP BY a.pl_gest, a.id_gest, l.pl_pr, l.id_pr) f
OUTER APPLY
(SELECT l.pl_pr, l.id_pr, SUM(l.cant_f - l.cant_r) AS cant_nerecep
FROM linfactfurnizori_view l
INNER JOIN fur f ON l.anluna = f.anluna AND l.pl_fct = f.pct_lcr AND l.id_fct = f.id
AND l.cod_pr = m.cod_bs AND f.valid = 1 AND f.anulat = 0 AND l.cant_f - l.cant_r > 0
WHERE f.data_doc > DATEADD(YEAR, -1, CAST(GETDATE() AS date)) AND l.pl_avm IS NULL AND l.id_avm IS NULL AND g.pct_lcr = f.pl_gest AND g.id = f.id_gest AND n.pct_lcr = l.pl_pr AND n.id = l.id_pr
GROUP BY f.pl_gest, f.id_gest, l.pl_pr, l.id_pr) cn
LEFT JOIN cant_limite b ON b.pl_pr = n.pct_lcr AND b.id_pr = n.id AND b.pl_gest = pg.pl_gest AND b.id_gest = pg.id_gest
AND (b.cant_max <= 0 OR b.cant_max <= ISNULL(s.cantitate, 0))
WHERE b.id IS NULL AND n.pl_ft IS NOT NULL AND n.id_ft IS NOT NULL AND n.tip_produs != 'C' AND n.aproviz_depozit = 0 AND m.cod_bs NOT LIKE 'S%' AND m.cod_bs NOT LIKE 'W%'
AND IIF(n.ambalare = 0, IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0)),
CEILING((IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comandafrn, 0) - ISNULL(cn.cant_nerecep, 0))) / n.ambalare) * n.ambalare) > 0