2023-12-08 21:38:34 +03:00
create or replace package PKG_P8PANELS_SAMPLES as
/* Получение списка контрагентов */
procedure AGNLIST_GET
(
COUT out clob -- Список контрагентов
) ;
/* Добавление контрагента */
procedure AGNLIST_INSERT
(
SAGNABBR in varchar2 , -- Мнемокод
SAGNNAME in varchar2 , -- Наименование
NRN out number -- Р е г . номер добавленного
) ;
/* Удаление контрагента */
procedure AGNLIST_DELETE
(
NRN in number -- Р е г . номер удаляемого
) ;
2023-12-10 19:27:04 +03:00
/* Таблица данных */
procedure DATA_GRID
(
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
) ;
/* График */
procedure CHART
(
COUT out clob -- Сериализованный график
) ;
2023-12-13 23:47:00 +03:00
/* Инициализация буфера данных для диаграмма Ганта */
procedure GANTT_INIT
(
NIDENT in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
) ;
/* С б о р данных для отображения диаграммы Ганта */
procedure GANTT
(
NIDENT in number , -- Идентификатор процесса
COUT out clob -- Сериализованные данные для диаграммы Ганта
) ;
/* Исправление задачи в диаграмме Ганта */
procedure GANTT_MODIFY
(
NIDENT in number , -- Идентификатор буфера
NRN in number , -- Р е г . номер записи
DDATE_FROM in date , -- Дата начала задачи
DDATE_TO in date -- Дата окончания задачи
) ;
2023-12-08 21:38:34 +03:00
end PKG_P8PANELS_SAMPLES ;
/
create or replace package body PKG_P8PANELS_SAMPLES as
/* Получение списка контрагентов */
procedure AGNLIST_GET
(
COUT out clob -- Список контрагентов
)
is
NVERSION PKG_STD . TREF ; -- Р е г . номер версии словаря контрагентов
begin
NVERSION : = GET_SESSION_VERSION ( SUNITCODE = > ' AGNLIST ' ) ;
PKG_XFAST . PROLOGUE ( ITYPE = > PKG_XFAST . CONTENT_ ) ;
PKG_XFAST . DOWN_NODE ( SNAME = > ' DATA ' ) ;
2024-02-26 13:10:17 +03:00
for C in ( select TMP . *
from ( select D . * ,
ROWNUM NROWNUM
from ( select T . RN NRN ,
T . AGNABBR SAGNABBR ,
T . AGNNAME SAGNNAME
from AGNLIST T
where T . VERSION = NVERSION
and exists ( select /* + INDEX(UP I_USERPRIV_CATALOG_ROLEID) */
null
from USERPRIV UP
where UP . CATALOG = T . CRN
and UP . ROLEID in ( select /* + INDEX(UR I_USERROLES_AUTHID_FK) */
UR . ROLEID
from USERROLES UR
where UR . AUTHID = UTILIZER )
union all
select /* + INDEX(UP I_USERPRIV_CATALOG_AUTHID) */
null
from USERPRIV UP
where UP . CATALOG = T . CRN
and UP . AUTHID = UTILIZER )
order by T . RN desc ) D ) TMP
where TMP . NROWNUM < = 10 )
2023-12-08 21:38:34 +03:00
loop
PKG_XFAST . DOWN_NODE ( SNAME = > ' AGENTS ' ) ;
PKG_XFAST . ATTR ( SNAME = > ' NRN ' , NVALUE = > C . NRN ) ;
PKG_XFAST . ATTR ( SNAME = > ' SAGNABBR ' , SVALUE = > C . SAGNABBR ) ;
PKG_XFAST . ATTR ( SNAME = > ' SAGNNAME ' , SVALUE = > C . SAGNNAME ) ;
PKG_XFAST . UP ( ) ;
end loop ;
PKG_XFAST . UP ( ) ;
COUT : = PKG_XFAST . SERIALIZE_TO_CLOB ( ) ;
PKG_XFAST . EPILOGUE ( ) ;
end AGNLIST_GET ;
/* Добавление контрагента */
procedure AGNLIST_INSERT
(
SAGNABBR in varchar2 , -- Мнемокод
SAGNNAME in varchar2 , -- Наименование
NRN out number -- Р е г . номер добавленного
)
is
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Текущая организация
NCRN PKG_STD . TREF ; -- Каталог размещения контрагента
begin
if ( SAGNABBR is null ) then
P_EXCEPTION ( 0 , ' Н е указан мнемокод.' ) ;
end if ;
if ( SAGNABBR is null ) then
P_EXCEPTION ( 0 , ' Н е указано наименование.' ) ;
end if ;
FIND_ROOT_CATALOG ( NCOMPANY = > NCOMPANY , SCODE = > ' AGNLIST ' , NCRN = > NCRN ) ;
P_AGNLIST_INSERT ( NCOMPANY = > NCOMPANY ,
CRN = > NCRN ,
AGNABBR = > SAGNABBR ,
AGNTYPE = > 0 ,
AGNNAME = > SAGNNAME ,
AGNIDNUMB = > null ,
ECONCODE = > null ,
ORGCODE = > null ,
AGNFAMILYNAME = > null ,
AGNFIRSTNAME = > null ,
AGNLASTNAME = > null ,
AGNFAMILYNAME_TO = > null ,
AGNFIRSTNAME_TO = > null ,
AGNLASTNAME_TO = > null ,
AGNFAMILYNAME_FR = > null ,
AGNFIRSTNAME_FR = > null ,
AGNLASTNAME_FR = > null ,
AGNFAMILYNAME_AC = > null ,
AGNFIRSTNAME_AC = > null ,
AGNLASTNAME_AC = > null ,
AGNFAMILYNAME_ABL = > null ,
AGNFIRSTNAME_ABL = > null ,
AGNLASTNAME_ABL = > null ,
EMP = > 0 ,
EMPPOST = > null ,
EMPPOST_FROM = > null ,
EMPPOST_TO = > null ,
EMPPOST_AC = > null ,
EMPPOST_ABL = > null ,
AGNBURN = > null ,
PHONE = > null ,
PHONE2 = > null ,
FAX = > null ,
TELEX = > null ,
MAIL = > null ,
IMAGE = > null ,
DDISCDATE = > null ,
AGN_COMMENT = > null ,
NSEX = > 0 ,
SPENSION_NBR = > null ,
SMEDPOLICY_SER = > null ,
SMEDPOLICY_NUMB = > null ,
SPROPFORM = > null ,
SREASON_CODE = > null ,
NRESIDENT_SIGN = > 0 ,
STAXPSTATUS = > null ,
SOGRN = > null ,
SPRFMLSTS = > null ,
SPRNATION = > null ,
SCITIZENSHIP = > null ,
ADDR_BURN = > null ,
SPRMLREL = > null ,
SOKATO = > null ,
SPFR_NAME = > null ,
DPFR_FILL_DATE = > null ,
DPFR_REG_DATE = > null ,
SPFR_REG_NUMB = > null ,
2024-03-15 17:02:56 +03:00
SSFR_REG_NUMB = > null ,
2023-12-08 21:38:34 +03:00
SFULLNAME = > null ,
SOKFS = > null ,
SOKOPF = > null ,
STFOMS = > null ,
SFSS_REG_NUMB = > null ,
SFSS_SUBCODE = > null ,
NCOEFFIC = > 0 ,
DAGNDEATH = > null ,
NOLD_RN = > null ,
SOKTMO = > null ,
SINN_CITIZENSHIP = > null ,
DTAX_REG_DATE = > null ,
SORIGINAL_NAME = > null ,
NIND_BUSINESSMAN = > 0 ,
SFNS_CODE = > null ,
SCTZNSHP_TYPE = > null ,
NCONTACT_METHOD = > null ,
SMF_ID = > null ,
SOKOGU = > null ,
NRN = > NRN ) ;
end AGNLIST_INSERT ;
/* Удаление контрагента */
procedure AGNLIST_DELETE
(
NRN in number -- Р е г . номер удаляемого
)
is
begin
P_AGNLIST_DELETE ( NCOMPANY = > GET_SESSION_COMPANY ( ) , RN = > NRN ) ;
end AGNLIST_DELETE ;
2023-12-10 19:27:04 +03:00
/* Таблица данных */
procedure DATA_GRID
(
NPAGE_NUMBER in number , -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number , -- Количество записей на странице (0 - все)
CFILTERS in clob , -- Фильтры
CORDERS in clob , -- Сортировки
NINCLUDE_DEF in number , -- Признак включения описания колонок таблицы в ответ
COUT out clob -- Сериализованная таблица данных
)
is
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Организация сеанса
NIDENT PKG_STD . TREF : = GEN_IDENT ( ) ; -- Идентификатор отбора
RF PKG_P8PANELS_VISUAL . TFILTERS ; -- Фильтры
RO PKG_P8PANELS_VISUAL . TORDERS ; -- Сортировки
RDG PKG_P8PANELS_VISUAL . TDATA_GRID ; -- Описание таблицы
RAGN_TYPES PKG_P8PANELS_VISUAL . TCOL_VALS ; -- Предопределенные значения "Типа контрагентов"
RDG_ROW PKG_P8PANELS_VISUAL . TROW ; -- Строка таблицы
NROW_FROM PKG_STD . TREF ; -- Номер строки с
NROW_TO PKG_STD . TREF ; -- Номер строки по
CSQL clob ; -- Буфер для запроса
ICURSOR integer ; -- К у р с о р для исполнения запроса
2024-02-05 16:07:27 +03:00
SGROUP PKG_STD . TSTRING ; -- Буфер для группы
SAGNINFO PKG_STD . TSTRING ; -- Буфер для "Сведений"
SAGNNAME PKG_STD . TSTRING ; -- Буфер для "Наименования"
NAGNTYPE PKG_STD . TREF ; -- Буфер для "Типа"
2023-12-10 19:27:04 +03:00
begin
/* Читаем фильтры */
RF : = PKG_P8PANELS_VISUAL . TFILTERS_FROM_XML ( CFILTERS = > CFILTERS ) ;
/* Читем сортировки */
RO : = PKG_P8PANELS_VISUAL . TORDERS_FROM_XML ( CORDERS = > CORDERS ) ;
/* Преобразуем номер и размер страницы в номер строк с и по */
PKG_P8PANELS_VISUAL . UTL_ROWS_LIMITS_CALC ( NPAGE_NUMBER = > NPAGE_NUMBER ,
NPAGE_SIZE = > NPAGE_SIZE ,
NROW_FROM = > NROW_FROM ,
NROW_TO = > NROW_TO ) ;
/* Инициализируем таблицу данных */
2024-05-04 15:22:43 +03:00
RDG : = PKG_P8PANELS_VISUAL . TDATA_GRID_MAKE ( BFIXED_HEADER = > true , NFIXED_COLUMNS = > 2 ) ;
2023-12-10 19:27:04 +03:00
/* Описываем колонки таблицы данных */
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SAGNABBR ' ,
SCAPTION = > ' Мнемокод ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' AgentAbbr ' ,
BVISIBLE = > true ,
BORDER = > true ,
2024-05-04 15:22:43 +03:00
BFILTER = > true ,
NWIDTH = > 150 ) ;
2024-02-05 16:07:27 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SAGNINFO ' ,
SCAPTION = > ' Сведения ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
BVISIBLE = > true ,
BORDER = > false ,
BFILTER = > false ,
2024-05-04 15:22:43 +03:00
BEXPANDABLE = > true ,
NWIDTH = > 300 ) ;
2023-12-10 19:27:04 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SAGNNAME ' ,
SCAPTION = > ' Наименование ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ,
SCOND_FROM = > ' AgentName ' ,
BVISIBLE = > true ,
BORDER = > true ,
2024-02-05 16:07:27 +03:00
BFILTER = > true ,
2024-05-04 15:22:43 +03:00
SPARENT = > ' SAGNINFO ' ,
NWIDTH = > 200 ) ;
2023-12-10 19:27:04 +03:00
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RAGN_TYPES , NVALUE = > 0 ) ;
PKG_P8PANELS_VISUAL . TCOL_VALS_ADD ( RCOL_VALS = > RAGN_TYPES , NVALUE = > 1 ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' NAGNTYPE ' ,
SCAPTION = > ' Тип ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_NUMB ,
SCOND_FROM = > ' AgentType ' ,
BVISIBLE = > true ,
BORDER = > true ,
BFILTER = > true ,
2024-02-05 16:07:27 +03:00
SPARENT = > ' SAGNINFO ' ,
2024-05-04 15:22:43 +03:00
NWIDTH = > 100 ,
2023-12-10 19:27:04 +03:00
RCOL_VALS = > RAGN_TYPES ,
SHINT = > ' В Системе бывают контрагенты двух типов:<br>' | |
' <b style="color:blue">Юридическое лицо</b> - организация, которая имеет в собственности, хозяйственном ведении ' | |
' или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' | |
' имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.<br> ' | |
' <b style="color:green">Физическое лицо</b> - субъект правовых отношений, представляющий собой одного человека. ' ) ;
2024-05-04 15:22:43 +03:00
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SFULLNAME ' ,
SCAPTION = > ' Полное наименование ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ) ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_COL_DEF ( RDATA_GRID = > RDG ,
SNAME = > ' SAGNIDNUMB ' ,
SCAPTION = > ' ИНН ' ,
SDATA_TYPE = > PKG_P8PANELS_VISUAL . SDATA_TYPE_STR ) ;
2023-12-10 19:27:04 +03:00
/* Обходим данные */
begin
2024-03-15 17:02:56 +03:00
/* Добавляем подсказку совместимости */
CSQL : = PKG_SQL_BUILD . COMPATIBLE ( SSQL = > CSQL ) ;
/* Формируем запрос */
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' select * ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from (select D.*, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > PKG_SQL_BUILD . SQLROWNUM ( ) | | ' NROW ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from (select AG.AGNABBR SAGNABBR, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' AG.AGNNAME SAGNNAME, ' ) ;
2024-05-04 15:22:43 +03:00
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' AG.AGNTYPE NAGNTYPE, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' AG.FULLNAME SFULLNAME, ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' AG.AGNIDNUMB SAGNIDNUMB ' ) ;
2024-03-15 17:02:56 +03:00
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from AGNLIST AG ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where exists (select ' | | PKG_SQL_BUILD . SET_HINT ( SHINT = > ' INDEX(UP I_USERPRIV_CATALOG_ROLEID) ' ) | | ' null ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from USERPRIV UP ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where UP."CATALOG" = AG.CRN ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and UP.ROLEID in (select ' | | PKG_SQL_BUILD . SET_HINT ( SHINT = > ' INDEX(UR I_USERROLES_AUTHID_FK) ' ) | | ' UR.ROLEID ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from USERROLES UR where UR.AUTHID = UTILIZER()) ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' union all ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' select ' | | PKG_SQL_BUILD . SET_HINT ( SHINT = > ' INDEX(UP I_USERPRIV_CATALOG_AUTHID) ' ) | | ' null ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER()) ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F ' ) ;
PKG_SQL_BUILD . APPEND ( SSQL = > CSQL , SELEMENT1 = > ' where F.NROW between :NROW_FROM and :NROW_TO ' ) ;
2023-12-10 19:27:04 +03:00
/* Учтём сортировки */
PKG_P8PANELS_VISUAL . TORDERS_SET_QUERY ( RDATA_GRID = > RDG , RORDERS = > RO , SPATTERN = > ' %ORDER_BY% ' , CSQL = > CSQL ) ;
/* Учтём фильтры */
PKG_P8PANELS_VISUAL . TFILTERS_SET_QUERY ( NIDENT = > NIDENT ,
NCOMPANY = > NCOMPANY ,
SUNIT = > ' AGNLIST ' ,
SPROCEDURE = > ' P_AGNLIST_BASE_COND ' ,
RDATA_GRID = > RDG ,
RFILTERS = > RF ) ;
/* Разбираем е г о */
ICURSOR : = PKG_SQL_DML . OPEN_CURSOR ( SWHAT = > ' SELECT ' ) ;
PKG_SQL_DML . PARSE ( ICURSOR = > ICURSOR , SQUERY = > CSQL ) ;
/* Делаем подстановку параметров */
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NIDENT ' , NVALUE = > NIDENT ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_FROM ' , NVALUE = > NROW_FROM ) ;
PKG_SQL_DML . BIND_VARIABLE_NUM ( ICURSOR = > ICURSOR , SNAME = > ' NROW_TO ' , NVALUE = > NROW_TO ) ;
/* Описываем структуру записи курсора */
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 1 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 2 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 3 ) ;
2024-05-04 15:22:43 +03:00
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 4 ) ;
PKG_SQL_DML . DEFINE_COLUMN_STR ( ICURSOR = > ICURSOR , IPOSITION = > 5 ) ;
PKG_SQL_DML . DEFINE_COLUMN_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 6 ) ;
2023-12-10 19:27:04 +03:00
/* Делаем выборку */
if ( PKG_SQL_DML . EXECUTE ( ICURSOR = > ICURSOR ) = 0 ) then
null ;
end if ;
/* Обходим выбранные записи */
while ( PKG_SQL_DML . FETCH_ROWS ( ICURSOR = > ICURSOR ) > 0 )
loop
/* Добавляем колонки с данными */
2024-02-05 16:07:27 +03:00
PKG_SQL_DML . COLUMN_VALUE_STR ( ICURSOR = > ICURSOR , IPOSITION = > 2 , SVALUE = > SAGNNAME ) ;
PKG_SQL_DML . COLUMN_VALUE_NUM ( ICURSOR = > ICURSOR , IPOSITION = > 3 , NVALUE = > NAGNTYPE ) ;
if ( NAGNTYPE = 0 ) then
SGROUP : = ' JUR ' ;
SAGNINFO : = SAGNNAME | | ' , ЮЛ ' ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_GROUP ( RDATA_GRID = > RDG ,
SNAME = > SGROUP ,
SCAPTION = > ' Юридические лица ' ,
BEXPANDABLE = > true ,
BEXPANDED = > false ) ;
else
SGROUP : = ' PERS ' ;
SAGNINFO : = SAGNNAME | | ' , ФЛ ' ;
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_GROUP ( RDATA_GRID = > RDG ,
SNAME = > SGROUP ,
SCAPTION = > ' Физические лица ' ,
BEXPANDABLE = > true ,
BEXPANDED = > false ) ;
end if ;
RDG_ROW : = PKG_P8PANELS_VISUAL . TROW_MAKE ( SGROUP = > SGROUP ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SAGNABBR ' , ICURSOR = > ICURSOR , NPOSITION = > 1 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SAGNINFO ' , SVALUE = > SAGNINFO ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' SAGNNAME ' , SVALUE = > SAGNNAME ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_COL ( RROW = > RDG_ROW , SNAME = > ' NAGNTYPE ' , NVALUE = > NAGNTYPE ) ;
2024-05-04 15:22:43 +03:00
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SFULLNAME ' , ICURSOR = > ICURSOR , NPOSITION = > 4 ) ;
PKG_P8PANELS_VISUAL . TROW_ADD_CUR_COLS ( RROW = > RDG_ROW , SNAME = > ' SAGNIDNUMB ' , ICURSOR = > ICURSOR , NPOSITION = > 5 ) ;
2023-12-10 19:27:04 +03:00
/* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL . TDATA_GRID_ADD_ROW ( RDATA_GRID = > RDG , RROW = > RDG_ROW ) ;
end loop ;
/* Освобождаем курсор */
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
exception
when others then
PKG_SQL_DML . CLOSE_CURSOR ( ICURSOR = > ICURSOR ) ;
raise ;
end ;
/* Сериализуем описание */
COUT : = PKG_P8PANELS_VISUAL . TDATA_GRID_TO_XML ( RDATA_GRID = > RDG , NINCLUDE_DEF = > NINCLUDE_DEF ) ;
end DATA_GRID ;
/* График */
procedure CHART
(
COUT out clob -- Сериализованный график
)
is
NCOMPANY PKG_STD . TREF : = GET_SESSION_COMPANY ( ) ; -- Организация сеанса
RCH PKG_P8PANELS_VISUAL . TCHART ; -- График
RCH_DS PKG_P8PANELS_VISUAL . TCHART_DATASET ; -- Н а б о р данных
RATTR_VALS PKG_P8PANELS_VISUAL . TCHART_DATASET_ITEM_ATTR_VALS ; -- Атрибуты элемента набора данных
begin
/* Сформируем заголовок графика */
RCH : = PKG_P8PANELS_VISUAL . TCHART_MAKE ( STYPE = > PKG_P8PANELS_VISUAL . SCHART_TYPE_BAR ,
STITLE = > ' Топ 5 контрагентов по сумме договоров ' ,
SLGND_POS = > PKG_P8PANELS_VISUAL . SCHART_LGND_POS_RIGHT ) ;
/* Сформируем набор данных */
RCH_DS : = PKG_P8PANELS_VISUAL . TCHART_DATASET_MAKE ( SCAPTION = > ' Сумма договоров ' ) ;
/* Обходим договоры, сгруппированные по контрагентам */
for C in ( select D . SAGENT ,
D . NSUM
from ( select AG . AGNABBR SAGENT ,
sum ( CN . DOC_SUMTAX * ( CN . CURBASE / CN . CURCOURS ) ) NSUM
from CONTRACTS CN ,
AGNLIST AG
where CN . COMPANY = NCOMPANY
and CN . AGENT = AG . RN
group by AG . AGNABBR
order by 2 desc ) D
where ROWNUM < = 5 )
loop
/* Добавим метку для контрагента */
PKG_P8PANELS_VISUAL . TCHART_ADD_LABEL ( RCHART = > RCH , SLABEL = > C . SAGENT ) ;
/* Сформируем дополнительные атрибуты для клиентского приложения - будем использовать их при открытии раздела "Договоры" для отбора */
PKG_P8PANELS_VISUAL . TCHART_DATASET_ITM_ATTR_VL_ADD ( RATTR_VALS = > RATTR_VALS ,
SNAME = > ' SCOND ' ,
SVALUE = > ' in_SAGENT ' ,
BCLEAR = > true ) ;
PKG_P8PANELS_VISUAL . TCHART_DATASET_ITM_ATTR_VL_ADD ( RATTR_VALS = > RATTR_VALS ,
SNAME = > ' SCOND_VALUE ' ,
SVALUE = > C . SAGENT ) ;
/* Добавим контрагента в набор данных */
PKG_P8PANELS_VISUAL . TCHART_DATASET_ADD_ITEM ( RDATASET = > RCH_DS , NVALUE = > C . NSUM , RATTR_VALS = > RATTR_VALS ) ;
end loop ;
/* Добавим набор данных в график */
PKG_P8PANELS_VISUAL . TCHART_ADD_DATASET ( RCHART = > RCH , RDATASET = > RCH_DS ) ;
/* Сериализуем описание */
COUT : = PKG_P8PANELS_VISUAL . TCHART_TO_XML ( RCHART = > RCH , NINCLUDE_DEF = > 1 ) ;
end CHART ;
2023-12-13 23:47:00 +03:00
/* Очистка буфера данных для диаграммы Ганта */
procedure GANTT_BASE_CLEAN
(
NIDENT in number -- Идентификатор буфера
)
is
begin
/* Удалим из буфера всё с указанным идентификатором */
delete from P8PNL_SMPL_GANTT T where T . IDENT = NIDENT ;
end GANTT_BASE_CLEAN ;
/* Добавление данных в буфер диаграммы Ганта */
procedure GANTT_BASE_INSERT
(
NIDENT in number , -- Идентификатор буфера
NTYPE in number , -- Тип задачи (0 - этап/веха, 1 - работа)
SNUMB in varchar2 , -- Номер задачи
SNAME in varchar2 , -- Наименование задачи
DDATE_FROM in date , -- Дата начала задачи
2024-03-31 22:54:42 +03:00
DDATE_TO in date , -- Дата окончания задачи
NSTATE in number -- Состояние (0 - не выполняется, 1 - выполняется)
2023-12-13 23:47:00 +03:00
)
is
begin
/* Добавим запись */
insert into P8PNL_SMPL_GANTT
2024-03-31 22:54:42 +03:00
( RN , IDENT , type , NUMB , name , DATE_FROM , DATE_TO , STATE )
2023-12-13 23:47:00 +03:00
values
2024-03-31 22:54:42 +03:00
( GEN_ID ( ) , NIDENT , NTYPE , SNUMB , SNAME , DDATE_FROM , DDATE_TO , NSTATE ) ;
2023-12-13 23:47:00 +03:00
end GANTT_BASE_INSERT ;
/* Исправление данных в буфере диаграммы Ганта */
procedure GANTT_BASE_UPDATE
(
NIDENT in number , -- Идентификатор буфера
NRN in number , -- Р е г . номер записи
NTYPE in number , -- Тип задачи (0 - этап/веха, 1 - работа)
SNUMB in varchar2 , -- Номер задачи
SNAME in varchar2 , -- Наименование задачи
DDATE_FROM in date , -- Дата начала задачи
DDATE_TO in date -- Дата окончания задачи
)
is
begin
/* Изменим запись */
update P8PNL_SMPL_GANTT T
set T . TYPE = NTYPE ,
T . NUMB = SNUMB ,
T . NAME = SNAME ,
T . DATE_FROM = DDATE_FROM ,
T . DATE_TO = DDATE_TO
where T . RN = NRN
and T . IDENT = NIDENT ;
end GANTT_BASE_UPDATE ;
/* Инициализация буфера данных для диаграммы Ганта */
procedure GANTT_INIT
(
NIDENT in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором)
)
is
/* Константы */
NSTAGE_LEN constant PKG_STD . TNUMBER : = 3 ; -- Длительность этапа (в месяцах)
/* Переменные */
NYEAR PKG_STD . TNUMBER ; -- Текущий год
NMONTH PKG_STD . TNUMBER ; -- Месяц начала этапа
DDATE_FROM PKG_STD . TLDATE ; -- Дата начала этапа
2024-03-31 22:54:42 +03:00
DDATE_TO PKG_STD . TLDATE ; -- Дата окончания этапа
DDATE_FROM_J PKG_STD . TLDATE ; -- Дата начала работы
DDATE_TO_J PKG_STD . TLDATE ; -- Дата окончания работы
NSTATE PKG_STD . TNUMBER ; -- Состояние задачи
2023-12-13 23:47:00 +03:00
begin
/* Удаляем старые данные из буфера */
if ( NIDENT is not null ) then
GANTT_BASE_CLEAN ( NIDENT = > NIDENT ) ;
else
/* Илиформируем новый идентификатор, если не задан */
NIDENT : = GEN_IDENT ( ) ;
end if ;
/* Фиксируем текущий год */
NYEAR : = EXTRACT ( year from sysdate ) ;
/* Этапы */
for ST in 1 . . 12 / NSTAGE_LEN
loop
/* Сформируем период этапа */
NMONTH : = ST * NSTAGE_LEN - NSTAGE_LEN + 1 ;
DDATE_FROM : = TO_DATE ( ' 01. ' | | NMONTH | | ' . ' | | TO_CHAR ( NYEAR ) , ' dd.mm.yyyy ' ) ;
2024-03-31 22:54:42 +03:00
DDATE_TO : = LAST_DAY ( ADD_MONTHS ( DDATE_FROM , NSTAGE_LEN ) - 1 ) ;
/* Сформируем значение для атриуба "состояние" этапа */
if ( TRUNC ( sysdate ) between TRUNC ( DDATE_FROM ) and TRUNC ( DDATE_TO ) ) then
NSTATE : = 1 ;
else
NSTATE : = 0 ;
end if ;
2023-12-13 23:47:00 +03:00
/* Добавим е г о в буфер */
GANTT_BASE_INSERT ( NIDENT = > NIDENT ,
NTYPE = > 0 ,
SNUMB = > TO_CHAR ( ST ) ,
SNAME = > ' Этап ' | | TO_CHAR ( ST ) ,
DDATE_FROM = > DDATE_FROM ,
2024-03-31 22:54:42 +03:00
DDATE_TO = > DDATE_TO ,
NSTATE = > NSTATE ) ;
2023-12-13 23:47:00 +03:00
/* Работы */
for J in 0 . . NSTAGE_LEN - 1
loop
2024-03-31 22:54:42 +03:00
/* Сформируем период работы */
DDATE_FROM_J : = ADD_MONTHS ( DDATE_FROM , J ) ;
DDATE_TO_J : = LAST_DAY ( ADD_MONTHS ( DDATE_FROM , J + 1 ) - 1 ) ;
/* Сформируем значение для атриуба "состояние" работы */
if ( TRUNC ( sysdate ) between TRUNC ( DDATE_FROM_J ) and TRUNC ( DDATE_TO_J ) ) then
NSTATE : = 1 ;
else
NSTATE : = 0 ;
end if ;
2023-12-13 23:47:00 +03:00
/* Добавим в буфер */
GANTT_BASE_INSERT ( NIDENT = > NIDENT ,
NTYPE = > 1 ,
SNUMB = > TO_CHAR ( ST ) | | ' . ' | | TO_CHAR ( J + 1 ) ,
SNAME = > ' Работа ' | | TO_CHAR ( J + 1 ) | | ' этапа ' | | TO_CHAR ( ST ) ,
2024-03-31 22:54:42 +03:00
DDATE_FROM = > DDATE_FROM_J ,
DDATE_TO = > DDATE_TO_J ,
NSTATE = > NSTATE ) ;
2023-12-13 23:47:00 +03:00
end loop ;
end loop ;
end GANTT_INIT ;
/* С б о р данных для отображения диаграммы Ганта */
procedure GANTT
(
NIDENT in number , -- Идентификатор процесса
COUT out clob -- Сериализованные данные для диаграммы Ганта
)
is
/* Константы */
SBG_COLOR_STAGE constant PKG_STD . TSTRING : = ' cadetblue ' ; -- Цвет заливки этапов
SBG_COLOR_JOB constant PKG_STD . TSTRING : = ' lightgreen ' ; -- Цвет заливки работ
/* Переменные */
RG PKG_P8PANELS_VISUAL . TGANTT ; -- Описание диаграммы Ганта
RGT PKG_P8PANELS_VISUAL . TGANTT_TASK ; -- Описание задачи для диаграммы
STASK_BG_COLOR PKG_STD . TSTRING ; -- Цвет фона задачи
begin
/* Инициализируем диаграмму Ганта */
RG : = PKG_P8PANELS_VISUAL . TGANTT_MAKE ( STITLE = > ' Задачи на ' | | TO_CHAR ( EXTRACT ( year from sysdate ) ) | | ' год ' ,
NZOOM = > PKG_P8PANELS_VISUAL . NGANTT_ZOOM_MONTH ) ;
/* Добавим динамические атрибуты к задачам */
2024-03-31 22:54:42 +03:00
PKG_P8PANELS_VISUAL . TGANTT_ADD_TASK_ATTR ( RGANTT = > RG , SNAME = > ' type ' , SCAPTION = > ' Тип ' , BVISIBLE = > true ) ;
PKG_P8PANELS_VISUAL . TGANTT_ADD_TASK_ATTR ( RGANTT = > RG ,
SNAME = > ' state ' ,
SCAPTION = > ' Состояние ' ,
BVISIBLE = > false ) ;
2023-12-13 23:47:00 +03:00
/* Добавим описание цветов задач */
PKG_P8PANELS_VISUAL . TGANTT_ADD_TASK_COLOR ( RGANTT = > RG ,
SBG_COLOR = > SBG_COLOR_JOB ,
SDESC = > ' Этот цвет для задач. ' ) ;
PKG_P8PANELS_VISUAL . TGANTT_ADD_TASK_COLOR ( RGANTT = > RG ,
SBG_COLOR = > SBG_COLOR_STAGE ,
SDESC = > ' Этим цветом выделены этапы. ' ) ;
/* Обходим буфер */
for C in ( select T . * from P8PNL_SMPL_GANTT T where T . IDENT = NIDENT order by T . RN )
loop
/* Определимся с форматированием */
if ( C . TYPE = 0 ) then
STASK_BG_COLOR : = SBG_COLOR_STAGE ;
else
STASK_BG_COLOR : = SBG_COLOR_JOB ;
end if ;
/* Сформируем задачу */
RGT : = PKG_P8PANELS_VISUAL . TGANTT_TASK_MAKE ( NRN = > C . RN ,
SNUMB = > C . NUMB ,
SCAPTION = > C . NUMB | | ' - ' | | C . NAME ,
SNAME = > C . NAME ,
DSTART = > C . DATE_FROM ,
DEND = > C . DATE_TO ,
SBG_COLOR = > STASK_BG_COLOR ) ;
PKG_P8PANELS_VISUAL . TGANTT_TASK_ADD_ATTR_VAL ( RGANTT = > RG ,
RTASK = > RGT ,
SNAME = > ' type ' ,
SVALUE = > C . TYPE ,
BCLEAR = > true ) ;
2024-03-31 22:54:42 +03:00
PKG_P8PANELS_VISUAL . TGANTT_TASK_ADD_ATTR_VAL ( RGANTT = > RG , RTASK = > RGT , SNAME = > ' state ' , SVALUE = > C . STATE ) ;
2023-12-13 23:47:00 +03:00
/* Добавляем задачу в диаграмму */
PKG_P8PANELS_VISUAL . TGANTT_ADD_TASK ( RGANTT = > RG , RTASK = > RGT ) ;
end loop ;
/* Сериализуем собранные данные */
COUT : = PKG_P8PANELS_VISUAL . TGANTT_TO_XML ( RGANTT = > RG ) ;
end GANTT ;
/* Исправление задачи в диаграмме Ганта */
procedure GANTT_MODIFY
(
NIDENT in number , -- Идентификатор буфера
NRN in number , -- Р е г . номер записи
DDATE_FROM in date , -- Дата начала задачи
DDATE_TO in date -- Дата окончания задачи
)
is
begin
for C in ( select T . *
from P8PNL_SMPL_GANTT T
where T . RN = NRN
and T . IDENT = NIDENT )
loop
GANTT_BASE_UPDATE ( NIDENT = > C . IDENT ,
NRN = > C . RN ,
NTYPE = > C . TYPE ,
SNUMB = > C . NUMB ,
SNAME = > C . NAME ,
DDATE_FROM = > TRUNC ( DDATE_FROM ) ,
DDATE_TO = > TRUNC ( DDATE_TO ) ) ;
end loop ;
end GANTT_MODIFY ;
2023-12-08 21:38:34 +03:00
end PKG_P8PANELS_SAMPLES ;
/