Инструменты пользователя

Инструменты сайта


axapta:recid

Раздел: Программирование>РаботаСБазойДанных


toc RecId - целое поле во всех таблицах для однозначной идентификации записи. Может быть отрицательным. Его значение может измениться результате импорта/экспорта. см. также НомерныеСерии

В Ax30 RecID 32-битное в Ax40 – 64 битное (см http://blogs.msdn.com/palle_agermark/archive/2006/05/23/604657.aspx)

http://axaptafreak.blogspot.com/2005/08/tip-how-to-renumber-your-recids.html – как перенумеровать RecId

Про дырки в нумерации: «Кстати, насчет дырок. Одна из причин их появления - каждый AOS (а так же тольстый клиент и клиент в 2-х звенке) резервирует под себя определенное кол-во recId (для уменьшения обращений к б/д при добавлении новых записей). При его перезагрузке это резервирование сбрасывается и выбирается новый диапазон при загрузке.»

RecId на временных таблицах

Нумерация для каждой временной таблицы (в том числе и тех, которые сделаны временными через вызов setTmp()) начинается с константы и возрастает на некоторую дельту (0x30) в рамках времени жизни табличной переменной. Если, к примеру, создать одновременной две одинаковые табличные переменные и вставить в каждую из них записи, то RecId у них будет одинаковый в соответствующих строках

недостатки связи по RecID

RECID при экспорте/импорте восстанавливаются. Однако бывают в этом алгоритме глюки, если у тебя два поля с RECID и/или ты включаешь/исключаешь твою таблицу в коллекцию.

Нумерация по RecId идет в каждой компании независимо, следовательно, если есть завязка по RecId в одной компании, то она будет бессильна в другой… то же самое с добавление таблиц в виртуальные компании… Импорт через CVS, тереяет ссылки по RefRecId, которые умеет восстанавливать bin импорт… т.е. приходится парами импортировать таблицы. Дефрагментация RecId может убить связи, если они не унаследованы от RefRecId. Если Вы убили-завели заново, допустим, поставщика, то все данные связанные поедут (Альтернативный адрес, например). Да много примеров было - все не упомнить.

  • На RecID не повесишь свой нумератор.
  • Никто не гарантирует, что нумерация RecID будет сплошная без дыр. Кстати, никто не гарантирует, что нумерация RecID монотонно возрастает по времени
  • RECID сугубо программистский инструмент. Если ты завязываешься на него, то тебе нужно будет придумывать, как показывать наименование вместо кода. А Аксапта сделана в расчете, что код является значимым для пользователя. Используйте НомерныеСерии
  • По RECID не будет работать VisualMorphXplorer.
  • По RecID не будет работать алгоритм изменения кода.
  • По RecID не будет работать DynaLink. Да и вообще автосвязь между таблицами работать не будет.
  • Будет меньше информации в перекрестных ссылках.

НадоПеревести:

Try running the SYSRECID class in the AOT, It takes a long time to
run 
but will clean it up significantly.

--- In Axapta-Knowledge-Village@yahoogroups.com, "lourens1210" 
<lourensjb@t...> wrote:
> Can anybody shed some light urgently please!!
> 
> We have a very young Axapta installation and have found that the 
> recid's are already running negative and is being allocated towards 
> Zero. This raises a few questions:
> 1 What can cause the positive id's to be 'used up' already?
> 2 If the recid's are not 'used up' what can cause the sign switch
> so 
> early on in the life of the database (Apparently once the maximum 
> positive number have been reached: 2,176,xxx,xxx, axapta goes to 
> maximum negative and create from there - it does not seem likely 
that 
> we have exhausted the positive numbers already)
> 3 Is it normal for recid's to be allocated not strictly in sequence?
> 4 What happens when the recid series reaches Zero?
> 5 If this situation is abnormal how do we correct it?
> 
> Thanx everybody

[[:Сырьё | ]]

В поле DataAreaId хранится идентификатор компании, к которой принадлежит данная запись в нашем случае это: «Hld», «Msk», «Pit» и «Tvr». В поле RecId хранится порядковый номер записи, который уникален во всех записях, принадлежащих одной компании во всех таблицах. Таким образом, сочетание этих полей дает уникальный ключ, который мы и будем применять. Здесь необходимо знать о правилах присвоения значения поля RecID. Axapta не пользуется никакими сервисами базы даных для вычисления нового номера в этом поле. Вместо этого она ведет таблицу SystemSequences следующей структуры:

#|

Имя столбца Тип Значение по умолч. NULL Описание столбца.
ID NUMBER(10) 0 NOT
NEXTVAL NUMBER(10) 0 NOT Начало следующего пула номеров
MINVAL NUMBER(10) 0 NOT Минимальный номер
MAXVAL NUMBER(10) 0 NOT Максимальный номер
CYCLE NUMBER(10) 0 NOT Номера по кругу
NAME VARCHAR2(20) ' ' NOT Наименование последовательности
TABID NUMBER(10) 0 NOT
DATAAREAID VARCHAR2(3) 'dat' NOT Идентификатор компании
RECID NUMBER(10) NOT Номер записи

Работает AXAPTA с этой таблицей следующим образом:

1. При вставке первой записи в новую компанию система AXAPTA добавляет в таблицу SystemSequences запись. В поле DATAAREAID устанавливается значение равное идентификатору компании, а в поля MINVAL и NEXVAL записывается единица.
2. Сразу после этого система AXAPTA берет лот номеров (лот в данном случае это - несколько подряд идущих номеров, AXAPTA берет 25). И записывает в поле NEXTVAL следующий свободный номер – 26.
3. Заносит в таблицу, с которой все началось запись с RECID равным 1 и DATAAREAID равным идентификатору компании.
4. После того как номера в лоте заканчиваются, система AXAPTA снова читает таблицу SystemSequences, берет оттуда NEXTVAL как первый номер следующего лота. А в таблицу SystemSequences записывает значение NEXTVAL+25.

Таким образом AXAPTA решает две проблемы – каждый пользователь ведет свой лот номеров RECID и значения этого поля не пересекаются, второе – пользователь (вернее его приложение) обращается к таблице SystemSequences один раз на 25 операций вставки и таким образом не возникает ожидания из-за обращения всех к этой таблице.


In Dynamics AX, recId is assigned according to the nextVal (ID -1, name SEQNO) of SystemSequence table. But the next value of RecId is not always retrieved from the table, and it is cached in client machine’s memory. In AX3.0, the default cache size is 25. Developers can change the default cache size using SystemSequence class: In the startupPost method of Application class, you can add the following code:

    SystemSequence SystemSequence;   
    …
 
    SystemSequence = new SystemSequence();
    SystemSequence.setCacheSize(30); 

As a result, recIDs are drawn in sets of 30. That also means that the next value of SystemSequence table will be increased by 30 each time.

In AX 4.0, recIds will be generated unique per table instead of per company. So for each table, there will be a nextVal (ID -1, name SEQNO) in SystemSequence table. The cache size for recId allocation is increased to 250. And AX 4 does not allow changing cache size for recId allocation anymore.


Assegnare Recid a una Tabella manualmente

MyTable xyz;
SystemSequences obj;
;
obj = new SystemSequences();
obj.SuspendRecIDs(tablenum(MyTable)); 
MyTable.overwriteSystemFields(TRUE); // dont know if this is required 
MyTable.clear;
MyTable.RecID = 4711;
...
MyTable.insert; 
obj.removeRecIDSuspension(tablenum(MyTable));

[[:СмТакже]]

axapta/recid.txt · Последнее изменение: 2018/04/13 22:43 (внешнее изменение)