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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2010, 20:53   #1  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Запись уже существует!?
Из одной компании выгрузил файл (dat) с клиентами. В другой компании пытаюсь загрузить, выдает ошибку:

Невозможно создать запись в Клиенты (CustTable). Счет клиента: АБРИКОС, ООО "АБРИКОС".
Запись уже существует.

НО такого клиента нет в этой компании со счетом клиента "АБРИКОС". Проверял всеми способами и в аксапте запросы писал, и фильтром, и на SQL посмотрел.

Такое ощущение что проблема в RecId, буд-то он его из файла грузит.
Запускал реиндексацию - не помогла

Как исправить эту ошибку?
Старый 05.06.2010, 21:14   #2  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Очевидный вопрос, но тем не менее: все варианты написания "АБРИКОС" проверили?
Старый 05.06.2010, 22:10   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Что если в параметрах загрузки установить флаг "Обновлять существующие записи" (или как он там называется в вашей версии - кстати, неплохо бы привести версию).
Ну и обычные шаманские пляски:
  • Может быть справочник клиентов включен в виртуальную компанию?
  • Перед загрузкой рестартовали AOS?
  • Чистили кэш?
Старый 05.06.2010, 22:54   #4  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
АБРИКОС искал во всех вариантах. "абрикос" это условный пример. на самом деле там несколько записей, и на всех ошибка.
Таблица не в виртуальной компании, аос перестартовывал - не помогло.
Кэш, если имеется ввиду пользовательский - чистил.
версия - 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();
                }
}
Причем doinsert() или doupdate() - ошибка все таже

Последний раз редактировалось propeller; 05.06.2010 в 23:01.
Старый 05.06.2010, 23:00   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Проверьте счетчик RecID. Вполне возможно, что из-за прямых вмешательств в БД он не актуален.

Ага, БД из 4.0 - все больше шансов что это именно счетчик RecId. Он хранится в таблице, на память не скажу, но название достаточно интуитивное. Таблицу надо смотреть в компании DAT.
__________________
Ivanhoe as is..

Последний раз редактировалось Ivanhoe; 05.06.2010 в 23:03.
Старый 05.06.2010, 23:08   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Таблица - SystemSequences, посмотреть можно через AOT - System Documentation.
__________________
Ivanhoe as is..
Старый 05.06.2010, 23:12   #7  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение

Ага, БД из 4.0 - все больше шансов что это именно счетчик RecId. Он хранится в таблице, на память не скажу, но название достаточно интуитивное. Таблицу надо смотреть в компании DAT.
Уже пробовал - В таблице SYSTEMSEQUENCES на скле нашел запись для этой таблицы (tableId = 77) для компании дат. и в поле NEXTVAL подставил единичку в начало. Перестартанул AOS все равно не помогло.


Вот запись об этой таблице
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  
Bober is offline
Bober
Участник
 
311 / 104 (4) +++++
Регистрация: 29.05.2007
propeller, поставьте для начала брейкпойнт в инфологе и посмотрите в этой точке, какая конкретно запись находится: с каким рекидом, в какой компании, и т.д. По-моему, это первое, что надо было сделать, чтобы начать разбирательство.
Старый 06.06.2010, 12:35   #9  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от Bober Посмотреть сообщение
propeller, поставьте для начала брейкпойнт в инфологе и посмотрите в этой точке, какая конкретно запись находится: с каким рекидом, в какой компании, и т.д. По-моему, это первое, что надо было сделать, чтобы начать разбирательство.
Это я и делал в первую очередь.
в 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  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от propeller Посмотреть сообщение
Запись эта находится в консолидирующей компании.
Ну вот и ответ. В консолидирующей компании можно создавать очень ограниченный набор записей. Клиенты к ним не относятся.
Старый 06.06.2010, 14:02   #11  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Ну вот и ответ. В консолидирующей компании можно создавать очень ограниченный набор записей. Клиенты к ним не относятся.
Что вы имеете ввиду?
Это собственная доработка, трансляция клиента в другую компанию.
в 4-ке все это работало на отлично.
Старый 06.06.2010, 14:55   #12  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Я имею ввиду, что если в компании в параметрах главной книги стоит флаг "Консолидирующая компания", то создать там запись клиента не особенно получится.
Попробуйте создать запись не программно, в вручную.
Старый 06.06.2010, 17:54   #13  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Я имею ввиду, что если в компании в параметрах главной книги стоит флаг "Консолидирующая компания", то создать там запись клиента не особенно получится.
Попробуйте создать запись не программно, в вручную.
Нет, флаг не стоит.
Руками запись создается нормально.
Старый 06.06.2010, 18:51   #14  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от propeller Посмотреть сообщение
Нет, флаг не стоит
Цитата:
Сообщение от propeller
Запись эта находится в консолидирующей компании.
В Аксе есть четкое определение консолидирующей компании, если флаг не стоит, то это с точки зрения Аксы не является консолидирующей компанией, поэтому расскажи ,что значит консолидирующая компания с вашей точки зрения - стандарт, судя по всему, к вам не относится.
Ну и "код в студию". Подробности опусти, начни с места changeCompany, заполение полей, за исключением ключевых опусти, приведи только ключевые поля и места, где заполняются ключевые поля. При этом покажи как обнуляются переменные при смене компании (то есть, есть ли конструкции типа custVend = null и т.п.)
Старый 06.06.2010, 19:10   #15  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Кстати. Для Ax30 была рекомендация при смене компании обнулять переменную, то есть, делать что-то подобное:
X++:
changeCompany('XXX') {
{
    custTable = null;
}
В DAX4 часто этого недостаточно. Если только что искали запись по коду и после этого переключились в другую компанию и ищем по тому же коду, то обнуление переменной может не сработать!!! Как-то странно работает кэш. Не знаю как в 2009, но в DAX4 кроме обнуления переменной нужно еще запретить кеширование, то есть делать что-то подобное:
X++:
changeCompany('XXX') {
{
    custTable = null;
    custTable.disabeCash(true);
}
Причем, обнаружил эту особенность на таблице InventTrans, которая вообще не кэшируется! Получилось так, что в результате работы механизма Интеркомпани - получлось так, что лот в одной компании (по которому только что был произведен поиск, совпал с лотом в другой компании, для которой ищем лот). Если в одной компании нашли лот, то после переключения на другую компанию этот лот не ищется, а возвращается запись из первой компании!!!
После этого взял в привычку после переключения компаний запрещать кеширование. В нашем коде нет проблем, а в стандартном делам это по мере обнаружения проблем. Так что, залезь в код импорта и вставиь в нужные места для переменной записи перед её заполнением .disableCash(true).
Старый 06.06.2010, 19:25   #16  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Для примера, работал примерно такой код:
X++:
InventTrans inventTrans;
InvenTrans inventTransNew;
InventTransId transId = 'Скл000001';
// Работеем в компании AAA
X++:
select firstOnly inventTrans where inventTrans.InventTransId == transId;
if (inventTrans )
{
    changeCompany('BBB')
    {
        inventTransNew = null; 
        select firstOnly inventTransNew where inventTransNew.InventTransId == transId;
    }
}
Лот с номером ''Скл000001' есть как в компании AAA, так и в компании BBB. В вышеприведеном коде в inventTransNew попадала та же запись, что и в inventTrans!!!
Если же запретить кэш:
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;
    }
}
то в компании BBB находилась запись именно этой компании, а не AAA.
Так что начиная с DAX4.0 затим нужно следить не только в своем коде, но и в стандартнм.

Последний раз редактировалось Raven Melancholic; 06.06.2010 в 19:28.
Старый 07.06.2010, 09:36   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Причем, обнаружил эту особенность на таблице InventTrans, которая вообще не кэшируется! Получилось так, что в результате работы механизма Интеркомпани - получлось так, что лот в одной компании (по которому только что был произведен поиск, совпал с лотом в другой компании, для которой ищем лот). Если в одной компании нашли лот, то после переключения на другую компанию этот лот не ищется, а возвращается запись из первой компании!!!
После этого взял в привычку после переключения компаний запрещать кеширование. В нашем коде нет проблем, а в стандартном делам это по мере обнаружения проблем. Так что, залезь в код импорта и вставиь в нужные места для переменной записи перед её заполнением .disableCash(true).

Судя по описанным симптомам, могло повлиять вот это :
Глюки RecordViewCache

Правда у меня все это воспроизводилось в Ax 3.0
Для 4-ки не проверял.
Теги
changecompany, импорт данных, кэш

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Курсор перешел к следующей записи на клиенте, на сервере этого сделать уже нельзя PavelSR DAX: Программирование 22 01.11.2012 07:33
Частичный возврат по позиции отгруженой в уже закрытый период... Dronas DAX: Программирование 0 02.08.2007 11:10
Уже существует проводка за более позднюю дату rus_stas DAX: Функционал 2 09.11.2004 20:17
Переход на правильную запись при Переходе к основной таблице. - 2 Anais DAX: Программирование 2 01.11.2004 17:14
Product Builder: "Модель продукции не существует" Hamster DAX: Функционал 4 17.03.2004 17:46

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

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

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