Создание уникального 16-символьного GUID

Пожалуйста, помогите мне создать уникальный 16-символьный GUID, который я мог бы использовать в качестве первичного ключа в своей пользовательской таблице.

Я пробовал с GUID_CREATE и CL_SYSTEM_UUID~CREATE_UUID_X16, но его параметры экспорта (EV_GUID_16) возвращают 32 символа (буквенно-цифровое шестнадцатеричное значение), которые я не могу назначить своей 16-символьной переменной.

Как я могу преобразовать необработанный текст длиной 16 (32 символа) в строку из 16 символов, которую я мог бы использовать в качестве первичного ключа?


person user2999223    schedule 16.11.2013    source источник


Ответы (6)


Упомянутые вами методы создают 16-байтовый GUID. Поскольку это не может быть отображено «изначально», оно преобразуется в шестнадцатеричное представление, которое, естественно, будет использовать два символа на байт, следовательно, 32 символа. Вы, вероятно, не получите ничего уникального, используя всего 16 символов (не байтов — разница огромная!) — если возможно, увеличьте первичный ключ до 32 символов.

person vwegert    schedule 16.11.2013
comment
Мне удалось сгенерировать уникальный идентификатор из 16 символов с помощью функционального модуля CRR_GET_RANDOM_STRING. Это решило мое требование. - person user2999223; 19.11.2013
comment
@user2999223 user2999223 Этот идентификатор не будет уникальным, он просто случайный или, точнее, псевдослучайный. - person Jagger; 19.11.2013

Попробуйте изменить тип первичного ключа вашей прозрачной таблицы на RAW16. Это должно решить вашу проблему.

person Jagger    schedule 17.11.2013
comment
Использование полей RAW в первичном ключе обычно является плохой идеей — например, вы не можете указать отдельные записи при переносе записей таблицы. (Хотел бы я, чтобы ребята из Object Services подумали об этом, когда навязывали нам свои OS_GUID...) - person vwegert; 19.11.2013
comment
Хм, это интересно, потому что, например, стандартная таблица SAP BCA_CONTRACT в SAP Banking Services содержит GUID как RAW 16, который является частью первичного ключа этой таблицы. Кроме того, этот ключ используется в других таблицах как первичный и внешний ключ. - person Jagger; 19.11.2013
comment
У меня нет банковской установки, но я подозреваю, что это одно из полей OS_GUID. Они работают нормально, но многие стандартные инструменты (диалоги обслуживания, транспорт, сравнение систем и т. д.) либо выдают неожиданные результаты, либо вообще перестают работать, как только RAW GUID становится частью таблицы. Я усвоил это на собственном горьком опыте, поэтому решил оставить хедз-ап... - person vwegert; 19.11.2013
comment
Кажется, я знаю, о чем ты говоришь. Я видел эту проблему в тестовом инструменте SE37. Вот почему BAPI, которые работают с данными, представленными в таблицах, которые я упомянул, имеют GUID, указанный как CHAR 32. Не могу много сказать о представлениях обслуживания, поскольку все эти таблицы являются данными приложений. Сгенерированный экран выбора для SE16, однако, кажется, отлично справляется с этим типом элемента данных, содержащего тип RAW (поле преобразуется в CHAR 32). - person Jagger; 20.11.2013
comment
Кстати: функция BANK_DISTRIBUTED_ID_CREATE используется для создания GUID в банковских системах SAP, потому что cl_system_uuid=>create_uuid_x16_static() не создает однородных, т.е. равномерно распределенных GUID. Это главная слабость. Уникальность GUID не подвергается сомнению, но когда он НЕ равномерно распределен, это ОЧЕНЬ ПЛОХОЕ индексное поле. Это критическая слабость в таблицах с большим объемом. (например, банковское дело) - person phil soady; 13.06.2016
comment
@philsoady Был там, сделал это. В одном из проектов, в котором я принимал участие, какой-то гений реализовал параллельную обработку, используя BUT000-GUID для разделения. Наши мигрировавшие бизнес-партнеры потом часами бегают в одном процессе, потому что для остальных было выбрано 0 экземпляров. - person Jagger; 13.06.2016

GUID_CREATE уже упоминался. Получив GUID в формате RAW, вы можете использовать GUID_CONVERT, чтобы переместить его в формат CHAR. Я бы не рекомендовал использовать RAW в первичном ключе и предложил бы вместо этого использовать только GUID_32 (формат char).

person Dzokaja    schedule 18.02.2015

Если вам нужен уникальный идентификатор, создайте собственный объект диапазона номеров «Z...» с транзакцией SNUM. Установите Number Length Domain на NUM16 или любой другой домен, соответствующий вашим требованиям. Сохраните и вернитесь на главный экран транзакции SNUM. Оттуда сохраните интервалы: ex 01 от 1 до 999999... и сохраните. Чтобы перенести новые значения intervals, выберите параметр переноса в меню.

В Abap для получения уникального идентификатора вызовите функцию NUMBER_GET_NEXT, как показано ниже:

CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
  nr_range_nr             = **'01'     " << put your number interval   here <<**
  object                  = **'Z.....' " << put your number range name here <<**
IMPORTING
  number                  = e_uniqueid
EXCEPTIONS
  interval_not_found      = 1
  number_range_not_intern = 2
  object_not_found        = 3
  quantity_is_0           = 4
  quantity_is_not_1       = 5
  interval_overflow       = 6
  buffer_overflow         = 7
  OTHERS                  = 8.
person Dany Lapointe    schedule 29.05.2014
comment
Просто не забудьте отключить флаг to-year, чтобы в следующем году число снова не начиналось с 1. Оставьте буферизацию включенной, чтобы повысить производительность. - person Andreas Huppert; 19.02.2015
comment
OP специально спрашивает о GUID, это не отвечает на вопрос. - person Lilienthal; 23.06.2015

Мы можем использовать FM 'CRR_GET_RANDOM_STRING' для создания уникального идентификатора из 16 символов.

person user2999223    schedule 19.11.2013
comment
Очень хорошо, но этот функциональный модуль доступен не во всех системах SAP. В моей например нет. - person Jagger; 19.11.2013
comment
У меня нет возможности посмотреть код этого FM, но, как и в случае с ответом PATRY, я очень сомневаюсь, что эта строка уникальна, она просто случайна. Так что на самом деле, если вы не хотите никаких сюрпризов, когда код будет запущен в производство, переключитесь на ключ RAW 16 в своей таблице и сгенерируйте UUID с помощью CL_SYSTEM_UUID~CREATE_UUID_X16. Вы также можете переключиться на CHAR 32, как предложил vwegert, а затем использовать CL_SYSTEM_UUID~CREATE_UUID_C32. - person Jagger; 19.11.2013

Функцию модуля "GENERAL_GET_RANDOM_STRING" также можно использовать, если вам нужен уникальный идентификатор из 16 символов.

person PATRY Guillaume    schedule 19.11.2013
comment
Вопрос в том, обеспечивает ли эта случайная строка хотя бы такую ​​уникальность, как сам GUID. - person Jagger; 19.11.2013
comment
Уникальность случайного числа не гарантируется. Это не решение, а ошибочный обходной путь (извините). - person vwegert; 19.11.2013
comment
это правда, так что не о чем сожалеть. Даже если вероятность наличия двух одинаковых строк по 16 символов мала, она все равно существует. - person PATRY Guillaume; 19.11.2013