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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.08.2007, 13:53   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
SystemSequences - Выделение RecId
Пытаюсь понять логику. Пока не дошло

X++:
static void JobSystemSequenceNextVal(Args _args)
{
    SystemSequence SystemSequence;   
    ;
 
    SystemSequence = new SystemSequence();
    print SystemSequence.getCacheSize();
    print SystemSequence.nextVal(tableNum(InventTable));
    pause;
}
Результат:
250
139565347

Если выполнить еще раз, получаю, ессно, 139565348

При этом смотрю в таблицу SystemSequences. В NextVal для RecId вижу 139565770

Я, конечно, не физ.мат. заканчивал, но даже мне видно, что

139565770 - 139565347 > 250, а конкретно равно 423

Вопрос1: Как же это так получается?
Вопрос2: Кроме как методом setCacheSize, как можно управлять параметром NextVal? В конфиг. утилите AOS есть для этого поле? Какое?

Спасибо
Старый 10.08.2007, 15:56   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
На всякий случаай напишу версию системы и СУБД:
AX 3.0 SP5 KR2, SQL Server 2005 SP2
Старый 10.08.2007, 16:55   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
См. также Вставка строк в таблицы Аксапты сторонними средствами

Была еще одна ветка, где разжевывался алгоритм генерации RecID.
Что-то не могу найти.
__________________
полезное на axForum, github, vk, coub.
Старый 10.08.2007, 17:11   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Хм. Спасибо конечно, ссылку эту я раньше не видел.
Но все это уже давно известно.

Мне бы причину этого странного поведения выяснить. Или выяснить, что я не прав и оно совсем не странное.
Старый 13.08.2007, 17:07   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Немного реабилитирую работу класса SystemSequences перед читателями.

X++:
static void JobSystemSequenceNextVal2(Args _args)
{
    SystemSequence  systemSequence;
    RecId           recIdBefore, recIdAfter;
    ;
    systemSequence = new SystemSequence();
    systemSequence.flushCache();
    recIdBefore = systemSequence.nextVal();
    systemSequence.flushCache();
    recIdAfter = systemSequence.nextVal();

    info(strFmt("Размер буфера: %1", systemSequence.getCacheSize()));
    info(strFmt("След. значение: %1", recIdBefore));
    info(strFmt("След. значение: %1", recIdAfter));
    info(strFmt("Разница: %1", recIdAfter - recIdBefore));
}
Это задание выдает след. результаты:

Info Сообщение (16:06:31) Размер буфера: 250
Info Сообщение (16:06:31) След. значение: 32285687
Info Сообщение (16:06:31) След. значение: 32285937
Info Сообщение (16:06:31) Разница: 250

То есть вроде как все ОК.
Правда при этом остатется в силе мой изначальный вопрос. Как так получается у меня?
Старый 16.08.2007, 02:13   #6  
Ed1k is offline
Ed1k
Участник
 
102 / 42 (2) +++
Регистрация: 19.07.2006
Цитата:
Сообщение от kashperuk Посмотреть сообщение

250
139565347

Если выполнить еще раз, получаю, ессно, 139565348

При этом смотрю в таблицу SystemSequences. В NextVal для RecId вижу 139565770

Я, конечно, не физ.мат. заканчивал, но даже мне видно, что

139565770 - 139565347 > 250, а конкретно равно 423

Вопрос1: Как же это так получается?
Так а чего удивительного, кто-то позже спросил и себе 250
Старый 16.08.2007, 09:22   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Ed1k Посмотреть сообщение
Так а чего удивительного, кто-то позже спросил и себе 250
AFAIK, вообще АОС выделяет RecId для всех клиентов. То есть кэш в 250 значений - на всех клиентов, а не на одного.
Соответственно не мог
Более того, я это тестировал в новой компании, я был единственным активным пользователем.
Старый 16.08.2007, 10:27   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А если несколько АОСов?
Старый 16.08.2007, 10:30   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от George Nordic Посмотреть сообщение
А если несколько АОСов?
Про несколько речь не идет, так как у нас АОС всего один.
Старый 21.08.2007, 15:37   #10  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Сообщение от kashperuk Посмотреть сообщение
При этом смотрю в таблицу SystemSequences. В NextVal для RecId вижу 139565770
у меня
SystemSequence.flushCache();
SystemSequence.nextVal();

ax 1753711625 db 1753711875 разница 250

SystemSequence.nextVal();

ax 1753711626 db 1753712125 уже 499

SystemSequence.nextVal();

ax 1753711627 db 1753712125 498
Старый 07.05.2009, 16:39   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Вопрос2: Кроме как методом setCacheSize, как можно управлять параметром NextVal? В конфиг. утилите AOS есть для этого поле? Какое?
Насколько я знаю, нет такого управляющего места, эта цифра по умолчанию похоже зашита в ядро, или где-то в khd файлах или т.п.
Более того в 4-ке и 2009 setCacheSize вообще нету...

Цитата:
Сообщение от kashperuk Посмотреть сообщение
На всякий случаай напишу версию системы и СУБД:
AX 3.0 SP5 KR2, SQL Server 2005 SP2
Кстати, в 2.5 и в 3.0 до sp3 как минимум эта цифра была не 250, а 25.

А как так получается - действительно вопрос. Если в этом случае использовался только один АОС и один активный тонкий клиент. Вероятно, кто-то или что-то всё-таки ещё использует этот кэш RecId. Возможно для каких-то внутренних задач, и мы об этом ничего не знаем... В доке этот момент как-то не особо разжёван, к сожалению..
__________________
Zhirenkov Vitaly
Старый 27.08.2013, 15:02   #12  
abark is offline
abark
Участник
 
14 / 10 (1) +
Регистрация: 26.06.2013
Адрес: Волгоград
Видимо стандартный алгоритм класса SystemSequence, который ведет буфер зарезервированных идентификаторов внутри AOS-а, работает следующим образом:
X++:
   AOS    getBufferSize  ,         BufferSize

Для примера для bufferSize = 250 будет такая трассировка:
1. делаем flushCache() --> N = 0 (количество неиспользованных идентификаторов), SystemSequence.NextVal = 10000000
2. первое выделение nextVal()
2.1. т.к. N = 0 < 250, то выделяем очередной блок --> N = 250, SystemSequence.NextVal = 10000250
2.2. используем первый из полученных идентификаторов, в итоге N = N-1 = 249
3. второе выделение nextVal()
3.1. т.к. N=249 < 250, то выделяем очередной блок --> N = 249 + 250 = 499, SystemSequence.NextVal = 10000500
3.2. используем очередной из полученных идентификаторов, в итоге N = N-1 = 498
4. очередное выделение nextVal()
4.1. т.к. N=498 > 250, то больше новых блоков пока не выделяем --> N = 498, SystemSequence.NextVal = 10000500
4.2. используем очередной из полученных идентификаторов, в итоге N = N-1 = 497

При нескольких AOS-ах поведение каждого отдельного AOS-а подчиняется тому же самому алгоритму.
Теги
recid, документация, systemsequences, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сформировать RecId Arahnid DAX: Программирование 18 14.07.2008 15:02
поля, содержащие RecId somebody DAX: Программирование 15 16.05.2008 17:50
Assegnare Recid a una Tabella manualmente belugin DAX: Программирование 5 14.01.2008 17:38
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56

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

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

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