05.06.2010, 20:53 | #1 |
Участник
|
Запись уже существует!?
Из одной компании выгрузил файл (dat) с клиентами. В другой компании пытаюсь загрузить, выдает ошибку:
Невозможно создать запись в Клиенты (CustTable). Счет клиента: АБРИКОС, ООО "АБРИКОС". Запись уже существует. НО такого клиента нет в этой компании со счетом клиента "АБРИКОС". Проверял всеми способами и в аксапте запросы писал, и фильтром, и на SQL посмотрел. Такое ощущение что проблема в RecId, буд-то он его из файла грузит. Запускал реиндексацию - не помогла Как исправить эту ошибку? |
|
05.06.2010, 21:14 | #2 |
Участник
|
Очевидный вопрос, но тем не менее: все варианты написания "АБРИКОС" проверили?
|
|
05.06.2010, 22:10 | #3 |
Участник
|
Что если в параметрах загрузки установить флаг "Обновлять существующие записи" (или как он там называется в вашей версии - кстати, неплохо бы привести версию).
Ну и обычные шаманские пляски:
|
|
05.06.2010, 22:54 | #4 |
Участник
|
АБРИКОС искал во всех вариантах. "абрикос" это условный пример. на самом деле там несколько записей, и на всех ошибка.
Таблица не в виртуальной компании, аос перестартовывал - не помогло. Кэш, если имеется ввиду пользовательский - чистил. версия - AX 2009 sp1. причем база SQL обновленная с AX 4. в 4-ке такой прием работал, нормально загружалось. Проверял по RecID в таблице (на SQL) с таким записей нет , кроме оригинальной. Так же код на трансляцию справочников выдает туже ошибку X++: changecompany("k3") { _newrecord = new DictTable(_record.tableId).makeRecord() .... if (!_newrecord) { buf2buf(_record,_newrecord); _newrecord.doinsert(); } else { buf2buf(_record,_newrecord); _newrecord.doupdate(); } } Последний раз редактировалось propeller; 05.06.2010 в 23:01. |
|
05.06.2010, 23:00 | #5 |
Участник
|
Проверьте счетчик RecID. Вполне возможно, что из-за прямых вмешательств в БД он не актуален.
Ага, БД из 4.0 - все больше шансов что это именно счетчик RecId. Он хранится в таблице, на память не скажу, но название достаточно интуитивное. Таблицу надо смотреть в компании DAT.
__________________
Ivanhoe as is.. Последний раз редактировалось Ivanhoe; 05.06.2010 в 23:03. |
|
05.06.2010, 23:08 | #6 |
Участник
|
Таблица - SystemSequences, посмотреть можно через AOT - System Documentation.
__________________
Ivanhoe as is.. |
|
05.06.2010, 23:12 | #7 |
Участник
|
Цитата:
Вот запись об этой таблице id nextVal minVal maxVal cycle name tabId dataAreaId recVersion RecId -1 5637168173 1 9223372036854775807 false SEQNO 77 dat 801014967 -1 Причем, если я добавляю новую запись в справочник то она нормально транслируется в другую компанию. Если же делаю update() существующих записей то такая ошибка. Опять же, если я в консолидирующей компании, руками создаю клиента - все нормально никаких ошибок. Последний раз редактировалось propeller; 05.06.2010 в 23:30. |
|
06.06.2010, 11:38 | #8 |
Участник
|
propeller, поставьте для начала брейкпойнт в инфологе и посмотрите в этой точке, какая конкретно запись находится: с каким рекидом, в какой компании, и т.д. По-моему, это первое, что надо было сделать, чтобы начать разбирательство.
|
|
06.06.2010, 12:35 | #9 |
Участник
|
Цитата:
в info\add попадает из [s]\Classes\xRecord\doinsert Запись эта находится в консолидирующей компании. С каким RecId неизвестно. в info такой информации не нашел. а до вызова _newrecord.doinsert(); RecId у записи еще равен 0 Еcли _newrecord.doupdate() ([s]\Classes\xRecord\doupdate) ошибка: Невозможно отредактировать запись в Клиенты (CustTable). Счет клиента: АНАНАС, ООО "АНАНАС". Запись уже существует. (Причем RecId у записи какой и должен быть) Не понимаю причем тут update() и запись уже существует... Существует и надо ее обновить.. Последний раз редактировалось propeller; 06.06.2010 в 13:06. |
|
06.06.2010, 13:55 | #10 |
Участник
|
|
|
06.06.2010, 14:02 | #11 |
Участник
|
|
|
06.06.2010, 14:55 | #12 |
Участник
|
Я имею ввиду, что если в компании в параметрах главной книги стоит флаг "Консолидирующая компания", то создать там запись клиента не особенно получится.
Попробуйте создать запись не программно, в вручную. |
|
06.06.2010, 17:54 | #13 |
Участник
|
|
|
06.06.2010, 18:51 | #14 |
Участник
|
Цитата:
Сообщение от propeller
Запись эта находится в консолидирующей компании.
Ну и "код в студию". Подробности опусти, начни с места changeCompany, заполение полей, за исключением ключевых опусти, приведи только ключевые поля и места, где заполняются ключевые поля. При этом покажи как обнуляются переменные при смене компании (то есть, есть ли конструкции типа custVend = null и т.п.) |
|
06.06.2010, 19:10 | #15 |
Участник
|
Кстати. Для Ax30 была рекомендация при смене компании обнулять переменную, то есть, делать что-то подобное:
X++: changeCompany('XXX') { { custTable = null; } X++: changeCompany('XXX') { { custTable = null; custTable.disabeCash(true); } После этого взял в привычку после переключения компаний запрещать кеширование. В нашем коде нет проблем, а в стандартном делам это по мере обнаружения проблем. Так что, залезь в код импорта и вставиь в нужные места для переменной записи перед её заполнением .disableCash(true). |
|
06.06.2010, 19:25 | #16 |
Участник
|
Для примера, работал примерно такой код:
X++: InventTrans inventTrans;
InvenTrans inventTransNew;
InventTransId transId = 'Скл000001'; X++: select firstOnly inventTrans where inventTrans.InventTransId == transId; if (inventTrans ) { changeCompany('BBB') { inventTransNew = null; select firstOnly inventTransNew where inventTransNew.InventTransId == transId; } } Если же запретить кэш: X++: select firstOnly inventTrans where inventTrans.InventTransId == transId; if (inventTrans ) { changeCompany('BBB') { inventTransNew = null; inventTransNew .disableCach(true); select firstOnly inventTransNew where inventTransNew rans.InventTransId == transId; } } Так что начиная с DAX4.0 затим нужно следить не только в своем коде, но и в стандартнм. Последний раз редактировалось Raven Melancholic; 06.06.2010 в 19:28. |
|
07.06.2010, 09:36 | #17 |
Участник
|
Цитата:
Сообщение от Raven Melancholic
Причем, обнаружил эту особенность на таблице InventTrans, которая вообще не кэшируется! Получилось так, что в результате работы механизма Интеркомпани - получлось так, что лот в одной компании (по которому только что был произведен поиск, совпал с лотом в другой компании, для которой ищем лот). Если в одной компании нашли лот, то после переключения на другую компанию этот лот не ищется, а возвращается запись из первой компании!!!
После этого взял в привычку после переключения компаний запрещать кеширование. В нашем коде нет проблем, а в стандартном делам это по мере обнаружения проблем. Так что, залезь в код импорта и вставиь в нужные места для переменной записи перед её заполнением .disableCash(true). Судя по описанным симптомам, могло повлиять вот это : Глюки RecordViewCache Правда у меня все это воспроизводилось в Ax 3.0 Для 4-ки не проверял. |
|
Теги |
changecompany, импорт данных, кэш |
|
|