AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2011, 19:43   #1  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
? Формирование 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
Не знаю, пробовал ли его уже кто-нибудь. Боязно снаружи менять SystemSequences.

В связи с тем, что пишут, что "в AX 2009 RecId уникален лишь для каждой таблицы, а не для базы в целом", появилась мысль: почему бы, ни на что не взирая, не авто-инкрементить RecId в данной конкретной таблице, начиная с единицы?

Это чем-то чревато? Как бы поступили вы сами?

Прошу поделиться соображениями.

Последний раз редактировалось Hyper; 23.06.2011 в 19:48.
Старый 23.06.2011, 20:58   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
даже если автоинкриментить RecId, то все равно придется обновлять таблицу SystemSequence для Вашей таблицы. Иначе если вдруг запись добавят из самой аксапты, могут получиться накладки.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.06.2011, 21:10   #3  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от lev Посмотреть сообщение
Иначе если вдруг запись добавят из самой аксапты, могут получиться накладки.
Риск минимален - таблица используется для импорта в AX внешних данных. Подразумевается, что хакерить из AX никто не будет.
Старый 23.06.2011, 21:13   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
если вдруг запись добавят из самой аксапты
уникальный индекс по RecId и никаких если вдруг не произойдет
автоинкремент, и не мучайте ни себя ни аксапту
Старый 23.06.2011, 21:16   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Hyper Посмотреть сообщение
Не знаю, пробовал ли его уже кто-нибудь. Боязно снаружи менять SystemSequences.
Пробовали, не бойтесь. Главное - не заблокировать таблицу SystemSequences, быстро получили новый RecId и отпустили таблицу.

Цитата:
Сообщение от Hyper Посмотреть сообщение
Это чем-то чревато? Как бы поступили вы сами?
Ничем, мы так и поступили.
За это сообщение автора поблагодарили: Hyper (1).
Старый 23.06.2011, 21:23   #6  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Да ничем это не чревато если Аксапта точно не будет сама что-либо писать в данную таблицу, а так же если данное поле recId нигде в бизнес-логике не участвует.

P.S. А вообще, можно сделать, чтобы и Аксапта могла в эту таблицу данные писать (используя suspendRecIds). Да и recId даже в пределах таблицы может быть и не уникален, если по нему уникального индекса нет. Только некрасиво это.
За это сообщение автора поблагодарили: Hyper (1).
Старый 23.06.2011, 23:07   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.

Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода.

Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены...
__________________
С уважением,
glibs®
Старый 24.06.2011, 01:04   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от glibs Посмотреть сообщение
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.

Заполнять RecId нужно потустороней софтиной, по хорошему. Или писать триггер и следить стоб не стерся. А коли так, то просто развести диапазоны RecId, в которые может писать Аксапта, и в которые может писать потусторонняя софтина, чтобы они не пересеклись. Не совершенно, но быстро и просто. И оптимально с т.з. поддержки кода.

Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены...
Я бы не делал из мухи слона. По-моему, здесь только усложнения: триггер, следить, чтобы он не стерся, развести диапазоны... Единственное, что действительно стоит отсюда добавить в верхние посты - это не связываться с хранимой процедурой и получать следующее значение RecId в той же софтине: т..е. написать метод
Код:
int64 getNextRecId(int _tableId)
>Для тех кто любит творить много совершенного кода и не беспокоится о стоимости его поддержки варианты были предложены...

Glibs, если предложишь решение по выделению RecId проще и дешевле в поддержке - ставлю пиво.
Старый 24.06.2011, 03:39   #9  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от glibs Посмотреть сообщение
Чтобы Аксапта работала с таблицей как с родной (а иначе вопрос про RecId зайти не должен был бы), ее нужно создавать в АОТ. А если так, то автоинкремент в чистом виде сделать не получится, насколько я могу понимать.

Заполнять RecId нужно потустороней софтиной, по хорошему.
Да, я имел в виду "программный" инкремент, ответственность за который несет внешняя софтина.
Цитата:
Сообщение от oip Посмотреть сообщение
А вообще, можно сделать, чтобы и Аксапта могла в эту таблицу данные писать (используя suspendRecIds).
Кстати, да, хорошая защита от излишне ретивых девелоперов. Перекрыть метод insert на таблице, делать в нем suspendRecIds, программное выделение RecId, super(), removeRecIdSuspenson. Таким образом даже если кто-то "случайно" вставит запись из AX, корректность RecId можно проконтролировать.
Но я все-таки склоняюсь к первоначальной идее перекрыть insert и закомментировать super().

Пока, насколько я понимаю, lev и DSPIC предпочитают использование кода, приведенного выше, а Wamr, oip и glibs согласны, что без этого можно обойтись.
Старый 24.06.2011, 12:47   #10  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Hyper Посмотреть сообщение
Три года назад был предложен следующий код
Только обратил внимание, что код для тройки. Для AX2009 надо еще подставить TableId:
X++:
FROM SYSTEMSEQUENCES A WHERE A.Id = -1 AND A.TABID =  AND A.DATAAREAID = @dataAreaId
С утра на свежую голову решил все-таки формировать RecId с помощью SystemSequences.
Если столкнусь с трудностями, буду иметь запасной вариант (игнор SystemSequences) в виду.

Всем спасибо за советы.

P.S. Ну и @RecID должен быть BIGINT. Еще что-то пропустил?

Последний раз редактировалось Hyper; 24.06.2011 в 12:56.
Старый 24.06.2011, 12:54   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Hyper Посмотреть сообщение
С утра на свежую голову решил все-таки формировать RecId с помощью SystemSequences.
Если столкнусь с трудностями, буду иметь запасной вариант (игнор SystemSequences) в виду.

Всем спасибо за советы.
Мне кажется правильное решение

ИМХО. Если уж в программе определен механизм определения RecId, то нужно его придерживаться и при использовании внешних систем.
Что бы в будущем спать спокойно
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 24.06.2011, 15:08   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
У меня вопрос. Правда, не совсем по теме

В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"? При каких условиях? Если не могут, то какой смысл в параметре @DataAreaId в приведенной функции?
За это сообщение автора поблагодарили: S.Kuskov (3).
Старый 24.06.2011, 15:19   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
У меня вопрос. Правда, не совсем по теме

В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"? При каких условиях? Если не могут, то какой смысл в параметре @DataAreaId в приведенной функции?
А что в этом плане разве чт-то поменялось по сравнеию с предыдущими версиями?
В каждой компании свой набор RecId, и соответсвенно свои записи с SystemSequences ...
__________________
Zhirenkov Vitaly
Старый 24.06.2011, 15:25   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А разве в 2009-й recId идет в разрезе компаний?
__________________
Axapta v.3.0 sp5 kr2
Старый 24.06.2011, 15:25   #15  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"?
В AX2009 я такого не наблюдаю, но в тройке вижу разные SystemSequences.DataAreaId для разных компаний.
Старый 24.06.2011, 15:42   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
У меня вопрос. Правда, не совсем по теме

В Ax2009 записи в таблице SystemSequences могут иметь значение DataAreaId отличное от "DAT"? При каких условиях?
В результате использования класса SystemSequence
__________________
Axapta v.3.0 sp5 kr2
Старый 24.06.2011, 16:18   #17  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
В результате использования класса SystemSequence
Можно пример?
Старый 24.06.2011, 16:25   #18  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от AndyD Посмотреть сообщение
А разве в 2009-й recId идет в разрезе компаний?
и правда, нет... не знал.
__________________
Zhirenkov Vitaly
Старый 24.06.2011, 16:29   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Так в документации есть
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"
Вот только subkey у меня в Rollup 7 не работает - последовательность продолжается, но запись в текущей компании регистрируется

PS Ой, класс неправильно выше назвал
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 24.06.2011 в 16:33.
За это сообщение автора поблагодарили: Владимир Максимов (1).
Старый 28.06.2011, 15:02   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
Вот только subkey у меня в Rollup 7 не работает - последовательность продолжается, но запись в текущей компании регистрируется
Да вроде все работает. Просто Axapta сверяет указанное значение subkey со списком существующих компаний. Если нет совпадений, то ошибок не выдает, но запись идет в текущую компанию.
Теги
ax2009, recid, systemsequences, интеграция, таблица

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axinthefield: SQL Server Trace Flags for Dynamics AX Blog bot DAX Blogs 0 23.11.2010 21:11
AX 2009 Technical Journal: Short note on AX and database mirroring in SQL Server 2008 Blog bot DAX Blogs 0 04.02.2010 06:10
emeadaxsupport: Unable to install Dynamics AX 2009 Analysis extensions when the default SQL Server Analysis Server collation is set to Turkish_CI_AS or Turkish_CS_AS Blog bot DAX Blogs 0 22.09.2009 04:06
gatesasbait: Dynamics AX 2009 SSRS and SSAS Integration Tips Blog bot DAX Blogs 3 09.07.2009 13:07
Dynamics AX: Looking into SQL Server 2008 Blog bot DAX Blogs 0 16.01.2009 05:06
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:47.