P8-Panels/db/PKG_P8PANELS_VISUAL.pck
2023-09-24 22:25:19 +03:00

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;
/