Установка МНН
Исправление от 28.03.2019
1. Выполнить скрипт исправления процедуры: SET TERM ^ ; create or alter procedure PR_GET_MNN ( SNAME DM_TEXT, TYPE_FIND DM_TEXT) returns ( MNN DM_TEXT, TNN DM_TEXT, PR_TNN DM_TEXT, R_TNN DM_TEXT) as declare variable NAME DM_TEXT; declare variable TEK_MNN DM_TEXT; declare variable TEK_TNN DM_TEXT; declare variable TEMP_TNN DM_TEXT; declare variable P1 DM_ID_NULL; declare variable P2 DM_ID_NULL; declare variable PR_LENGTH DM_ID_NULL; declare variable SNAME1 DM_TEXT; declare variable TEKMNN1 DM_TEXT; declare variable TEKTNN1 DM_TEXT; declare variable KOEF1 DM_DOUBLE; declare variable STATUS1 DM_STATUS; begin if (TYPE_FIND = 'SNAME') then begin NAME = (select RES from PR_DELETE_SYMBOL(:SNAME)); MNN = ; TNN = ; PR_LENGTH = 5; for select M.SNAME, M.MNN_RUS, M.PREPARED_SNAME, M.REPLACE_SNAME from OUT$MNN M into :TEK_TNN, :TEK_MNN, :PR_TNN, :R_TNN do begin if (position(upper(trim(:TEK_TNN)), upper(trim(:SNAME))) = 1) then --неприведенные наименования вхождение с начало слова begin sname1 =:sname; tekmnn1=:TEK_MNN; TEKTNN1=:TEK_TNN; KOEF1=(100 * char_length(:TEK_TNN) / char_length(:SNAME)); STATUS1=2; end if (position(upper(trim(:R_TNN)), upper(trim(:NAME))) = 1 and char_length(trim(replace(:R_TNN, ' ', ))) > :PR_LENGTH) then --приведенные наименования, тнн поменяно местами вхождение c начала слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:R_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:R_TNN) / char_length(:NAME)); STATUS1=1; end P1 = position(upper(trim(:PR_TNN)), upper(trim(:NAME))); if (P1 = 1 and char_length(trim(replace(:PR_TNN, ' ', ))) > :PR_LENGTH) then --приведенные наименования, вхождение с начало слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:PR_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:PR_TNN) / char_length(:NAME)); STATUS1=1; end if (P1 > 1 and P1 < round(char_length(:NAME) / 2) and char_length(trim(replace(:PR_TNN, ' ', ))) > :PR_LENGTH) then --приведенные наименования, но вхождение раньше половины слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:PR_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:PR_TNN) / char_length(:NAME)); STATUS1=0; end P2 = position(upper(trim(:R_TNN)), upper(trim(:NAME))); if (P2 > 1 and P2 < round(char_length(:NAME) / 2) and char_length(trim(replace(:R_TNN, ' ', ))) > :PR_LENGTH) then --приведенные наименования, тнн поменяно местами, но вхождение раньше половины слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:R_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:R_TNN) / char_length(:NAME)); STATUS1=0; end end if ((:KOEF1>75) and (:status1=2)) then begin mnn= :tekmnn1; exit; end if ((:KOEF1>75) and (:status1=2)) then begin tnn=:TEKTNN1; exit; end if ((mnn=) or (mnn is null)) then if (:KOEF1>99) then begin mnn=:tekmnn1; end if ((tnn=) or (tnn is null)) then if (:KOEF1>99) then begin tnn=:TEKTNN1; end if ((mnn=) or (mnn is null)) then if ((:KOEF1>10) and (:status1=2)) then mnn=:tekmnn1; --можт меньше 20 ? if ((tnn=) or (tnn is null)) then if ((:KOEF1>10) and (:status1=2)) then tnn=:TEKTNN1; if ((mnn=) or (mnn is null)) then if ((:KOEF1>10) and (:status1=1)) then mnn=:tekmnn1; if ((tnn=) or (tnn is null)) then if ((:KOEF1>10) and (:status1=1)) then tnn=:TEKTNN1; if ((mnn=) or (mnn is null)) then if (:KOEF1>10) then mnn=:tekmnn1; if ((tnn=) or (tnn is null)) then if (:KOEF1>10) then tnn=:TEKTNN1; if ((mnn=) or (mnn is null)) then if ((char_length(:TEKTNN1)>=3) and (:status1=2)) then mnn=:tekmnn1; if ((tnn=) or (tnn is null)) then if ((char_length(:TEKTNN1)>=3) and (:status1=2)) then mnn=:TEKTNN1; end suspend; end^ SET TERM ; ^ COMMENT ON PARAMETER PR_GET_MNN.TYPE_FIND IS 'SNAME наименование, BARCODE - шк изготовителя'; /* Следующие операторы GRANT сгенерированы автоматически */ GRANT EXECUTE ON PROCEDURE PR_DELETE_SYMBOL TO PROCEDURE PR_GET_MNN; GRANT SELECT ON OUT$MNN TO PROCEDURE PR_GET_MNN; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE PR_GET_MNN TO PROCEDURE PR_GETVAL_ID; GRANT EXECUTE ON PROCEDURE PR_GET_MNN TO SYSDBA;
DROP TABLE TEMP_MNN; DROP TABLE MNN_VALS;
2. Выполнить если требуется обновление всех названий в базе (процедура очень длительная делать только по согласованию клиента: execute block as declare variable id dm_uuid; declare variable sname dm_text; declare variable mnn dm_text; declare variable mnn_old dm_text; begin for select id,svalue,preparedvalue from vals v where (v.preparedvalue is not null or v.preparedvalue<>) and v.vtype=0 into :id, :sname, :mnn_old do begin mnn = (select mnn from pr_get_mnn(:sname,'SNAME')); if ((mnn<>) or (mnn is NOT null)) then if (mnn<>mnn_old) then update vals set preparedvalue=:mnn where id=:id; end end;
Если МНН вообще нет в базе ниже полный текст:
1) Просим всех выйти из базы.
2) Создаем резервную копию базы данных
3) если нет таблицы OUT$MNN, то добавляем ее
/******************************************************************************/ /*** Generated by IBExpert 22.04.2015 17:43:35 ***/ /******************************************************************************/ /******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE GENERATOR GEN_OUT$MNN_ID; CREATE TABLE OUT$MNN ( ID DM_ID NOT NULL /* DM_ID = BIGINT */, SNAME DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */, MNN_LAT DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */, MNN_RUS DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */, BARCODE DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */, PREPARED_SNAME DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */, REPLACE_SNAME DM_TEXT /* DM_TEXT = VARCHAR(250) */, STATUS DM_STATUS /* DM_STATUS = INTEGER */ ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE OUT$MNN ADD PRIMARY KEY (ID); /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE INDEX OUT$MNN_IDX1 ON OUT$MNN (SNAME); CREATE DESCENDING INDEX OUT$MNN_IDX2 ON OUT$MNN (SNAME); CREATE INDEX OUT$MNN_IDX3 ON OUT$MNN (MNN_LAT); CREATE DESCENDING INDEX OUT$MNN_IDX4 ON OUT$MNN (MNN_LAT); CREATE INDEX OUT$MNN_IDX5 ON OUT$MNN (MNN_RUS); CREATE DESCENDING INDEX OUT$MNN_IDX6 ON OUT$MNN (MNN_RUS); CREATE INDEX OUT$MNN_IDX7 ON OUT$MNN (BARCODE); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: OUT$MNN_BI */ CREATE OR ALTER TRIGGER OUT$MNN_BI FOR OUT$MNN ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then NEW.id = GEN_ID(gen_out$MNN_id,1); if (new.status is null) then NEW.status =0; end ^ SET TERM ; ^ /******************************************************************************/ /*** Privileges ***/ /******************************************************************************/
4) Выполняем скрипт
/*--PR_DELETE_SYMBOL-------------------------------------------------------*/ SET TERM ^ ; create or alter procedure PR_DELETE_SYMBOL ( S DM_TEXT) returns ( RES DM_TEXT) as declare variable TEMP DM_TEXT; declare variable K DM_ID_NULL; declare variable TEK_NAME DM_TEXT; begin k=0; res=s||' '; res=replace(res,',',''); res=replace(res,'.',''); res=replace(res,'1',''); res=replace(res,'2',''); res=replace(res,'3',''); res=replace(res,'4',''); res=replace(res,'5',''); res=replace(res,'6',''); res=replace(res,'7',''); res=replace(res,'8',''); res=replace(res,'9',''); res=replace(res,'0',''); res=replace(res,'(',''); res=replace(res,')',''); if (position('МАЗЬ',UPPER(:res))=1) then begin res=replace(res,'Мазь ',''); res=res||' Мазь'; end if (position('КРЕМ',UPPER(:res))=1) then begin res=replace(res,'Крем ',''); res=res||' Крем'; end if (position('БАЛЬЗАМ',UPPER(:res))=1) then begin res=replace(res,'Бальзам ',''); res=res||' Бальзам'; end if (position('КАПЛИ',UPPER(:res))=1) then begin res=replace(res,'Капли ',''); res=res||' капли'; end if (position('ПАСТИЛК',UPPER(:res))=1) then begin res=replace(res,'Пастилки ',''); res=res||' пастилки'; end res=replace(res,' к-та ',' кислота '); res=replace(res,' к-та-',' кислота '); res=replace(res,'детский','детс'); res=replace(res,'/',''); res=replace(res,'№',''); res=replace(res,'N',''); res=replace(res,'+',''); res=replace(res,'%',''); res=replace(res,' мг ',' '); res=replace(res,'-',' '); res=replace(res,' мкг ',' '); res=replace(res,' мл ',' '); res=replace(res,' п/о ',' '); res=replace(res,' н/ст ',' '); res=replace(res,' ',' '); res=replace(res,' ',' '); res=(select r from pr_repart_sname(:res)); res=trim(res); suspend; end^ SET TERM ; ^ COMMIT; GRANT EXECUTE ON PROCEDURE PR_REPART_SNAME TO PROCEDURE PR_DELETE_SYMBOL; GRANT EXECUTE ON PROCEDURE PR_DELETE_SYMBOL TO PROCEDURE PR_GET_MNN; GRANT EXECUTE ON PROCEDURE PR_DELETE_SYMBOL TO SYSDBA; COMMIT; /*--PR_GET_MNN-------------------------------------------------------------*/ SET TERM ^ ; create or alter procedure PR_GET_MNN ( SNAME DM_TEXT, TYPE_FIND DM_TEXT) returns ( MNN DM_TEXT, TNN DM_TEXT, PR_TNN DM_TEXT, R_TNN DM_TEXT) as declare variable NAME DM_TEXT; declare variable TEK_MNN DM_TEXT; declare variable TEK_TNN DM_TEXT; declare variable TEMP_TNN DM_TEXT; declare variable P1 DM_ID_NULL; declare variable P2 DM_ID_NULL; declare variable PR_LENGTH DM_ID_NULL; declare variable SNAME1 DM_TEXT; declare variable TEKMNN1 DM_TEXT; declare variable TEKTNN1 DM_TEXT; declare variable KOEF1 DM_DOUBLE; declare variable STATUS1 DM_STATUS; begin if (TYPE_FIND = 'SNAME') then begin NAME = (select RES from PR_DELETE_SYMBOL(:SNAME)); MNN = ''; TNN = ''; PR_LENGTH = 4; for select M.SNAME, M.MNN_RUS, M.PREPARED_SNAME, M.REPLACE_SNAME from OUT$MNN M into :TEK_TNN, :TEK_MNN, :PR_TNN, :R_TNN do begin if (position(upper(trim(:TEK_TNN)), upper(trim(:SNAME))) = 1) then --неприведенные наименования вхождение с начало слова begin sname1 =:sname; tekmnn1=:TEK_MNN; TEKTNN1=:TEK_TNN; KOEF1=(100 * char_length(:TEK_TNN) / char_length(:SNAME)); STATUS1=2; end if (position(upper(trim(:R_TNN)), upper(trim(:NAME))) = 1 and char_length(trim(replace(:R_TNN, ' ', ''))) > :PR_LENGTH) then --приведенные наименования, тнн поменяно местами вхождение c начала слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:R_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:R_TNN) / char_length(:NAME)); STATUS1=1; end P1 = position(upper(trim(:PR_TNN)), upper(trim(:NAME))); if (P1 = 1 and char_length(trim(replace(:PR_TNN, ' ', ''))) > :PR_LENGTH) then --приведенные наименования, вхождение с начало слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:PR_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:PR_TNN) / char_length(:NAME)); STATUS1=1; end if (P1 > 1 and P1 < round(char_length(:NAME) / 2) and char_length(trim(replace(:PR_TNN, ' ', ''))) > :PR_LENGTH) then --приведенные наименования, но вхождение раньше половины слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:PR_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:PR_TNN) / char_length(:NAME)); STATUS1=0; end P2 = position(upper(trim(:R_TNN)), upper(trim(:NAME))); if (P2 > 1 and P2 < round(char_length(:NAME) / 2) and char_length(trim(replace(:R_TNN, ' ', ''))) > :PR_LENGTH) then --приведенные наименования, тнн поменяно местами, но вхождение раньше половины слова begin sname1 = :NAME; tekmnn1=:TEK_MNN; TEKTNN1=:R_TNN || ' == ' || :TEK_TNN; KOEF1=(100 * char_length(:R_TNN) / char_length(:NAME)); STATUS1=0; end end if ((:KOEF1>75) and (:status1=2)) then begin mnn= :tekmnn1; exit; end if ((:KOEF1>75) and (:status1=2)) then begin tnn=:TEKTNN1; exit; end if ((mnn='') or (mnn is null)) then if (:KOEF1>99) then begin mnn=:tekmnn1; end if ((tnn='') or (tnn is null)) then if (:KOEF1>99) then begin tnn=:TEKTNN1; end if ((mnn='') or (mnn is null)) then if ((:KOEF1>10) and (:status1=2)) then mnn=:tekmnn1; --можт меньше 20 ? if ((tnn='') or (tnn is null)) then if ((:KOEF1>10) and (:status1=2)) then tnn=:TEKTNN1; if ((mnn='') or (mnn is null)) then if ((:KOEF1>10) and (:status1=1)) then mnn=:tekmnn1; if ((tnn='') or (tnn is null)) then if ((:KOEF1>10) and (:status1=1)) then tnn=:TEKTNN1; if ((mnn='') or (mnn is null)) then if (:KOEF1>10) then mnn=:tekmnn1; if ((tnn='') or (tnn is null)) then if (:KOEF1>10) then tnn=:TEKTNN1; if ((mnn='') or (mnn is null)) then if ((char_length(:TEKTNN1)>=3) and (:status1=2)) then mnn=:tekmnn1; if ((tnn='') or (tnn is null)) then if ((char_length(:TEKTNN1)>=3) and (:status1=2)) then mnn=:TEKTNN1; end suspend; end^ SET TERM ; ^ COMMENT ON PARAMETER PR_GET_MNN.TYPE_FIND IS 'SNAME наименование, BARCODE - шк изготовителя'; /* Следующие операторы GRANT сгенерированы автоматически */ GRANT EXECUTE ON PROCEDURE PR_DELETE_SYMBOL TO PROCEDURE PR_GET_MNN; GRANT SELECT ON OUT$MNN TO PROCEDURE PR_GET_MNN; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE PR_GET_MNN TO PROCEDURE PR_GETVAL_ID; GRANT EXECUTE ON PROCEDURE PR_GET_MNN TO SYSDBA; /*--PR_GETVAL_ID-----------------------------------------------------------*/ SET TERM ^ ; create or alter procedure PR_GETVAL_ID ( SVALUE type of DM_TEXT, VTYPE type of DM_STATUS, ALTTYPE DM_STATUS, MNN DM_TEXT = '') returns ( VAL_ID type of DM_ID) as declare variable MNN_2 DM_TEXT; begin if (:svalue is null) then svalue=''; select id from vals where vtype=:vtype and svalue=:svalue and alttype=:alttype into :val_id; if ((val_id is not null) and (:mnn<>'') and (:mnn is not null) AND (vtype=0)) then update vals set preparedvalue=:mnn where id=:val_id; if (val_id is null) then begin val_id=GEN_ID(GEN_VALS_ID,1); mnn_2=null; if ((:mnn<>'') and (:mnn is not null) and (vtype=0)) then mnn_2=:mnn; if (vtype=0) then if ((:mnn='') or (:mnn is null)) then mnn_2=(select mnn from pr_get_mnn(:svalue,'SNAME')); insert into vals (id, vtype, svalue, alttype, preparedvalue) values (:val_id,:vtype,:svalue, :alttype, :mnn_2); end suspend; end^ SET TERM ; ^ COMMIT; GRANT SELECT,INSERT,UPDATE ON VALS TO PROCEDURE PR_GETVAL_ID; GRANT EXECUTE ON PROCEDURE PR_GET_MNN TO PROCEDURE PR_GETVAL_ID; GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO PROCEDURE PR_GET_WARE; GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO STANDART; GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO SYSDBA; COMMIT; /*--PR_GET_WARE------------------------------------------------------------*/ 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_ID) as declare variable NAME_ID type of DM_ID; declare variable IZG_ID type of DM_ID; declare variable COUNTRY_ID type of DM_ID; declare variable ORIG_NAME_ID type of DM_ID; declare variable ORIG_IZG_ID type of DM_ID; declare variable ORIG_COUNTRY_ID type of 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; 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; if (w_id is null) then begin -- exception EX_WRONG_OPER; w_id=gen_id(gen_wares_id,1); 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^ SET TERM ; ^ COMMIT; GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO PROCEDURE PR_GET_WARE; GRANT SELECT,INSERT ON WARES TO PROCEDURE PR_GET_WARE; GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO STANDART; GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO SYSDBA; COMMIT; /*--DOC_DETAIL_ACTIVE------------------------------------------------------*/ ALTER TABLE DOC_DETAIL_ACTIVE ADD MAKE_ID DM_ID_NULL; ALTER TABLE DOC_DETAIL_ACTIVE ADD MNN DM_TEXT; COMMIT; SET TERM ^ ; CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_BI_MNN FOR DOC_DETAIL_ACTIVE ACTIVE BEFORE INSERT POSITION 3 AS begin if (new.name_id>0) then new.mnn=(select preparedvalue from vals where id=new.name_id); if (new.mnn is null) then new.mnn=(select MNN from pr_get_mnn(new.sname,'SNAME')); end ^ SET TERM ; ^ COMMIT; /*--PR_DOC_DETAIL_INSERT---------------------------------------------------*/ ALTER TABLE DOC_DETAIL ADD MAKE_ID DM_ID_NULL; COMMIT; SET TERM ^ ; create or alter procedure PR_DOC_DETAIL_INSERT ( PARENT_ID bigint, DOC_ID bigint, PART_ID bigint, QUANT type of DM_DOUBLE, DISCOUNT double precision, SUMMA double precision, SUMMA_O double precision, PRICE numeric(15,4), SUM_NDSO numeric(15,4), NAC numeric(15,4), COMMITDATE type of DM_DATE, HUMAN_QUANT type of DM_TEXT, SUM_DSC type of DM_DOUBLE, DCARD type of DM_TEXT, ACTIVE_ID type of DM_ID, PART_TYPE DM_STATUS, MAKE_ID DM_ID_NULL = null) as declare variable NEW_ID type of DM_ID; begin new_id=gen_id(gen_doc_detail_id,1); insert into doc_detail (id,PARENT_ID,DOC_ID,PART_ID,QUANT,DISCOUNT,SUMMA,summa_o, sum_ndso, price, nac, doc_commitdate, human_quant,SUM_DSC,dcard, part_type,make_id) /* (PARENT_ID,DOC_ID,PART_ID,QUANT,DISCOUNT,SUMMA,summa_o) */ values /* (:PARENT_ID,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o); */ (:new_id,:PARENT_ID,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o, :sum_ndso, :price, :nac, :commitdate, :human_quant,:SUM_DSC,:dcard, :part_type,:make_id); execute procedure PR_DOC_DETAIL_ACTIVE_ONCOMMIT(:active_id,:new_id,:doc_id,:commitdate); end^ SET TERM ; ^ GRANT INSERT ON DOC_DETAIL TO PROCEDURE PR_DOC_DETAIL_INSERT; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_ACTIVE_ONCOMMIT TO PROCEDURE PR_DOC_DETAIL_INSERT; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO STANDART; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO SYSDBA; COMMIT; /*--PR_DOC_RASHOD_COMMIT---------------------------------------------------*/ SET TERM ^ ; create or alter procedure PR_DOC_RASHOD_COMMIT ( DOC_ID type of DM_ID, DBG type of DM_STATUS) as declare variable PARENT_ID type of DM_ID; declare variable PART_ID type of DM_ID; declare variable PRICE type of DM_DOUBLE; declare variable QUANT type of DM_DOUBLE; declare variable DISCOUNT type of DM_DOUBLE; 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 NAC type of DM_DOUBLE; declare variable DOC_COMMITDATE type of DM_DATE; declare variable HUMAN_QUANT type of DM_TEXT; declare variable SUM_DSC type of DM_DOUBLE; declare variable DCARD type of DM_TEXT; declare variable ACTIVE_ID type of DM_ID; declare variable PART_TYPE DM_STATUS; declare variable BASE_AGENT_ID DM_ID; declare variable MAKE_ID DM_ID_NULL; begin select cast(commitdate as date) from docs where id=:doc_id into :doc_commitdate; for select PARENT_ID,DOC_ID,PART_ID,PRICE,QUANT,DISCOUNT,SUMMA,summa_o, sum_ndso, nac, human_quant, SUM_DSC, dcard, part_type, id, make_id from doc_detail_active where doc_id=:doc_id into :PARENT_ID,:DOC_ID,:PART_ID,:PRICE,:QUANT,:DISCOUNT,:SUMMA,:summa_o, :sum_ndso, :nac, :human_quant, :SUM_DSC, :dcard, :part_type, :active_id, :make_id do begin execute procedure PR_DOC_DETAIL_INSERT(:PARENT_ID,:DOC_ID,:PART_ID,QUANT,:DISCOUNT,:SUMMA,:summa_o, :price,:sum_ndso, :nac, :doc_commitdate, :human_quant, :SUM_DSC,:dcard,:active_id,:part_type,:make_id); end end^ SET TERM ; ^ GRANT SELECT ON DOCS TO PROCEDURE PR_DOC_RASHOD_COMMIT; GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_RASHOD_COMMIT; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO PROCEDURE PR_DOC_RASHOD_COMMIT; GRANT EXECUTE ON PROCEDURE PR_DOC_RASHOD_COMMIT TO PROCEDURE PR_DOC_COMMIT; GRANT EXECUTE ON PROCEDURE PR_DOC_RASHOD_COMMIT TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_DOC_RASHOD_COMMIT TO STANDART; GRANT EXECUTE ON PROCEDURE PR_DOC_RASHOD_COMMIT TO SYSDBA; /*--PR_DOC_PRIHOD_COMMIT_RECURSE-------------------------------------------*/ SET TERM ^ ; create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE ( DOC_ID type of DM_ID, DOC_PARENT_ID type of DM_ID, PART_PARENT_ID type of DM_ID, DOC_COMMITDATE type of DM_DATE, CONTRACT_ID DM_ID) as declare variable PART_ID type of DM_ID; declare variable WARE_ID type of DM_ID; declare variable SNAME type of DM_TEXT; declare variable SIZG type of DM_TEXT; declare variable SCOUNTRY type of DM_TEXT; declare variable ORIG_CODE type of DM_TEXT; declare variable SORIG_NAME type of DM_TEXT; declare variable SORIG_IZG type of DM_TEXT; declare variable SORIG_COUNTRY type of DM_TEXT; declare variable BARCODE type of DM_TEXT; declare variable Z_ID type of DM_ID; declare variable SKLAD_ID DM_TEXT; declare variable PRICE type of DM_DOUBLE; declare variable PRICE_O type of DM_DOUBLE; declare variable PRICE_Z type of DM_DOUBLE; declare variable PRICE_R type of DM_DOUBLE; declare variable QUANT type of DM_DOUBLE; declare variable BARCODE1 type of DM_TEXT; declare variable DEP type of DM_ID; declare variable KRITK type of DM_DOUBLE; declare variable GODENDO type of DM_DATETIME; declare variable SERIA type of DM_TEXT; declare variable NDS type of DM_DOUBLE; declare variable SUM_NDSO type of DM_DOUBLE; declare variable SERT type of DM_TEXT; declare variable DATESERT type of DM_DATETIME; declare variable KEMVSERT type of DM_TEXT; declare variable SDSERT type of DM_DATETIME; declare variable REGN type of DM_TEXT; declare variable NGTD type of DM_TEXT; declare variable EDIZM type of DM_TEXT; declare variable PARENT_ID type of DM_ID; declare variable SUMMA type of DM_DOUBLE; declare variable SUMMA_O type of DM_DOUBLE; declare variable DISCOUNT type of DM_DOUBLE; declare variable ACTIVE_ID type of DM_ID; declare variable NAC type of DM_DOUBLE; declare variable DOC_DETAIL_ID type of DM_ID; declare variable MOTHERPART_ID type of DM_ID; declare variable BCODE_IZG type of DM_TEXT; declare variable HUMAN_QUANT type of DM_TEXT; declare variable SUM_DSC type of DM_DOUBLE; declare variable DCARD type of DM_TEXT; declare variable PART_TYPE DM_STATUS; declare variable BASE_AGENT_ID DM_ID; declare variable GROUP_ID DM_ID; declare variable MAKE_ID DM_ID_NULL; declare variable MNN DM_TEXT; begin for select /*ware_id*/ sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id, /*part_id*/ PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM, PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard, part_type, BASE_AGENT_ID, group_id, make_id, mnn from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id into :sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id, :PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM, :PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard, :part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn do begin -- if ((price<0.001) or (price is null)) then exception EX_PRICE; if ((price<0) or (price is null)) then exception EX_PRICE; if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O; if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT; if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA; if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O; -- if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS; if (/*(SUM_NDSO<0) or */(SUM_NDSO is null)) then exception EX_SUM_NDSO; select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn) into :ware_id; if ((part_id=0) or (part_id is NULL)) then select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id) into :part_id; execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id); -- обновляем членство в группах execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id); -- присваиваем ценам партии update prices set part_id=:part_id where dda_id=:active_id; update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE); execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id); end end^ SET TERM ; ^ COMMIT; GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_UPDGROUPDETAIL_ACTIVE2PARTS TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT SELECT,INSERT,UPDATE ON PRICES TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE; GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO "PUBLIC"; GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO STANDART; GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO SYSDBA; COMMIT; /*--VW_DOC_DETAIL_ACTIVE---------------------------------------------------*/ CREATE OR ALTER VIEW VW_DOC_DETAIL_ACTIVE( 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, MMBSH, NDSBYDEP, REALQUANT, PRICE_DSC, BLOCK_QUANT, SUM_DSC, HUMAN_QUANT, CUSTOMDRAW, STATUS, OLDPRICE, PART_TYPE, PRICES, BASE_AGENT_ID, SBASE_AGENT_ID, GNVLS, GROUP_ID, MNN) AS SELECT da.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, (select intvalue from vals where id=da.name_id), --KRITK, GODENDO, SERIA, da.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, da.INSERTDT, INFO, KOEF, MOTHERPART_ID, DEP, (select membership from PR_MEMBERSHIPS('PARTS=' || da.part_id || ';DOC_DETAIL_ACTIVE=' || da.id || ';PARTS.NAME_ID=' || da.name_id || ';PARTS.IZG_ID=' ||da.izg_id ||';',ascii_char(13)||ascii_char(10),1)), deps.nds, (select realquant from warebase w where w.part_id=da.part_id), iif(da.quant between -0.000001 and 0.000001,0,cast(da.summa/da.quant as numeric(15,4))), (select BLOCK_QUANT from warebase where part_id=da.part_id), da.SUM_DSC, da.human_quant, DA.CUSTOMDRAW, da.STATUS, iif(da.parent_id<>0, (select ddd.price from DOC_DETAIL_ACTIVE ddd where ddd.id=da.parent_id),0), part_type, (select s from PR_GETPARTPRICES(da.part_id,da.id)), da.BASE_AGENT_ID, (select caption from agents where id=da.BASE_AGENT_ID), da.gnvls, da.group_id, da.mnn FROM DOC_DETAIL_ACTIVE da left join deps on da.dep=deps.id order by da.parent_id, da.sname, da.id ; COMMIT; GRANT SELECT ON VW_DOC_DETAIL_ACTIVE TO PROCEDURE PR_PART_HISTORY; GRANT SELECT ON VW_DOC_DETAIL_ACTIVE TO PROCEDURE PR_PART_HISTORY_TEMP; GRANT SELECT, UPDATE, DELETE, INSERT, REFERENCES ON VW_DOC_DETAIL_ACTIVE TO STANDART WITH GRANT OPTION; COMMIT; /*--VW_WAREBASE_KASSA------------------------------------------------------*/ CREATE OR ALTER VIEW VW_WAREBASE_KASSA( PART_ID, WARE_ID, SNAME, SIZG, SCOUNTRY, ORIG_CODE, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, BCODE_IZG, PRICE, PRICE_O, PRICE_Z, PRICE_R, QUANT, BARCODE, BARCODE1, DEP, KRITK, GODENDO, SERIA, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, DOC_ID, DOCNUM, DOCDATE, DOCCAPTION, DOCAGENT, DOCVNUM, DOCVSHIFT, INSERTDT, UPDATEDT, ENDDT, NDS, REALQUANT, PART_PARENT_ID, NAME_ID, IZG_ID, COUNTRY_ID, NAC, BLOCK_QUANT, BLOCK_COUNT, MMBSH, PART_TYPE, BASE_AGENT_ID, GROUPS, CAPTION, CONTRACT_ID, SCONTRACT_ID, GROUP_ID, VPART_ID, PACKET, SORDERNAME, MNN) AS select w.PART_ID, w.WARE_ID, w.SNAME, w.SIZG, w.SCOUNTRY, w.ORIG_CODE, w.SORIG_NAME, w.SORIG_IZG, w.SORIG_COUNTRY, w.BCODE_IZG, w.PRICE, w.PRICE_O, w.PRICE_Z, w.PRICE_R, w.QUANT, w.BARCODE, w.BARCODE1, w.DEP, w.KRITK, w.GODENDO, w.SERIA, w.SUM_NDSO, w.SERT, w.DATESERT, w.KEMVSERT, w.SDSERT, w.REGN, w.NGTD, w.EDIZM, w.doc_id, w.docnum, w.docdate, w.doccaption, w.docagent, w.docvnum, w.docvshift, w.INSERTDT, w.UPDATEDT, w.ENDDT, w.NDS , w.REALQUANT, w.PART_PARENT_ID, w.NAME_ID, w.IZG_ID, w.COUNTRY_ID,w.NAC, w.BLOCK_QUANT, w.BLOCK_COUNT, w.MMBSH,w.PART_TYPE,w.BASE_AGENT_ID, (select membership from PR_MEMBERSHIPS('PARTS=' || w.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10))) as groups, a.caption, W.contract_id, W.scontract_id, w.group_id, w.vpart_id, w.packet, w.SNAME, v.preparedvalue from warebase w join docs d on w.doc_id = d.id join agents a on d.agent_id = a.id join vals v on w.name_id=v.id and v.vtype=0 ; COMMIT; /*--VW_WAREBASE------------------------------------------------------------*/ CREATE OR ALTER VIEW VW_WAREBASE( PART_ID, WARE_ID, SNAME, SIZG, SCOUNTRY, ORIG_CODE, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, BCODE_IZG, PRICE, PRICE_O, PRICE_Z, PRICE_R, QUANT, BARCODE, BARCODE1, DEP, KRITK, GODENDO, SERIA, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, DOC_ID, DOCNUM, DOCDATE, DOCCAPTION, DOCAGENT, DOCVNUM, DOCVSHIFT, INSERTDT, UPDATEDT, ENDDT, NDS, REALQUANT, PART_PARENT_ID, NAME_ID, IZG_ID, COUNTRY_ID, NAC, BLOCK_QUANT, BLOCK_COUNT, MMBSH, PART_TYPE, PRICES, BASE_AGENT_ID, SBASE_AGENT_ID, CONTRACT_ID, SCONTRACT_ID, GROUP_ID, SGROUP_ID, VPART_ID, SKLAD_ID, MNN) AS select PART_ID, WARE_ID, SNAME, SIZG, SCOUNTRY, ORIG_CODE, SORIG_NAME, SORIG_IZG, SORIG_COUNTRY, BCODE_IZG, PRICE, PRICE_O, PRICE_Z, PRICE_R, QUANT, BARCODE, BARCODE1, DEP, (select intvalue from vals where id=name_id), --KRITK, GODENDO, SERIA, SUM_NDSO, SERT, DATESERT, KEMVSERT, SDSERT, REGN, NGTD, EDIZM, DOC_ID, /*(select pr.doc_id from pr_getmotherpart(part_id) pr), */ DOCNUM, /*(select (select ddd.docnum from docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ cast (DOCDATE as dm_date), /*(select (select ddd.docdate from docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ DOCCAPTION, /*(select (select ddd.caption from docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ DOCAGENT, /*(select (select ddd.sagent from vw_docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ DOCVNUM, /*(select (select ddd.vnum from docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ DOCVSHIFT, /*(select (select ddd.vshift from docs ddd where ddd.id=pr.doc_id) from pr_getmotherpart(part_id) pr),*/ INSERTDT, UPDATEDT, ENDDT, NDS, REALQUANT, PART_PARENT_ID, NAME_ID, IZG_ID, COUNTRY_ID, NAC, BLOCK_QUANT, BLOCK_COUNT, (select membership from PR_MEMBERSHIPS('PARTS=' || wb.part_id || ';PARTS.NAME_ID=' || wb.name_id || ';PARTS.IZG_ID=' || wb.izg_id ||';',ascii_char(13)||ascii_char(10),1)), part_type, (select s from PR_GETPARTPRICES(wb.part_id,0)), BASE_AGENT_ID, (select caption from agents where id=wb.BASE_AGENT_ID), CONTRACT_ID, SCONTRACT_ID, GROUP_ID, (select gr.caption from groups gr where gr.id=wb.group_id), VPART_ID, (select sklad_id from parts where parts.id=wb.part_id), (select preparedvalue from vals where id=name_id) --mnn from WAREBASE wb ; COMMIT; /*--SP$WDICTS--------------------------------------------------------------*/ INSERT INTO SP$WDICTS (PARENT_ID, CAPTION, DESCRIPTION, SID, STATUS, INSERTDT, INI, BMP, SORTING, FRAMECLASS) VALUES (0, 'МНН', NULL, 'MNN ', 3, NULL, '[insertsql] [deletesql_selected] [deletesql] [refreshsql] select * from OUT$MNN where id=:ID [selectsqlwithdeleted] [selectsql] select * from OUT$MNN order by sname [form_show] position=8 left=0 Top=0 Width=1024 Height=800 MaxWidth=0 MaxHeight=0 MinWidth=0 MinHeight=0 [form_get] position=8 left=0 Top=0 Width=1024 Height=800 MaxWidth=0 MaxHeight=0 MinWidth=0 MinHeight=0 [main] sourcetablename=OUT$MNN returnfieldname=ID captionfieldname=SNAME keyfieldname=ID ViewID=OUT$MNN RootGroupTableName= ShowCaption=Справочник МНН GetCaption=Справочник МНН InitTMSGroup_id= GroupSelect=0 foldergroup= initfolder_id= dataset=0 folders_visible=0 Canfloating=0 hidetoppanel=0 ActivateDictAction=0 [cfSelect] selectfieldexpression=SNAME||'' ''||coalesce(mnn_rus,'''') AllwaysPartial=1 [childs] bottomdock_units=0 bottomdock_size=0 rightdock_units=0 rightdock_size=0 [editfields]', NULL, NULL, NULL); COMMIT;
5) Проверяем, включено ли логирование таблицы VALS, если есть, то убираем. (Логирование на все остальные таблицы тоже должно быть отключено).
6) Заполняем таблицу VALS МНН-нами, действие очень долгое) формула для примерного расчета времени: ~1,5 сек* ассортимент = Время в секундах.
/* execute block as declare variable id dm_id; declare variable sname dm_text; begin for select id, svalue from vals where (vtype = 0) and ((preparedvalue is null) or (preparedvalue = '')) into :id, :sname do begin select mnn from pr_get_mnn(:sname, 'SNAME') into :sname; update vals set preparedvalue = :sname where id = :id; end end */ execute block as declare variable id dm_id; declare variable sname dm_text; begin for select id, svalue from vals where (vtype = 0) and ((preparedvalue is null) or (preparedvalue = '')) and id in (select name_id from vw_warebase group by name_id) into :id, :sname do begin select mnn from pr_get_mnn(:sname, 'SNAME') into :sname; update vals set preparedvalue = :sname where id = :id; end end
7) через программу "OST" прокачиваем актуальный "справочник МНН".
8) В сетке базы остатков в менеджере под каждым пользователем и в кассире добавляем колонку MNN.
9) В кассире под каждым пользователем в верхней панели выводим кнопку МНН (Горячая клавиша "Ctrl+M")
10) Открываем справочник по этой кнопке и загружаем сетку для справочника в кассире (необходимо под каждым пользователем открывать этот справочник и подгружать сетку)
Файл:Сетка для справочника mnn в кассире.zip.
11) В настройках кассира в поле поиска добавляем поле "mnn".
12) После закрытия настроек проверяем поиск по МНН, должен работать.
13) Применяем профиль текущего пользователя ко остальным кассирам (кроме специфических, например пользователь "Заказ" или "Выручка ФАП" или др.).
14) В менеджере нажимаем F3 проверяем наличие справочника МНН.
Файл:Сетка для справочника mnn в менеджере.zip.
15). В менеджере проверяем редактируется ли поле МНН, если нет то идем в подпрограмму "редактирование поля" и добавляем это поле в разрешенное для редактирования "
(UPPERCASE(program_result.values['fieldname'])='MNN')or
16) Если поле все таки не обновляется, то обновляем версию менеджера до последней, с соответсвующим обновлением базы.
17) После обновления менеджера, проверить приходуется ли электронная накладная.
18) Если после установки MNN тормозит компьютер, то выполняем скрипт
/******************************************************************************/ /*** Following SET SQL DIALECT is just for the Database Comparer ***/ /******************************************************************************/ SET SQL DIALECT 3; SET TERM ^ ; CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_BI_MNN FOR DOC_DETAIL_ACTIVE ACTIVE BEFORE INSERT POSITION 3 AS begin if (new.quant<=0) then exit; if (new.name_id>0) then new.mnn=(select preparedvalue from vals where id=new.name_id); if (new.mnn is null) then new.mnn=(select MNN from pr_get_mnn(new.sname,'SNAME')); end ^ SET TERM ; ^
19) Если в кассире нет кнопочки "МНН", то заходим в менеджере в "Сервис - Привилегии" - Справочники. Находим справочник "МНН" и устанавливаем разрешения для группы кассиров.