![]() |
#1 |
Участник
|
![]()
Создается таблица в AX, вставка в которую будет происходить только сторонними средствами (скорее всего DTS). Планируется изменение одного поля (Status) в созданных записях непосредственно из AX.
Разумеется, сразу озаботился необходимостью формирования RecId. Эта тема уже поднималась 8 лет назад, но у предложенного решения было существенное ограничение: требовалось передавать параметры во внешнюю программу. Три года назад был предложен следующий код: Цитата:
Сообщение от oip
![]() Код: -- Генерация RecId. На выходе не 0 если всё Ok и 0, если что-то не так -- Входные параметры: код компании и шаг -- Пример: exec AX_GETRECID 'dat', '25' CREATE PROCEDURE [dbo].[AX_GETRECID] (@dataAreaId VARCHAR(3), @hop INT) AS SET NOCOUNT ON DECLARE @RecID INT SET @RecID = NULL UPDATE SYSTEMSEQUENCES SET @RecID = A.NextVal, NextVal = A.NextVal + @HOP FROM SYSTEMSEQUENCES A WHERE A.Id = -1 AND A.DATAAREAID = @dataAreaId SELECT ISNULL(@RecID, 0) AS RecId RETURN ISNULL(@RecID, 0) GO В связи с тем, что пишут, что "в AX 2009 RecId уникален лишь для каждой таблицы, а не для базы в целом", появилась мысль: почему бы, ни на что не взирая, не авто-инкрементить RecId в данной конкретной таблице, начиная с единицы? Это чем-то чревато? Как бы поступили вы сами? Прошу поделиться соображениями. Последний раз редактировалось Hyper; 23.06.2011 в 19:48. |
|
![]() |
#2 |
Ищущий знания...
|
даже если автоинкриментить RecId, то все равно придется обновлять таблицу SystemSequence для Вашей таблицы. Иначе если вдруг запись добавят из самой аксапты, могут получиться накладки.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#3 |
Участник
|
|
|
![]() |
#4 |
----------------
|
Цитата:
если вдруг запись добавят из самой аксапты
![]() автоинкремент, и не мучайте ни себя ни аксапту |
|
![]() |
#5 |
Боец
|
Цитата:
Ничем, мы так и поступили. |
|
|
За это сообщение автора поблагодарили: Hyper (1). |
![]() |
#6 |
Axapta
|
Да ничем это не чревато если Аксапта точно не будет сама что-либо писать в данную таблицу, а так же если данное поле recId нигде в бизнес-логике не участвует.
P.S. А вообще, можно сделать, чтобы и Аксапта могла в эту таблицу данные писать (используя suspendRecIds). Да и recId даже в пределах таблицы может быть и не уникален, если по нему уникального индекса нет. Только некрасиво это. |
|
|
За это сообщение автора поблагодарили: Hyper (1). |
![]() |
#7 |
Member
|
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.
Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода. Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены...
__________________
С уважением, glibs® |
|
![]() |
#8 |
Боец
|
Цитата:
Сообщение от glibs
![]() Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.
Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода. Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены... Код: int64 getNextRecId(int _tableId) Glibs, если предложишь решение по выделению RecId проще и дешевле в поддержке - ставлю пиво. |
|
![]() |
#9 |
Участник
|
Цитата:
Цитата:
Но я все-таки склоняюсь к первоначальной идее перекрыть insert и закомментировать super(). Пока, насколько я понимаю, lev и DSPIC предпочитают использование кода, приведенного выше, а Wamr, oip и glibs согласны, что без этого можно обойтись. |
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от Hyper
![]() Три года назад был предложен следующий код
X++: FROM SYSTEMSEQUENCES A WHERE A.Id = -1 AND A.TABID = AND A.DATAAREAID = @dataAreaId ![]() Если столкнусь с трудностями, буду иметь запасной вариант (игнор SystemSequences) в виду. Всем спасибо за советы. P.S. Ну и @RecID должен быть BIGINT. Еще что-то пропустил? Последний раз редактировалось Hyper; 24.06.2011 в 12:56. |
|
![]() |
#11 |
Ищущий знания...
|
Цитата:
![]() ИМХО. Если уж в программе определен механизм определения RecId, то нужно его придерживаться и при использовании внешних систем. Что бы в будущем спать спокойно ![]()
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#12 |
Участник
|
У меня вопрос. Правда, не совсем по теме
![]() В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"? При каких условиях? Если не могут, то какой смысл в параметре @DataAreaId в приведенной функции? |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
![]() |
#13 |
MCITP
|
![]() Цитата:
В каждой компании свой набор RecId, и соответсвенно свои записи с SystemSequences ...
__________________
Zhirenkov Vitaly |
|
![]() |
#14 |
Участник
|
А разве в 2009-й recId идет в разрезе компаний?
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#15 |
Участник
|
|
|
![]() |
#16 |
Участник
|
В результате использования класса SystemSequence
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#17 |
Участник
|
|
|
![]() |
#18 |
MCITP
|
![]()
и правда, нет... не знал.
__________________
Zhirenkov Vitaly |
|
![]() |
#19 |
Участник
|
Так в документации есть
X++: Sequence S = new Sequence("mySequence",1,100,10000); print S.nextval(10); // 100 in current company (the subkey) print S.nextval(10); // 110 in current company (the subkey) print S.nextval(1,"MMM"); // 100 in subkey "MMM" print S.nextval(1,"MMM"); // 101 in subkey "MMM" PS Ой, класс неправильно выше назвал ![]()
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 24.06.2011 в 16:33. |
|
|
За это сообщение автора поблагодарили: Владимир Максимов (1). |
![]() |
#20 |
Участник
|
Да вроде все работает. Просто Axapta сверяет указанное значение subkey со списком существующих компаний. Если нет совпадений, то ошибок не выдает, но запись идет в текущую компанию.
|
|
Теги |
ax2009, recid, systemsequences, интеграция, таблица |
|
|