Подготовка серверной базы и скриптов для Единого Окна — различия между версиями
| Aleksnick  (обсуждение | вклад) | Aleksnick  (обсуждение | вклад)  | ||
| Строка 1: | Строка 1: | ||
| − | + | ==Экспорт vals_link (для ЙО: boss:d:\обмен\JO\ZTRADE.FDB) как dbf или insert== | |
| − | + | ||
| + | |||
| + | ==Создаем и вставляем данные vals_link в нашу БД (скрипт создания и импорта из dbf: cowa_vals_links.sql)== | ||
| <pre> | <pre> | ||
| /******************************************************************************/ | /******************************************************************************/ | ||
| Строка 117: | Строка 119: | ||
| end | end | ||
| </pre> | </pre> | ||
| + | |||
| + | |||
| # Выпоняем cowa_all.sql (не оптимизирован для ЙО) | # Выпоняем cowa_all.sql (не оптимизирован для ЙО) | ||
| <pre> | <pre> | ||
| Строка 411: | Строка 415: | ||
| SET TERM ; ^ | SET TERM ; ^ | ||
| − | |||
| Строка 447: | Строка 450: | ||
| SET TERM ; ^ | SET TERM ; ^ | ||
| − | |||
| − | |||
| − | |||
| Строка 559: | Строка 559: | ||
| ALTER TRIGGER PARTS_AU0 ACTIVE; | ALTER TRIGGER PARTS_AU0 ACTIVE; | ||
| </pre> | </pre> | ||
| − | + | ==Для связывания по ШК выполняем 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го пункта== | ||
| + | <pre> | ||
| + | /******************************************************************************/ | ||
| + | /***               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; | ||
| + | |||
| + | </pre> | ||
Версия 15:04, 6 сентября 2016
Содержание
- 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;
