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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.04.2015, 17:21   #1  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Ошибка записи в SalesParmSubLine
Доброго времени суток!

DAX2009. Заказ на продажу - Разноска накладной, в окне "Количество" выбираем "Отборочная накладная" - вылетает инфолог не могу записать в SalesParmSubLine, запись уже существует.

Не буду перегружать инфой как всё это происходит, корень зла обнаружен в SalesFormLetter_Invoice.reselect(). В цикле формируются записи в SalesParmLine и SalesParmSubLine, и получается что создаются лишние записи, обычно 2 или 3.

Всё дело в том, что вот какой там цикл:
X++:
while select forceplaceholders _salesParmTable
                where _salesParmTable.ParmId == salesParmUpdate.ParmId
                join  forupdate _salesParmSubTable
                    where _salesParmSubTable.ParmId     == _salesParmTable.ParmId       &&
                          _salesParmSubTable.TableRefId == _salesParmTable.TableRefId
В нормальной ситуации есть у нас например по одной записи из каждой таблицы, соответственно должна быть одна итерация. Но что происходит. Там во внутренней функции updateSalesParmSubTable() есть участок:
X++:
_salesParmSubTable.doUpdate();
что приводит к повторному выполнению итерации, из-за чего и создаются лишние строки.

Честно говоря, до этого момента не знал о такой особенности. Специально отдельным джобом попробовал имитировать такую ситуацию, действительно, возникает лишняя итерация в while select, если происходит обновление записи.
Причем, это возникает только если код выполняется на сервере, такой момент.

Что я делаю не так, что алгоритм именно так отрабатывает? Специально проверил - код на стандартных слоях, т.е. нет "вмешательства" со стороны модификаций. Значит - что? Неправильное использование функциональности? Но то что приводит к красному инфологу "Ошибка записи"... Странно как-то, возникают мысли о теории заговора глюке в стандарте.

P.S. Если в предформе изначально стоит количество "Отборочная накладная", такой ошибки не происходит, что логично, т.к. тут алгоритм по несколько другим путям отрабатывает.

Объясните плиз, в чем тут подвох?
Старый 03.04.2015, 09:49   #2  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Борьба продолжается ) Погуглил на предмет аналогичных проблем, выяснилось что подобный инфолог в некоторых ситуациях так или иначе вылазил, но судя по всему по каким-то другим причинам - во-первых, происходило это не только из-за установки значения "Количество" в "Отборочная накладная", а во-вторых, лечилось простой чисткой таблицы SalesParmSubLine.

Пока что довольствуемся такой вот заглушкой:
X++:
while select forceplaceholders _salesParmTable
                where _salesParmTable.ParmId == salesParmUpdate.ParmId
                join  forupdate _salesParmSubTable
                    where _salesParmSubTable.ParmId     == _salesParmTable.ParmId       &&
                          _salesParmSubTable.TableRefId == _salesParmTable.TableRefId
        {
            // bug fix -->
            if (prevRecId && (prevRecId == _salesParmSubTable.RecId))
            {
                continue;
            }
            prevRecId = _salesParmSubTable.RecId;
            // bug fix <--
  
            // остальной код ...
Но понятное дело что это лечение следствия а не причины. Причина в чем-то другом.

Коллеги, неужели никто ни разу не сталкивался с таким поведением?

Последний раз редактировалось FrolovAndy; 03.04.2015 в 09:52.
За это сообщение автора поблагодарили: konfet (2), madm (1).
Старый 09.01.2018, 15:48   #3  
konfet is offline
konfet
Снова балуюсь косаптой :)
 
143 / 50 (2) ++++
Регистрация: 23.04.2003
Адрес: Moscow
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
Странно как-то, возникают мысли о теории заговора глюке в стандарте.
Думаю, именно так - баг, а точнее г*внокод в стандарте. Проявился в DAX 2009, именно при Ваших условиях (только при выборе "количество из отборочной накладной"). Чистка таблицы SalesParmSubTable также не помогла. Предложенный вами хотфикс проблему решил. Спасибо! Обожаю этот форум
__________________
Бесты и регарды!
Теги
salesparmsubline

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Real в качестве ключа - ошибка при создании записи в связанной таблице sgt.Pepper DAX: Программирование 4 20.05.2008 16:08
Ошибка при сохраниении записи ahtoh DAX: Администрирование 6 24.09.2005 13:05
Ошибка при импорте демоданных (Axapta 3.0 CIS SP1) KocDm DAX: Администрирование 2 11.08.2005 12:04
Ошибка при изменении записи nicko DAX: Администрирование 1 05.05.2004 11:23
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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