спочатку в t_reports вибираємо наш звіт, міняємо значення IS_OLAP на 4 йдемо в t_interfaces_v1 ,Data створюємо нове поле з категорією olap, module_id- report_номер, в XML створюємо(приклад): report_номер_dic
none Товари+магазини+залишок objects_name nomen_name rest rest_sum Виробник(ТМ)+товари+магазин+залишок objects_name maker_name nomen_name rest rest_sum Товари+магазини+ціни objects_name nomen_name last_inprice out_price яке вибираємо із T_REPORT_CHEMAS по report_id- (номер), вибираємо(ctrl+C) з поля NAME, та XML і переносимо (Ctrl+V) в Назва та Назва тіло Назва1 тіло1 зберігаємо Наступний крок: Створюєм нове поблицю (в T_INTERFACES_V1) gategory_id- table, module_id- report_номер_dic, XML будемо вставляти код за наступним принципом: (select odoc_date, doc_num, doc_mark, otypedoc_name, nomen_code, nomen_name, oclient_name, oowner_name, out_price, oi_kilk, oi_price, oil_out_price, oi_in_sum_pdv, oi_sum_markup_pdv, oi_out_sum_pdv, oil_out_sum_pdv, oil_sum_markup_pdv, oi_in_sum from pr_in_documents(:idate0, :idate1) Дата документа Номер документа Примітка Тип документа Код товару Назва товару Постачальник Власник К-ть СЗ з ПДВ ЦЗ з ПДВ СЗ ЦР з ПДВ СР з ПДВ СН з ПДВ Нова ЦР з ПДВ Нова СР з ПДВ Нова СН з ПДВ) приклад де select тіло взяте із процедури сама прецедура: створюємо нову процедуру називаємо її ... (в моєму випадку PR_IN_DOCUMENTS): (SET TERM ^ ; create or alter procedure PR_IN_DOCUMENTS ( IDATE0 date, IDATE1 date) returns ( ODOC_DATE date, DOC_NUM varchar(14), DOC_MARK varchar(14), OTYPEDOC_NAME varchar(30), NOMEN_CODE varchar(7), NOMEN_NAME varchar(80), OCLIENT_NAME varchar(80), OOWNER_NAME varchar(80), OUT_PRICE double precision, OI_KILK double precision, OI_PRICE double precision, OIL_OUT_PRICE double precision, OI_IN_SUM_PDV double precision, OI_SUM_MARKUP_PDV double precision, OI_OUT_SUM_PDV double precision, OIL_OUT_SUM_PDV double precision, OIL_SUM_MARKUP_PDV double precision, OI_IN_SUM double precision) as begin for select rr.odoc_date as odoc_date, rr.doc_num, rr.doc_mark, rr.otypedoc_name as otypedoc_name, n.nomen_code, n.nomen_name, rr.oi_kilk, rr.oi_price, rr.oi_in_sum_pdv, rr.oi_in_sum, n.out_price, around(rr.oi_kilk * n.out_price) as oi_out_sum_pdv, around(rr.oi_kilk * n.out_price) - rr.oi_in_sum_pdv as oi_sum_markup_pdv, cl.name || ' (' || cl.zkpo || ')' as oclient_name, coalesce(rr.new_out_price, rr.old_out_price) as oil_out_price, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) as oil_out_sum_pdv, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) - rr.oi_in_sum_pdv as oil_sum_markup_pdv, o.name as oowner_name from ( select dr.docrec_id, d.doc_date as odoc_date, d.doc_num, d.doc_mark, d.objects_id as oclient_id, dt.typedoc_name as otypedoc_name, dr.nomen_id as tnomen_id, dr.kilk as oi_kilk, dr.price as oi_price, dr.insum_pdv as oi_in_sum_pdv, dr.insum as oi_in_sum, (select oout_price from PS_GET_OUT_PRICE_AT(dr.nomen_id, d.date_cr)) as new_out_price, (select first(1) pl.out_price from t_price_logs pl where pl.date_time < d.date_cr and pl.nomen_id = dr.nomen_id order by pl.date_time desc) as old_out_price, d.owner_id from t_documents d join t_document_types dt on (dt.typedoc_id = d.typedoc_id and d.typedoc_id <> 16 and d.clients_id = 1 and d.doc_lock in (1,2) and d.doc_date between :idate0 and :idate1) join t_doc_records dr on (d.document_id = dr.document_id) ) rr left join t_nomens n on (rr.tnomen_id = n.nomen_id) left join t_clients cl on rr.oclient_id = cl.clients_id left join t_clients o on rr.owner_id = o.clients_id into odoc_date,doc_num,doc_mark,otypedoc_name,nomen_code,nomen_name, oi_kilk,oi_price,oi_in_sum_pdv,oi_in_sum,out_price, oi_out_sum_pdv, oi_sum_markup_pdv, oclient_name, oil_out_price, oil_out_sum_pdv, oil_sum_markup_pdv, oowner_name do begin suspend; end end^ SET TERM ; ^ /* Following GRANT statetements are generated automatically */ GRANT EXECUTE ON PROCEDURE PS_GET_OUT_PRICE_AT TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_PRICE_LOGS TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_DOCUMENTS TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_DOCUMENT_TYPES TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_DOC_RECORDS TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_NOMENS TO PROCEDURE PR_IN_DOCUMENTS; GRANT SELECT ON T_CLIENTS TO PROCEDURE PR_IN_DOCUMENTS; /* Existing privileges on this procedure */ GRANT EXECUTE ON PROCEDURE PR_IN_DOCUMENTS TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_IN_DOCUMENTS TO SYSDBA;) тіло коду берем із T_REPORTS, report_id- номер процедури, вибираємо (ctrl+C) (у моєму випадку 7) буде: (select rr.odoc_date as odoc_date, rr.doc_num, rr.doc_mark, rr.otypedoc_name as otypedoc_name, n.nomen_code, n.nomen_name, rr.oi_kilk, rr.oi_price, rr.oi_in_sum_pdv, rr.oi_in_sum, n.out_price, around(rr.oi_kilk * n.out_price) as oi_out_sum_pdv, around(rr.oi_kilk * n.out_price) - rr.oi_in_sum_pdv as oi_sum_markup_pdv, cl.name || ' (' || cl.zkpo || ')' as oclient_name, coalesce(rr.new_out_price, rr.old_out_price) as oil_out_price, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) as oil_out_sum_pdv, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) - rr.oi_in_sum_pdv as oil_sum_markup_pdv, o.name as oowner_name from ( select dr.docrec_id, d.doc_date as odoc_date, d.doc_num, d.doc_mark, d.objects_id as oclient_id, dt.typedoc_name as otypedoc_name, dr.nomen_id as tnomen_id, dr.kilk as oi_kilk, dr.price as oi_price, dr.insum_pdv as oi_in_sum_pdv, dr.insum as oi_in_sum, (select oout_price from PS_GET_OUT_PRICE_AT(dr.nomen_id, d.date_cr)) as new_out_price, (select first(1) pl.out_price from t_price_logs pl where pl.date_time < d.date_cr and pl.nomen_id = dr.nomen_id order by pl.date_time desc) as old_out_price, d.owner_id from t_documents d join t_document_types dt on (dt.typedoc_id = d.typedoc_id and d.typedoc_id <> 16 and d.clients_id = 1 and d.doc_lock in (1,2) and d.doc_date between :idate0 and :idate1) join t_doc_records dr on (d.document_id = dr.document_id) ) rr left join t_nomens n on (rr.tnomen_id = n.nomen_id) left join t_clients cl on rr.oclient_id = cl.clients_id left join t_clients o on rr.owner_id = o.clients_id) при створені процедури добавляємо поле: into odoc_date,doc_num,doc_mark,otypedoc_name,nomen_code,nomen_name, oi_kilk,oi_price,oi_in_sum_pdv,oi_in_sum,out_price, oi_out_sum_pdv, oi_sum_markup_pdv, oclient_name, oil_out_price, oil_out_sum_pdv, oil_sum_markup_pdv, oowner_name do begin suspend; end end вставляємо в процедуру попередньо додавши input та output parameters які знаходяться в самому скрипті(значення шукаємо в інших таблицях бази + перед тим виконуємо sql запрос тіла щоб знати точні дані): результат: create or alter procedure PR_IN_DOCUMENTS ( IDATE0 date, IDATE1 date) returns ( ODOC_DATE date, DOC_NUM varchar(14), DOC_MARK varchar(14), OTYPEDOC_NAME varchar(30), NOMEN_CODE varchar(7), NOMEN_NAME varchar(80), OCLIENT_NAME varchar(80), OOWNER_NAME varchar(80), OUT_PRICE double precision, OI_KILK double precision, OI_PRICE double precision, OIL_OUT_PRICE double precision, OI_IN_SUM_PDV double precision, OI_SUM_MARKUP_PDV double precision, OI_OUT_SUM_PDV double precision, OIL_OUT_SUM_PDV double precision, OIL_SUM_MARKUP_PDV double precision, OI_IN_SUM double precision) as begin for select rr.odoc_date as odoc_date, rr.doc_num, rr.doc_mark, rr.otypedoc_name as otypedoc_name, n.nomen_code, n.nomen_name, rr.oi_kilk, rr.oi_price, rr.oi_in_sum_pdv, rr.oi_in_sum, n.out_price, around(rr.oi_kilk * n.out_price) as oi_out_sum_pdv, around(rr.oi_kilk * n.out_price) - rr.oi_in_sum_pdv as oi_sum_markup_pdv, cl.name || ' (' || cl.zkpo || ')' as oclient_name, coalesce(rr.new_out_price, rr.old_out_price) as oil_out_price, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) as oil_out_sum_pdv, around(rr.oi_kilk * coalesce(rr.new_out_price, rr.old_out_price)) - rr.oi_in_sum_pdv as oil_sum_markup_pdv, o.name as oowner_name from ( select dr.docrec_id, d.doc_date as odoc_date, d.doc_num, d.doc_mark, d.objects_id as oclient_id, dt.typedoc_name as otypedoc_name, dr.nomen_id as tnomen_id, dr.kilk as oi_kilk, dr.price as oi_price, dr.insum_pdv as oi_in_sum_pdv, dr.insum as oi_in_sum, (select oout_price from PS_GET_OUT_PRICE_AT(dr.nomen_id, d.date_cr)) as new_out_price, (select first(1) pl.out_price from t_price_logs pl where pl.date_time < d.date_cr and pl.nomen_id = dr.nomen_id order by pl.date_time desc) as old_out_price, d.owner_id from t_documents d join t_document_types dt on (dt.typedoc_id = d.typedoc_id and d.typedoc_id <> 16 and d.clients_id = 1 and d.doc_lock in (1,2) and d.doc_date between :idate0 and :idate1) join t_doc_records dr on (d.document_id = dr.document_id) ) rr left join t_nomens n on (rr.tnomen_id = n.nomen_id) left join t_clients cl on rr.oclient_id = cl.clients_id left join t_clients o on rr.owner_id = o.clients_id into odoc_date,doc_num,doc_mark,otypedoc_name,nomen_code,nomen_name, oi_kilk,oi_price,oi_in_sum_pdv,oi_in_sum,out_price, oi_out_sum_pdv, oi_sum_markup_pdv, oclient_name, oil_out_price, oil_out_sum_pdv, oil_sum_markup_pdv, oowner_name do begin suspend; end end (select * from T_INTERFACES_V1 where module_id like 'report_7%')- для швикого пошуку нашого звіту стаєм на процедуру ctrl+C у новому вікні вибираємо select отримуємо : select ODOC_DATE, DOC_NUM, DOC_MARK, OTYPEDOC_NAME, NOMEN_CODE, NOMEN_NAME, OCLIENT_NAME, OOWNER_NAME, OUT_PRICE, OI_KILK, OI_PRICE, OIL_OUT_PRICE, OI_IN_SUM_PDV, OI_SUM_MARKUP_PDV, OI_OUT_SUM_PDV, OIL_OUT_SUM_PDV, OIL_SUM_MARKUP_PDV, OI_IN_SUM from PR_IN_DOCUMENTS(:IDATE0, :IDATE1) що в подальшому вставляємо в таблицю з T_INTERFACES_V1 : select odocrec_id, onomen_code, onomen_name, okilk, oout_price_pdv, osum_out, osum_out_pdv, osum_in, osum_in_pdv, osum_pdv, oout_price, otypepdv_id, onomen_price, odisc_persent, oshort_name, oadded_scores, ospent_scores, osumma_mod from pkl_documents_detail({:iid}) зосталися парамерти : ID Код товару Назва товару К-ть ЦР(з ПДВ) СЗ(з ПДВ) СР(з ПДВ) Бонусів + Бонусів - Знижка які ми вибираємо окремим запитом select ''||caption||'' from t_reportcaptions where report_id = 7 для просто вставки та правимо порожні поля type Підкінець Створюємо скрипт обнови: ( UPDATE T_REPORTS SET IS_OLAP = 4 WHERE (REPORT_ID = 9); commit work; UPDATE OR INSERT INTO T_INTERFACES_V1 (CATEGORY_ID, MODULE_ID, XML, WEIGHT, IS_ACTIVE, ACCESS_ID, VER) VALUES ('olap', 'report_9', 'report_9_dic
Скорочена nomen_prod_group_id name b_rest move_in money_move_in move_out money_move_out e_rest Розширена nomen_prod_group_id name nomen_name b_rest move_in money_move_in move_out money_move_out e_rest ', 0, 0, NULL, 0) MATCHING (CATEGORY_ID, MODULE_ID, XML, VER); COMMIT WORK; UPDATE OR INSERT INTO T_INTERFACES_V1 (CATEGORY_ID, MODULE_ID, XML, WEIGHT, IS_ACTIVE, ACCESS_ID, VER) VALUES ('table', 'report_9_dic', 'select nomen_id, nomen_code, nomen_name, brutto, nomen_prod_group_id, uktz, name, b_rest, e_rest, move_in, money_move_in, money_move_in_sr, move_out, money_move_out from pr_in_documentsnine(:idate0, :idate1) ID товару Код товару Назва товару Код виду продукції Код продукції Вид продукції Об"єм л. Залишок на поч, дкл. Прихід, дкл. Реалізація, дкл. Залишок на кін, дкл. Прихід, грн. Реалізація, грн Прихід по ЦР, грн', 0, 1, NULL, 0) MATCHING (CATEGORY_ID, MODULE_ID, XML, VER); COMMIT WORK; SET TERM ^ ; create or alter procedure PR_IN_DOCUMENTSNINE ( IDATE0 date, IDATE1 date) returns ( NOMEN_ID varchar(7), NOMEN_CODE varchar(7), NOMEN_NAME varchar(80), BRUTTO numeric(9,3), NOMEN_PROD_GROUP_ID integer, UKTZ varchar(15), NAME varchar(120), B_REST double precision, E_REST double precision, MOVE_IN double precision, MONEY_MOVE_IN double precision, MONEY_MOVE_IN_SR double precision, MOVE_OUT double precision, MONEY_MOVE_OUT double precision) as begin for select rr.nomen_id, n.nomen_code, n.nomen_name, n.brutto, n.nomen_prod_group_id, n.uktz, pg.name, sum(rr.b_rest) * n.brutto / 10.0 as b_rest, sum(rr.move_in) * n.brutto / 10.0 as move_in, sum(rr.money_move_in) as money_move_in, sum(rr.money_move_in_sr) as money_move_in_sr, sum(rr.move_out) * n.brutto / 10.0 as move_out, sum(rr.money_move_out) as money_move_out, sum(rr.e_rest) * n.brutto / 10.0 as e_rest from ( select nomen_id, r.rest as b_rest, 0.0 as move_in, 0.0 as money_move_in, 0.0 as money_move_in_sr, 0.0 as move_out, 0.0 as money_move_out, r.rest as e_rest from t_rests r union all select dr.nomen_id, iif(d.objects_id = 1, dr.kilk, -dr.kilk) as b_rest, iif((d.typedoc_id = 1) and (d.doc_date between :idate0 and :idate1), dr.kilk, 0) as move_in, iif((d.typedoc_id = 1) and (d.doc_date between :idate0 and :idate1), ss.osum_pdv, 0) as money_move_in, iif((d.typedoc_id = 1) and (d.doc_date between :idate0 and :idate1), (select dr.kilk * oout_price from PS_GET_OUT_PRICE_AT(dr.nomen_id, d.date_cr)), 0) as money_move_in_sr, iif((d.typedoc_id = 11) and (d.doc_date between :idate0 and :idate1) and dr.device_id = 2, dr.kilk, 0) as move_out, iif((d.typedoc_id = 11) and (d.doc_date between :idate0 and :idate1) and dr.device_id = 2, ss.osum_pdv, 0) as money_move_out, iif(d.doc_date > :idate1, iif(d.objects_id = 1, dr.kilk, -dr.kilk), 0) as e_rest from t_doc_records dr join t_documents d on dr.document_id = d.document_id left join ps_get_sum_v1(dr.docrec_id, 'r', 0) ss on 1=1 where d.doc_date >= :idate0 ) rr join t_nomens n on rr.nomen_id = n.nomen_id and n.sg_id in (1,6,7) left join t_nomen_prod_groups pg on pg.nomen_prod_group_id = n.nomen_prod_group_id group by rr.nomen_id, n.nomen_code, n.nomen_name, n.brutto, n.nomen_prod_group_id, n.uktz, pg.name into nomen_id, nomen_code, nomen_name, brutto, nomen_prod_group_id, uktz, name, b_rest, move_in, money_move_in, money_move_in_sr, move_out, money_move_out,/*rest,*/ e_rest do begin suspend; end end^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE PR_IN_DOCUMENTSNINE TO "PUBLIC"; ) вибираємо запросом select * from T_INTERFACES_V1 where module_id like 'report_номер%' опісля export data inti sript (три верхні, одне нижнє- categori, module_id, xml, ver) дописуємо зверху (UPDATE T_REPORTS SET IS_OLAP = 4 WHERE (REPORT_ID = номер); commit work;) ... опісля переходимо DLL в нашій процедурі зачищаємо остані рядки, ставимо замість SYSDBA- PUBLIC зберігаємо .