Подготовка серверной базы и скриптов для Единого Окна
Содержание
- 1 Экспорт vals_link (для ЙО: boss:d:\обмен\JO\ZTRADE.FDB) как dbf или insert
- 2 Создаем и вставляем данные vals_link в нашу БД (скрипт создания и импорта из dbf: cowa_vals_links.sql)
- 3 Для связывания по ШК выполняем cowa_bcode_links.sql (не оптимизирован для ЙО)
- 4 Проверяем работу, смотрим сколько записей добавилось в g$distribute - могут добавится немного записей и только по таблицам wares и wares_log
- 5 Экспорт как insert скрипт в файл запроса "select * from wares_log wl where wl.actual_ware_id is not null", все строки "commit work" - убираем
- 6 Экспрорт как update or insert скрипт в файл запроса "select distinct w.* from TMP_UPDATED_WARES t left join wares w on t.uuid=w.d$uuid where w.d$uuid is not null", все строки "commit work" - убираем
- 7 Делаем шаблоны G$TASKS_TMPL по образцу. Заменить data в записях cowa_02XX на файл, созданный в 6м пункте, cowa_08 - на файл 7го пункта
Экспорт vals_link (для ЙО: boss:d:\обмен\JO\ZTRADE.FDB) как dbf или insert
Создаем и вставляем данные vals_link в нашу БД (скрипт создания и импорта из dbf: cowa_vals_links.sql)
/******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_VALS_LINKS_ID; CREATE TABLE VALS_LINKS ( ID DM_ID NOT NULL, RIGHT_VAL_ID DM_UUID, WRONG_VAL_ID DM_UUID, INSERTDT DM_DATETIME, VTYPE DM_STATUS NOT NULL, SRIGHT_VAL DM_TEXT, SWRONG_VAL DM_TEXT, DELETEDT DM_DATETIME ); /******************************************************************************/ /*** Unique Constraints ***/ /******************************************************************************/ ALTER TABLE VALS_LINKS ADD CONSTRAINT UNQ1_VALS_LINKS UNIQUE (RIGHT_VAL_ID, WRONG_VAL_ID); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE VALS_LINKS ADD CONSTRAINT PK_VALS_LINKS PRIMARY KEY (ID); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX VALS_LINKS_IDX1 ON VALS_LINKS (RIGHT_VAL_ID); CREATE INDEX VALS_LINKS_IDX2 ON VALS_LINKS (WRONG_VAL_ID); CREATE INDEX VALS_LINKS_IDX3 ON VALS_LINKS (SRIGHT_VAL, SWRONG_VAL); CREATE INDEX VALS_LINKS_IDX4 ON VALS_LINKS (SRIGHT_VAL); CREATE INDEX VALS_LINKS_IDX5 ON VALS_LINKS (SWRONG_VAL); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: VALS_LINKS_BI */ CREATE OR ALTER TRIGGER VALS_LINKS_BI FOR VALS_LINKS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then new.id = gen_id(gen_vals_links_id,1); new.insertdt=current_timestamp; end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ execute ibeblock as begin cbb = 'execute ibeblock (RecCount variant) as begin if (ibec_Mod(RecCount, 100) = 0) then ibec_Progress(RecCount || '' records imported.''); end;'; DB = ibec_CreateConnection(__ctFirebird, 'DBName="standart-n:D:\STANDART-N\base_g\test\test_ztrade_g.fdb"; ClientLib=gds32.dll; User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3;'); try ibec_UseConnection(DB); Res = ibec_ImportData(DB, 'VALS_LINKS', __impDBase, 'D:\STANDART-N\base_g\test\SQLs\vals_links.dbf', '', 'RowFirst=1; RowLast=2147483647; DateOrder=DMY; DateSeparator="."; TimeSeparator=":";', '', cbb); if (Res is not null) then ibec_ShowMessage(Res || ' records were imported successfully.'); finally ibec_CloseConnection(DB); end; end
- Выпоняем cowa_all.sql (не оптимизирован для ЙО)
--копируем VALS_LINKS как объект ALTER TRIGGER WARES_LOG_BI_DISTR INACTIVE; ALTER TRIGGER WARES_LOG_BU_DISTR INACTIVE; ALTER TRIGGER WARES_LOG_AD_DISTR INACTIVE; ALTER TRIGGER WARES_AD_DISTR INACTIVE; ALTER TRIGGER WARES_AU0 INACTIVE; ALTER TRIGGER WARES_AIU0 INACTIVE; ALTER TRIGGER VALS_AIU0 INACTIVE; ALTER TRIGGER PARTS_AU0 INACTIVE; ALTER TRIGGER VALS_AD_DISTR INACTIVE; --ALTER TRIGGER VALS_AD_DODOUBLES INACTIVE; --ALTER TRIGGER WARES_BIU_VALCHECK INACTIVE; --ALTER TRIGGER WARES_AD_DISTR INACTIVE; --ALTER TRIGGER WARES_AD0 INACTIVE; ALTER TRIGGER WARES_BD0 INACTIVE; ALTER TRIGGER WARES_BU_DISTR INACTIVE; --ALTER TRIGGER WARES_BU0_MGN_NAME_ASNA INACTIVE; --DROP INDEX WARES_IDX15; --CREATE INDEX WARES_IDX15 ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID); ALTER TABLE WARES_LOG ADD ACTUAL_WARE_ID DM_UUID_NULL; CREATE INDEX WARES_LOG_ACTUAL_WARE_ID ON WARES_LOG (ACTUAL_WARE_ID); SET TERM ^ ; CREATE OR ALTER trigger wares_log_bi_tmp for wares_log active before insert position 0 AS begin if (new.log_id is null) then new.log_id=UUID_TO_CHAR(GEN_UUID()); new.d$uuid=new.log_id; if (new.d$srvupddt is null) then begin new.d$srvupddt='2000-01-01'; end if (new.l_id is null) then new.l_id=GEN_ID(GEN_WARES_LOG_ID,1); new.log_insertdt=current_timestamp; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure PR_TMP_CHANGEWARES_CONSTR as declare variable UUID type of DM_UUID; declare variable NAME_ID type of DM_UUID; declare variable IZG_ID type of DM_UUID; declare variable COUNTRY_ID type of DM_UUID; declare variable BARCODE type of DM_TEXT; declare variable ACTUAL_UUID type of DM_UUID; begin delete from wares_log wl where (ACTUAL_WARE_ID is null) and (not exists (select id from wares w where w.id=wl.id)); for select min(d$uuid), name_id, izg_id, country_id, barcode from wares group by name_id, izg_id, country_id, barcode having count(1)>1 into actual_uuid, name_id, izg_id, country_id, barcode do begin for select d$uuid from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and barcode=:barcode and d$uuid<>:actual_uuid into uuid do begin -- insert into tmp_todelete (TABLENAME,UUID,REASON,ACTUAL_UUID) values ('WARES',:uuid,'удаление',:actual_uuid); insert into wares_log (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,ACTUAL_WARE_ID) select ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,:actual_uuid from wares where d$uuid=:uuid; update parts set ware_id=:actual_uuid where ware_id=:uuid; delete from wares where d$uuid=:uuid; end end --delete from wares w where not exists (select id from parts p where p.ware_id=w.id) = всего 11414 , после сжатия - игнорим пока delete from vals v where (vtype=0) and (not exists (select id from wares w where w.name_id=v.id)) and (not exists (select id from wares_log wl where wl.name_id=v.id)); delete from vals v where (vtype=3) and (not exists (select id from wares w where w.izg_id=v.id)) and (not exists (select id from wares_log wl where wl.izg_id=v.id)); delete from vals v where (vtype=2) and (not exists (select id from wares w where w.country_id=v.id)) and (not exists (select id from wares_log wl where wl.country_id=v.id)); delete from vals v where (vtype=1) and (not exists (select id from wares w where w.orig_name_id=v.id)) and (not exists (select id from wares_log wl where wl.orig_name_id=v.id)); delete from vals v where (vtype=6) and (not exists (select id from wares w where w.orig_izg_id=v.id)) and (not exists (select id from wares_log wl where wl.orig_izg_id=v.id)); delete from vals v where (vtype=5) and (not exists (select id from wares w where w.orig_country_id=v.id)) and (not exists (select id from wares_log wl where wl.orig_country_id=v.id)); end^ SET TERM ; ^ update wares set barcode='' where barcode is null; execute procedure PR_TMP_CHANGEWARES_CONSTR; commit work; CREATE UNIQUE INDEX WARES_IDX_U ON WARES (NAME_ID, IZG_ID, COUNTRY_ID, BARCODE); --DROP TRIGGER WARES_LOG_BI_TMP; CREATE TABLE TMP_UPDATED_WARES ( UUID DM_UUID /* DM_UUID = CHAR(36) NOT NULL */ ); CREATE INDEX TMP_UPDATED_WARES_IDX1 ON TMP_UPDATED_WARES (UUID); /* CREATE GENERATOR GEN_VALS_CARANTINE_ID; CREATE TABLE VALS_CARANTINE ( ID DM_ID NOT NULL, CUR_ID DM_UUID, NEW_ID DM_UUID, INSERTDT DM_DATETIME, FROM_PROFILE_ID DM_ID_NULL ); SET TERM ^ ; CREATE OR ALTER TRIGGER VALS_CARANTINE_BI FOR VALS_CARANTINE ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then new.id = gen_id(gen_vals_carantine_id,1); new.insertdt=current_timestamp; if (new.from_profile_id is null) then select from_profile_id from g$distribute where uuid=new.new_id into new.from_profile_id; end ^ SET TERM ; ^ */ SET TERM ^ ; CREATE OR ALTER trigger vals_biu_dodoubles for vals inactive before insert or update position 0 AS declare variable ID type of DM_UUID; begin select id from vals where VTYPE=new.VTYPE and svalue=new.svalue and ALTTYPE=new.ALTTYPE and d$uuid<>new.d$uuid into :id; if (id is null) then exit; /* 0 - приведенное наименование 3 - приведенный производитель 2 - приведенная страна 1 - ориг. наименование 6 - ориг. производитель 5 - ориг. страна Запускает цепочку апдейтов. При изменении wares проверяются дубли, и, в случае нахождения, правятся партии */ if (new.vtype=0) then update wares set name_id=new.id where name_id=:id; else if (new.vtype=3) then update wares set izg_id=new.id where izg_id=:id; else if (new.vtype=2) then update wares set country_id=new.id where country_id=:id; else if (new.vtype=1) then update wares set orig_name_id=new.id where orig_name_id=:id; else if (new.vtype=6) then update wares set orig_izg_id=new.id where orig_izg_id=:id; else if (new.vtype=5) then update wares set orig_country_id=new.id where orig_country_id=:id; else exit; insert into vals_carantine (cur_id, new_id) values (:id, new.id); delete from vals where id=:id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger wares_biu_cowa for wares active before insert or update position 0 AS declare variable cur_id type of DM_UUID; begin cur_id=null; select d$uuid from wares where NAME_ID=new.name_id and IZG_ID=new.izg_id and COUNTRY_ID=new.COUNTRY_ID and BARCODE=new.BARCODE and d$uuid<>new.d$uuid into :cur_id; if (cur_id is null) then exit; if (not exists(select id from wares_log where id=:cur_id and actual_ware_id=new.id)) then begin update wares_log set ACTUAL_WARE_ID=new.d$uuid where ACTUAL_WARE_ID=:cur_id; insert into wares_log (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,ACTUAL_WARE_ID) select ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,new.d$uuid from wares where d$uuid=:cur_id; -- values (new.ID,new.NAME_ID,new.IZG_ID,new.COUNTRY_ID,new.ORIG_CODE,new.ORIG_NAME_ID,new.ORIG_IZG_ID,new.ORIG_COUNTRY_ID,new.BARCODE,new.Z_ID,new.SKLAD_ID,new.INSERTDT,new.PACKET,new.L_ID,new.d$uuid); end update parts set ware_id=new.d$uuid where ware_id=:cur_id; delete from wares where d$uuid=:cur_id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger parts_biu_cowa for parts active before insert or update position 0 AS declare variable ware_id type of DM_UUID; begin if (exists(select id from wares where id=new.ware_id)) then exit; select max(actual_ware_id) from wares_log where id=new.ware_id and (exists(select id from wares w where w.d$uuid=actual_ware_id)) into :ware_id; if (ware_id is null) then exit; -- if (exists(select id from wares where d$uuid=:ware_id)) then new.ware_id=:ware_id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure UTPR_REMOVE_TILDA ( SVALUE type of DM_TEXT) returns ( S type of DM_TEXT) as declare variable TILDA type of DM_TEXT; declare variable C char(10); begin s=:svalue; if (svalue not starting with '~') then begin suspend; exit; end tilda=''; if (svalue starting with '~100') then begin s=substring(svalue from 5 for 245); tilda='100'; end else begin c=substring(svalue from 3 for 1); if (c in ('0','1','2','3','4','5','6','7','8','9')) then begin s=substring(svalue from 4 for 245); tilda=substring(svalue from 2 for 2); end else begin s=substring(svalue from 3 for 245); tilda=substring(svalue from 2 for 1); end c=substring(s from 1 for 1); if (c='@') then begin s=substring(s from 2); end end suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure UTPR_BUBBLE_SORT ( SOURCE DM_TEXT) returns ( S DM_TEXT) as declare variable C1 char(1); declare variable L integer; declare variable I integer; declare variable SWAPPED integer; declare variable J integer; declare variable C2 char(1); declare variable B char(1); begin l=char_length(source); i=0; s=source; while (i<=l) do begin i=i+1; j=0; swapped=0; while (j<=l-i-1) do begin j=j+1; c1=substring(s from j for 1); c2=substring(s from j+1 for 1); if (c1>c2) then begin b=c1; s=substring(s from 1 for j - 1) || c2 || c1 || substring(s from j + 2); swapped=1; end end if (swapped=0) then break; end suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure UTPR_CHARSONLY ( SOURCE type of DM_TEXT, SORTED integer = 0) returns ( S DM_TEXT) as declare variable C char(1); declare variable L integer; declare variable I integer; declare variable V integer; begin l=char_length(source); i=1; s=''; while (i<=l) do begin c=substring(source from i for 1); v=ascii_val(c); if (((v>47) and (v<58)) or ((v>64) and (v<91)) or ((v>96) and (v<123)) or (v>191)) then s=s||c; i=i+1; end if (sorted=1) then select s from UTPR_BUBBLE_SORT(:s) into :s; suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure PR_TMP_COMPRESS_VALS as declare variable UVALUE type of DM_TEXT; declare variable VTYPE type of DM_STATUS; declare variable ID type of DM_UUID; declare variable W_CNT type of DM_STATUS; declare variable T_CNT type of DM_STATUS; declare variable T_ID type of DM_UUID; begin -- update vals set uppervalue=upper(trim((select s from UTPR_REMOVE_TILDA(svalue)))), isactual=0; update vals set uppervalue=(select s from UTPR_CHARSONLY(upper(trim((select s from UTPR_REMOVE_TILDA(svalue)))),1)), isactual=0; -- for select uppervalue, vtype from vals where vtype in (0,3,2) and svalue<>'' group by vtype, uppervalue having count(1)>1 into uvalue, vtype do for select uppervalue, vtype from vals where vtype in (0,3,2) group by vtype, uppervalue having count(1)>1 into uvalue, vtype do begin T_CNT=0; t_id=null; for select id from vals where vtype=:vtype and uppervalue=:uvalue into id do begin if (vtype=0) then select count(1) from wares where name_id=:id into :w_cnt; else if (vtype=3) then select count(1) from wares where izg_id=:id into :w_cnt; else if (vtype=2) then select count(1) from wares where country_id=:id into :w_cnt; if (t_cnt<w_cnt) then begin t_cnt=w_cnt; t_id=:id; end update vals set isactual=:w_cnt where id=:id; end if (t_id is not null) then begin for select id from vals where vtype=:vtype and uppervalue=:uvalue and id<>:t_id into id do begin if (vtype=0) then begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where name_id=:id; update wares set name_id=:t_id where name_id=:id; end else if (vtype=3) then begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where izg_id=:id; update wares set izg_id=:t_id where izg_id=:id; end else if (vtype=2) then begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where country_id=:id; update wares set country_id=:t_id where country_id=:id; end end end end end^ SET TERM ; ^ CREATE INDEX VALS_IDX_COWA_TMP ON VALS (VTYPE, UPPERVALUE); execute procedure PR_TMP_COMPRESS_VALS; commit work; SET TERM ^ ; CREATE OR ALTER procedure PR_TMP_APPLY_VALS_LINKS as declare variable RIGHT_ID type of DM_UUID; declare variable WRONG_ID type of DM_UUID; begin for select vl.right_val_id, vl.wrong_val_id from vals_links vl where vtype=0 into right_id, wrong_id do begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where name_id=:wrong_id; update wares set name_id=:right_id where name_id=:wrong_id; end for select vl.right_val_id, vl.wrong_val_id from vals_links vl where vtype=3 into right_id, wrong_id do begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where izg_id=:wrong_id; update wares set izg_id=:right_id where izg_id=:wrong_id; end for select vl.right_val_id, vl.wrong_val_id from vals_links vl where vtype=2 into right_id, wrong_id do begin insert into TMP_UPDATED_WARES (uuid) select d$uuid from wares where country_id=:wrong_id; update wares set country_id=:right_id where country_id=:wrong_id; end end^ SET TERM ; ^ execute procedure PR_TMP_APPLY_VALS_LINKS; commit work; DROP TRIGGER WARES_LOG_BI_TMP; ALTER TRIGGER WARES_AU0 INACTIVE; ALTER TRIGGER WARES_AIU0 INACTIVE; ALTER TRIGGER VALS_AIU0 INACTIVE; ALTER TRIGGER WARES_LOG_BI_DISTR ACTIVE; ALTER TRIGGER WARES_LOG_BU_DISTR ACTIVE; ALTER TRIGGER WARES_LOG_AD_DISTR ACTIVE; ALTER TRIGGER WARES_AD_DISTR ACTIVE; ALTER TRIGGER PARTS_AU0 ACTIVE;
Для связывания по ШК выполняем cowa_bcode_links.sql (не оптимизирован для ЙО)
/******************************************************************************/ /*** Generated by IBExpert 19.08.2016 13:46:31 ***/ /******************************************************************************/
/******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3;
/******************************************************************************/ /*** Tables ***/ /******************************************************************************/
CREATE GENERATOR GEN_BARCODE_WARE_ID;
CREATE TABLE BARCODE_WARE (
WARE_ID DM_UUID NOT NULL, BARCODE DM_TEXT, ID DM_ID NOT NULL, NAME_ID DM_UUID, IZG_ID DM_UUID, COUNTRY_ID DM_UUID, SNAME DM_TEXT, SIZG DM_TEXT, SCOUNTRY DM_TEXT
);
/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/
ALTER TABLE BARCODE_WARE ADD CONSTRAINT PK_BARCODE_WARE PRIMARY KEY (ID);
/******************************************************************************/
/*** Indices ***/
/******************************************************************************/
CREATE INDEX BARCODE_WARE_IDX1 ON BARCODE_WARE (NAME_ID); CREATE INDEX BARCODE_WARE_IDX2 ON BARCODE_WARE (IZG_ID); CREATE INDEX BARCODE_WARE_IDX3 ON BARCODE_WARE (COUNTRY_ID);
/******************************************************************************/
/*** Triggers ***/
/******************************************************************************/
SET TERM ^ ;
/******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/
/* Trigger: BARCODE_WARE_BI */ CREATE OR ALTER TRIGGER BARCODE_WARE_BI FOR BARCODE_WARE ACTIVE BEFORE INSERT POSITION 0 as begin
if (new.id is null) then new.id = gen_id(gen_barcode_ware_id,1); select svalue from vals where id=new.name_id into new.sname; select svalue from vals where id=new.izg_id into new.sizg; select svalue from vals where id=new.country_id into new.scountry;
end ^
SET TERM ; ^
/******************************************************************************/ /*** Privileges ***/ /******************************************************************************/
SET TERM ^ ;
CREATE OR ALTER procedure UTPR_EXPLODE (
SOURCE type of DM_BLOBTEXT, SEPARATOR type of DM_TEXT)
returns (
S type of DM_TEXT)
as declare variable I integer; declare variable L integer; declare variable O integer; begin
o=1; l=char_length(separator); i=position(SEPARATOR,SOURCE); while (i>0) do begin s=substring(source from o for i-o); suspend; o=i+1; i=position(SEPARATOR,SOURCE,o); end s=substring(source from o for char_length(source)); suspend;
end^
SET TERM ; ^
SET TERM ^ ;
CREATE OR ALTER procedure PRCOWA_BARCODE_LINKS as declare variable NAME_ID type of DM_UUID; declare variable IZG_ID type of DM_UUID; declare variable COUNTRY_ID type of DM_UUID; declare variable BARCODE type of DM_TEXT; declare variable ID DM_UUID; declare variable SCOUNTRY DM_TEXT; declare variable SIZG DM_TEXT; begin --заполнение
delete from barcode_ware; for select name_id, izg_id, country_id, barcode, id from wares where barcode<> and barcode is not null into name_id, izg_id, country_id, barcode, :id do begin for select trim(s) from UTPR_EXPLODE(:barcode,',') into :barcode do begin if (barcode<>) then insert into barcode_ware (ware_id, barcode, name_id, izg_id, country_id) values (:id,:barcode,:name_id, :izg_id, :country_id); end end
-- обработка
for select barcode, name_id, --count(1) as total--, count(distinct izg_id) as izg, count(distinct country_id) as country max(sizg) as sizg, max(scountry) as scountry
-- from barcode_ware group by barcode, name_id having ((count(1)>count(distinct izg_id)) and count(distinct izg_id)>1) or ((count(1)>count(distinct country_id)) and count(distinct country_id)>1)
from barcode_ware group by barcode, name_id having (count(distinct izg_id)>1) or (count(distinct country_id)>1) into barcode, name_id, sizg, scountry do begin if (trim(sizg)<>) then begin izg_id=null; select id from vals where svalue=:sizg and vtype=3 into :izg_id; for select ware_id from barcode_ware where barcode=:barcode and name_id=:name_id and sizg= into :id do begin update wares set izg_id=:izg_id where id=:id; insert into TMP_UPDATED_WARES(uuid) values (:id); end end if (trim(scountry)<>) then begin country_id=null; select id from vals where svalue=:scountry and vtype=2 into :country_id; for select ware_id from barcode_ware where barcode=:barcode and name_id=:name_id and scountry= into :id do begin update wares set country_id=:country_id where id = :id; insert into TMP_UPDATED_WARES(uuid) values (:id); end end end
end^
SET TERM ; ^
ALTER TRIGGER WARES_LOG_BI_DISTR INACTIVE; ALTER TRIGGER WARES_LOG_BU_DISTR INACTIVE; ALTER TRIGGER WARES_BI_DODOUBLES INACTIVE; ALTER TRIGGER WARES_AD_DISTR INACTIVE; ALTER TRIGGER PARTS_BIU0_SAGENT INACTIVE; ALTER TRIGGER PARTS_BU_SRVSYNC INACTIVE; ALTER TRIGGER PARTS_AU0 INACTIVE;
SET TERM ^ ;
CREATE OR ALTER trigger wares_log_bi_tmp for wares_log active before insert position 0 AS begin
if (new.log_id is null) then new.log_id=UUID_TO_CHAR(GEN_UUID()); new.d$uuid=new.log_id; if (new.d$srvupddt is null) then begin new.d$srvupddt='2000-01-01'; end if (new.l_id is null) then new.l_id=GEN_ID(GEN_WARES_LOG_ID,1); new.log_insertdt=current_timestamp;
end^
SET TERM ; ^
execute procedure PRCOWA_BARCODE_LINKS;
commit work;
DROP TRIGGER WARES_LOG_BI_TMP; ALTER TRIGGER WARES_LOG_BI_DISTR ACTIVE; ALTER TRIGGER WARES_LOG_BU_DISTR ACTIVE; ALTER TRIGGER WARES_BI_DODOUBLES ACTIVE; ALTER TRIGGER WARES_AD_DISTR ACTIVE; ALTER TRIGGER PARTS_BIU0_SAGENT ACTIVE; ALTER TRIGGER PARTS_BU_SRVSYNC ACTIVE; ALTER TRIGGER PARTS_AU0 ACTIVE;
Проверяем работу, смотрим сколько записей добавилось в g$distribute - могут добавится немного записей и только по таблицам wares и wares_log
Экспорт как insert скрипт в файл запроса "select * from wares_log wl where wl.actual_ware_id is not null", все строки "commit work" - убираем
Экспрорт как update or insert скрипт в файл запроса "select distinct w.* from TMP_UPDATED_WARES t left join wares w on t.uuid=w.d$uuid where w.d$uuid is not null", все строки "commit work" - убираем
Делаем шаблоны G$TASKS_TMPL по образцу. Заменить data в записях cowa_02XX на файл, созданный в 6м пункте, cowa_08 - на файл 7го пункта
/******************************************************************************/ /*** Generated by IBExpert 25.08.2016 14:49:37 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE TABLE G$TASKS_TMPL ( ID DM_ID NOT NULL, PROFILE_ID DM_ID, TASK_TYPE DM_STATUS, CAPTION DM_TEXT, DATA DM_BLOBTEXT, INSERTDT DM_DATETIME, SENDDT DM_DATETIME, ENDDT DM_DATETIME, ENDFLAG DM_STATUS, ENDTEXT DM_BLOBTEXT, ENDDATA DM_BLOBTEXT, G$PROFILE_ID DM_ID_NULL, D$UUID DM_UUID_NULL, D$SRVUPDDT DM_DATETIME, CHECKPREVTASK DM_STATUS ); /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348162, 0, 0, 'cowa_01', 'SET TERM ^ ; CREATE trigger wares_log_bi_cowatmp for wares_log active before insert position 0 AS begin if (new.sklad_id is null) then new.sklad_id=''''; end^ SET TERM ; ^ CREATE TABLE TMP_LOG ( SKEY DM_TEXT, SVALUE DM_TEXT); ALTER TABLE WARES_LOG ADD ACTUAL_WARE_ID DM_UUID_NULL; CREATE INDEX WARES_LOG_ACTUAL_WARE_ID ON WARES_LOG (ACTUAL_WARE_ID); CREATE GENERATOR GEN_VALS_CARANTINE_ID; CREATE TABLE VALS_CARANTINE ( ID DM_ID NOT NULL, CUR_ID DM_UUID, NEW_ID DM_UUID, INSERTDT DM_DATETIME, FROM_PROFILE_ID DM_ID_NULL ); SET TERM ^ ; CREATE OR ALTER TRIGGER VALS_CARANTINE_BI FOR VALS_CARANTINE ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then new.id = gen_id(gen_vals_carantine_id,1); new.insertdt=current_timestamp; if (new.from_profile_id is null) then select from_profile_id from g$distribute where uuid=new.new_id into new.from_profile_id; end ^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger vals_biu_dodoubles for vals active before insert or update position 0 AS declare variable ID type of DM_UUID; begin select id from vals where VTYPE=new.VTYPE and svalue=new.svalue and ALTTYPE=new.ALTTYPE and d$uuid<>new.d$uuid into :id; if (id is null) then exit; /* 0 - приведенное наименование 3 - приведенный производитель 2 - приведенная страна 1 - ориг. наименование 6 - ориг. производитель 5 - ориг. страна Запускает цепочку апдейтов. При изменении wares проверяются дубли, и, в случае нахождения, правятся партии */ if (new.vtype=0) then update wares set name_id=new.id where name_id=:id; else if (new.vtype=3) then update wares set izg_id=new.id where izg_id=:id; else if (new.vtype=2) then update wares set country_id=new.id where country_id=:id; else if (new.vtype=1) then update wares set orig_name_id=new.id where orig_name_id=:id; else if (new.vtype=6) then update wares set orig_izg_id=new.id where orig_izg_id=:id; else if (new.vtype=5) then update wares set orig_country_id=new.id where orig_country_id=:id; else exit; insert into vals_carantine (cur_id, new_id) values (:id, new.id); delete from vals where id=:id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER TRIGGER WARES_BIU_COWA FOR WARES ACTIVE BEFORE INSERT OR UPDATE POSITION 0 AS declare variable cur_id type of DM_UUID; begin select d$uuid from wares where NAME_ID=new.name_id and IZG_ID=new.izg_id and COUNTRY_ID=new.COUNTRY_ID and BARCODE=new.BARCODE and d$uuid<>new.d$uuid into :cur_id; if (cur_id is null) then exit; if (not exists(select id from wares_log where id=:cur_id and actual_ware_id=new.id)) then begin update wares_log set ACTUAL_WARE_ID=new.d$uuid where ACTUAL_WARE_ID=:cur_id; insert into wares_log (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,ACTUAL_WARE_ID) select ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,new.d$uuid from wares where d$uuid=:cur_id; end update parts set ware_id=new.d$uuid where ware_id=:cur_id; update doc_detail_active set ware_id=new.d$uuid where ware_id=:cur_id; --20160819 А.К. update warebase_distr set ware_id=new.d$uuid where ware_id=:cur_id; update doc_detail_active_treb set ware_id=new.d$uuid where ware_id=:cur_id; update DOC_DETAIL_DELETED set ware_id=new.d$uuid where ware_id=:cur_id; update DOC_DETAIL_VIRTUAL set ware_id=new.d$uuid where ware_id=:cur_id; update WARES_TREB set ware_id=new.d$uuid where ware_id=:cur_id; delete from wares where d$uuid=:cur_id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger parts_biu_cowa for parts active before insert or update position 0 AS declare variable ware_id type of DM_UUID; begin if (exists(select id from wares where id=new.ware_id)) then exit; -- select max(actual_ware_id) from wares_log where id=new.ware_id into :ware_id; select max(actual_ware_id) from wares_log where id=new.ware_id and (exists(select id from wares w where w.d$uuid=actual_ware_id)) into :ware_id; if (ware_id is null) then exit; -- if (exists(select id from wares where d$uuid=:ware_id)) then new.ware_id=:ware_id; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger wares_bd_cowa for wares active before delete position 0 AS declare variable ware_id type of DM_UUID; begin if (not exists (select id from parts where ware_id=old.id)) then exit; -- select max(actual_ware_id) from wares_log where id=old.id into ware_id; select max(actual_ware_id) from wares_log wl where id=old.id and (exists (select id from wares w where w.id=wl.actual_ware_id)) into ware_id; if (ware_id is null) then insert into tmp_log (skey, svalue) values (''Нет ware по acual_ware!'',old.id); else begin update parts set ware_id=:ware_id where ware_id=old.id; --20160819 А.К. update doc_detail_active set ware_id=:ware_id where ware_id=old.id; update warebase_distr set ware_id=:ware_id where ware_id=old.id; update doc_detail_active_treb set ware_id=:ware_id where ware_id=old.id; update DOC_DETAIL_DELETED set ware_id=:ware_id where ware_id=old.id; update DOC_DETAIL_VIRTUAL set ware_id=:ware_id where ware_id=old.id; update WARES_TREB set ware_id=:ware_id where ware_id=old.id; end end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure PR_TMP_CHANGEWARES_CONSTR as declare variable UUID type of DM_UUID; declare variable NAME_ID type of DM_UUID; declare variable IZG_ID type of DM_UUID; declare variable COUNTRY_ID type of DM_UUID; declare variable BARCODE type of DM_TEXT; declare variable ACTUAL_UUID type of DM_UUID; declare variable EXISTING_ACTUAL_WARE_ID type of DM_UUID; begin -- delete from wares_log wl where (ACTUAL_WARE_ID is null) and (not exists (select id from wares w where w.id=wl.id)); for select min(d$uuid), name_id, izg_id, country_id, barcode from wares group by name_id, izg_id, country_id, barcode having count(1)>1 into actual_uuid, name_id, izg_id, country_id, barcode do begin EXISTING_ACTUAL_WARE_ID=null; select max(actual_ware_id) from wares_log where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and barcode=:barcode into EXISTING_ACTUAL_WARE_ID; if (EXISTING_ACTUAL_WARE_ID is not null) then begin if (exists (select id from wares where d$uuid=:existing_actual_ware_id)) then actual_uuid=EXISTING_ACTUAL_WARE_ID; end for select d$uuid from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and barcode=:barcode and d$uuid<>:actual_uuid into uuid do begin insert into wares_log (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,ACTUAL_WARE_ID,d$srvupddt) select ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID,INSERTDT,PACKET,L_ID,:actual_uuid, current_timestamp from wares where d$uuid=:uuid; --на триггере update parts set ware_id=:actual_uuid where ware_id=:uuid; delete from wares where d$uuid=:uuid; end end end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger wares_log_ai_cowatmp for wares_log active after insert position 0 AS begin if (new.actual_ware_id is null) then exit; if (exists(select id from wares where id=new.actual_ware_id)) then delete from wares where id=new.id; else insert into tmp_log (skey,svalue) values (''WARES_LOG_AI_COWATMP'',new.actual_ware_id); end^ SET TERM ; ^ ALTER TRIGGER WARES_AD_DISTR INACTIVE; ALTER TRIGGER WARES_BU_DISTR INACTIVE; ALTER TRIGGER WARES_LOG_BI_DISTR INACTIVE; ALTER TRIGGER WARES_LOG_AI0 INACTIVE; ALTER TRIGGER PARTS_AU0 INACTIVE; ALTER TRIGGER PARTS_BU_DISTR INACTIVE; ALTER TRIGGER PARTS_BU_G$SYNC INACTIVE; ALTER TRIGGER PARTS_BU0 INACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348163, 0, 0, 'cowa_02', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348164, 0, 0, 'cowa_03', 'ALTER TRIGGER PARTS_BU_DISTR ACTIVE; ALTER TRIGGER PARTS_BU_G$SYNC ACTIVE; ALTER TRIGGER PARTS_BU0 ACTIVE; ALTER TRIGGER WARES_LOG_BI_DISTR ACTIVE; ALTER TRIGGER WARES_AD_DISTR ACTIVE; ALTER TRIGGER WARES_BU_DISTR ACTIVE; CREATE INDEX WARES_IDX_U ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,BARCODE); ALTER TABLE WARES DROP CONSTRAINT UNQ1_WARES; ALTER TABLE WARES DROP CONSTRAINT WARES_IDX1; CREATE INDEX WARES_IDX1 ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID); DROP TRIGGER wares_log_bi_cowatmp; ALTER TRIGGER WARES_AU0 INACTIVE; ALTER TRIGGER WARES_BU0 INACTIVE; ALTER TRIGGER WARES_BIU_COWA INACTIVE; ALTER TRIGGER WARES_SNAME_BU0 INACTIVE; ALTER TRIGGER WARES_BU_DISTR INACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348165, 0, 0, 'cowa_04', 'update wares set barcode='''' where barcode is null;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348166, 0, 0, 'cowa_05', 'ALTER TRIGGER WARES_BU0 ACTIVE; ALTER TRIGGER WARES_BIU_COWA ACTIVE; ALTER TRIGGER WARES_SNAME_BU0 ACTIVE; ALTER TRIGGER WARES_BU_DISTR ACTIVE; CREATE UNIQUE INDEX WARES_IDX_UUID ON WARES (D$UUID); ALTER TRIGGER WARES_AD_DISTR INACTIVE; ALTER TRIGGER PARTS_BU_DISTR INACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348167, 0, 0, 'cowa_06', 'execute procedure PR_TMP_CHANGEWARES_CONSTR;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348168, 0, 0, 'cowa_07', 'DROP INDEX WARES_IDX_U; CREATE UNIQUE INDEX WARES_IDX_U ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,BARCODE); DROP TRIGGER WARES_LOG_AI_COWATMP; DROP INDEX WARES_IDX100;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348169, 0, 0, 'cowa_08', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348170, 0, 0, 'cowa_09', 'execute procedure DBGPR_MAKEWAREBASEFROMDOCS(0);', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348171, 0, 0, 'cowa_10', 'ALTER TRIGGER PARTS_BU_DISTR ACTIVE; ALTER TRIGGER WARES_AD_DISTR ACTIVE; ALTER TRIGGER WARES_AU0 ACTIVE; ALTER TRIGGER WARES_LOG_AI0 ACTIVE; ALTER TRIGGER PARTS_AU0 ACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348172, 0, 0, 'cowa_1_whash', 'SET TERM ^ ; CREATE OR ALTER procedure PR_GET_WARES_HASH ( NAME_ID DM_UUID_NULL, IZG_ID DM_UUID_NULL, COUNTRY_ID DM_UUID_NULL, BARCODE DM_TEXT) returns ( WHASH DM_ID) as begin if (exists(select RDB$INDEX_NAME from RDB$INDEX_SEGMENTS ris where ris.rdb$index_name=''WARES_IDX_U'' and ris.rdb$field_name = ''BARCODE'')) then whash = hash(coalesce(:NAME_ID,''NAME_ID'')||coalesce(:IZG_ID,''IZG_ID'')||coalesce(:COUNTRY_ID,''COUNTRY_ID'')||coalesce(:BARCODE, '''')); else whash = hash(coalesce(:NAME_ID,''NAME_ID'')||coalesce(:IZG_ID,''IZG_ID'')||coalesce(:COUNTRY_ID,''COUNTRY_ID'')); suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure PR_GETWARE_BY_IDS ( NAME_ID type of DM_UUID_NULL, IZG_ID type of DM_UUID_NULL, COUNTRY_ID type of DM_UUID_NULL, ORIG_CODE type of DM_TEXT, ORIG_NAME_ID type of DM_UUID_NULL, ORIG_IZG_ID type of DM_UUID_NULL, ORIG_COUNTRY_ID type of DM_UUID_NULL, DOINSERT type of DM_STATUS, SEARCHINLOGS type of DM_STATUS, BARCODE DM_TEXT) returns ( WARE_ID type of DM_UUID_NULL) as declare variable WHASH DM_ID; begin if (orig_code is null) then orig_code=''''; if (searchinlogs is null) then searchinlogs=0; if (searchinlogs=1) then begin select first 1 id from wares_log where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id and barcode=:barcode into :ware_id; if ((select id from wares where id = :ware_id) is null) then ware_id = null; end else begin --20160805 A.K. select whash from PR_GET_WARES_HASH(:NAME_ID,:IZG_ID,:COUNTRY_ID,:BARCODE) into :whash; select id from wares where whash = :whash into :ware_id; /* select first 1 id from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id and barcode=:barcode into :ware_id; */ end if ((ware_id is null) and (DOINSERT=1) and (searchinlogs<>1)) then begin -- ware_id=gen_id(gen_wares_id,1); ware_id=UUID_TO_CHAR(GEN_UUID()); insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,Z_ID,SKLAD_ID, barcode) values (:ware_id,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,0,'''',:barcode); end suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER procedure PR_GET_WARE ( SNAME type of DM_TEXT, SIZG type of DM_TEXT, SCOUNTRY type of DM_TEXT, ORIG_CODE type of DM_TEXT, SORIG_NAME type of DM_TEXT, SORIG_IZG type of DM_TEXT, SORIG_COUNTRY type of DM_TEXT, BARCODE type of DM_TEXT, Z_ID type of DM_ID, SKLAD_ID DM_TEXT, ALTTYPE DM_STATUS, MNN DM_TEXT = '''') returns ( W_ID type of DM_UUID_NULL) as declare variable OLD_BARCODE DM_TEXT1024; declare variable NAME_ID type of DM_UUID_NULL; declare variable IZG_ID type of DM_UUID_NULL; declare variable COUNTRY_ID type of DM_UUID_NULL; declare variable ORIG_NAME_ID type of DM_UUID_NULL; declare variable ORIG_IZG_ID type of DM_UUID_NULL; declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL; declare variable WHASH DM_ID; begin if (orig_code is null) then orig_code=''''; select val_id from pr_getval_id(:sname,0,:alttype,:mnn) into :name_id; select val_id from pr_getval_id(:sizg,3,:alttype) into :izg_id; select val_id from pr_getval_id(:scountry,2,:alttype) into :country_id; select val_id from pr_getval_id(:sorig_name,1,:alttype) into :orig_name_id; select val_id from pr_getval_id(:sorig_izg,6,:alttype) into :orig_izg_id; select val_id from pr_getval_id(:sorig_country,5,:alttype) into :orig_country_id; --20160805 A.K. select whash from PR_GET_WARES_HASH(:NAME_ID,:IZG_ID,:COUNTRY_ID,:BARCODE) into :whash; select id from wares where whash = :whash into :w_id; /*select id from wares where NAME_ID=:name_id and IZG_ID=:izg_id and COUNTRY_ID=:country_id and ORIG_CODE=:orig_code and ORIG_NAME_ID=:orig_name_id and ORIG_IZG_ID=:orig_izg_id and ORIG_COUNTRY_ID=:orig_country_id and barcode=:barcode into :w_id; */ if (w_id is null) then begin -- exception EX_WRONG_OPER; --w_id=gen_id(gen_wares_id,1); w_id=UUID_TO_CHAR(GEN_UUID()); insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID) values (:W_ID,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,:BARCODE,:Z_ID,:SKLAD_ID); end --else if (old_barcode <> barcode) then update wares set barcode = :barcode where id = :w_id; suspend; end^ SET TERM ; ^ SET TERM ^ ; CREATE OR ALTER trigger wares_hash_bui0 for wares active before insert or update position 0 AS begin select whash from PR_GET_WARES_HASH(new.NAME_ID,new.IZG_ID,new.COUNTRY_ID,new.BARCODE) into new.whash; end^ SET TERM ; ^ ALTER TRIGGER WARES_BU_DISTR INACTIVE; ALTER TRIGGER WARES_SNAME_BU0 INACTIVE; ALTER TRIGGER WARES_BU0 INACTIVE; ALTER TRIGGER WARES_AU0 INACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348173, 0, 0, 'cowa_2_whash', 'update wares set id=id;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348174, 0, 0, 'cowa_3_whash', 'ALTER TRIGGER WARES_BU_DISTR ACTIVE; ALTER TRIGGER WARES_SNAME_BU0 ACTIVE; ALTER TRIGGER WARES_BU0 ACTIVE; ALTER TRIGGER WARES_AU0 ACTIVE; CREATE UNIQUE INDEX WARES_IDX100 ON WARES (WHASH);', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348175, 0, 0, 'cowa_1_recur', 'SET TERM ^ ; CREATE OR ALTER procedure PR_COWA_01 as declare variable I integer; declare variable ACTUAL_WARE_ID type of DM_UUID; declare variable ACTUAL_WARE_ID1 type of DM_UUID; begin i=1; while (i>0) do begin i=0; for select distinct actual_ware_id from wares_log wl where actual_ware_id is not null and not exists (select id from wares w where w.id=wl.actual_ware_id) into :actual_ware_id do begin for select distinct actual_ware_id from wares_log wl where id = :actual_ware_id and actual_ware_id is not null into ACTUAL_WARE_ID1 do begin i=i+1; update wares_log set actual_ware_id=:ACTUAL_WARE_ID1 where actual_ware_id=:ACTUAL_WARE_ID; end end end end^ SET TERM ; ^ ALTER TRIGGER WARES_LOG_BU_DISTR INACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348200, 0, 0, 'cowa_bizon', 'SET TERM ^ ; create or alter procedure PR_AUTO_WARESLINK ( DOC_ID DM_ID_NULL, ACTIVE_ID DM_ID_NULL) as declare variable DDA_BARCODE DM_TEXT1024; declare variable DDA_WARE_ID DM_UUID_NULL; declare variable DDA_ORIG_COUNTRYID DM_UUID_NULL; declare variable DDA_ORIG_IZGID DM_UUID_NULL; declare variable DDA_ORIG_NAMEID DM_UUID_NULL; declare variable DDA_COUNTRY_ID DM_UUID_NULL; declare variable DDA_IZG_ID DM_UUID_NULL; declare variable DDA_NAME_ID DM_UUID_NULL; declare variable DDA_Z_ID DM_UUID_NULL; declare variable DDA_SKLAD_ID DM_UUID_NULL; declare variable DDALOG_BARCODE DM_TEXT1024; declare variable DDALOG_WARE_ID DM_UUID_NULL; declare variable DDALOG_ORIG_COUNTRYID DM_UUID_NULL; declare variable DDALOG_ORIG_IZGID DM_UUID_NULL; declare variable DDALOG_ORIG_NAMEID DM_UUID_NULL; declare variable DDALOG_COUNTRY_ID DM_UUID_NULL; declare variable DDALOG_IZG_ID DM_UUID_NULL; declare variable DDALOG_NAME_ID DM_UUID_NULL; declare variable DDALOG_Z_ID DM_UUID_NULL; declare variable DDALOG_SKLAD_ID DM_UUID_NULL; declare variable DDALOG2_BARCODE DM_TEXT1024; declare variable DDALOG2_WARE_ID DM_UUID_NULL; declare variable DDALOG2_ORIG_COUNTRYID DM_UUID_NULL; declare variable DDALOG2_ORIG_IZGID DM_UUID_NULL; declare variable DDALOG2_ORIG_NAMEID DM_UUID_NULL; declare variable DDALOG2_COUNTRY_ID DM_UUID_NULL; declare variable DDALOG2_IZG_ID DM_UUID_NULL; declare variable DDALOG2_NAME_ID DM_UUID_NULL; declare variable DDALOG2_Z_ID DM_UUID_NULL; declare variable DDALOG2_SKLAD_ID DM_UUID_NULL; begin select bcode_izg, ware_id, (select val_id from PR_GETVAL_ID(dda.sname, 0, dda.part_type)) as name_id, (select val_id from PR_GETVAL_ID(dda.sizg, 3, dda.part_type)) as izg_id, (select val_id from PR_GETVAL_ID(dda.scountry, 2, dda.part_type)) as country_id, (select val_id from PR_GETVAL_ID(dda.sorig_name, 1, dda.part_type)) as orig_name_id, (select val_id from PR_GETVAL_ID(dda.sorig_izg, 6, dda.part_type)) as orgi_izg_id, (select val_id from PR_GETVAL_ID(dda.sorig_country, 5, dda.part_type)) as orig_country_id, Z_ID, SKLAD_ID from doc_detail_active dda where doc_id = :doc_id and id = :active_id into dda_barcode, dda_ware_id, dda_name_id, dda_izg_id, dda_country_id, dda_orig_nameid, dda_orig_izgid, dda_orig_countryid, dda_z_id, dda_sklad_id; select first 1 bcode_izg, ware_id, (select val_id from PR_GETVAL_ID(ddal.sname, 0, ddal.part_type)) as name_id, (select val_id from PR_GETVAL_ID(ddal.sizg, 3, ddal.part_type)) as izg_id, (select val_id from PR_GETVAL_ID(ddal.scountry, 2, ddal.part_type)) as country_id, (select val_id from PR_GETVAL_ID(ddal.sorig_name, 1, ddal.part_type)) as orig_name_id, (select val_id from PR_GETVAL_ID(ddal.sorig_izg, 6, ddal.part_type)) as orgi_izg_id, (select val_id from PR_GETVAL_ID(ddal.sorig_country, 5, ddal.part_type)) as orig_country_id, Z_ID, SKLAD_ID from doc_detail_active_log ddal where doc_id = :doc_id and id = :active_id order by log_id into ddalog_barcode, ddalog_ware_id, ddalog_name_id, ddalog_izg_id, ddalog_country_id, ddalog_orig_nameid, ddalog_orig_izgid, ddalog_orig_countryid, ddalog_z_id, ddalog_sklad_id; select first 1 skip 1 bcode_izg, ware_id, (select val_id from PR_GETVAL_ID(ddal.sname, 0, ddal.part_type)) as name_id, (select val_id from PR_GETVAL_ID(ddal.sizg, 3, ddal.part_type)) as izg_id, (select val_id from PR_GETVAL_ID(ddal.scountry, 2, ddal.part_type)) as country_id, (select val_id from PR_GETVAL_ID(ddal.sorig_name, 1, ddal.part_type)) as orig_name_id, (select val_id from PR_GETVAL_ID(ddal.sorig_izg, 6, ddal.part_type)) as orgi_izg_id, (select val_id from PR_GETVAL_ID(ddal.sorig_country, 5, ddal.part_type)) as orig_country_id, Z_ID, SKLAD_ID from doc_detail_active_log ddal where doc_id = :doc_id and id = :active_id order by log_id into ddalog2_barcode, ddalog2_ware_id, ddalog2_name_id, ddalog2_izg_id, ddalog2_country_id, ddalog2_orig_nameid, ddalog2_orig_izgid, ddalog2_orig_countryid, ddalog2_z_id, ddalog2_sklad_id; if ( ((dda_ware_id <> ''-1'') and (dda_ware_id <> ''0'') and (dda_ware_id is not null)) and ((ddalog2_ware_id <> ''-1'') and (ddalog2_ware_id <> ''0'') and (ddalog2_ware_id is not null)) and (dda_barcode = ddalog2_barcode) and (dda_ware_id <> ddalog2_ware_id) ) then begin update wares set name_id = :dda_name_id, izg_id = :dda_izg_id, country_id = :dda_country_id, orig_name_id = :dda_orig_nameid, orig_izg_id = :dda_orig_izgid, orig_country_id = :dda_orig_countryid, barcode = :dda_barcode where id = :ddalog2_ware_id; exit; end if ( (ddalog_ware_id = ''0'') or (ddalog_ware_id = ''-1'') or (ddalog_ware_id is null) ) then begin insert into wares_log (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE, Z_ID, SKLAD_ID) values (:dda_ware_id, :ddalog_name_id, :ddalog_izg_id, :ddalog_country_id, :ddalog_orig_nameid, :ddalog_orig_izgid, :ddalog_orig_countryid, :ddalog_barcode, :ddalog_z_id, :ddalog_sklad_id); end else if ( ((dda_ware_id <> ''0'') and (dda_ware_id <> ''-1'') and (dda_ware_id is not null)) and ((dda_name_id <> ddalog_name_id) or (dda_izg_id <> ddalog_izg_id) or (dda_country_id <> ddalog_country_id) or (dda_orig_nameid <> ddalog_orig_nameid) or (dda_orig_izgid <> ddalog_orig_izgid) or (dda_orig_countryid <> ddalog_orig_countryid)) and (dda_barcode = ddalog_barcode) ) then begin update wares set name_id = :dda_name_id, izg_id = :dda_izg_id, country_id = :dda_country_id, orig_name_id = :dda_orig_nameid, orig_izg_id = :dda_orig_izgid, orig_country_id = :dda_orig_countryid, barcode = :dda_barcode where id = :ddalog_ware_id; end end;^ create or alter procedure PR_MAKEGOODWAREVALUES ( SNAME type of DM_TEXT, SORIG_NAME type of DM_TEXT, SIZG type of DM_TEXT, SORIG_IZG type of DM_TEXT, SCOUNTRY type of DM_TEXT, SORIG_COUNTRY type of DM_TEXT, ORIG_CODE type of DM_TEXT, ACTIVE_ID type of DM_ID, ALTTYPE DM_STATUS, BARCODE DM_TEXT1024 = '''') returns ( GOODNAME type of DM_TEXT, GOODIZG type of DM_TEXT, GOODCOUNTRY type of DM_TEXT, GOODBARCODE DM_TEXT) as declare variable WARE_ID type of DM_UUID_NULL; declare variable NAME_ID type of DM_UUID_NULL; declare variable ORIG_NAME_ID type of DM_UUID_NULL; declare variable IZG_ID type of DM_UUID_NULL; declare variable ORIG_IZG_ID type of DM_UUID_NULL; declare variable COUNTRY_ID type of DM_UUID_NULL; declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL; begin /* select val_id from pr_getval_id(:sname,0,:alttype) into :name_id; select val_id from pr_getval_id(:sorig_name,1,:alttype) into :orig_name_id; select val_id from pr_getval_id(:sizg,3,:alttype) into :izg_id; select val_id from pr_getval_id(:sorig_izg,6,:alttype) into :orig_izg_id; select val_id from pr_getval_id(:scountry,2,:alttype) into :country_id; select val_id from pr_getval_id(:sorig_country,5,:alttype) into :orig_country_id; */ select id from vals where vtype=0 and alttype=:alttype and svalue=:sname into :name_id; select id from vals where vtype=1 and alttype=:alttype and svalue=:sorig_name into :orig_name_id; select id from vals where vtype=3 and alttype=:alttype and svalue=:sizg into :izg_id; select id from vals where vtype=6 and alttype=:alttype and svalue=:sorig_izg into :orig_izg_id; select id from vals where vtype=2 and alttype=:alttype and svalue=:scountry into :country_id; select id from vals where vtype=5 and alttype=:alttype and svalue=:sorig_country into :orig_country_id; select ware_id from PR_GETWARE_BY_IDS(:name_id,:izg_id,:country_id,:orig_code,:orig_name_id,:orig_izg_id,:orig_country_id,0,1, :barcode) into :ware_id; if (ware_id is not null) then begin --select actualware_id from PR_GETACTUALWAREID(:ware_id) into :ware_id; select sname, sizg, scountry, barcode from VW_WARES where id=:ware_id into :goodname, :goodizg, :goodcountry, :goodbarcode; -- if ((active_id>0) and ((goodname<>sname) or (goodizg<>sizg) or (goodcountry<>scountry))) then -- insert into doc_detail_active_log(id,sname,sizg,scountry,part_type) values (:active_id,:sname,:sizg,:scountry,:alttype); --goodname=''2'';--sname; if (goodname is null) then goodname = sname; if (goodizg is null) then goodizg = sizg; if (goodcountry is null) then goodcountry = scountry; if (goodname is null) then goodname = sorig_name; if (goodizg is null) then goodizg = sorig_izg; if (goodcountry is null) then goodcountry = sorig_country; if (goodbarcode is null) then goodbarcode = barcode; suspend; exit; end select ware_id from PR_GETWARE_BY_IDS(:name_id,:izg_id,:country_id,:orig_code,:orig_name_id,:orig_izg_id,:orig_country_id,0,null, :barcode) into :ware_id; if (ware_id is not null) then begin --select actualware_id from PR_GETACTUALWAREID(:ware_id) into :ware_id; --goodname=''1'';--sname; goodname=sname; goodizg=sizg; goodcountry=scountry; goodbarcode=barcode; suspend; exit; end ware_id=null; if (orig_name_id is not null) then begin select first 1 id from wares where orig_name_id=:orig_name_id order by INSERTDT desc into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where orig_name_id=:orig_name_id order by LOG_INSERTDT desc into :ware_id; end if ((ware_id is null) and (name_id is not null)) then begin select first 1 id from wares where name_id=:name_id into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where name_id=:name_id order by LOG_INSERTDT desc into :ware_id; end if (ware_id is null) then begin --goodname=''3'';--sname; goodname=sname; name_id=null; end else begin --select actualware_id from PR_GETACTUALWAREID(:ware_id) into :ware_id; select w.name_id, v.svalue from WARES w left join vals v on w.name_id=v.id where w.id=:ware_id into :name_id, :goodname; end ware_id=null; if (orig_izg_id is not null) then begin select first 1 id from wares where orig_izg_id=:orig_izg_id into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where orig_izg_id=:orig_izg_id order by LOG_INSERTDT desc into :ware_id; end if ((ware_id is null) and (izg_id is not null)) then begin select first 1 id from wares where izg_id=:izg_id into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where izg_id=:izg_id order by LOG_INSERTDT desc into :ware_id; end if (ware_id is null) then goodizg=sizg; else begin --select actualware_id from PR_GETACTUALWAREID(:ware_id) into :ware_id; select w.izg_id, v.svalue from WARES w left join vals v on w.izg_id=v.id where w.id=:ware_id into :izg_id, :goodizg; end ware_id=null; if (orig_country_id is not null) then begin select first 1 id from wares where orig_country_id=:orig_country_id into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where orig_country_id=:orig_country_id order by LOG_INSERTDT desc into :ware_id; end if ((ware_id is null) and (country_id is not null)) then begin select first 1 id from wares where country_id=:country_id into :ware_id; if (ware_id is null) then select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where country_id=:country_id order by LOG_INSERTDT desc into :ware_id; end if (ware_id is null) then goodcountry=scountry; else begin --select actualware_id from PR_GETACTUALWAREID(:ware_id) into :ware_id; select w.country_id, v.svalue from WARES w left join vals v on w.country_id=v.id where w.id=:ware_id into :country_id, :goodcountry; end -- if ((active_id>0) and ((goodname<>sname) or (goodizg<>sizg) or (goodcountry<>scountry))) then -- insert into doc_detail_active_log(id,sname,sizg,scountry, part_type) values (:active_id,:sname,:sizg,:scountry,:alttype); --goodname=''3''; goodbarcode=barcode; if (goodname is null) then goodname = sname; if (goodizg is null) then goodizg = sizg; if (goodcountry is null) then goodcountry = scountry; if (goodname is null) then goodname = sorig_name; if (goodizg is null) then goodizg = sorig_izg; if (goodcountry is null) then goodcountry = sorig_country; suspend; end^ create or alter procedure PR_GET_WARE ( SNAME type of DM_TEXT, SIZG type of DM_TEXT, SCOUNTRY type of DM_TEXT, ORIG_CODE type of DM_TEXT = '''', SORIG_NAME type of DM_TEXT = '''', SORIG_IZG type of DM_TEXT = '''', SORIG_COUNTRY type of DM_TEXT = '''', BARCODE type of DM_TEXT = '''', Z_ID type of DM_ID = 0, SKLAD_ID DM_TEXT = '''', ALTTYPE DM_STATUS = 0, MNN DM_TEXT = '''') returns ( W_ID type of DM_UUID_NULL) as declare variable NAME_ID type of DM_UUID_NULL; declare variable IZG_ID type of DM_UUID_NULL; declare variable COUNTRY_ID type of DM_UUID_NULL; declare variable ORIG_NAME_ID type of DM_UUID_NULL; declare variable ORIG_IZG_ID type of DM_UUID_NULL; declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL; begin select VAL_ID from PR_GETVAL_ID(:SNAME, 0, :ALTTYPE, :MNN) into :NAME_ID; select VAL_ID from PR_GETVAL_ID(:SIZG, 3, :ALTTYPE) into :IZG_ID; select VAL_ID from PR_GETVAL_ID(:SCOUNTRY, 2, :ALTTYPE) into :COUNTRY_ID; select val_id from pr_getval_id(:sorig_name,1,:alttype) into :orig_name_id; select val_id from pr_getval_id(:sorig_izg,6,:alttype) into :orig_izg_id; select val_id from pr_getval_id(:sorig_country,5,:alttype) into :orig_country_id; /* select first 1 id from wares where NAME_ID=:name_id and IZG_ID=:izg_id and COUNTRY_ID=:country_id and ORIG_CODE=:orig_code and ORIG_NAME_ID=:orig_name_id and ORIG_IZG_ID=:orig_izg_id and ORIG_COUNTRY_ID=:orig_country_id -- into :w_id; and barcode=:barcode into :w_id; */ select ID from WARES where NAME_ID = :NAME_ID and IZG_ID = :IZG_ID and COUNTRY_ID = :COUNTRY_ID and BARCODE = :BARCODE into :W_ID; if (W_ID is null) then begin -- exception EX_WRONG_OPER; --w_id=gen_id(gen_wares_id,1); W_ID = uuid_to_char(gen_uuid()); insert into WARES (ID, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, BARCODE, Z_ID, SKLAD_ID) values (:W_ID, :NAME_ID, :IZG_ID, :COUNTRY_ID, :ORIG_CODE, :ORIG_NAME_ID, :ORIG_IZG_ID, :ORIG_COUNTRY_ID, :BARCODE, :Z_ID, :SKLAD_ID); end suspend; end;^ create or alter procedure PR_GETWARE_BY_IDS ( NAME_ID type of DM_UUID_NULL, IZG_ID type of DM_UUID_NULL, COUNTRY_ID type of DM_UUID_NULL, ORIG_CODE type of DM_TEXT, ORIG_NAME_ID type of DM_UUID_NULL, ORIG_IZG_ID type of DM_UUID_NULL, ORIG_COUNTRY_ID type of DM_UUID_NULL, DOINSERT type of DM_STATUS, SEARCHINLOGS type of DM_STATUS, BARCODE DM_TEXT) returns ( WARE_ID type of DM_UUID_NULL) as begin if (orig_code is null) then orig_code=''''; if (searchinlogs is null) then searchinlogs=0; if (searchinlogs=1) then begin select first 1 iif(actual_ware_id is null, id, actual_ware_id) from wares_log where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and barcode=:barcode order by log_insertdt desc into :ware_id; end else begin select first 1 id from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and barcode=:barcode into :ware_id; end if ((ware_id is null) and (DOINSERT=1) and (searchinlogs<>1)) then begin -- ware_id=gen_id(gen_wares_id,1); ware_id=UUID_TO_CHAR(GEN_UUID()); insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,Z_ID,SKLAD_ID, barcode) values (:ware_id,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,0,'''',:barcode); end suspend; end;^ create or alter procedure PR_DOC_COMMIT ( DOC_ID type of DM_ID, SESSION_ID type of DM_ID) as declare variable WRONG_WARES DM_STATUS; declare variable BASE_TYPE type of DM_STATUS; declare variable SUMMA type of DM_DOUBLE; declare variable SUMMA_O type of DM_DOUBLE; declare variable SUM_NDSO type of DM_DOUBLE; declare variable DSCSUMMA type of DM_DOUBLE; declare variable SUM_DSC type of DM_DOUBLE; declare variable PRICE_TYPE DM_STATUS; declare variable CONTRACT_ID DM_ID; declare variable W_PARAM DM_STATUS; declare variable WARES_MODE DM_STATUS; begin select DT.BASE_TYPE, D.PRICE_TYPE, D.CONTRACT_ID from DOCS D left join DOC_TYPES DT on D.DOC_TYPE = DT.ID where D.ID = :DOC_ID into :BASE_TYPE, :PRICE_TYPE, :CONTRACT_ID; if (BASE_TYPE in (1, 3, 6, 8)) then begin wrong_wares = 0; wares_mode = 1; select PARAM_VALUE from PR_GETPARAMVALUE(''WARES_MODE'', 0) into wares_mode; if (wares_mode = 0) then begin select count(id) from doc_detail_active where doc_id = :doc_id and ((ware_id = ''0'') or (ware_id = ''-1'') or (ware_id = '''')) into wrong_wares; if (wrong_wares > 0) then exception EX_WRONG_OPER; end execute procedure PR_DOC_PRIHOD_COMMIT(:DOC_ID, 0); end else if (BASE_TYPE in (2, 7, 9)) then execute procedure PR_DOC_RASHOD_COMMIT(:DOC_ID, 0); else exception EX_WRONGDOC_BASE_TYPE; delete from DOC_DETAIL_ACTIVE where DOC_ID = :DOC_ID; if (BASE_TYPE = 3) then begin delete from WAREBASE where PART_ID in (select PART_ID from DOC_DETAIL where DOC_ID = :DOC_ID and QUANT < 0 and PART_TYPE = 1); end select sum(SUMMA), sum(SUMMA_O), sum(SUM_NDSO), sum(PRICE * QUANT / 10000), sum(SUM_DSC) from DOC_DETAIL where DOC_ID = :DOC_ID into :SUMMA, :SUMMA_O, :SUM_NDSO, :DSCSUMMA, :SUM_DSC; DSCSUMMA = DSCSUMMA * 10000; update DOCS set COMMITSESSION_ID = :SESSION_ID, STATUS = 1, POSTDT = ''now'', CHECKDATA = (select CHECKDATA from PR_DOCCHECKDATA(:DOC_ID)), SUMMA = :SUMMA, SUMMA_O = :SUMMA_O, SUM_NDSO = :SUM_NDSO, CALCSUMMA = :DSCSUMMA, SUM_DSC = :SUM_DSC, CASHDATA = (iif(:BASE_TYPE = 1, -:SUMMA, null)) where ID = :DOC_ID; execute procedure PR_UPDBLOCKINFO_BY_DOC(:DOC_ID, 1); --if ((base_type = 2) and (contract_id<>0)) then if (CONTRACT_ID <> 0) then begin if (BASE_TYPE = 2) then execute procedure PR_CREDITCOMMIT(:CONTRACT_ID); if (BASE_TYPE in (8, 9)) then execute procedure PR_CREDITREINITCOMMIT(:CONTRACT_ID, :SESSION_ID); -- execute procedure PR_CREDITCOMMIT(:contract_id); end execute procedure PR_DOEVENT(''EV_DOCCOMMIT''); end;^ CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_BI FOR DOC_DETAIL_ACTIVE ACTIVE BEFORE INSERT POSITION 0 as begin --Если в документ ввод услуг вставлять через буфер обмена, то тип строк - товар, а не услуга if ((select dt.base_type from docs d left join doc_types dt on dt.id=d.doc_type where d.id=new.doc_id)=6) then new.part_type=1; if (new.ID is null) then new.ID = gen_id(GEN_DOC_DETAIL_ACTIVE_ID, 1); new.INSERTDT = ''now''; if (new.BASE_AGENT_ID is null) then new.BASE_AGENT_ID = 0; if (new.STATUS is null) then new.STATUS = 0; if (new.PARENT_ID is null) then new.PARENT_ID = 0; if (new.PART_TYPE is null) then new.PART_TYPE = 0; --первая строчка = до привидения, оригианльные значения накладной select first 1 ID from WARES where NAME_ID = new.NAME_ID and IZG_ID = new.IZG_ID and COUNTRY_ID = new.COUNTRY_ID and BARCODE = new.BCODE_IZG into new.WARE_ID; insert into DOC_DETAIL_ACTIVE_LOG (ID, PARENT_ID, DOC_ID, PART_ID, PART_PARENT_ID, DOC_DETAIL_ID, PRICE, NAC, QUANT, DISCOUNT, SUMMA, SUMMA_O, DCARD, WARE_ID, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, BCODE_IZG, GODENDO, SERIA, NDS, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SKLAD_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, SUM_DSC, HUMAN_QUANT, CUSTOMDRAW, PART_TYPE, BASE_AGENT_ID) values (new.ID, new.PARENT_ID, new.DOC_ID, new.PART_ID, new.PART_PARENT_ID, new.DOC_DETAIL_ID, new.PRICE, new.NAC, new.QUANT, new.DISCOUNT, new.SUMMA, new.SUMMA_O, new.DCARD, new.WARE_ID, new.PRICE_O, new.PRICE_Z, new.PRICE_R, new.BARCODE, new.BARCODE1, new.BCODE_IZG, new.GODENDO, new.SERIA, new.NDS, new.SUM_NDSO, new.SERT, new.DATESERT, new.KEMVSERT, new.SDSERT, new.REGN, new.NGTD, new.EDIZM, new.NAME_ID, new.IZG_ID, new.COUNTRY_ID, new.ORIG_CODE, new.ORIG_NAME_ID, new.ORIG_IZG_ID, new.ORIG_COUNTRY_ID, new.Z_ID, new.SKLAD_ID, new.SNAME, new.SIZG, new.SCOUNTRY, new.SORIG_NAME, new.SORIG_IZG, new.SORIG_COUNTRY, new.INSERTDT, new.INFO, new.KOEF, new.MOTHERPART_ID, new.DEP, new.SUM_DSC, new.HUMAN_QUANT, new.CUSTOMDRAW, new.PART_TYPE, new.BASE_AGENT_ID); -- if ((new.PART_ID is null) or (new.PART_ID = 0)) then begin -->cf20110923 --if (new.ware_id<0) then if (new.WARE_ID = ''-1'') then begin select GOODNAME, GOODIZG, GOODCOUNTRY, GOODBARCODE from PR_MAKEGOODWAREVALUES(new.SNAME, new.SORIG_NAME, new.SIZG, new.SORIG_IZG, new.SCOUNTRY, new.SORIG_COUNTRY, new.ORIG_CODE, new.ID, new.PART_TYPE, new.bcode_izg) into new.SNAME, new.SIZG, new.SCOUNTRY, new.BCODE_IZG; end --<cf20110923 new.PART_ID = 0; select ID from VALS where VTYPE = 0 and ALTTYPE = new.PART_TYPE and SVALUE = new.SNAME into new.NAME_ID; select ID from VALS where VTYPE = 3 and ALTTYPE = new.PART_TYPE and SVALUE = new.SIZG into new.IZG_ID; select ID from VALS where VTYPE = 2 and ALTTYPE = new.PART_TYPE and SVALUE = new.SCOUNTRY into new.COUNTRY_ID; select ID from VALS where VTYPE = 1 and ALTTYPE = new.PART_TYPE and SVALUE = new.SORIG_NAME into new.ORIG_NAME_ID; select ID from VALS where VTYPE = 6 and ALTTYPE = new.PART_TYPE and SVALUE = new.SORIG_IZG into new.ORIG_IZG_ID; select ID from VALS where VTYPE = 5 and ALTTYPE = new.PART_TYPE and SVALUE = new.SORIG_COUNTRY into new.ORIG_COUNTRY_ID; new.WARE_ID = 0; select first 1 ID from WARES where NAME_ID = new.NAME_ID and IZG_ID = new.IZG_ID and COUNTRY_ID = new.COUNTRY_ID and BARCODE = new.BCODE_IZG into new.WARE_ID; --вторая строчка = после приведения insert into DOC_DETAIL_ACTIVE_LOG (ID, PARENT_ID, DOC_ID, PART_ID, PART_PARENT_ID, DOC_DETAIL_ID, PRICE, NAC, QUANT, DISCOUNT, SUMMA, SUMMA_O, DCARD, WARE_ID, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, BCODE_IZG, GODENDO, SERIA, NDS, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SKLAD_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, SUM_DSC, HUMAN_QUANT, CUSTOMDRAW, PART_TYPE, BASE_AGENT_ID) values (new.ID, new.PARENT_ID, new.DOC_ID, new.PART_ID, new.PART_PARENT_ID, new.DOC_DETAIL_ID, new.PRICE, new.NAC, new.QUANT, new.DISCOUNT, new.SUMMA, new.SUMMA_O, new.DCARD, new.WARE_ID, new.PRICE_O, new.PRICE_Z, new.PRICE_R, new.BARCODE, new.BARCODE1, new.BCODE_IZG, new.GODENDO, new.SERIA, new.NDS, new.SUM_NDSO, new.SERT, new.DATESERT, new.KEMVSERT, new.SDSERT, new.REGN, new.NGTD, new.EDIZM, new.NAME_ID, new.IZG_ID, new.COUNTRY_ID, new.ORIG_CODE, new.ORIG_NAME_ID, new.ORIG_IZG_ID, new.ORIG_COUNTRY_ID, new.Z_ID, new.SKLAD_ID, new.SNAME, new.SIZG, new.SCOUNTRY, new.SORIG_NAME, new.SORIG_IZG, new.SORIG_COUNTRY, new.INSERTDT, new.INFO, new.KOEF, new.MOTHERPART_ID, new.DEP, new.SUM_DSC, new.HUMAN_QUANT, new.CUSTOMDRAW, new.PART_TYPE, new.BASE_AGENT_ID); -- end if (new.PART_PARENT_ID is null) then new.PART_PARENT_ID = 0; if (new.WARE_ID is null) then new.WARE_ID = 0; if (new.NAME_ID is null) then new.NAME_ID = 0; if (new.IZG_ID is null) then new.IZG_ID = 0; if (new.COUNTRY_ID is null) then new.COUNTRY_ID = 0; if (new.ORIG_NAME_ID is null) then new.ORIG_NAME_ID = 0; if (new.ORIG_IZG_ID is null) then new.ORIG_IZG_ID = 0; if (new.ORIG_COUNTRY_ID is null) then new.ORIG_COUNTRY_ID = 0; if (new.Z_ID is null) then new.Z_ID = 0; if (new.SKLAD_ID is null) then new.SKLAD_ID = ''''; if (new.MOTHERPART_ID is null) then new.MOTHERPART_ID = 0; if (new.DOC_DETAIL_ID is null) then new.DOC_DETAIL_ID = 0; if (new.PART_ID > 0) then -- заполняем значения партии begin select WARE_ID, PRICE, PRICE_O, PRICE_Z, PRICE_R, --QUANT, BARCODE, BARCODE1, --KRITK, GODENDO, SERIA, NDS, --SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, nac, dep, part_type, base_agent_id, group_id, MOTHERPART_UUID from parts where id=new.part_id into new.WARE_ID, new.PRICE, new.PRICE_O, new.PRICE_Z, new.PRICE_R, --new.QUANT, new.BARCODE, new.BARCODE1, --new.KRITK, new.GODENDO, new.SERIA, new.NDS, --new.SUM_NDSO, new.SERT, new.DATESERT, new.KEMVSERT, new.SDSERT, new.REGN, new.NGTD, new.EDIZM, new.nac, new.dep, new.part_type, new.base_agent_id, new.group_id, new.MOTHERPART_UUID; end if (new.GROUP_ID is null) then new.GROUP_ID = 0; --if (new.ware_id>0) then -- заполняем значения позиции if (new.WARE_ID not in (''-1'', ''0'')) then -- заполняем значения позиции begin select WW.NAME_ID, (select SVALUE from VALS where ID = WW.NAME_ID), WW.IZG_ID, (select SVALUE from VALS where ID = WW.IZG_ID), WW.COUNTRY_ID, (select SVALUE from VALS where ID = WW.COUNTRY_ID), WW.ORIG_CODE, WW.ORIG_NAME_ID, (select SVALUE from VALS where ID = WW.ORIG_NAME_ID), WW.ORIG_IZG_ID, (select SVALUE from VALS where ID = WW.ORIG_IZG_ID), WW.ORIG_COUNTRY_ID, (select SVALUE from VALS where ID = WW.ORIG_COUNTRY_ID), WW.BARCODE, WW.Z_ID, WW.SKLAD_ID from WARES WW where WW.ID = new.WARE_ID into new.NAME_ID, new.SNAME, new.IZG_ID, new.SIZG, new.COUNTRY_ID, new.SCOUNTRY, new.ORIG_CODE, new.ORIG_NAME_ID, new.SORIG_NAME, new.ORIG_IZG_ID, new.SORIG_IZG, new.ORIG_COUNTRY_ID, new.SORIG_COUNTRY, new.BCODE_IZG, new.Z_ID, new.SKLAD_ID; end else begin --if (new.ware_id<0) then if (new.WARE_ID = ''-1'') then begin select GOODNAME, GOODIZG, GOODCOUNTRY from PR_MAKEGOODWAREVALUES(new.SNAME, new.SORIG_NAME, new.SIZG, new.SORIG_IZG, new.SCOUNTRY, new.SORIG_COUNTRY, new.ORIG_CODE, new.ID, new.PART_TYPE, new.bcode_izg) into new.SNAME, new.SIZG, new.SCOUNTRY; new.WARE_ID = 0; end end if (new.quant is null) then new.quant=0; if (new.price is null) then new.price=0; if (new.price_o is null) then new.price_o=0; if (new.nds is null) then new.nds=0; if (new.summa is null) then new.summa=new.quant*new.price; if (new.sum_dsc is null) then new.sum_dsc=0; if (new.summa_o is null) then begin new.summa_o=new.quant*new.price_o; end else begin if (new.quant<>0) then new.price_o=new.summa_o/new.quant; end --В любом случае перерасчитываем наценку, т.к. в автопереоценках идет вставка старой наценки А.К. 20151020 --if (((new.nac is null) or (new.nac=0)) and new.price_o<>0) then if (new.price_o<>0) then new.nac=(new.price-new.price_o)*100/new.price_o; if (new.dep is null) then begin select first 1 id from deps where nds=new.nds order by id into new.dep; end if (new.dep is null) then new.dep=0; -- В любом случае перерасчитываем НДСы, т.к. при возврате могут отличаться на копейки А.К. 20151113 --if ( (new.sum_ndso is null) or (new.sum_ndso=0) ) then new.sum_ndso=round(new.summa_o*new.nds/(100+new.nds),2); --if ( (new.sum_ndsr is null) or (new.sum_ndso=0) ) then new.sum_ndsr=new.summa*(select ndsr from deps where id=new.dep)/(100+(select ndsr from deps where id=new.dep)); --if ((new.barcode is null) or (trim(new.barcode)='''') or (new.part_id=0) ) then ---> 20130301-ann gen_barcode_by_name if ((new.barcode is null) or (trim(new.barcode)='''')) then ---> 20150320 A.K. begin if ((select PARAM_VALUE from PR_GETPARAMVALUE(''GEN_BARCODE'',0))=0) then select res_bcode from utpr_getchecksum_ean13(new.id) into new.barcode; else select res_bcode from utpr_getchecksum_ean13((select l_id from vals where d$uuid=new.name_id),''88'') into new.barcode; end ---> 20130301-ann gen_barcode_by_name if (new.part_parent_id>0) then begin update doc_detail_active set quant=quant-new.quant, summa=summa-new.summa, summa_o=summa_o-new.summa_o, sum_ndso=sum_ndso-new.sum_ndso, sum_ndsr=sum_ndsr-new.sum_ndsr where id=new.part_parent_id; execute procedure PR_COPY_MEMBERSHIP(''DOC_DETAIL_ACTIVE'',new.part_parent_id,new.id); end --Если указано наименование, но не указан ШК изготовителя - ищем его в партиях и подставляем по умолчанию 20.03.2015 A.K. if (new.name_id is not null and (new.bcode_izg is null or Trim(new.bcode_izg) = '''' ) and exists(select first 1 id from docs where doc_type in (1,2,20) and id = new.doc_id)) then --20151113 A.K. new.bcode_izg = (select list(barcode,'','') from PR_GET_ALL_BARCODE(new.name_id)); -- select first 1 w.barcode from wares w where w.name_id = new.name_id into new.bcode_izg; -- select first 1 w.barcode from wares w inner join vals v on w.name_id = v.id or w.orig_name_id = v.id -- where w.barcode is not null and Trim(w.barcode) <> '''' and ( v.svalue =new.sname or v.svalue = new.sorig_name ) -- into new.bcode_izg; --Для "Заказ оптовику" при отрицательном или нулевом кол-ве товара - берем кол-во из последнего прихода 02.03.2015 A.K. if (((Select Doc_type From docs where id = new.doc_id) = 36) and new.quant <= 0 ) then begin new.quant = ( select first 1 dd.quant from doc_detail dd inner join docs d on dd.doc_id = d.id inner join parts p on dd.part_id=p.id inner join WARES w on p.ware_id=w.id where d.doc_type in (1,2) and w.name_id = new.name_id order by dd.insertdt desc ); if (new.quant is null or new.quant = 0) then new.quant = 1; end --Для "Заказ оптовику" цену и цену опт берем из остатков 19.10.2015 A.K. if ((Select Doc_type From docs where id = new.doc_id) = 36) Then Begin select first 1 price, price_o, part_id,ware_id from warebase where name_id = new.name_id order by docdate desc into new.price, new.price_o, new.part_id,new.ware_id; end --Заявка 656799 от 14.07.2016 A.K. --Ткаченко: При добавлении позиции из остатков в активный документ прихода от поставщика розничную цену ставить 0, чтобы не забывали наценивать накладные if ((Select Doc_type From docs where id = new.doc_id) = 1) Then begin new.part_id=0; new.price=0; new.nac=-100; new.summa=0; end end ^ CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_BU0 FOR DOC_DETAIL_ACTIVE ACTIVE BEFORE UPDATE POSITION 0 as begin if (new.nds<>old.nds) then --Изменение НДС только через отдел OlgaV 20141114 begin select first 1 id from deps where status=0 and nds=new.nds into new.dep; new.nds=old.nds; end if (new.dep<>old.dep) then select nds from deps where id=new.dep into new.nds; if ((new.nds<>old.nds) or (new.sum_ndso is null) or (new.sum_ndsr is null) ) then begin new.sum_ndso=round(new.summa_o*new.nds/(100+new.nds),2); new.sum_ndsr=new.summa*(select ndsr from deps where id=new.dep)/(100+(select ndsr from deps where id=new.dep)); end --Пересчет сумм НДС Olgav20141114 if (abs(new.sum_ndso-round((new.quant*new.price_o)*new.nds/(100+new.nds),2))>0.05) then new.sum_ndso=round((new.quant*new.price_o)*new.nds/(100+new.nds),2); if (abs(new.sum_ndsr-(new.summa)*(100+(select d.ndsr from deps d where d.id=new.dep))/(100+(select d.ndsr from deps d where d.id=new.dep)))>0.05) Then new.sum_ndsr=(new.summa)*(select d.ndsr from deps d where d.id=new.dep)/(100+(select d.ndsr from deps d where d.id=new.dep)); if ( (new.sname <> old.sname) or (new.name_id is null) or (new.name_id = ''0'') ) then select val_id from pr_getval_id(new.sname,0,new.part_type,new.mnn) into new.name_id; --select id from vals where vtype=0 and alttype=new.part_type and svalue=new.sname into new.name_id; if (new.name_id is null) then new.name_id=0; if ( (new.summa is null) and ((new.quant<>0) and (new.price<>0)) ) then begin new.summa=new.quant*new.price; if (new.sum_dsc is not null) then new.summa = new.summa - new.sum_dsc; end if ( ((new.summa_o = 0) or (new.summa_o is null) ) and ((new.quant<>0) and (new.price_o<>0)) ) then new.summa_o=new.quant*new.price_o; --if (new.name_id <> old.name_id) then execute procedure PR_COPYGROUPS(old.name_id, new.name_id); 23072015 A.K. if (new.sum_dsc is null) then if (new.summa<>old.summa) then begin new.sum_dsc=(1+new.discount/100)*100*new.summa/(100+old.discount)-100*new.summa/(100+old.discount); --new.summa=(1+new.discount/100)*100*old.summa/(100+old.discount); end if (new.sum_dsc is null) then if (new.discount<>old.discount) then begin new.sum_dsc=(1+new.discount/100)*100*old.summa/(100+old.discount)-100*old.summa/(100+old.discount); new.summa=(1+new.discount/100)*100*old.summa/(100+old.discount); end select id from vals where vtype=0 and alttype=new.part_type and svalue=new.sname into new.name_id; if (new.name_id is null) then new.name_id=0; select id from vals where vtype=3 and alttype=new.part_type and svalue=new.sizg into new.izg_id; if (new.izg_id is null) then new.izg_id=0; select id from vals where vtype=2 and alttype=new.part_type and svalue=new.scountry into new.country_id; if (new.country_id is null) then new.country_id=0; select id from vals where vtype=1 and alttype=new.part_type and svalue=new.sorig_name into new.orig_name_id; if (new.orig_name_id is null) then new.orig_name_id=0; select id from vals where vtype=6 and alttype=new.part_type and svalue=new.sorig_izg into new.orig_izg_id; if (new.orig_izg_id is null) then new.orig_izg_id=0; select id from vals where vtype=5 and alttype=new.part_type and svalue=new.sorig_country into new.orig_country_id; if (new.orig_country_id is null) then new.orig_country_id=0; if ((old.part_id<>0) and (new.part_id=0) and (select deleted_doc_id from docs where id=new.doc_id) is null ) then begin if ((select PARAM_VALUE from PR_GETPARAMVALUE(''GEN_BARCODE'',0))=0) then select res_bcode from utpr_getchecksum_ean13(new.id) into new.barcode; else select res_bcode from utpr_getchecksum_ean13((select l_id from vals where d$uuid=new.name_id),''88'') into new.barcode; end if ((select PARAM_VALUE from pr_getparamvalue(''CHANGE_BRC_FOR_CORRECT'',''0'')) = ''0'') Then --Менять ШК в док-тах корректировки if ((select d.doc_type from docs d where d.id=new.doc_id) in (7,8,22) and new.quant>0 and new.barcode<>'''' and new.barcode is not null) then new.barcode=(select barcode from doc_detail_active where id=new.parent_id); --Если указано наименование, но не указан ШК изготовителя - ищем его в партиях и подставляем по умолчанию 20.03.2015 A.K. if (new.name_id is not null and (new.bcode_izg is null or Trim(new.bcode_izg) = '''' ) and exists(select first 1 id from docs where doc_type in (1,2,20) and id = new.doc_id)) then select first 1 w.barcode from wares w where w.name_id = new.name_id into new.bcode_izg; --Менять оптовую цену можно только в документах прихода от поставщика и оприходования (Заявка 574482 от 26.04.2016 А.К.) if ( (coalesce(new.price_o,0) <> coalesce(old.price_o,0)) and ((select doc_type from docs where id = new.doc_id) not in (1,20)) ) then exception EX_ZAPRET_PRICE_O; exit; -- 20160424 A.K. insert into DOC_DETAIL_ACTIVE_LOG (ID, PARENT_ID, DOC_ID, PART_ID, PART_PARENT_ID, DOC_DETAIL_ID, PRICE, NAC, QUANT, DISCOUNT, SUMMA, SUMMA_O, DCARD, WARE_ID, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, BCODE_IZG, --KRITK, GODENDO, SERIA, NDS, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SKLAD_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, SUM_DSC, HUMAN_QUANT, CUSTOMDRAW, PART_TYPE, BASE_AGENT_ID) values (old.ID, old.PARENT_ID, old.DOC_ID, old.PART_ID, old.PART_PARENT_ID, old.DOC_DETAIL_ID, old.PRICE, old.NAC, old.QUANT, old.DISCOUNT, old.SUMMA, old.SUMMA_O, old.DCARD, old.WARE_ID, old.PRICE_O, old.PRICE_Z, old.PRICE_R, old.BARCODE, old.BARCODE1, old.BCODE_IZG, --old.KRITK, old.GODENDO, old.SERIA, old.NDS, old.SUM_NDSO, old.SERT, old.DATESERT, old.KEMVSERT, old.SDSERT, old.REGN, old.NGTD, old.EDIZM, old.NAME_ID, old.IZG_ID, old.COUNTRY_ID, old.ORIG_CODE, old.ORIG_NAME_ID, old.ORIG_IZG_ID, old.ORIG_COUNTRY_ID, old.Z_ID, old.SKLAD_ID, old.SNAME, old.SIZG, old.SCOUNTRY, old.SORIG_NAME, old.SORIG_IZG, old.SORIG_COUNTRY, old.INSERTDT, old.INFO, old.KOEF, old.MOTHERPART_ID, old.DEP, old.SUM_DSC, old.HUMAN_QUANT, old.CUSTOMDRAW, old.PART_TYPE, old.BASE_AGENT_ID); end ^ create or alter procedure PR_DOC_DETAIL_ACTIVE_ONCOMMIT ( ACTIVE_ID type of DM_ID, COMMIT_ID type of DM_ID, DOC_ID type of DM_ID, COMMITDATE type of DM_DATETIME) as begin /* эта процедура выполняется для каждой записи, добавляемой в DOC_DETAIL в процедурах проведения документов */ /* Для вречей*/ update doc_detail_doctor set doc_detail_id=:commit_id, doc_id=:doc_id, commitdate=:commitdate where DOC_DETAIL_ACTIVE_ID=:active_id; /* Старые рецепты*/ update DOC_DETAIL_MAKE set doc_detail_id=:commit_id, doc_id=:doc_id, commitdate=:commitdate where DOC_DETAIL_ACTIVE_ID=:active_id; /* Новые рецепты*/ update recepts set table_id=:commit_id, table_name=''DOC_DETAIL'', status=1 where doc_detail_active_id=:active_id; --для рецептов execute procedure PR_AUTO_WARESLINK(:DOC_ID, :ACTIVE_ID); end;^ SET TERM ; ^ CREATE OR ALTER VIEW VW_WARES( ID, NAME_ID, SNAME, IZG_ID, SIZG, COUNTRY_ID, SCOUNTRY, ORIG_CODE, ORIG_NAME_ID, SORIG_NAME, ORIG_IZG_ID, SORIG_IZG, ORIG_COUNTRY_ID, SORIG_COUNTRY, BARCODE, Z_ID, SKLAD_ID, INSERTDT, PACKET, MGN_NAME, MGN_ID, MGN_SOURCE) AS select w.ID, w.NAME_ID, w.sname,--(select svalue from vals where id = w.name_id), w.IZG_ID, (select svalue from vals where id = w.izg_id), w.COUNTRY_ID, (select svalue from vals where id = w.country_id), w.ORIG_CODE, w.ORIG_NAME_ID, (select svalue from vals where id = w.orig_name_id), w.ORIG_IZG_ID, (select svalue from vals where id = w.orig_izg_id), w.ORIG_COUNTRY_ID, (select svalue from vals where id = w.orig_country_id), w.BARCODE, w.Z_ID, w.SKLAD_ID, w.INSERTDT, w.PACKET, w.mgn_name, w.mgn_id, w.mgn_source from wares w ; /******************************************************************************/ /*** Generated by IBExpert 12.08.2016 17:39:43 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_WARES_TREB_ID; CREATE TABLE WARES_TREB ( ID DM_ID NOT NULL /* DM_ID = BIGINT */, WARE_ID DM_UUID_NULL /* DM_UUID_NULL = CHAR(36) */, NAME_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, IZG_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, COUNTRY_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, ORIG_CODE DM_TEXT /* DM_TEXT = VARCHAR(250) */, ORIG_NAME_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, ORIG_IZG_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, ORIG_COUNTRY_ID DM_UUID NOT NULL /* DM_UUID = CHAR(36) NOT NULL */, Z_ID DM_ID NOT NULL /* DM_ID = BIGINT */, SNAME DM_TEXT /* DM_TEXT = VARCHAR(250) */, SIZG DM_TEXT /* DM_TEXT = VARCHAR(250) */, SCOUNTRY DM_TEXT /* DM_TEXT = VARCHAR(250) */, SORIG_NAME DM_TEXT /* DM_TEXT = VARCHAR(250) */, SORIG_IZG DM_TEXT /* DM_TEXT = VARCHAR(250) */, SORIG_COUNTRY DM_TEXT /* DM_TEXT = VARCHAR(250) */, SKLAD_ID DM_TEXT NOT NULL /* DM_TEXT = VARCHAR(250) */, PRICE DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, QUANT DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, SUMMA DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, SUMMA_O DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, PRICE_O DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, PRICE_Z DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, PRICE_R DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, BARCODE DM_TEXT /* DM_TEXT = VARCHAR(250) */, BARCODE1 DM_TEXT /* DM_TEXT = VARCHAR(250) */, GODENDO DM_DATETIME /* DM_DATETIME = TIMESTAMP */, SERIA DM_TEXT /* DM_TEXT = VARCHAR(250) */, NDS DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, SUM_NDSO DM_DOUBLE /* DM_DOUBLE = DOUBLE PRECISION */, SERT DM_TEXT /* DM_TEXT = VARCHAR(250) */, DATESERT DM_DATETIME /* DM_DATETIME = TIMESTAMP */, KEMVSERT DM_TEXT /* DM_TEXT = VARCHAR(250) */, SDSERT DM_DATETIME /* DM_DATETIME = TIMESTAMP */, REGN DM_TEXT /* DM_TEXT = VARCHAR(250) */, NGTD DM_TEXT /* DM_TEXT = VARCHAR(250) */, EDIZM DM_TEXT /* DM_TEXT = VARCHAR(250) */, INSERTDT DM_DATETIME /* DM_DATETIME = TIMESTAMP */, BCODE_IZG DM_TEXT /* DM_TEXT = VARCHAR(250) */, DDA_UUID DM_UUID_NULL /* DM_UUID_NULL = CHAR(36) */, CMT_STATUS DM_STATUS /* DM_STATUS = INTEGER */, CMT_DT DM_DATETIME /* DM_DATETIME = TIMESTAMP */, CMT_USER DM_TEXT /* DM_TEXT = VARCHAR(250) */, CMT_PROFILE_ID DM_ID_NULL /* DM_ID_NULL = BIGINT */, PART_TYPE DM_STATUS /* DM_STATUS = INTEGER */, RQ_USER DM_TEXT /* DM_TEXT = VARCHAR(250) */, RQ_PROFILE_ID DM_ID_NULL /* DM_ID_NULL = BIGINT */, D$SRVUPDDT DM_DATETIME /* DM_DATETIME = TIMESTAMP */, D$UUID DM_UUID /* DM_UUID = CHAR(36) NOT NULL */ ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE WARES_TREB ADD CONSTRAINT PK_WARES_TREB PRIMARY KEY (D$UUID); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: WARES_TREB_AD_DISTR */ CREATE OR ALTER TRIGGER WARES_TREB_AD_DISTR FOR WARES_TREB ACTIVE AFTER DELETE POSITION 0 AS begin update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values (''WARES_TREB'',old.d$uuid,2,null) matching (TABLENAME,UUID); end ^ /* Trigger: WARES_TREB_AU0 */ CREATE OR ALTER TRIGGER WARES_TREB_AU0 FOR WARES_TREB ACTIVE AFTER UPDATE POSITION 0 AS declare variable name_id type of DM_UUID; declare variable sname type of DM_TEXT; declare variable izg_id type of DM_UUID; declare variable sizg type of DM_TEXT; declare variable country_id type of DM_UUID; declare variable scountry type of DM_TEXT; declare variable orig_code type of DM_TEXT; declare variable orig_name_id type of DM_UUID; declare variable sorig_name type of DM_TEXT; declare variable orig_izg_id type of DM_UUID; declare variable sorig_izg type of DM_TEXT; declare variable orig_country_id type of DM_UUID; declare variable sorig_country type of DM_TEXT; declare variable barcode type of DM_TEXT; begin if (not exists (select d$uuid from doc_detail_active where d$uuid=new.dda_uuid)) then exit; if (not exists (select d$uuid from wares where d$uuid=new.ware_id)) then exit; select w.name_id, (select svalue from vals v1 where v1.id=w.name_id), w.izg_id, (select svalue from vals v2 where v2.id=w.izg_id), w.country_id, (select svalue from vals v3 where v3.id=w.country_id), w.orig_code, w.orig_name_id, (select svalue from vals v4 where v4.id=w.orig_name_id), w.orig_izg_id, (select svalue from vals v5 where v5.id=w.orig_izg_id), w.orig_country_id, (select svalue from vals v6 where v6.id=w.orig_country_id), w.barcode from wares w where d$uuid=new.ware_id into name_id,sname, izg_id,sizg, country_id,scountry, orig_code, orig_name_id,sorig_name, orig_izg_id,sorig_izg, orig_country_id,sorig_country, barcode; update doc_detail_active set ware_id=new.ware_id, name_id=:name_id,sname=:sname, izg_id=:izg_id,sizg=:sizg, country_id=:country_id,scountry=:scountry, orig_code=:orig_code, orig_name_id=:orig_name_id,sorig_name=:sorig_name, orig_izg_id=:orig_izg_id,sorig_izg=:sorig_izg, orig_country_id=:orig_country_id,sorig_country=:sorig_country, bcode_izg=:barcode where d$uuid=new.dda_uuid; execute procedure PR_DOEVENT(''EV_WARES_TREB''); end ^ /* Trigger: WARES_TREB_BI */ CREATE OR ALTER TRIGGER WARES_TREB_BI FOR WARES_TREB ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then new.id = gen_id(gen_wares_treb_id,1); new.insertdt=current_timestamp; if (new.CMT_STATUS is null) then new.CMT_STATUS=0; if (new.d$uuid is null) then --создание требования begin select null,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,Z_ID, SORIG_NAME,SORIG_IZG,SORIG_COUNTRY,SKLAD_ID,PRICE,QUANT,SUMMA,SUMMA_O,PRICE_O,PRICE_Z,PRICE_R,BARCODE,BARCODE1, GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,INSERTDT from doc_detail_active where d$uuid=new.dda_uuid into new.WARE_ID,new.NAME_ID,new.IZG_ID,new.COUNTRY_ID,new.ORIG_CODE,new.ORIG_NAME_ID,new.ORIG_IZG_ID,new.ORIG_COUNTRY_ID, new.Z_ID,new.SORIG_NAME,new.SORIG_IZG,new.SORIG_COUNTRY,new.SKLAD_ID,new.PRICE,new.QUANT, new.SUMMA,new.SUMMA_O,new.PRICE_O,new.PRICE_Z,new.PRICE_R,new.BARCODE,new.BARCODE1,new.GODENDO,new.SERIA,new.NDS,new.SUM_NDSO, new.SERT,new.DATESERT,new.KEMVSERT,new.SDSERT,new.REGN,new.NGTD,new.EDIZM,new.INSERTDT; end end ^ /* Trigger: WARES_TREB_BI_DISTR */ CREATE OR ALTER TRIGGER WARES_TREB_BI_DISTR FOR WARES_TREB ACTIVE BEFORE INSERT POSITION 1000 AS begin if (new.d$uuid is null) then begin new.d$uuid=UUID_TO_CHAR(GEN_UUID()); new.d$srvupddt=''2000-01-01''; update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values (''WARES_TREB'',new.d$uuid,0,null) matching (TABLENAME,UUID); end end ^ /* Trigger: WARES_TREB_BU_DISTR */ CREATE OR ALTER TRIGGER WARES_TREB_BU_DISTR FOR WARES_TREB ACTIVE BEFORE UPDATE POSITION 0 AS begin if (new.D$SRVUPDDT=old.D$SRVUPDDT) then update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values (''WARES_TREB'',new.d$uuid,1,null) matching (TABLENAME,UUID); end ^ SET TERM ; ^ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Views ***/ /******************************************************************************/ /* View: VW_WARES_TREB */ CREATE OR ALTER VIEW VW_WARES_TREB( ID, WARE_ID, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, Z_ID, SNAME, SIZG, SCOUNTRY, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, SKLAD_ID, PRICE, QUANT, SUMMA, SUMMA_O, PRICE_O, PRICE_Z, PRICE_R, BARCODE, BARCODE1, GODENDO, SERIA, NDS, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, INSERTDT, BCODE_IZG, DDA_UUID, D$UUID, D$SRVUPDDT, CMT_STATUS, CMT_DT, CMT_USER, CMT_PROFILE_ID, PART_TYPE, RQ_USER, RQ_PROFILE_ID, CMT_SNAME, CMT_SIZG, CMT_SCOUNTRY, CMT_BARCODE) AS select wt.ID, wt.WARE_ID, wt.NAME_ID, wt.IZG_ID, wt.COUNTRY_ID, wt.ORIG_CODE, wt.ORIG_NAME_ID, wt.ORIG_IZG_ID, wt.ORIG_COUNTRY_ID, wt.Z_ID, wt.SNAME, wt.SIZG, wt.SCOUNTRY, wt.SORIG_NAME, wt.SORIG_IZG, wt.SORIG_COUNTRY, wt.SKLAD_ID, wt.PRICE, wt.QUANT, wt.SUMMA, wt.SUMMA_O, wt.PRICE_O, wt.PRICE_Z, wt.PRICE_R, wt.BARCODE, wt.BARCODE1, wt.GODENDO, wt.SERIA, wt.NDS, wt.SUM_NDSO, wt.SERT, wt.DATESERT, wt.KEMVSERT, wt.SDSERT, wt.REGN, wt.NGTD, wt.EDIZM, wt.INSERTDT, wt.BCODE_IZG, wt.DDA_UUID, wt.D$UUID, wt.D$SRVUPDDT, wt.CMT_STATUS, wt.CMT_DT, wt.CMT_USER, wt.CMT_PROFILE_ID, wt.PART_TYPE, wt.RQ_USER, wt.RQ_PROFILE_ID, (select svalue from vals where id = w.name_id), (select svalue from vals where id = w.izg_id), (select svalue from vals where id = w.country_id), w.barcode from wares_treb wt left join wares w on wt.ware_id = w.id ; /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/ SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER WARES_AU0 FOR WARES ACTIVE AFTER UPDATE POSITION 0 AS begin update warebase set updatedt=current_timestamp where ware_id=new.id; if (not(new.D$SRVUPDDT=old.D$SRVUPDDT)) then exit; if ((old.name_id<>new.name_id) or (old.izg_id<>new.izg_id) or (old.country_id<>new.country_id) or -- (old.orig_code<>new.orig_code) or (old.orig_name_id<>new.orig_name_id) or (old.orig_izg_id<>new.orig_izg_id) or (old.orig_country_id<>new.orig_country_id) or (old.barcode<>new.barcode) or -- (old.z_id<>new.z_id) or (old.sklad_id<>new.sklad_id)) then begin insert into wares_log ( ID, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, BARCODE, Z_ID, SKLAD_ID, INSERTDT, PACKET ) values ( old.ID, old.NAME_ID, old.IZG_ID, old.COUNTRY_ID, old.ORIG_CODE, old.ORIG_NAME_ID, old.ORIG_IZG_ID, old.ORIG_COUNTRY_ID, old.BARCODE, old.Z_ID, old.SKLAD_ID, old.INSERTDT, old.PACKET ); end end ^ SET TERM ; ^', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348176, 0, 0, 'cowa_2_recur', 'execute procedure PR_COWA_01;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); INSERT INTO G$TASKS_TMPL (ID, PROFILE_ID, TASK_TYPE, CAPTION, DATA, INSERTDT, SENDDT, ENDDT, ENDFLAG, G$PROFILE_ID, D$UUID, D$SRVUPDDT, CHECKPREVTASK) VALUES (348177, 0, 0, 'cowa_3_recur', 'ALTER TRIGGER WARES_LOG_BU_DISTR ACTIVE;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); COMMIT WORK;