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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.12.2014, 12:27   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Это фича, или я что-то не так делаю?
AX2012 R2
Обновляю цену на строке закупки
X++:
purchLine.PurchPrice = MyPrice;
purchLine.LineAmount = purchLine.calcLineAmount();
purchLine.update()
Заметили, что при выполении этого кода, сообщения пропадают из инфолога.
При отладке наткнулась на сообщение:
"Cannot create a record in Relationship between the purchase order line and the inventory transactions originator (InventTransOriginPurchLine). Inventory transactions originator: SomeInvTransNum123, SomeInvTransNum123. The record already exists"
Которое потом "исчезает".
Далее вышла на волшебный метод InventTransOriginPurchLine-> writeOriginOwnerRelationship()
Где написано следующее :
X++:
catch (Exception::DuplicateKeyException)
    {
        if (xSession::lastDuplicateKeyViolatingTable() == inventTransOriginPurchLine)
        {
            update_recordset inventTransOriginPurchLine
            setting InventTransOrigin = _inventTransOriginId
            where inventTransOriginPurchLine.PurchLineInventTransId == _purchLineInventTransId
               && inventTransOriginPurchLine.PurchLineDataAreaId    == _purchLineDataAreaId
               && inventTransOriginPurchLine.InventTransOrigin      != _inventTransOriginId;
        }
        else
        {
            throw Exception::DuplicateKeyException;
        }
        infolog.clear(logCount);
    }
То есть, вроде как, вставка дубликата обрабатывается как штатаная ситуация ... вот только лог-то затирается при этом!
Вот вопрос : обновление цены на purchLine неправильно реализовано, или все так и должно быть, и надо просто смириться?

Последний раз редактировалось IKA; 02.12.2014 в 12:34.
Старый 02.12.2014, 13:01   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Смиритесь)

Exception:: DuplicateKeyException не прерывает выполнение транзакции.
Таким способом проверяют, что запись уже существует (отдельный select для этого не стали делать)
__________________
Axapta v.3.0 sp5 kr2
Старый 02.12.2014, 13:09   #3  
online
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,689 / 405 (17) +++++++
Регистрация: 23.03.2006
при желании можно переписать в классически вид, вреда особо не будет
Старый 02.12.2014, 19:59   #4  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Проблема в том. что этот код периодически затирает весь инфолог, а не только те строки, что записались при DuplicateKeyException . Воспроизвести не всегда получается. Если я отлаживаю код в дебаггере, то все ок. Если без дебаггера запускаю, то периодически исчезают строки из инфолога.
Я грешу на метод
X++:
Counter   logCount = infologLine();
, если в него заглянуть, то написано:
Цитата:
This method has similar functionality to the <c>xInfo.line</c> method, but it improves performance
/// and lowers network load when you are executing server-side code.When the <c>xInfo.line</c> method
/// is run on the server, it makes a call to the client to retrieve the number of lines in the Infolog
/// buffer. The <c>xGlobal::infologLine</c> method retrieves the server-side Infolog buffer line count.
/// This eliminates the requirement to call to the client. When the <c>xGlobal::infologLine</c> method
/// is called on the client, it returns the count directly from the Infolog buffer on the client.This
/// method is especially useful when you write server-side code that processes exceptions.The number of
/// lines in the Infolog is generally stored before entering a <c>try</c> / <c>catch</c> block.If an
/// exception occurs, the number of lines that were previously stored is used to determine which
/// messages were logged during the code in the <c>try</c> block. If no exceptions occur, the stored
/// Infolog buffer line count is often unused. If you use the <c>xGlobal::infologLine</c> method
/// instead of the <c>xInfo.line</c> method to retrieve the Infolog lines, a round-trip to the client
/// is prevented.
/// </remarks>
Думается мне , что серверный инфолог не всегда корректное количество строк возвращает, и в этом кроется проблема, щас попробую для проверки на
X++:
xInfo.line
перейти, и посмотрим, что будет

Последний раз редактировалось IKA; 02.12.2014 в 20:25.
Старый 02.12.2014, 20:29   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от IKA Посмотреть сообщение
вот только лог-то затирается при этом!
Да, писали этот код феерические пидарасы.
Которым каждый раз хочется оторвать то, что болтается.

там еще есть попытка "управлять" инфологом, подсчитывать количество "ненужных" сообщений и стирать только "ненужные". При этом разработчик похоже не знал о префиксах и иерархии в инфологе.

Цитата:
Сообщение от IKA Посмотреть сообщение
Вот вопрос : обновление цены на purchLine неправильно реализовано, или все так и должно быть, и надо просто смириться?
Цены реализованы неправильно. Но это отдельная тема и просто так их не вылечить.

Что нужно сделать обязательно:
1. при помощи перекрестных ссылок найти все попытки очистить инфолог, закомментировать такие попытки
2. при помощи перекрестных ссылок найти все попытки удалять строки в инфологе поотдельности, провести более тщательный анализ и закомментировать такие попытки и обвязку вокруг них (подсчет строк, запоминание первой "ненужной" строки, удаление строк и инфолога начиная с первой "ненужной")

дело в том, что таких мест несколько.
и значимые сообщения пропадают не в одном месте.
За это сообщение автора поблагодарили: f18 (2).
Старый 03.12.2014, 12:51   #6  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Я бы просто добавил проверку на дубликаты перед try() а catch бы так и оставил.
Еще как идея, для isDeveloper() можно в clear() не очищать диалог, а добавлять сообщение, что была попытка очистить диалог. Как минимум облегчит отладку и поиск таких косяков. Это если нет желания перелопачивать весь код.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.

Последний раз редактировалось Link; 03.12.2014 в 12:55.
Старый 03.12.2014, 16:40   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Link Посмотреть сообщение
...для isDeveloper()...
дык, про ошибки сообщают нормальные пользователи.
Старый 03.12.2014, 17:23   #8  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 513 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от mazzy Посмотреть сообщение
дык, про ошибки сообщают нормальные пользователи.
Это да, я предложил с позиции отладки. Отключить для всех можно в тестовой среде, а то не ясно где начнут вылазить ранее затираемые сообщения и в каких количествах.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 05.12.2014, 19:55   #9  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
вообщем, так и есть ((
В коде решила писать в таблицу(пишу не в infolog, а таблицу, чтобы лишний раз его не "дергать с сервера" и т.о не обновлять его) значения, возвращаемые обеими функциями
X++:
infologLine();
infolog.line();
почему-то периодически infologLine() возвращает 0, когда сам infolog.line - корректное значение.
Может, из-за неправильной работы самого infolog.clear(logCount) с серв и клиентским объектом - будет время. еще поиграю ...

Только вот странно. что в интернете нет ссылок на этот баг....

Последний раз редактировалось IKA; 05.12.2014 в 20:10.
Старый 05.12.2014, 20:14   #10  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Clear не виноват.
Без него то же самое происходит. Причем, интересно, что на следующей итерации "после сбойной" значения уже корректные. То есть, допустим, что-то пишет в инфолог 4 записи, то имеем, например, вот такие результаты:
It1: infologLine()=1, infolog.line = 1,
It2: infologLine()=2, infolog.line = 2,
It2: infologLine()=0, infolog.line = 3,
It2: infologLine()=4, infolog.line = 4

Последний раз редактировалось IKA; 05.12.2014 в 20:17.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2012 Пересчет единиц измерения - баг или фича? Kabardian DAX: Функционал 3 25.02.2014 11:00
Есть ли фича для вставки комментариев ? Zabr DAX: Программирование 14 08.09.2008 09:58
Я может быть что-то не так делаю?! qbds2 = _qbds2; - ошибка. Roman. ~RVS DAX: Программирование 3 21.10.2005 12:07
что не так делаю? амортизация ОС по периоду yooshi DAX: Функционал 1 08.08.2005 14:03
FormListItem.stateChecked() - баг или фича ? Андре DAX: Программирование 5 20.02.2003 14:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:13.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.