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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2018, 10:10   #1  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
снова updateMarking 4.0
Добрый день, коллеги!

Есть проблема с маркировкой, может кто-то посоветует с какой стороны её решить (кроме отказа работать с 4кой)
Есть исправление функционала в updateMarking, связанного с кредит-нодой, это отразилось на процедуре сторнирования журналов переноса

есть постановка о том, что
Цитата:
В момент создания строк/разноски? сторно журнала для исходных строк должно заполняеться:
- у строки StatusReceipt (Куплено...) - InventRefTransId (проставляется InventTransId сторнирующей строки)
- у строки StatusIssue (Продано...)- InventTransIdReturn (проставляется InventTransId сторнирующей строки)

У сторнирующих строк:
- у строки StatusReceipt (Куплено...) - InventTransIdReturn и InventRefTransId (проставляется InventTransId исходной строки)
- у строки StatusIssue (Продано...) InventRefTransId (проставляется InventTransId исходной строки)
но для updateMarking есть изменение: добавлено условие

X++:
if ((inventTrans.InvoiceId != '') && (inventTrans.InvoiceId == _invoiceId)) // здесь обернули строку кода в условие
        {
            inventTrans.InventRefTransId    = _inventRefTransId;
        }
если убрать условие, система вылетает с ошибкой в InventJourCopyStorno.run()
X++:
Qty1 = InventTrans::updateMarking(transOrig.InventTransId, transNew.InventTransId ,  transOrig.Qty);
Qty2 = InventTrans::updateMarking(transNew.InventTransId , transOrig.InventTransId, -transOrig.Qty);
            if (Qty1 != -Qty2)
                error('Не удалось сопоставить проводки');
эта ошибка вообще вылетает почти на каждый чих, частично для журналов проводок удалось решить её доработкой метода delete на таблице InventTrans: т.е. зачищать значение в поле, тк оно не затиралось, но для журналов переноса это не сработало...

задача срочная, если есть какие-то мысли в каком направлении двигаться, подскажите, пожалуйста.

то, что нашлось по теме
http://axforum.info/forums/archive/i...p?t-17558.html
Маркировка - достала!
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 06.08.2018, 17:47   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
ты хотя бы код целиком выложи.

мысль тут простая: посмотреть в дебугере, почему эти количества не равны.
__________________
Felix nihil admirari
Старый 09.08.2018, 12:24   #3  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
Мысль хорошая, тоже приходила и ещё до поста:
По конкретно моей задаче: не было очистки референсного значения при удалении строки транзакции, а алгоритм подбирает значение, учитывая данные только с непустым этим значением, отсюда расхождение, но ... вопрос в том, что можно ещё зацепить или сломать, делая изменения в updateMarking (перекрёстные ссылки просмотрены)
Может кто-нибудь проконсультировать по предметной части?
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 09.08.2018, 15:42   #4  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
Цитата:
Сообщение от wojzeh Посмотреть сообщение
ты хотя бы код целиком выложи.
Код чего? Метода updateMarking?
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 09.08.2018, 16:36   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Пара предложений. Не уверен, что правильно понял логику ...


1. InventTrans::updateMarking()

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

Вероятно, по этой причине и в delete() не было очистки маркировок. Просто маркированные проводки не могли быть удалены. Точнее, наоборот. Маркировка только в тех проводках, которые не удаляются

Для складских журналов аналогичным признаком будет факт разноски журнала. Вот через ИЛИ и добавить соответствующее условие

if ("Указана накладная" ИЛИ "складской журнал разнесен")
- (Маркируем)



2. InventJourCopyStorno.run()

Сделать сопоставление не вообще "всего" количества, а именно того, которое удалось сопоставить. Т.е. примерно так

X++:
markQty = InventTrans::updateMarking(transOrig.InventTransId, transNew.InventTransId ,  transOrig.Qty);

if (markQty)
      InventTrans::updateMarking(transNew.InventTransId , transOrig.InventTransId,  -markQty);

Ведь если не удалось сопоставить какое-то количество, значит, это количество где-то, как-то "заблокировано" к сопоставлению. Ну, и зачем "ломать об колено"?

Здесь даже проверка уже смысла не имеет, ведь сторно-документ только что создан, так что вторая маркировка в сторно-документе всегда будет на все указанное количество
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: jeky (3).
Старый 10.08.2018, 10:30   #6  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
Thumbs up
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Пара предложений.
Спасибо огромное!
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 10.08.2018, 10:59   #7  
jeky is offline
jeky
:o)
Аватар для jeky
 
130 / 64 (3) ++++
Регистрация: 22.05.2008
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
1. InventTrans::updateMarking()

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

Вероятно, по этой причине и в delete() не было очистки маркировок. Просто маркированные проводки не могли быть удалены. Точнее, наоборот. Маркировка только в тех проводках, которые не удаляются
Подскажите про очистку маркировок:
- создали строки в журнале, используя функцию "сторно на основании", журнал не разнесён, маркировка проставлена
- решили строки удалить
маркировку в этом случае необходимо очистить? (я про доработку, которую мы сделали) или это необязательно? и возможно ли идентифицировать данные проводки, еcли мы помещаем функционал в общий delete() ?
просто ошибка "Не удалось сопоставить проводки" плавающая, в определённый момент удаление маркировки "помогло" избавиться от её возникновения, но через какое-то время она снова возникла, я могу, безусловно, оттрассировать ошибку и выяснить причину её возникновения, но мне пока не хватает опыта понять условия возникновения причины. т.е. симптомы ясны, не ясны причины. если маркировка была проставлена, как вы объяснили выше и не было необходимости в её очистке, то, возможно, и ошибка как раз имеет право на существование и от неё не надо избавляться, а есть необходимость откорректировать что-то другое, возможно в т.ч. действия пользователей, но это надо достаточно четко выявить
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.
Старый 10.08.2018, 14:58   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Насколько я в курсе, удаление маркировок и так выполняется при помощи

InventTrans::deleteMarking()

Возможно, раз был изменен InventTrans::updateMarking() и в качестве поля "маркировки" стали использовать еще и InventTransIdReturn, то именно с этим полем и связаны проблемы

По поводу InvoiceId, я же уже написал. Вроде бы, в складской проводке это поле заполняется в момент финансовой разноски. Т.е. Вам надо выполнять маркировку не в момент создания копии журнала, а в момент разноски журнала (post). Очевидно, для этих целей надо сохранять ссылку на лот-источник в строке самого журнала. Тогда отпадет необходимость модифицировать удаление

Хотя, вроде, поля в строках журнала для этих целей и так есть \Classes\InventMov_Journal\setInventRefFields. Просто используются в стандартном функционале по другому. Зеркально. Но никто не мешает заполнить их заранее в момент копирования
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Снова SpreadSheet 8) _Андрей DAX: Программирование 23 17.02.2009 23:09
И снова про номерные серии... правда немного глубже... sparur DAX: Программирование 29 23.05.2008 17:30
Снова запрос mu_nan DAX: Программирование 11 09.07.2007 15:02
снова COM Connector _A_ DAX: Прочие вопросы 11 02.09.2005 16:38
И снова про Сводное планирование costa DAX: Функционал 2 04.05.2005 21:24
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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