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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2009, 15:52   #1  
DocSerzh is offline
DocSerzh
Участник
 
51 / 22 (0) +++
Регистрация: 28.06.2004
Хорошая ветка.Борьбу с recId вели долгую и упорную.В итоге дефрагментировали все-таки дефрагментировали компанию(база ~500Гб)...

1. Хорошая ветка почитать
Assegnare Recid a una Tabella manualmente
2. Решали подобную задачу - правда, "Писатель" данных был 1.В коде явно прописывали генерацию max+1, max вычислялся 1 раз при инициализации класса-генератора.Класс прописывался в appl (хотя это не хорошо), и кажды раз
X++:
if( appl.parmRecId_engine( this.TableId ) )
        this.RecId = appl.parmRecId_engine().getRecId( this.TableId );
Может, есть лучший способ ?
Старый 22.06.2009, 12:46   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (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).
Старый 22.06.2009, 13:17   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от SRF Посмотреть сообщение
Можно и с RecId = 0 поиграться
Не надо так играться.
По всем соглашениям, принятым в Аксапте, recId == 0 означает, что запись либо не найдена, либо только что-создана (отсутствует на SQL-сервере).
__________________
полезное на axForum, github, vk, coub.
Теги
ax3.0, recid, systemsequences

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
if (record) vs if (record.RecId) kashperuk DAX: Программирование 18 27.11.2008 18:53
поля, содержащие RecId somebody DAX: Программирование 15 16.05.2008 17:50
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56
Форма InventOnhandItem, Почему RecID у InventSum в этой форме всегда 0? Кирилл DAX: Программирование 2 25.05.2004 18:15

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

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

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