Приведение наименований в менеджере — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Новая страница: «Устанавливаем процедуру '''PR_GET_WARE'''. <pre> SET TERM ^ ; create or alter procedure PR_INSTALL_PR_GET_WARE as declare variable IDX_U_EX…»)
 
Строка 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;
   if (W_ID is null) then
+
   ';
  begin
+
  ';
+
  
 
  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;