Показать сообщение отдельно
Старый 22.06.2009, 12:46   #8  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
А как же уникальный индекс по RecID (даже в таблицах с SaveDataPerCompany ==no). По-моему, база не даст добавить запись.
Цитата:
Сообщение от ZVV Посмотреть сообщение
Если индекс есть, то не даст, если нет, то даст...
Цитата:
Сообщение от Logger Посмотреть сообщение
В 3.0 все же возможно что то типа
\System Documentation\Classes\systemSequence\suspendRecIds

Правда мы его использовали когда recId задавали сами - если же его оставить нулем, то не проверял что будет.
Вообще не стоит забывать как минимум еще и о том, что AX создает 2 ограничения на поле RecId - NOT NULL и RecId <> 0 (так что если recid не выделять, оставляя пустым или нулевым, то SQL ругнется сначала, как раз на данное ограничение)

Цитата:
Сообщение от mazzy Посмотреть сообщение
в какой версии?
если в 3.0, то невозможно
если в 4.0, то тоже невозможно, но там и не нужно заморачиваться recid, поскольку для каждой таблицы свой диапазон номеров.
Насчет не выделения RecId - вопрос спорный, предлагаю вот такой финт ушами(у меня в AX 4.0 работало нормально, на AX 3.0 проверить не могу), к примеру, есть таблица - test, у нее есть строковое поле tst, данное поле добавлено в индекс на таблице(индекс нужен затем, чтобы AX не создала уникальный в разрезе RecId, иначе ничего работать не будет). Затем делаются 2 вещи :
1. Перекрывается initValue() в таблице следующим образом(число любое, кроме 0)
X++:
public void initValue()
{
    super();
    //srf -->
    this.(fieldNum(Test, RecId)) = 1;
    //srf <--
}
2. Запускается job :
X++:
static void Test(Args _args)
{
    ;
    new SystemSequence().suspendRecIds(tableNum(test));
}
После этого спокойно открываем таблицу в обозревателе и начинаем создавать записи с recId равным 1, при этом systemSequences не трогается

Но если вы укажите для поля tst - одно и тоже значение для разных записей, то AX выдаст ошибку, что вставка не возможна, это как раз связано с тем, о чем писал Виталий(ZVV) :
Цитата:
- наличия в таблице других уникальных индексов (если их нет, то Аксапта добавит recid в какой-нибудь другой индекс и сделает его уникальным)
- наличия индексов в принципе - если их нет вообще, то создаст индекс по RecId независимо от первого пункта
Применительно к SysDataBaseLog - в стандарте, у нее есть индекс в AOT (TableId, LogRecId, CreatedDate, CreatedTime) - так вот если эти 4 поля уникальны у Вас в базе, либо если Вы готовы отключать уникальность каждый раз после синхронизации данной таблицы - то в принципе можно отключить заполнение recid для данной таблицы(но если честно, одно дело тестовая база, другое - рабочая , в промышленной эксплуатации я такого не видел)

P.S. Можно и с RecId = 0 поиграться, убив к примеру, ограничения на таблице, однако в ax 4.0 через обозреватель записи не вставляются, а из кода вставка возможна.

Последний раз редактировалось SRF; 22.06.2009 в 13:14. Причина: Дополнение
За это сообщение автора поблагодарили: Eldar9x (2).