|
23.06.2011, 19:43 | #1 |
Участник
|
Формирование RecId при вставке в таблицу AX из SQL Server
Создается таблица в 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. |
|
23.06.2011, 20:58 | #2 |
Ищущий знания...
|
даже если автоинкриментить RecId, то все равно придется обновлять таблицу SystemSequence для Вашей таблицы. Иначе если вдруг запись добавят из самой аксапты, могут получиться накладки.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
23.06.2011, 21:10 | #3 |
Участник
|
|
|
23.06.2011, 21:13 | #4 |
----------------
|
Цитата:
если вдруг запись добавят из самой аксапты
автоинкремент, и не мучайте ни себя ни аксапту |
|
23.06.2011, 21:16 | #5 |
Боец
|
Цитата:
Ничем, мы так и поступили. |
|
|
За это сообщение автора поблагодарили: Hyper (1). |
23.06.2011, 21:23 | #6 |
Axapta
|
Да ничем это не чревато если Аксапта точно не будет сама что-либо писать в данную таблицу, а так же если данное поле recId нигде в бизнес-логике не участвует.
P.S. А вообще, можно сделать, чтобы и Аксапта могла в эту таблицу данные писать (используя suspendRecIds). Да и recId даже в пределах таблицы может быть и не уникален, если по нему уникального индекса нет. Только некрасиво это. |
|
|
За это сообщение автора поблагодарили: Hyper (1). |
23.06.2011, 23:07 | #7 |
Member
|
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.
Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода. Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены...
__________________
С уважением, glibs® |
|
24.06.2011, 01:04 | #8 |
Боец
|
Цитата:
Сообщение от glibs
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.
Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода. Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены... Код: int64 getNextRecId(int _tableId) Glibs, если предложишь решение по выделению RecId проще и дешевле в поддержке - ставлю пиво. |
|
24.06.2011, 03:39 | #9 |
Участник
|
Цитата:
Цитата:
Но я все-таки склоняюсь к первоначальной идее перекрыть insert и закомментировать super(). Пока, насколько я понимаю, lev и DSPIC предпочитают использование кода, приведенного выше, а Wamr, oip и glibs согласны, что без этого можно обойтись. |
|
24.06.2011, 12:47 | #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. |
|
24.06.2011, 12:54 | #11 |
Ищущий знания...
|
Цитата:
ИМХО. Если уж в программе определен механизм определения RecId, то нужно его придерживаться и при использовании внешних систем. Что бы в будущем спать спокойно
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
24.06.2011, 15:08 | #12 |
Участник
|
У меня вопрос. Правда, не совсем по теме
В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"? При каких условиях? Если не могут, то какой смысл в параметре @DataAreaId в приведенной функции? |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
24.06.2011, 15:19 | #13 |
MCITP
|
Цитата:
В каждой компании свой набор RecId, и соответсвенно свои записи с SystemSequences ...
__________________
Zhirenkov Vitaly |
|
24.06.2011, 15:25 | #14 |
Участник
|
|
|
24.06.2011, 15:42 | #15 |
Участник
|
В результате использования класса SystemSequence
__________________
Axapta v.3.0 sp5 kr2 |
|
24.06.2011, 16:18 | #16 |
Участник
|
|
|
24.06.2011, 15:25 | #17 |
Участник
|
А разве в 2009-й recId идет в разрезе компаний?
__________________
Axapta v.3.0 sp5 kr2 |
|
24.06.2011, 16:25 | #18 |
MCITP
|
и правда, нет... не знал.
__________________
Zhirenkov Vitaly |
|
24.06.2011, 16:29 | #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). |
28.06.2011, 15:02 | #20 |
Участник
|
Да вроде все работает. Просто Axapta сверяет указанное значение subkey со списком существующих компаний. Если нет совпадений, то ошибок не выдает, но запись идет в текущую компанию.
|
|
Теги |
ax2009, recid, systemsequences, интеграция, таблица |
|
|