1132 lines
50 KiB
Plaintext
1132 lines
50 KiB
Plaintext
create or replace package PKG_P8PANELS_VISUAL as
|
|
|
|
/* Êîíñòàíòû - òèïû äàííûõ */
|
|
SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Òèï äàííûõ "ñòðîêà"
|
|
SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Òèï äàííûõ "÷èñëî"
|
|
SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Òèï äàííûõ "äàòà"
|
|
|
|
/* Êîíñòàíòû - íàïðàâëåíèå ñîðòèðîâêè */
|
|
SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- Ïî âîçðàñòàíèþ
|
|
SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- Ïî óáûâàíèþ
|
|
|
|
/* Òèïû äàííûõ - çíà÷åíèå êîëîíêè òàáëèöû äàííûõ */
|
|
type TCOL_VAL is record
|
|
(
|
|
SVALUE PKG_STD.TLSTRING, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE PKG_STD.TNUMBER, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE PKG_STD.TLDATE -- Çíà÷åíèå (äàòà)
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ çíà÷åíèé êîëîíêè òàáëèöû äàííûõ */
|
|
type TCOL_VALS is table of TCOL_VAL;
|
|
|
|
/* Òèïû äàííûõ - îïèñàòåëü êîëîíêè òàáëèöû äàííûõ */
|
|
type TCOL_DEF is record
|
|
(
|
|
SNAME PKG_STD.TSTRING, -- Íàèìåíîâàíèå
|
|
SCAPTION PKG_STD.TSTRING, -- Çàãîëîâîê
|
|
SDATA_TYPE PKG_STD.TSTRING, -- Òèï äàííûõ (ñì. êîíñòàíòû SDATA_TYPE_*)
|
|
SCOND_FROM PKG_STD.TSTRING, -- Íàèìåíîâàíèå íèæíåé ãðàíèöû óñëîâèÿ îòáîðà
|
|
SCOND_TO PKG_STD.TSTRING, -- Íàèìåíîâàíèå âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà
|
|
BVISIBLE boolean, -- Ðàçðåøèòü îòîáðàæåíèå
|
|
BORDER boolean, -- Ðàçðåøèòü ñîðòèðîâêó
|
|
BFILTER boolean, -- Ðàçðåøèòü îòáîð
|
|
RCOL_VALS TCOL_VALS -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ îïèñàòåëåé êîëîíîê òàáëèöû äàííûõ */
|
|
type TCOL_DEFS is table of TCOL_DEF;
|
|
|
|
/* Òèïû äàííûõ - êîëîíêà */
|
|
type TCOL is record
|
|
(
|
|
SNAME PKG_STD.TSTRING, -- Íàèìåíîâàíèå
|
|
RCOL_VAL TCOL_VAL -- Çíà÷åíèå
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ êîëîíîê */
|
|
type TCOLS is table of TCOL;
|
|
|
|
/* Òèïû äàííûõ - ñòðîêà */
|
|
type TROW is record
|
|
(
|
|
RCOLS TCOLS -- Êîëîíêè
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ ñòðîê */
|
|
type TROWS is table of TROW;
|
|
|
|
/* Òèïû äàííûõ - òàáëèöà äàííûõ */
|
|
type TDATA_GRID is record
|
|
(
|
|
RCOL_DEFS TCOL_DEFS, -- Îïèñàíèå êîëîíîê
|
|
RROWS TROWS -- Äàííûå ñòðîê
|
|
);
|
|
|
|
/* Òèïû äàííûõ - ôèëüòð */
|
|
type TFILTER is record
|
|
(
|
|
SNAME PKG_STD.TSTRING, -- Íàèìåíîâàíèå
|
|
SFROM PKG_STD.TSTRING, -- Çíà÷åíèå "ñ"
|
|
STO PKG_STD.TSTRING -- Çíà÷åíèå "ïî"
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ ôèëüòðîâ */
|
|
type TFILTERS is table of TFILTER;
|
|
|
|
/* Òèïû äàííûõ - ñîðòèðîâêà */
|
|
type TORDER is record
|
|
(
|
|
SNAME PKG_STD.TSTRING, -- Íàèìåíîâàíèå
|
|
SDIRECTION PKG_STD.TSTRING -- Íàïðàâëåíèå (ñì. êîíñòàíòû SORDER_DIRECTION_*)
|
|
);
|
|
|
|
/* Òèïû äàííûõ - êîëëåêöèÿ ñîðòèðîâîê */
|
|
type TORDERS is table of TORDER;
|
|
|
|
/* Ðàñ÷åò äèàïàîíà âûäàâàåìûõ çàïèñåé */
|
|
procedure UTL_ROWS_LIMITS_CALC
|
|
(
|
|
NPAGE_NUMBER in number, -- Íîìåð ñòðàíèöû (èãíîðèðóåòñÿ ïðè NPAGE_SIZE=0)
|
|
NPAGE_SIZE in number, -- Êîëè÷åñòâî çàïèñåé íà ñòðàíèöå (0 - âñå)
|
|
NROW_FROM out number, -- Íèæíÿÿ ãðàíèöà äèàïàçîíà
|
|
NROW_TO out number -- Âåðõíÿÿ ãðàíèöà äèàïàçîíà
|
|
);
|
|
|
|
/* Ôîðìèðîâàíèå íàèìåíîâàíèÿ óñëîâèÿ îòáîðà äëÿ íèæíåé ãðàíèöû */
|
|
function UTL_COND_NAME_MAKE_FROM
|
|
(
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return varchar2; -- Ðåçóëüòàò
|
|
|
|
/* Ôîðìèðîâàíèå íàèìåíîâàíèÿ óñëîâèÿ îòáîðà äëÿ âåðõíåé ãðàíèöû */
|
|
function UTL_COND_NAME_MAKE_TO
|
|
(
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return varchar2; -- Ðåçóëüòàò
|
|
|
|
/* Äîáàâëåíèå çíà÷åíèÿ â êîëëåêöèþ */
|
|
procedure TCOL_VALS_ADD
|
|
(
|
|
RCOL_VALS in out nocopy TCOL_VALS, -- Êîëëåêöèÿ çíà÷åíèé
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null, -- Çíà÷åíèå (äàòà)
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Ôîðìèðîâàíèå ñòðîêè */
|
|
function TROW_MAKE
|
|
return TROW; -- Ðåçóëüòàò ðàáîòû
|
|
|
|
/* Äîáàâëåíèå êîëîíêè ê ñòðîêå */
|
|
procedure TROW_ADD_COL
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null, -- Çíà÷åíèå (äàòà)
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Äîáàâëåíèå ñòðîêîâîé êîëîíêè ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLS
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Äîáàâëåíèå ÷èñëîâîé êîëîíêè ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLN
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Äîáàâëåíèå êîëîíêè òèïà "äàòà" ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLD
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Ôîðìèðîâàíèå òàáëèöû äàííûç */
|
|
function TDATA_GRID_MAKE
|
|
return TDATA_GRID; -- Ðåçóëüòàò ðàáîòû
|
|
|
|
/* Ïîèñê îïèñàíèÿ êîëîíêè â òàáëèöå äàííûõ ïî íàèìåíîâàíèþ */
|
|
function TDATA_GRID_FIND_COL_DEF
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return TCOL_DEF; -- Íàéäåííîå îïèñàíèå (null - åñëè íå íàøëè)
|
|
|
|
/* Äîáàâëåíèå îïèñàíèÿ êîëîíêè ê òàáëèöå äàííûõ */
|
|
procedure TDATA_GRID_ADD_COL_DEF
|
|
(
|
|
RDATA_GRID in out nocopy TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SCAPTION in varchar2, -- Çàãîëîâîê êîëîíêè
|
|
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Òèï äàííûõ êîëîíêè (ñì. êîíñòàíòû SDATA_TYPE_*)
|
|
SCOND_FROM in varchar2 := null, -- Íàèìåíîâàíèå íèæíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_FROM)
|
|
SCOND_TO in varchar2 := null, -- Íàèìåíîâàíèå âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_TO)
|
|
BVISIBLE in boolean := true, -- Ðàçðåøèòü îòîáðàæåíèå
|
|
BORDER in boolean := false, -- Ðàçðåøèòü ñîðòèðîâêó ïî êîëîíêå
|
|
BFILTER in boolean := false, -- Ðàçðåøèòü îòáîð ïî êîëîíêå
|
|
RCOL_VALS in TCOL_VALS := null, -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ êîëîíêè
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè îïèñàíèé êîëîíîê òàáëèöû äàííûõ (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Äîáàâëåíèå îïèñàíèÿ êîëîíêè ê òàáëèöå äàííûõ */
|
|
procedure TDATA_GRID_ADD_ROW
|
|
(
|
|
RDATA_GRID in out nocopy TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
RROW in TROW, -- Ñòðîêà
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè ñòðîê òàáëèöû äàííûõ (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
);
|
|
|
|
/* Ñåðèàëèçàöèÿ òàáëèöû äàííûõ */
|
|
function TDATA_GRID_TO_XML
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
NINCLUDE_DEF in number := 1 -- Âêëþ÷èòü îïèñàíèå êîëîíîê (0 - íåò, 1 - äà)
|
|
) return clob; -- XML-îïèñàíèå
|
|
|
|
|
|
/* Êîíâåðòàöèÿ çíà÷åíèé ôèëüòðà â ÷èñëî */
|
|
procedure TFILTER_TO_NUMBER
|
|
(
|
|
RFILTER in TFILTER, -- Ôèëüòð
|
|
NFROM out number, -- Çíà÷åíèå íèæíåé ãðàíèöû äèàïàçîíà
|
|
NTO out number -- Çíà÷åíèå âåðõíåé ãðàíèöû äèàïàçîíà
|
|
);
|
|
|
|
/* Êîíâåðòàöèÿ çíà÷åíèé ôèëüòðà â äàòó */
|
|
procedure TFILTER_TO_DATE
|
|
(
|
|
RFILTER in TFILTER, -- Ôèëüòð
|
|
DFROM out date, -- Çíà÷åíèå íèæíåé ãðàíèöû äèàïàçîíà
|
|
DTO out date -- Çíà÷åíèå âåðõíåé ãðàíèöû äèàïàçîíà
|
|
);
|
|
|
|
/* Ïîèñê ôèëüòðà â êîëëåêöèè */
|
|
function TFILTERS_FIND
|
|
(
|
|
RFILTERS in TFILTERS, -- Êîëëåêöèÿ ôèëüòðîâ
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå
|
|
) return TFILTER; -- Íàéäåííûé ôèëüòð (null - åñëè íå íàøëè)
|
|
|
|
/* Äåñåðèàëèçàöèÿ ôèëüòðîâ */
|
|
function TFILTERS_FROM_XML
|
|
(
|
|
CFILTERS in clob -- Ñåðèàëèçîâàííîå ïðåäñòàâëåíèå ôèëüòðîâ (BASE64(<filters><name>ÈÌß</name><from>ÇÍÀ×ÅÍÈÅ</from><to>ÇÍÀ×ÅÍÈÅ</to></filters>...))
|
|
) return TFILTERS; -- Ðåçóëüòàò ðàáîòû
|
|
|
|
/* Ïðèìåíåíèå ïàðàìåòðîâ ôèëüòðàöèè â çàïðîñå */
|
|
procedure TFILTERS_SET_QUERY
|
|
(
|
|
NIDENT in number, -- Èäåíòèôèêàòîð îòáîðà
|
|
NCOMPANY in number, -- Ðåã. íîìåð îðãàíèçàöèè
|
|
NPARENT in number := null, -- Ðåã. íîìåð ðîäèòåëÿ
|
|
SUNIT in varchar2, -- Êîä ðàçäåëà
|
|
SPROCEDURE in varchar2, -- Íàèìåíîâàíèå ñåðâåðíîé ïðîöåäóðû îòáîðà
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
RFILTERS in TFILTERS -- Êîëëåêöèÿ ôèëüòðîâ
|
|
);
|
|
|
|
/* Äåñåðèàëèçàöèÿ ñîðòèðîâîê */
|
|
function TORDERS_FROM_XML
|
|
(
|
|
CORDERS in clob -- Ñåðèàëèçîâàííîå ïðåäñòàâëåíèå ñîòðèðîâîê (BASE64(<orders><name>ÈÌß</name><direction>ASC/DESC</direction></orders>...))
|
|
) return TORDERS; -- Ðåçóëüòàò ðàáîòû
|
|
|
|
/* Ïðèìåíåíèå ïàðàìåòðîâ ñîðòèðîâêè â çàïðîñå */
|
|
procedure TORDERS_SET_QUERY
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû
|
|
RORDERS in TORDERS, -- Êîëëåêöèÿ ñîðòèðîâîê
|
|
SPATTERN in varchar2, -- Øàáëîí äëÿ ïîäñòàíîâêè óñëîâèé îòáîðà â çàïðîñ
|
|
CSQL in out nocopy clob -- Áóôåð çàïðîñà
|
|
);
|
|
|
|
end PKG_P8PANELS_VISUAL;
|
|
/
|
|
create or replace package body PKG_P8PANELS_VISUAL as
|
|
|
|
/* Êîíñòàíòû - òýãè çàïðîñîâ */
|
|
SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Òýã äëÿ êîðíÿ äàííûõ çàïðîñà
|
|
SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Òýã äëÿ ñòðîê äàííûõ
|
|
SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- Òýã äëÿ îïèñàíèÿ êîëîíîê
|
|
SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- Òýã äëÿ íàèìåíîâàíèÿ
|
|
SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- Òýã äëÿ íàïðàâëåíèÿ
|
|
SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- Òýã äëÿ çíà÷åíèÿ "ñ"
|
|
SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Òýã äëÿ çíà÷åíèÿ "ïî"
|
|
|
|
/* Êîíñòàíòû - òýãè îòâåòîâ */
|
|
SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Òýã äëÿ êîðíÿ îïèñàíèÿ äàííûõ
|
|
SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- Òýã äëÿ ñòðîê äàííûõ
|
|
SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- Òýã äëÿ îïèñàíèÿ êîëîíîê
|
|
|
|
/* Êîíñòàíòû - àòðèáóòû îòâåòîâ */
|
|
SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Àòðèáóò äëÿ íàèìåíîâàíèÿ
|
|
SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Àòðèáóò äëÿ ïîäïèñè
|
|
SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Àòðèáóò äëÿ òèïà äàííûõ
|
|
SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Àòðèáóò äëÿ ôëàãà âèäèìîñòè
|
|
SRESP_ATTR_ORDER constant PKG_STD.TSTRING := 'order'; -- Àòðèáóò äëÿ ôëàãà ñîðòèðîâêè
|
|
SRESP_ATTR_FILTER constant PKG_STD.TSTRING := 'filter'; -- Àòðèáóò äëÿ ôëàãà îòáîðà
|
|
SRESP_ATTR_VALUES constant PKG_STD.TSTRING := 'values'; -- Àòðèáóò äëÿ çíà÷åíèé
|
|
|
|
/* Êîíñòàíòû - ïàðàìåòðû óñëîâèé îòáîðà */
|
|
SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Ïîñòôèêñ íàèìåíîâàíèÿ íèæíåé ãðàíèöû óñëîâèÿ îòáîðà
|
|
SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Ïîñòôèêñ íàèìåíîâàíèÿ âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà
|
|
|
|
/* Ðàñ÷åò äèàïàîíà âûäàâàåìûõ çàïèñåé */
|
|
procedure UTL_ROWS_LIMITS_CALC
|
|
(
|
|
NPAGE_NUMBER in number, -- Íîìåð ñòðàíèöû (èãíîðèðóåòñÿ ïðè NPAGE_SIZE=0)
|
|
NPAGE_SIZE in number, -- Êîëè÷åñòâî çàïèñåé íà ñòðàíèöå (0 - âñå)
|
|
NROW_FROM out number, -- Íèæíÿÿ ãðàíèöà äèàïàçîíà
|
|
NROW_TO out number -- Âåðõíÿÿ ãðàíèöà äèàïàçîíà
|
|
)
|
|
is
|
|
begin
|
|
if (COALESCE(NPAGE_SIZE, 0) <= 0)
|
|
then
|
|
NROW_FROM := 1;
|
|
NROW_TO := 1000000000;
|
|
else
|
|
NROW_FROM := COALESCE(NPAGE_NUMBER, 1) * NPAGE_SIZE - NPAGE_SIZE + 1;
|
|
NROW_TO := COALESCE(NPAGE_NUMBER, 1) * NPAGE_SIZE;
|
|
end if;
|
|
end UTL_ROWS_LIMITS_CALC;
|
|
|
|
/* Ôîðìèðîâàíèå íàèìåíîâàíèÿ óñëîâèÿ îòáîðà äëÿ íèæíåé ãðàíèöû */
|
|
function UTL_COND_NAME_MAKE_FROM
|
|
(
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return varchar2 -- Ðåçóëüòàò
|
|
is
|
|
begin
|
|
return SNAME || SCOND_FROM_POSTFIX;
|
|
end UTL_COND_NAME_MAKE_FROM;
|
|
|
|
/* Ôîðìèðîâàíèå íàèìåíîâàíèÿ óñëîâèÿ îòáîðà äëÿ âåðõíåé ãðàíèöû */
|
|
function UTL_COND_NAME_MAKE_TO
|
|
(
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return varchar2 -- Ðåçóëüòàò
|
|
is
|
|
begin
|
|
return SNAME || SCOND_TO_POSTFIX;
|
|
end UTL_COND_NAME_MAKE_TO;
|
|
|
|
/* Ôîðìèðîâàíèå çíà÷åíèÿ */
|
|
function TCOL_VAL_MAKE
|
|
(
|
|
SVALUE in varchar2, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date -- Çíà÷åíèå (äàòà)
|
|
) return TCOL_VAL -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TCOL_VAL; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.SVALUE := SVALUE;
|
|
RRES.NVALUE := NVALUE;
|
|
RRES.DVALUE := DVALUE;
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TCOL_VAL_MAKE;
|
|
|
|
/* Äîáàâëåíèå çíà÷åíèÿ â êîëëåêöèþ */
|
|
procedure TCOL_VALS_ADD
|
|
(
|
|
RCOL_VALS in out nocopy TCOL_VALS, -- Êîëëåêöèÿ çíà÷åíèé
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null, -- Çíà÷åíèå (äàòà)
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Èíèöèàëèçèðóåì êîëëåêöèþ åñëè íåîáõîäèìî */
|
|
if ((RCOL_VALS is null) or (BCLEAR)) then
|
|
RCOL_VALS := TCOL_VALS();
|
|
end if;
|
|
/* Äîáàâëÿåì ýëåìåíò */
|
|
RCOL_VALS.EXTEND();
|
|
RCOL_VALS(RCOL_VALS.LAST) := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
|
|
end TCOL_VALS_ADD;
|
|
|
|
/* Ôîðìèðîâàíèå îïèñàíèÿ êîëîíêè */
|
|
function TCOL_DEF_MAKE
|
|
(
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå
|
|
SCAPTION in varchar2, -- Çàãîëîâîê
|
|
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Òèï äàííûõ (ñì. êîíñòàíòû SDATA_TYPE_*)
|
|
SCOND_FROM in varchar2 := null, -- Íàèìåíîâàíèå íèæíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_FROM)
|
|
SCOND_TO in varchar2 := null, -- Íàèìåíîâàíèå âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_TO)
|
|
BVISIBLE in boolean := true, -- Ðàçðåøèòü îòîáðàæåíèå
|
|
BORDER in boolean := false, -- Ðàçðåøèòü ñîðòèðîâêó
|
|
BFILTER in boolean := false, -- Ðàçðåøèòü îòáîð
|
|
RCOL_VALS in TCOL_VALS := null -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ
|
|
) return TCOL_DEF -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TCOL_DEF; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.SNAME := SNAME;
|
|
RRES.SCAPTION := SCAPTION;
|
|
RRES.SDATA_TYPE := COALESCE(SDATA_TYPE, SDATA_TYPE_STR);
|
|
RRES.SCOND_FROM := COALESCE(SCOND_FROM, UTL_COND_NAME_MAKE_FROM(SNAME => SNAME));
|
|
RRES.SCOND_TO := COALESCE(SCOND_TO, UTL_COND_NAME_MAKE_TO(SNAME => SNAME));
|
|
RRES.BVISIBLE := COALESCE(BVISIBLE, true);
|
|
RRES.BORDER := COALESCE(BORDER, false);
|
|
RRES.BFILTER := COALESCE(BFILTER, false);
|
|
RRES.RCOL_VALS := COALESCE(RCOL_VALS, TCOL_VALS());
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TCOL_DEF_MAKE;
|
|
|
|
/* Äîáàâëåíèå îïèñàíèÿ êîëîíêè â êîëëåêöèþ */
|
|
procedure TCOL_DEFS_ADD
|
|
(
|
|
RCOL_DEFS in out nocopy TCOL_DEFS, -- Êîëëåêöèÿ îïèñàíèé êîëîíîê
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå
|
|
SCAPTION in varchar2, -- Çàãîëîâîê
|
|
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Òèï äàííûõ (ñì. êîíñòàíòû SDATA_TYPE_*)
|
|
SCOND_FROM in varchar2 := null, -- Íàèìåíîâàíèå íèæíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_FROM)
|
|
SCOND_TO in varchar2 := null, -- Íàèìåíîâàíèå âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_TO)
|
|
BVISIBLE in boolean := true, -- Ðàçðåøèòü îòîáðàæåíèå
|
|
BORDER in boolean := false, -- Ðàçðåøèòü ñîðòèðîâêó
|
|
BFILTER in boolean := false, -- Ðàçðåøèòü îòáîð
|
|
RCOL_VALS in TCOL_VALS := null, -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Èíèöèàëèçèðóåì êîëëåêöèþ åñëè íåîáõîäèìî */
|
|
if ((RCOL_DEFS is null) or (BCLEAR)) then
|
|
RCOL_DEFS := TCOL_DEFS();
|
|
end if;
|
|
/* Äîáàâëÿåì ýëåìåíò */
|
|
RCOL_DEFS.EXTEND();
|
|
RCOL_DEFS(RCOL_DEFS.LAST) := TCOL_DEF_MAKE(SNAME => SNAME,
|
|
SCAPTION => SCAPTION,
|
|
SDATA_TYPE => SDATA_TYPE,
|
|
SCOND_FROM => SCOND_FROM,
|
|
SCOND_TO => SCOND_TO,
|
|
BVISIBLE => BVISIBLE,
|
|
BORDER => BORDER,
|
|
BFILTER => BFILTER,
|
|
RCOL_VALS => RCOL_VALS);
|
|
end TCOL_DEFS_ADD;
|
|
|
|
/* Ïîèñê îïèñàíèÿ êîëîíêè ïî íàèìåíîâàíèþ */
|
|
function TCOL_DEFS_FIND
|
|
(
|
|
RCOL_DEFS in TCOL_DEFS, -- Îïèñàíèå êîëîíîê òàáëèöû äàííûõ
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå
|
|
) return TCOL_DEF -- Íàéäåííîå îïèñàíèå (null - åñëè íå íàøëè)
|
|
is
|
|
begin
|
|
/* Îáõîäèì êîëîíêè èç êîëëåêöèè îïèñàíèé */
|
|
if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then
|
|
for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST
|
|
loop
|
|
if (RCOL_DEFS(I).SNAME = SNAME) then
|
|
return RCOL_DEFS(I);
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
/* Íè÷åãî íå íàøëè */
|
|
return null;
|
|
end TCOL_DEFS_FIND;
|
|
|
|
/* Ñåðèàëèçàöèÿ îïèñàíèÿ êîëîíêè òàáëèöû äàííûõ */
|
|
procedure TCOL_DEFS_TO_XML
|
|
(
|
|
RCOL_DEFS in TCOL_DEFS -- Îïèñàíèå êîëîíîê òàáëèöû äàííûõ
|
|
)
|
|
is
|
|
begin
|
|
/* Îáõîäèì êîëîíêè èç êîëëåêöèè */
|
|
if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then
|
|
for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST
|
|
loop
|
|
/* Îòêðûâàåì îïèñàíèå êîëîíêè */
|
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCOLUMNS_DEF);
|
|
/* Àòðèáóòû êîëîíêè */
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCOL_DEFS(I).SNAME);
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCOL_DEFS(I).SCAPTION);
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DATA_TYPE, SVALUE => RCOL_DEFS(I).SDATA_TYPE);
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RCOL_DEFS(I).BVISIBLE);
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ORDER, BVALUE => RCOL_DEFS(I).BORDER);
|
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FILTER, BVALUE => RCOL_DEFS(I).BFILTER);
|
|
/* Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ */
|
|
if (RCOL_DEFS(I).RCOL_VALS is not null) and (RCOL_DEFS(I).RCOL_VALS.COUNT > 0) then
|
|
for V in RCOL_DEFS(I).RCOL_VALS.FIRST .. RCOL_DEFS(I).RCOL_VALS.LAST
|
|
loop
|
|
/* Îòêðûâàåì îïèñàíèå ïðåäîïðåäåë¸ííîãî çíà÷åíèÿ */
|
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_VALUES);
|
|
/* Çíà÷åíèå */
|
|
case RCOL_DEFS(I).SDATA_TYPE
|
|
when SDATA_TYPE_STR then
|
|
PKG_XFAST.VALUE(SVALUE => RCOL_DEFS(I).RCOL_VALS(V).SVALUE);
|
|
when SDATA_TYPE_NUMB then
|
|
PKG_XFAST.VALUE(NVALUE => RCOL_DEFS(I).RCOL_VALS(V).NVALUE);
|
|
when SDATA_TYPE_DATE then
|
|
PKG_XFAST.VALUE(DVALUE => RCOL_DEFS(I).RCOL_VALS(V).DVALUE);
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Îïèñàíèå êîëîíêè "%s" òàáëèöû äàííûõ ñîäåðæèò íåïîääåðæèâàåìûé òèï äàííûõ ("%s").',
|
|
COALESCE(RCOL_DEFS(I).SNAME, '<ÍÅ ÎÏÐÅÄÅËÅÍÀ>'),
|
|
COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<ÍÅ ÎÏÐÅÄÅ˨Í>'));
|
|
end case;
|
|
/* Çàêðûâàåì îïèñàíèå ïðåäîïðåäåë¸ííîãî çíà÷åíèÿ */
|
|
PKG_XFAST.UP();
|
|
end loop;
|
|
end if;
|
|
/* Çàêðûâàåì îïèñàíèå êîëîíêè */
|
|
PKG_XFAST.UP();
|
|
end loop;
|
|
end if;
|
|
end TCOL_DEFS_TO_XML;
|
|
|
|
/* Ôîðìèðîâàíèå êîëîíêè */
|
|
function TCOL_MAKE
|
|
(
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null -- Çíà÷åíèå (äàòà)
|
|
) return TCOL -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TCOL; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.SNAME := SNAME;
|
|
RRES.RCOL_VAL := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TCOL_MAKE;
|
|
|
|
/* Äîáàâëåíèå êîëîíêè â êîëëåêöèþ */
|
|
procedure TCOLS_ADD
|
|
(
|
|
RCOLS in out nocopy TCOLS, -- Êîëëåêöèÿ êîëîíîê
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null, -- Çíà÷åíèå (äàòà)
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Èíèöèàëèçèðóåì êîëëåêöèþ åñëè íåîáõîäèìî */
|
|
if ((RCOLS is null) or (BCLEAR)) then
|
|
RCOLS := TCOLS();
|
|
end if;
|
|
/* Äîáàâëÿåì ýëåìåíò */
|
|
RCOLS.EXTEND();
|
|
RCOLS(RCOLS.LAST) := TCOL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
|
|
end TCOLS_ADD;
|
|
|
|
/* Ôîðìèðîâàíèå ñòðîêè */
|
|
function TROW_MAKE
|
|
return TROW -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TROW; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.RCOLS := TCOLS();
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TROW_MAKE;
|
|
|
|
/* Äîáàâëåíèå êîëîíêè ê ñòðîêå */
|
|
procedure TROW_ADD_COL
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SVALUE in varchar2 := null, -- Çíà÷åíèå (ñòðîêà)
|
|
NVALUE in number := null, -- Çíà÷åíèå (÷èñëî)
|
|
DVALUE in date := null, -- Çíà÷åíèå (äàòà)
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Ñôîðìèðóåì êîëîíêó è äîáàâèì å¸ ê êîëëåêöèè êîëîíîê ñòðîêè */
|
|
TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE, BCLEAR => BCLEAR);
|
|
end TROW_ADD_COL;
|
|
|
|
/* Äîáàâëåíèå ñòðîêîâîé êîëîíêè ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLS
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
SVALUE PKG_STD.TLSTRING; -- Áóôåð äëÿ çíà÷åíèÿ êóðñîðà
|
|
begin
|
|
/* ×èòàåì äàííûå èç êóðñîðà */
|
|
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => NPOSITION, SVALUE => SVALUE);
|
|
/* Ñôîðìèðóåì êîëîíêó è äîáàâèì å¸ ê êîëëåêöèè êîëîíîê ñòðîêè */
|
|
TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => null, DVALUE => null, BCLEAR => BCLEAR);
|
|
end TROW_ADD_CUR_COLS;
|
|
|
|
/* Äîáàâëåíèå ÷èñëîâîé êîëîíêè ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLN
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
NVALUE PKG_STD.TNUMBER; -- Áóôåð äëÿ çíà÷åíèÿ êóðñîðà
|
|
begin
|
|
/* ×èòàåì äàííûå èç êóðñîðà */
|
|
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => NPOSITION, NVALUE => NVALUE);
|
|
/* Ñôîðìèðóåì êîëîíêó è äîáàâèì å¸ ê êîëëåêöèè êîëîíîê ñòðîêè */
|
|
TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => NVALUE, DVALUE => null, BCLEAR => BCLEAR);
|
|
end TROW_ADD_CUR_COLN;
|
|
|
|
/* Äîáàâëåíèå êîëîíêè òèïà "äàòà" ê ñòðîêå èç êóðñîðà äèíàìè÷åñêîãî çàïðîñà */
|
|
procedure TROW_ADD_CUR_COLD
|
|
(
|
|
RROW in out nocopy TROW, -- Ñòðîêà
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
ICURSOR in integer, -- Êóðñîð
|
|
NPOSITION in number, -- Íîìåð êîëîíêè â êóðñîðå
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
DVALUE PKG_STD.TLDATE; -- Áóôåð äëÿ çíà÷åíèÿ êóðñîðà
|
|
begin
|
|
/* ×èòàåì äàííûå èç êóðñîðà */
|
|
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => NPOSITION, DVALUE => DVALUE);
|
|
/* Ñôîðìèðóåì êîëîíêó è äîáàâèì å¸ ê êîëëåêöèè êîëîíîê ñòðîêè */
|
|
TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => null, DVALUE => DVALUE, BCLEAR => BCLEAR);
|
|
end TROW_ADD_CUR_COLD;
|
|
|
|
/* Ñåðèàëèçàöèÿ ñòðîêè äàííûõ òàáëèöû äàííûõ */
|
|
procedure TROWS_TO_XML
|
|
(
|
|
RCOL_DEFS in TCOL_DEFS, -- Îïèñàíèå êîëîíîê òàáëèöû äàííûõ
|
|
RROWS in TROWS -- Ñòðîêè òàáëèöû äàííûõ
|
|
)
|
|
is
|
|
RCOL_DEF TCOL_DEF; -- Îïèñàíèå òåêóùåé ñåðèàëèçóåìîé êîëîíêè
|
|
begin
|
|
/* Îáõîäèì ñòðîêè èç êîëëåêöèè */
|
|
if ((RROWS is not null) and (RROWS.COUNT > 0)) then
|
|
for I in RROWS.FIRST .. RROWS.LAST
|
|
loop
|
|
/* Îòêðûâàåì ñòðîêó */
|
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XROWS);
|
|
/* Îáõîäèì êîëîíêè ñòðîêè */
|
|
if ((RROWS(I).RCOLS is not null) and (RROWS(I).RCOLS.COUNT > 0)) then
|
|
for J in RROWS(I).RCOLS.FIRST .. RROWS(I).RCOLS.LAST
|
|
loop
|
|
/* Íàéä¸ì îïèñàíèå êîëîíêè */
|
|
RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RCOL_DEFS, SNAME => RROWS(I).RCOLS(J).SNAME);
|
|
if (RCOL_DEF.SNAME is null) then
|
|
P_EXCEPTION(0,
|
|
'Îïèñàíèå êîëîíêè "%s" òàáëèöû äàííûõ íå îïðåäåëåíî.',
|
|
RROWS(I).RCOLS(J).SNAME);
|
|
end if;
|
|
/* Äîáàâëåíèåì çíà÷åíèå êîëîíêè êàê àòðèáóò ñòðîêè */
|
|
case RCOL_DEF.SDATA_TYPE
|
|
when SDATA_TYPE_STR then
|
|
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, SVALUE => RROWS(I).RCOLS(J).RCOL_VAL.SVALUE);
|
|
when SDATA_TYPE_NUMB then
|
|
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, NVALUE => RROWS(I).RCOLS(J).RCOL_VAL.NVALUE);
|
|
when SDATA_TYPE_DATE then
|
|
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, DVALUE => RROWS(I).RCOLS(J).RCOL_VAL.DVALUE);
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Îïèñàíèå êîëîíêè "%s" òàáëèöû äàííûõ ñîäåðæèò íåïîääåðæèâàåìûé òèï äàííûõ ("%s").',
|
|
RCOL_DEFS(I).SNAME,
|
|
COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<ÍÅ ÎÏÐÅÄÅ˨Í>'));
|
|
end case;
|
|
end loop;
|
|
end if;
|
|
/* Çàêðûâàåì ñòðîêó */
|
|
PKG_XFAST.UP();
|
|
end loop;
|
|
end if;
|
|
end TROWS_TO_XML;
|
|
|
|
/* Ôîðìèðîâàíèå òàáëèöû äàííûç */
|
|
function TDATA_GRID_MAKE
|
|
return TDATA_GRID -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TDATA_GRID; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.RCOL_DEFS := TCOL_DEFS();
|
|
RRES.RROWS := TROWS();
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TDATA_GRID_MAKE;
|
|
|
|
/* Ïîèñê îïèñàíèÿ êîëîíêè â òàáëèöå äàííûõ ïî íàèìåíîâàíèþ */
|
|
function TDATA_GRID_FIND_COL_DEF
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå êîëîíêè
|
|
) return TCOL_DEF -- Íàéäåííîå îïèñàíèå (null - åñëè íå íàøëè)
|
|
is
|
|
begin
|
|
return TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME);
|
|
end TDATA_GRID_FIND_COL_DEF;
|
|
|
|
/* Äîáàâëåíèå îïèñàíèÿ êîëîíêè ê òàáëèöå äàííûõ */
|
|
procedure TDATA_GRID_ADD_COL_DEF
|
|
(
|
|
RDATA_GRID in out nocopy TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå êîëîíêè
|
|
SCAPTION in varchar2, -- Çàãîëîâîê êîëîíêè
|
|
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Òèï äàííûõ êîëîíêè (ñì. êîíñòàíòû SDATA_TYPE_*)
|
|
SCOND_FROM in varchar2 := null, -- Íàèìåíîâàíèå íèæíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_FROM)
|
|
SCOND_TO in varchar2 := null, -- Íàèìåíîâàíèå âåðõíåé ãðàíèöû óñëîâèÿ îòáîðà (null - èñïîëüçóåòñÿ UTL_COND_NAME_MAKE_TO)
|
|
BVISIBLE in boolean := true, -- Ðàçðåøèòü îòîáðàæåíèå
|
|
BORDER in boolean := false, -- Ðàçðåøèòü ñîðòèðîâêó ïî êîëîíêå
|
|
BFILTER in boolean := false, -- Ðàçðåøèòü îòáîð ïî êîëîíêå
|
|
RCOL_VALS in TCOL_VALS := null, -- Ïðåäîïðåäåë¸ííûå çíà÷åíèÿ êîëîíêè
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè îïèñàíèé êîëîíîê òàáëèöû äàííûõ (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Ôîðìèðóåì îïèñàíèå è äîáàâëÿåì â êîëëåêöèþ òàáëèöû äàííûõ */
|
|
TCOL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS,
|
|
SNAME => SNAME,
|
|
SCAPTION => SCAPTION,
|
|
SDATA_TYPE => SDATA_TYPE,
|
|
SCOND_FROM => SCOND_FROM,
|
|
SCOND_TO => SCOND_TO,
|
|
BVISIBLE => BVISIBLE,
|
|
BORDER => BORDER,
|
|
BFILTER => BFILTER,
|
|
RCOL_VALS => RCOL_VALS,
|
|
BCLEAR => BCLEAR);
|
|
end TDATA_GRID_ADD_COL_DEF;
|
|
|
|
/* Äîáàâëåíèå îïèñàíèÿ êîëîíêè ê òàáëèöå äàííûõ */
|
|
procedure TDATA_GRID_ADD_ROW
|
|
(
|
|
RDATA_GRID in out nocopy TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
RROW in TROW, -- Ñòðîêà
|
|
BCLEAR in boolean := false -- Ôëàã î÷èñòêè êîëëåêöèè ñòðîê òàáëèöû äàííûõ (false - íå î÷èùàòü, true - î÷èñòèòü êîëëåêöèþ ïåðåä äîáàâëåíèåì)
|
|
)
|
|
is
|
|
begin
|
|
/* Èíèöèàëèçèðóåì êîëëåêöèþ åñëè íåîáõîäèìî */
|
|
if ((RDATA_GRID.RROWS is null) or (BCLEAR)) then
|
|
RDATA_GRID.RROWS := TROWS();
|
|
end if;
|
|
/* Äîáàâëÿåì ýëåìåíò */
|
|
RDATA_GRID.RROWS.EXTEND();
|
|
RDATA_GRID.RROWS(RDATA_GRID.RROWS.LAST) := RROW;
|
|
end TDATA_GRID_ADD_ROW;
|
|
|
|
/* Ñåðèàëèçàöèÿ òàáëèöû äàííûõ */
|
|
function TDATA_GRID_TO_XML
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
NINCLUDE_DEF in number := 1 -- Âêëþ÷èòü îïèñàíèå êîëîíîê (0 - íåò, 1 - äà)
|
|
) return clob -- XML-îïèñàíèå
|
|
is
|
|
CRES clob; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Íà÷èíàåì ôîðìèðîâàíèå XML */
|
|
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
|
/* Îòêðûâàåì êîðåíü */
|
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
|
|
/* Åñëè íåîáõîäèìî âêëþ÷èòü îïèñàíèå êîëîíîê */
|
|
if (NINCLUDE_DEF = 1) then
|
|
TCOL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS);
|
|
end if;
|
|
/* Ôîðìèðóåì îïèñàíèå ñòðîê */
|
|
TROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS,RROWS => RDATA_GRID.RROWS);
|
|
/* Çàêðûâàåì êîðåíü */
|
|
PKG_XFAST.UP();
|
|
/* Ñåðèàëèçóåì */
|
|
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
|
|
/* Çàâåðøàåì ôîðìèðîâàíèå XML */
|
|
PKG_XFAST.EPILOGUE();
|
|
/* Âîçâðàùàåì ïîëó÷åííîå */
|
|
return CRES;
|
|
exception
|
|
when others then
|
|
/* Çàâåðøàåì ôîðìèðîâàíèå XML */
|
|
PKG_XFAST.EPILOGUE();
|
|
/* Âåðíåì îøèáêó */
|
|
PKG_STATE.DIAGNOSTICS_STACKED();
|
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
|
end TDATA_GRID_TO_XML;
|
|
|
|
/* Êîíâåðòàöèÿ çíà÷åíèé ôèëüòðà â ÷èñëî */
|
|
procedure TFILTER_TO_NUMBER
|
|
(
|
|
RFILTER in TFILTER, -- Ôèëüòð
|
|
NFROM out number, -- Çíà÷åíèå íèæíåé ãðàíèöû äèàïàçîíà
|
|
NTO out number -- Çíà÷åíèå âåðõíåé ãðàíèöû äèàïàçîíà
|
|
)
|
|
is
|
|
begin
|
|
/* Íèæíÿÿ ãðàíèöà äèàïàçîíà */
|
|
if (RFILTER.SFROM is not null) then
|
|
begin
|
|
NFROM := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.SFROM);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0,
|
|
'Íåâåðíûé ôîðìàò ÷èñëà (%s) â óêàçàííîé íèæíåé ãðàíèöå äèàïàçîíà ôèëüòðà.',
|
|
RFILTER.SFROM);
|
|
end;
|
|
end if;
|
|
/* Âåðõíÿÿ ãðàíèöà äèàïàçîíà */
|
|
if (RFILTER.STO is not null) then
|
|
begin
|
|
NTO := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.STO);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0,
|
|
'Íåâåðíûé ôîðìàò ÷èñëà (%s) â óêàçàííîé âåðõíåé ãðàíèöå äèàïàçîíà ôèëüòðà.',
|
|
RFILTER.STO);
|
|
end;
|
|
end if;
|
|
end TFILTER_TO_NUMBER;
|
|
|
|
/* Êîíâåðòàöèÿ çíà÷åíèé ôèëüòðà â äàòó */
|
|
procedure TFILTER_TO_DATE
|
|
(
|
|
RFILTER in TFILTER, -- Ôèëüòð
|
|
DFROM out date, -- Çíà÷åíèå íèæíåé ãðàíèöû äèàïàçîíà
|
|
DTO out date -- Çíà÷åíèå âåðõíåé ãðàíèöû äèàïàçîíà
|
|
)
|
|
is
|
|
begin
|
|
/* Íèæíÿÿ ãðàíèöà äèàïàçîíà */
|
|
if (RFILTER.SFROM is not null) then
|
|
begin
|
|
DFROM := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.SFROM);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0,
|
|
'Íåâåðíûé ôîðìàò äàòû (%s) â óêàçàííîé íèæíåé ãðàíèöå äèàïàçîíà ôèëüòðà.',
|
|
RFILTER.SFROM);
|
|
end;
|
|
end if;
|
|
/* Âåðõíÿÿ ãðàíèöà äèàïàçîíà */
|
|
if (RFILTER.STO is not null) then
|
|
begin
|
|
DTO := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.STO);
|
|
exception
|
|
when others then
|
|
P_EXCEPTION(0,
|
|
'Íåâåðíûé ôîðìàò äàòû (%s) â óêàçàííîé âåðõíåé ãðàíèöå äèàïàçîíà ôèëüòðà.',
|
|
RFILTER.STO);
|
|
end;
|
|
end if;
|
|
end TFILTER_TO_DATE;
|
|
|
|
/* Ôîðìèðîâàíèå ôèëüòðà */
|
|
function TFILTER_MAKE
|
|
(
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå
|
|
SFROM in varchar2, -- Çíà÷åíèå "ñ"
|
|
STO in varchar2 -- Çíà÷åíèå "ïî"
|
|
) return TFILTER -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TFILTER; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.SNAME := SNAME;
|
|
RRES.SFROM := SFROM;
|
|
RRES.STO := STO;
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TFILTER_MAKE;
|
|
|
|
/* Ïîèñê ôèëüòðà â êîëëåêöèè */
|
|
function TFILTERS_FIND
|
|
(
|
|
RFILTERS in TFILTERS, -- Êîëëåêöèÿ ôèëüòðîâ
|
|
SNAME in varchar2 -- Íàèìåíîâàíèå
|
|
) return TFILTER -- Íàéäåííûé ôèëüòð (null - åñëè íå íàøëè)
|
|
is
|
|
begin
|
|
/* Îáõîäèì ôèëüòðû èç êîëëåêöèè */
|
|
if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then
|
|
for I in RFILTERS.FIRST .. RFILTERS.LAST
|
|
loop
|
|
if (RFILTERS(I).SNAME = SNAME) then
|
|
return RFILTERS(I);
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
/* Íè÷åãî íå íàøëè */
|
|
return null;
|
|
end TFILTERS_FIND;
|
|
|
|
/* Äåñåðèàëèçàöèÿ ôèëüòðîâ */
|
|
function TFILTERS_FROM_XML
|
|
(
|
|
CFILTERS in clob -- Ñåðèàëèçîâàííîå ïðåäñòàâëåíèå ôèëüòðîâ (BASE64(<filters><name>ÈÌß</name><from>ÇÍÀ×ÅÍÈÅ</from><to>ÇÍÀ×ÅÍÈÅ</to></filters>...))
|
|
) return TFILTERS -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RFILTERS TFILTERS; -- Áóôåð äëÿ ðåçóëüòàòà ðàáîòû
|
|
XDOC PKG_XPATH.TDOCUMENT; -- Äîêóìåíò XML
|
|
XROOT PKG_XPATH.TNODE; -- Êîðåíü äîêóìåíòà XML
|
|
XNODE PKG_XPATH.TNODE; -- Áóôåð óçëà äîêóìåíòà
|
|
XNODES PKG_XPATH.TNODES; -- Áóôåð êîëëåêöèè óçëîâ äîêóìåíòà
|
|
begin
|
|
/* Âåðí¸ì âûõîäíóþ êîëëåêöèþ */
|
|
RFILTERS := TFILTERS();
|
|
/* Ðàçáèðàåì XML */
|
|
XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' ||
|
|
BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CFILTERS),
|
|
SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || '</' ||
|
|
SRQ_TAG_XROOT || '>');
|
|
/* Ñ÷èòûâàåì êîðíåâîé óçåë */
|
|
XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC);
|
|
/* Ñ÷èòûâàíèå ñïèñêà çàïèñåé */
|
|
XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XFILTERS);
|
|
/* Öèêë ïî ñïèñêó çàïèñèåé */
|
|
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES)
|
|
loop
|
|
/* Ñ÷èòàåì ýëåìåíò ïî åãî íîìåðó */
|
|
XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I);
|
|
/* Äîáàâèì åãî â êîëëåêöèþ */
|
|
RFILTERS.EXTEND();
|
|
RFILTERS(RFILTERS.LAST) := TFILTER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME),
|
|
SFROM => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SFROM),
|
|
STO => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_STO));
|
|
end loop;
|
|
/* Îñâîáîäèì äîêóìåíò */
|
|
PKG_XPATH.FREE(RDOCUMENT => XDOC);
|
|
/* Âåðí¸ì ðåçóëüòàò */
|
|
return RFILTERS;
|
|
exception
|
|
when others then
|
|
/* Îñâîáîäèì äîêóìåíò */
|
|
PKG_XPATH.FREE(RDOCUMENT => XDOC);
|
|
/* Âåðíåì îøèáêó */
|
|
PKG_STATE.DIAGNOSTICS_STACKED();
|
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
|
end TFILTERS_FROM_XML;
|
|
|
|
/* Ïðèìåíåíèå ïàðàìåòðîâ ôèëüòðàöèè â çàïðîñå */
|
|
procedure TFILTERS_SET_QUERY
|
|
(
|
|
NIDENT in number, -- Èäåíòèôèêàòîð îòáîðà
|
|
NCOMPANY in number, -- Ðåã. íîìåð îðãàíèçàöèè
|
|
NPARENT in number := null, -- Ðåã. íîìåð ðîäèòåëÿ
|
|
SUNIT in varchar2, -- Êîä ðàçäåëà
|
|
SPROCEDURE in varchar2, -- Íàèìåíîâàíèå ñåðâåðíîé ïðîöåäóðû îòáîðà
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû äàííûõ
|
|
RFILTERS in TFILTERS -- Êîëëåêöèÿ ôèëüòðîâ
|
|
)
|
|
is
|
|
RCOL_DEF TCOL_DEF; -- Îïèñàíèå òåêóùåé ôèëüòðóåìîé êîëîíêè
|
|
BENUM boolean; -- Ôëàã íà÷èëè÷èÿ ïåðå÷èñëÿåìûõ çíà÷åíèé
|
|
NFROM PKG_STD.TNUMBER; -- Áóôåð äëÿ âåðõíåé ãðàíèöû äèàïàçîíà îòáîðà ÷èñåë
|
|
NTO PKG_STD.TNUMBER; -- Áóôåð äëÿ íèæíåé ãðàíèöû äèàïàçîíà îòáîðà ÷èñåë
|
|
DFROM PKG_STD.TLDATE; -- Áóôåð äëÿ âåðõíåé ãðàíèöû äèàïàçîíà îòáîðà äàò
|
|
DTO PKG_STD.TLDATE; -- Áóôåð äëÿ íèæíåé ãðàíèöû äèàïàçîíà îòáîðà äàò
|
|
begin
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Ïðîëîã */
|
|
PKG_COND_BROKER.PROLOGUE(IMODE => PKG_COND_BROKER.MODE_SMART_, NIDENT => NIDENT);
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Óñòàíîâêà ïðîöåäóðû ñåðâåðíîãî îòáîðà */
|
|
PKG_COND_BROKER.SET_PROCEDURE(SPROCEDURE_NAME => SPROCEDURE);
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Óñòàíîâêà ðàçäåëà */
|
|
PKG_COND_BROKER.SET_UNIT(SUNITCODE => SUNIT);
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Óñòàíîâêà îðãàíèçàöèè */
|
|
PKG_COND_BROKER.SET_COMPANY(NCOMPANY => NCOMPANY);
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Óñòàíîâêà ðîäèòåëÿ */
|
|
if (NPARENT is not null) then
|
|
PKG_COND_BROKER.SET_PARENT(NPARENT => NPARENT);
|
|
end if;
|
|
/* Îáõîäèì ôèëüòð, åñëè çàäàí */
|
|
if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then
|
|
for I in RFILTERS.FIRST .. RFILTERS.LAST
|
|
loop
|
|
/* Íàéäåì ôèëüòðóåìóþ êîëîíêó â îïèñàíèè */
|
|
RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RFILTERS(I).SNAME);
|
|
if (RCOL_DEF.SNAME is not null) then
|
|
/* Îïðåäåëèìñÿ ñ íàëè÷èåì ïåðå÷èñëÿåìûõ çíà÷åíèé */
|
|
if ((RCOL_DEF.RCOL_VALS is not null) and (RCOL_DEF.RCOL_VALS.COUNT > 0)) then
|
|
BENUM := true;
|
|
else
|
|
BENUM := false;
|
|
end if;
|
|
/* Óñòàíîâèì äëÿ íå¸ óñëîâèå îòîáðà ñîãëàñíî òèïó äàííûõ */
|
|
case RCOL_DEF.SDATA_TYPE
|
|
when SDATA_TYPE_STR then
|
|
begin
|
|
if (BENUM) then
|
|
PKG_COND_BROKER.SET_CONDITION_ESTR(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
SCONDITION_ESTR => RFILTERS(I).SFROM,
|
|
ICASE_INSENSITIVE => 1);
|
|
else
|
|
PKG_COND_BROKER.SET_CONDITION_STR(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
SCONDITION_VALUE => RFILTERS(I).SFROM,
|
|
ICASE_INSENSITIVE => 1);
|
|
end if;
|
|
end;
|
|
when SDATA_TYPE_NUMB then
|
|
begin
|
|
if (BENUM) then
|
|
PKG_COND_BROKER.SET_CONDITION_ENUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
SCONDITION_ENUM => RFILTERS(I).SFROM);
|
|
else
|
|
TFILTER_TO_NUMBER(RFILTER => RFILTERS(I), NFROM => NFROM, NTO => NTO);
|
|
if (NFROM is not null) then
|
|
PKG_COND_BROKER.SET_CONDITION_NUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
NCONDITION_VALUE => NFROM);
|
|
end if;
|
|
if (NTO is not null) then
|
|
PKG_COND_BROKER.SET_CONDITION_NUM(SCONDITION_NAME => RCOL_DEF.SCOND_TO, NCONDITION_VALUE => NTO);
|
|
end if;
|
|
end if;
|
|
end;
|
|
when SDATA_TYPE_DATE then
|
|
begin
|
|
if (BENUM) then
|
|
PKG_COND_BROKER.SET_CONDITION_EDATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
SCONDITION_EDATE => RFILTERS(I).SFROM);
|
|
else
|
|
TFILTER_TO_DATE(RFILTER => RFILTERS(I), DFROM => DFROM, DTO => DTO);
|
|
if (DFROM is not null) then
|
|
PKG_COND_BROKER.SET_CONDITION_DATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
|
|
DCONDITION_VALUE => DFROM);
|
|
end if;
|
|
if (DTO is not null) then
|
|
PKG_COND_BROKER.SET_CONDITION_DATE(SCONDITION_NAME => RCOL_DEF.SCOND_TO, DCONDITION_VALUE => DTO);
|
|
end if;
|
|
end if;
|
|
end;
|
|
else
|
|
P_EXCEPTION(0,
|
|
'Îïèñàíèå êîëîíêè "%s" òàáëèöû äàííûõ ñîäåðæèò íåïîääåðæèâàåìûé òèï äàííûõ ("%s").',
|
|
RCOL_DEF.SNAME,
|
|
COALESCE(RCOL_DEF.SDATA_TYPE, '<ÍÅ ÎÏÐÅÄÅ˨Í>'));
|
|
end case;
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
/* Ôîðìèðîâàíèå óñëîâèé îòáîðà - Ýïèëîã */
|
|
PKG_COND_BROKER.EPILOGUE();
|
|
end TFILTERS_SET_QUERY;
|
|
|
|
/* Ôîðìèðîâàíèå ñîðòèðîâêè */
|
|
function TORDER_MAKE
|
|
(
|
|
SNAME in varchar2, -- Íàèìåíîâàíèå
|
|
SDIRECTION in varchar2 -- Íàïðàâëåíèå (ñì. êîíñòàíòû SORDER_DIRECTION_*)
|
|
) return TORDER -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RRES TORDER; -- Áóôåð äëÿ ðåçóëüòàòà
|
|
begin
|
|
/* Ôîðìèðóåì îáúåêò */
|
|
RRES.SNAME := SNAME;
|
|
RRES.SDIRECTION := SDIRECTION;
|
|
/* Âîçâðàùàåì ðåçóëüòàò */
|
|
return RRES;
|
|
end TORDER_MAKE;
|
|
|
|
/* Äåñåðèàëèçàöèÿ ñîðòèðîâîê */
|
|
function TORDERS_FROM_XML
|
|
(
|
|
CORDERS in clob -- Ñåðèàëèçîâàííîå ïðåäñòàâëåíèå ñîòðèðîâîê (BASE64(<orders><name>ÈÌß</name><direction>ASC/DESC</direction></orders>...))
|
|
) return TORDERS -- Ðåçóëüòàò ðàáîòû
|
|
is
|
|
RORDERS TORDERS; -- Áóôåð äëÿ ðåçóëüòàòà ðàáîòû
|
|
XDOC PKG_XPATH.TDOCUMENT; -- Äîêóìåíò XML
|
|
XROOT PKG_XPATH.TNODE; -- Êîðåíü äîêóìåíòà XML
|
|
XNODE PKG_XPATH.TNODE; -- Áóôåð óçëà äîêóìåíòà
|
|
XNODES PKG_XPATH.TNODES; -- Áóôåð êîëëåêöèè óçëîâ äîêóìåíòà
|
|
begin
|
|
/* Èíèöèàëèçèðóåì âûõîäíóþ êîëëåêöèþ */
|
|
RORDERS := TORDERS();
|
|
/* Ðàçáèðàåì XML */
|
|
XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' ||
|
|
BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CORDERS),
|
|
SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || '</' ||
|
|
SRQ_TAG_XROOT || '>');
|
|
/* Ñ÷èòûâàåì êîðíåâîé óçåë */
|
|
XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC);
|
|
/* Ñ÷èòûâàíèå ñïèñêà çàïèñåé */
|
|
XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XORDERS);
|
|
/* Öèêë ïî ñïèñêó çàïèñèåé */
|
|
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES)
|
|
loop
|
|
/* Ñ÷èòàåì ýëåìåíò ïî åãî íîìåðó */
|
|
XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I);
|
|
/* Äîáàâèì åãî â êîëëåêöèþ */
|
|
RORDERS.EXTEND();
|
|
RORDERS(RORDERS.LAST) := TORDER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME),
|
|
SDIRECTION => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SDIRECTION));
|
|
end loop;
|
|
/* Îñâîáîäèì äîêóìåíò */
|
|
PKG_XPATH.FREE(RDOCUMENT => XDOC);
|
|
/* Âåðí¸ì ðåçóëüòàò */
|
|
return RORDERS;
|
|
exception
|
|
when others then
|
|
/* Îñâîáîäèì äîêóìåíò */
|
|
PKG_XPATH.FREE(RDOCUMENT => XDOC);
|
|
/* Âåðíåì îøèáêó */
|
|
PKG_STATE.DIAGNOSTICS_STACKED();
|
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
|
end TORDERS_FROM_XML;
|
|
|
|
/* Ïðèìåíåíèå ïàðàìåòðîâ ñîðòèðîâêè â çàïðîñå */
|
|
procedure TORDERS_SET_QUERY
|
|
(
|
|
RDATA_GRID in TDATA_GRID, -- Îïèñàíèå òàáëèöû
|
|
RORDERS in TORDERS, -- Êîëëåêöèÿ ñîðòèðîâîê
|
|
SPATTERN in varchar2, -- Øàáëîí äëÿ ïîäñòàíîâêè óñëîâèé îòáîðà â çàïðîñ
|
|
CSQL in out nocopy clob -- Áóôåð çàïðîñà
|
|
)
|
|
is
|
|
CSQL_ORDERS clob; -- Áóôåð äëÿ óñëîâèé ñîðòèðîâêè â çàïðîñå
|
|
begin
|
|
/* Åñëè ñîðòèðîâêà çàäàíà */
|
|
if ((RORDERS is not null) and (RORDERS.COUNT > 0)) then
|
|
CSQL_ORDERS := ' order by ';
|
|
for I in RORDERS.FIRST .. RORDERS.LAST
|
|
loop
|
|
/* Ïåðåä äîáàâëåíèåì â çàïðîñ - îáÿçàòåëüíàÿ ïðîâåðêà, ÷òîáû èçáåæàòü SQL-èíúåêöèé */
|
|
if ((TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RORDERS(I).SNAME).SNAME is not null) and
|
|
(RORDERS(I).SDIRECTION in (SORDER_DIRECTION_ASC, SORDER_DIRECTION_DESC))) then
|
|
CSQL_ORDERS := CSQL_ORDERS || RORDERS(I).SNAME || ' ' || RORDERS(I).SDIRECTION;
|
|
if (I < RORDERS.LAST) then
|
|
CSQL_ORDERS := CSQL_ORDERS || ', ';
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
end if;
|
|
CSQL := replace(CSQL, SPATTERN, CSQL_ORDERS);
|
|
end TORDERS_SET_QUERY;
|
|
|
|
end PKG_P8PANELS_VISUAL;
|
|
/
|