19.06.2009, 14:00 | #1 |
MCTS
|
Не выделять RecId
Подозреваю, что не возможно, но вдруг... Как для определенной таблицы заставить не выделять новые RecId? Например, для логов мне абсолютно не нужно тратить номера.
|
|
19.06.2009, 14:06 | #2 |
Участник
|
в какой версии?
если в 3.0, то невозможно если в 4.0, то тоже невозможно, но там и не нужно заморачиваться recid, поскольку для каждой таблицы свой диапазон номеров. еще тема для размышления: для временных таблиц recid не выделяется (вроде бы). |
|
19.06.2009, 14:11 | #3 |
Ищущий знания...
|
на сколько я знаю, выделением RecId занимается ядро... едвали можно это как то обойти.
да и как то это дико\непривычно выглядит
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
19.06.2009, 14:12 | #4 |
Участник
|
В 3.0 все же возможно что то типа
\System Documentation\Classes\systemSequence\suspendRecIds Правда мы его использовали когда recId задавали сами - если же его оставить нулем, то не проверял что будет. |
|
|
За это сообщение автора поблагодарили: mazzy (5), gl00mie (10), SRF (2). |
19.06.2009, 14:31 | #5 |
MCTS
|
А как же уникальный индекс по RecID (даже в таблицах с SaveDataPerCompany ==no). По-моему, база не даст добавить запись. Его можно как-нибудь удалить, при этом, чтобы синхронизация не вернула его обратно?
А еще выделение RecId в рамках таблиц, где это можно прочитать? (3,0) Последний раз редактировалось Eldar9x; 19.06.2009 в 14:33. |
|
19.06.2009, 15:48 | #6 |
MCITP
|
Цитата:
Наличие индекса по RecId не является обязательным, а зависит от - соответсвующего свойства на таблице (CreateRecIdIndex) - наличия в таблице других уникальных индексов (если их нет, то Аксапта добавит recid в какой-нибудь другой индекс и сделает его уникальным) - наличия индексов в принципе - если их нет вообще, то создаст индекс по RecId независимо от первого пункта Для тройки это не возможно, обсуждалось: Включение потабличного RecID в 3-ке Для четвёрки и выше - это по умолчанию, ничего настраивать не надо.
__________________
Zhirenkov Vitaly |
|
19.06.2009, 15:52 | #7 |
Участник
|
Хорошая ветка.Борьбу с 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 | #8 |
Участник
|
Цитата:
Цитата:
Цитата:
1. Перекрывается initValue() в таблице следующим образом(число любое, кроме 0) X++: public void initValue() { super(); //srf --> this.(fieldNum(Test, RecId)) = 1; //srf <-- } X++: static void Test(Args _args) { ; new SystemSequence().suspendRecIds(tableNum(test)); } Но если вы укажите для поля tst - одно и тоже значение для разных записей, то AX выдаст ошибку, что вставка не возможна, это как раз связано с тем, о чем писал Виталий(ZVV) : Цитата:
- наличия в таблице других уникальных индексов (если их нет, то Аксапта добавит recid в какой-нибудь другой индекс и сделает его уникальным)
- наличия индексов в принципе - если их нет вообще, то создаст индекс по RecId независимо от первого пункта P.S. Можно и с RecId = 0 поиграться, убив к примеру, ограничения на таблице, однако в ax 4.0 через обозреватель записи не вставляются, а из кода вставка возможна. Последний раз редактировалось SRF; 22.06.2009 в 13:14. Причина: Дополнение |
|
|
За это сообщение автора поблагодарили: Eldar9x (2). |
22.06.2009, 13:17 | #9 |
Участник
|
Не надо так играться.
По всем соглашениям, принятым в Аксапте, recId == 0 означает, что запись либо не найдена, либо только что-создана (отсутствует на SQL-сервере). |
|
25.06.2009, 08:51 | #10 |
MCTS
|
Цитата:
вот такой финт ушами
Вобщем меня интересует, как долго будет длится действие suspendRecIds. Зы, а зачем через id поля? [XPP]this.(fieldNum(Test, RecId)) = 1;/XPP] почему не так? X++: this.RecId = 1; Последний раз редактировалось Eldar9x; 25.06.2009 в 08:55. |
|
25.06.2009, 09:08 | #11 |
Участник
|
RecId, равно как и createdBy/createdDate/modifiedBy/etc, - это системное поле, поэтому присваивать ему значение напрямую запрещено, а использование идентификатора позволяет этот запрет обойти.
|
|
25.06.2009, 09:25 | #12 |
Участник
|
Цитата:
Сообщение от Eldar9x
Спасибо за идею. Подскажите еще, suspendRecIds работает как? В рамках сессии, в рамках запущенного кода, или можно один раз запустить и recId для таблиц генериться не будет? В какой момент таблица снова станет генерировать RecId? После синхронизации таблиц, перезапуска АОС...? Или нужно вызвать removeRecIdSuspensin?
Вобщем меня интересует, как долго будет длится действие suspendRecIds. Зы, а зачем через id поля? [XPP]this.(fieldNum(Test, RecId)) = 1;/XPP] почему не так? X++: this.RecId = 1; Цитата:
По поводу suspendRecIds - могу только сказать, что прерывает генерацию как минимум в рамках сессии(разумеется без вызова removeRecIdSuspenson), синхронизация никак не влияет. |
|
18.09.2017, 10:08 | #13 |
Участник
|
Цитата:
Применительно к SysDataBaseLog - в стандарте, у нее есть индекс в AOT (TableId, LogRecId, CreatedDate, CreatedTime) - так вот если эти 4 поля уникальны у Вас в базе, либо если Вы готовы отключать уникальность каждый раз после синхронизации данной таблицы - то в принципе можно отключить заполнение recid для данной таблицы(но если честно, одно дело тестовая база, другое - рабочая , в промышленной эксплуатации я такого не видел)
|
|