Приведение наименований в менеджере — различия между версиями
Материал из wiki.standart-n.ru
Aleksnick (обсуждение | вклад) (Новая страница: «Устанавливаем процедуру '''PR_GET_WARE'''. <pre> SET TERM ^ ; create or alter procedure PR_INSTALL_PR_GET_WARE as declare variable IDX_U_EX…») |
Aleksnick (обсуждение | вклад) |
||
Строка 12: | Строка 12: | ||
declare variable FIELD DM_TEXT; | declare variable FIELD DM_TEXT; | ||
begin | begin | ||
− | + | /* определяем база с глобальными наименованиями или нет */ | |
if ((select upper(RF.RDB$FIELD_SOURCE) | if ((select upper(RF.RDB$FIELD_SOURCE) | ||
from RDB$RELATION_FIELDS RF | from RDB$RELATION_FIELDS RF | ||
Строка 22: | Строка 22: | ||
GLOBAL_ID = 0; | GLOBAL_ID = 0; | ||
+ | /* определяем единое окно установлено или нет */ | ||
if ((select first 1 count(1) | if ((select first 1 count(1) | ||
from RDB$INDICES RIN | from RDB$INDICES RIN | ||
Строка 30: | Строка 31: | ||
IDX_U_EXISTS = 0; | IDX_U_EXISTS = 0; | ||
+ | /* определяем из какого индекса брать список полей, отвечающих за уникальность товаров */ | ||
if (IDX_U_EXISTS = 1) then | if (IDX_U_EXISTS = 1) then | ||
INDEX_NAME = 'WARES_IDX_U'; | INDEX_NAME = 'WARES_IDX_U'; | ||
Строка 35: | Строка 37: | ||
INDEX_NAME = 'WARES_IDX1'; | INDEX_NAME = 'WARES_IDX1'; | ||
+ | /* определяем установлен ли хэш индекс */ | ||
if ((select first 1 count(1) | if ((select first 1 count(1) | ||
from RDB$INDICES RIN | from RDB$INDICES RIN | ||
Строка 43: | Строка 46: | ||
IDX_100_EXISTS = 0; | IDX_100_EXISTS = 0; | ||
+ | /* входные параметры процедуры */ | ||
S = ' | S = ' | ||
create or alter procedure PR_GET_WARE ( | create or alter procedure PR_GET_WARE ( | ||
Строка 60: | Строка 64: | ||
'; | '; | ||
+ | /* выходные параметры процедуры */ | ||
if (GLOBAL_ID = 1) then | if (GLOBAL_ID = 1) then | ||
S = S || 'W_ID type of DM_UUID_NULL)'; | S = S || 'W_ID type of DM_UUID_NULL)'; | ||
Строка 65: | Строка 70: | ||
S = S || 'W_ID type of DM_ID)'; | S = S || 'W_ID type of DM_ID)'; | ||
+ | /* внутренние параметры процедуры */ | ||
S = S || ' as | S = S || ' as | ||
declare variable OLD_BARCODE DM_TEXT1024;'; | declare variable OLD_BARCODE DM_TEXT1024;'; | ||
+ | /* для базы с глобальными наименованиями типы полей DM_UUID_NULL */ | ||
if (GLOBAL_ID = 1) then | if (GLOBAL_ID = 1) then | ||
S = S || ' | S = S || ' | ||
Строка 81: | Строка 88: | ||
+ | /* для базы без глобальных наименований типы полей DM_ID */ | ||
S = S || ' | S = S || ' | ||
declare variable NAME_ID type of DM_ID; | declare variable NAME_ID type of DM_ID; | ||
Строка 95: | Строка 103: | ||
'; | '; | ||
+ | /* вставляем в процедуру комментарии */ | ||
if (GLOBAL_ID = 1) then | if (GLOBAL_ID = 1) then | ||
S = S || ' /* BASE WITH GLOBAL ID */ | S = S || ' /* BASE WITH GLOBAL ID */ | ||
Строка 116: | Строка 125: | ||
'; | '; | ||
+ | /* находим валсы для всех справочных значений */ | ||
S = S || ' if (ORIG_CODE is null) then | S = S || ' if (ORIG_CODE is null) then | ||
ORIG_CODE = ''''; | ORIG_CODE = ''''; | ||
Строка 138: | Строка 148: | ||
'; | '; | ||
+ | /* если хэш индекса нет */ | ||
if (IDX_100_EXISTS = 0) then | if (IDX_100_EXISTS = 0) then | ||
Строка 150: | Строка 161: | ||
'; | '; | ||
+ | /* ищем варес по всем поляем, которые есть в индексе, отвечающем за уникальность карточек */ | ||
select list('and ' || trim(RIS.RDB$FIELD_NAME) || ' = :' || trim(RIS.RDB$FIELD_NAME), ascii_char(13)) | select list('and ' || trim(RIS.RDB$FIELD_NAME) || ' = :' || trim(RIS.RDB$FIELD_NAME), ascii_char(13)) | ||
from RDB$INDEX_SEGMENTS RIS | from RDB$INDEX_SEGMENTS RIS | ||
Строка 158: | Строка 170: | ||
into :W_ID, | into :W_ID, | ||
:OLD_BARCODE; | :OLD_BARCODE; | ||
− | + | '; | |
− | + | ||
− | + | ||
end | end | ||
Строка 167: | Строка 177: | ||
+ | /* если хэш индекс есть в базе */ | ||
begin | begin | ||
Строка 172: | Строка 183: | ||
whash = ('; | whash = ('; | ||
− | select list(':' || trim(RIS.RDB$FIELD_NAME), ',') | + | /* генерируем хэш по поляем в индексе */ |
+ | select list('coalesce(:' || trim(RIS.RDB$FIELD_NAME) || ',''' || trim(RIS.RDB$FIELD_NAME) || ''')', ',') | ||
from RDB$INDEX_SEGMENTS RIS | from RDB$INDEX_SEGMENTS RIS | ||
where RIS.RDB$INDEX_NAME = :INDEX_NAME | where RIS.RDB$INDEX_NAME = :INDEX_NAME | ||
Строка 179: | Строка 191: | ||
S = S || :FIELD || ');'; | S = S || :FIELD || ');'; | ||
+ | /* ищем варес по хэшу */ | ||
S = S || ' | S = S || ' | ||
select ID, | select ID, | ||
Строка 187: | Строка 200: | ||
:OLD_BARCODE; | :OLD_BARCODE; | ||
'; | '; | ||
− | |||
end | end | ||
+ | /* если варес не нашли */ | ||
+ | S = S || ' | ||
+ | if (W_ID is null) then | ||
+ | begin | ||
+ | '; | ||
+ | |||
+ | /* генерируем id */ | ||
if (GLOBAL_ID = 1) then | if (GLOBAL_ID = 1) then | ||
S = S || ' W_ID = uuid_to_char(gen_uuid()); | S = S || ' W_ID = uuid_to_char(gen_uuid()); | ||
Строка 198: | Строка 217: | ||
'; | '; | ||
+ | /* создаем новый варес */ | ||
S = S || ' insert into WARES (ID, NAME_ID, IZG_ID, COUNTRY_ID, ORIG_CODE, ORIG_NAME_ID, ORIG_IZG_ID, ORIG_COUNTRY_ID, | S = S || ' 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) | BARCODE, Z_ID, SKLAD_ID) | ||
Строка 204: | Строка 224: | ||
end | end | ||
else | else | ||
+ | '; | ||
+ | |||
+ | /* если штрихкод не в индексе */ | ||
+ | S = S || ' | ||
if (OLD_BARCODE <> BARCODE) then | if (OLD_BARCODE <> BARCODE) then | ||
update WARES | update WARES | ||
Строка 224: | Строка 248: | ||
GRANT EXECUTE ON PROCEDURE PR_INSTALL_PR_GET_WARE TO SYSDBA; | GRANT EXECUTE ON PROCEDURE PR_INSTALL_PR_GET_WARE TO SYSDBA; | ||
+ | |||
EXECUTE PROCEDURE PR_INSTALL_PR_GET_WARE; | EXECUTE PROCEDURE PR_INSTALL_PR_GET_WARE; | ||
DROP PROCEDURE PR_INSTALL_PR_GET_WARE; | DROP PROCEDURE PR_INSTALL_PR_GET_WARE; | ||
</pre> | </pre> |
Версия 18:46, 12 августа 2016
Устанавливаем процедуру PR_GET_WARE.
SET TERM ^ ; create or alter procedure PR_INSTALL_PR_GET_WARE as declare variable IDX_U_EXISTS DM_STATUS; declare variable IDX_100_EXISTS DM_STATUS; declare variable GLOBAL_ID DM_STATUS; declare variable INDEX_NAME DM_TEXT; declare variable S DM_TEXT_BIG; declare variable FIELD DM_TEXT; begin /* определяем база с глобальными наименованиями или нет */ if ((select upper(RF.RDB$FIELD_SOURCE) from RDB$RELATION_FIELDS RF where 1 = 1 and RF.RDB$FIELD_NAME = 'ID' and RF.RDB$RELATION_NAME = 'WARES') = 'DM_UUID') then GLOBAL_ID = 1; else GLOBAL_ID = 0; /* определяем единое окно установлено или нет */ if ((select first 1 count(1) from RDB$INDICES RIN where RIN.RDB$INDEX_NAME = 'WARES_IDX_U' and RIN.RDB$RELATION_NAME = 'WARES') > 0) then IDX_U_EXISTS = 1; else IDX_U_EXISTS = 0; /* определяем из какого индекса брать список полей, отвечающих за уникальность товаров */ if (IDX_U_EXISTS = 1) then INDEX_NAME = 'WARES_IDX_U'; else INDEX_NAME = 'WARES_IDX1'; /* определяем установлен ли хэш индекс */ if ((select first 1 count(1) from RDB$INDICES RIN where RIN.RDB$INDEX_NAME = 'WARES_IDX100' and RIN.RDB$RELATION_NAME = 'WARES') > 0) then IDX_100_EXISTS = 1; else IDX_100_EXISTS = 0; /* входные параметры процедуры */ S = ' 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 ( '; /* выходные параметры процедуры */ if (GLOBAL_ID = 1) then S = S || 'W_ID type of DM_UUID_NULL)'; else S = S || 'W_ID type of DM_ID)'; /* внутренние параметры процедуры */ S = S || ' as declare variable OLD_BARCODE DM_TEXT1024;'; /* для базы с глобальными наименованиями типы полей DM_UUID_NULL */ if (GLOBAL_ID = 1) then S = S || ' 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; '; else /* для базы без глобальных наименований типы полей DM_ID */ S = S || ' 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; declare variable WHASH DM_ID; '; S = S || ' begin '; /* вставляем в процедуру комментарии */ if (GLOBAL_ID = 1) then S = S || ' /* BASE WITH GLOBAL ID */ '; else S = S || ' /* BASE WITHOUT GLOBAL ID */ '; if (IDX_U_EXISTS = 1) then S = S || ' /* BASE WITH WARES_IDX_U */ '; else S = S || ' /* BASE WITHOUT WARES_IDX_U */ '; if (IDX_100_EXISTS = 1) then S = S || ' /* BASE WITH WARES_IDX100 */ '; else S = S || ' /* BASE WITHOUT WARES_IDX100 */ '; /* находим валсы для всех справочных значений */ S = S || ' 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; '; /* если хэш индекса нет */ if (IDX_100_EXISTS = 0) then begin S = S || ' select ID, BARCODE from WARES where 1 = 1 '; /* ищем варес по всем поляем, которые есть в индексе, отвечающем за уникальность карточек */ select list('and ' || trim(RIS.RDB$FIELD_NAME) || ' = :' || trim(RIS.RDB$FIELD_NAME), ascii_char(13)) from RDB$INDEX_SEGMENTS RIS where RIS.RDB$INDEX_NAME = :INDEX_NAME into :FIELD; S = S || :FIELD || ' into :W_ID, :OLD_BARCODE; '; end else /* если хэш индекс есть в базе */ begin S = S || ' whash = ('; /* генерируем хэш по поляем в индексе */ select list('coalesce(:' || trim(RIS.RDB$FIELD_NAME) || ',''' || trim(RIS.RDB$FIELD_NAME) || ''')', ',') from RDB$INDEX_SEGMENTS RIS where RIS.RDB$INDEX_NAME = :INDEX_NAME into :FIELD; S = S || :FIELD || ');'; /* ищем варес по хэшу */ S = S || ' select ID, BARCODE from WARES WHERE WHASH = :WHASH into :W_ID, :OLD_BARCODE; '; end /* если варес не нашли */ S = S || ' if (W_ID is null) then begin '; /* генерируем id */ if (GLOBAL_ID = 1) then S = S || ' W_ID = uuid_to_char(gen_uuid()); '; else S = S || ' W_ID = gen_id(GEN_WARES_ID, 1); '; /* создаем новый варес */ S = S || ' 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 '; /* если штрихкод не в индексе */ S = S || ' if (OLD_BARCODE <> BARCODE) then update WARES set BARCODE = :BARCODE where ID = :W_ID; '; S = S || ' suspend; end '; execute statement(S); end^ SET TERM ; ^ /* Existing privileges on this procedure */ GRANT EXECUTE ON PROCEDURE PR_INSTALL_PR_GET_WARE TO SYSDBA; EXECUTE PROCEDURE PR_INSTALL_PR_GET_WARE; DROP PROCEDURE PR_INSTALL_PR_GET_WARE;