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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2012, 15:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
sashanazarov: Manipulating the Marking form from code
Источник: http://sashanazarov.blogspot.com/201...from-code.html
==============

Businesses buy AX, because they would like to automate their processes. Sometimes they would like to automate more, than standard AX allows. And if business logic is built into forms, it is sort of hard to automate.

One of our clients had to migrate open sales and purchase orders to AX, and mark their lines against each other afterwards. Apparently, calling InventTransOrigin::updateMarking method was not enough, as sales and purchase lines were still not pointing to each other in the reference fields. So, I tried to use the standard Marking form for that ad-hoc task.

Below is the code sample that takes a purchase line lot ID, opens the Marking form, selects the target sales order line and marks it (or unmarks, if it was marked before). Just like you do it by hand.

static void main(Args _args)
{
#define.TmpInventTransMarkDsNo(2)
#define.InventTransOriginDsNo(4)
#define.InventTransOriginMarkDsNo(5)
#define.MarkNowControlName('markNow')

#define.PurchLineLotId("GSC-000983")
#define.SalesLineLotId("GSC-000982")

FormRun formRun;
Args args;
TmpInventTransMark tmpInventTransMark;
SalesLine salesLine;
InventTransOrigin salesLineOrigin;
PurchLine purchLine;
InventTransOrigin inventTransOriginMark;
FormCheckBoxControl markNowCheckBox;

purchLine = PurchLine::findInventTransId(#PurchLineLotId);

args = new Args();
args.name(formStr(InventMarking));
args.record(purchLine);

// Work-around: first if-statement in
// Classes\ReqCalc\argsItemId method expects a caller
args.caller(new InventMarkingEmulator());

formRun = classfactory.formRunClass(args);
formRun.init();
formRun.run();

// The temp table is filled in when this active() is called
formRun.dataSource(#InventTransOriginDsNo).active();

tmpInventTransMark =
formRun.dataSource(#TmpInventTransMarkDsNo).cursor();
inventTransOriginMark =
formRun.dataSource(#InventTransOriginMarkDsNo).cursor();

ttsbegin;

// Find the required reference and mark it
formRun.dataSource(#TmpInventTransMarkDsNo).first();
Debug::assert(tmpInventTransMark.RecId != 0);
do
{
if (inventTransOriginMark.InventTransId == #SalesLineLotId)
{
markNowCheckBox =
formRun.design().controlName(#MarkNowControlName);
markNowCheckBox.value(1);
markNowCheckBox.clicked();

formRun.closeOk();
break;
}
} while (formRun.dataSource(#TmpInventTransMarkDsNo).next());

ttscommit;
}


Источник: http://sashanazarov.blogspot.com/201...from-code.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 16.10.2012, 12:44   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Совет из разряда тех, которыми никогда не стоит пользоваться. Проблема в том, что он основан на изначально неверном утверждении, что вся логика маркинга определена в форме InventMarking. Это, мягко говоря, не совсем так.

Правильный способ решения поставленной задачи - использовать метод TmpInventTransMark::updateTmpMark(). Он, кстати, не только поля InventRef* в SalesLine и PurchLine заполнит, но и резервирование обновит.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: Stitch_MS (2), S.Kuskov (1).
Старый 17.10.2012, 11:45   #3  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
За отзыв спасибо, но хотелось бы пояснить
  • Это был не совет, а описание решения некоторой задачи.
  • Утверждения, что вся логика маркинга определена в форме - не было. Было "Apparently, calling InventTransOrigin::updateMarking method was not enough... So, I tried to use the standard Marking form for that ad-hoc task. "
  • Использование метода updateTmpMark напрямую из кода подразумевает подготовку параметров, один из которых - контейнер c записями. Я такие вещи, мягко говоря, недолюбливаю. Судя по перекрестным ссылкам, единственное место, где этот метод используется - это та самая форма. Форма же и занимается подготовкой записей для метода. Я не хотел писать всё это руками для своей задачи, если это уже сделано на форме.
Старый 17.10.2012, 12:31   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Я думаю, что маркировка из кода все таки задача для выполнения на сервере. Использование формы, её датасорсов для заполнения данных переводит задачу на клиента, что не очень хорошо.
Старый 17.10.2012, 14:20   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Это был не совет, а описание решения некоторой задачи.
Мы с вами это понимаем. А хотелось бы, чтобы понимали и начинающие программисты. Из оригинального сообщения не следует, что его не стоит использовать в качестве руководства к действию.
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Утверждения, что вся логика маркинга определена в форме - не было. Было "Apparently, calling InventTransOrigin::updateMarking method was not enough... So, I tried to use the standard Marking form for that ad-hoc task. "
Напрямую - не было. Но вот после этого - "And if business logic is built into forms, it is sort of hard to automate" - и последующего описания процесса маркировки, можно запутаться и сделать неправильные выводы.
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
Использование метода updateTmpMark напрямую из кода подразумевает подготовку параметров, один из которых - контейнер c записями. Я такие вещи, мягко говоря, недолюбливаю. Судя по перекрестным ссылкам, единственное место, где этот метод используется - это та самая форма. Форма же и занимается подготовкой записей для метода. Я не хотел писать всё это руками для своей задачи, если это уже сделано на форме.
Так вы посмотрите, как этот контейнер с записями готовится. Попробуйте через него. Код получится проще и понятнее, чем у вас. И, кстати, чтобы вызвать форму, тоже много параметров приходится подготовить, не так ли?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 17.10.2012, 15:11   #6  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
sashanazarov: Manupulating forms from code - continued...
Источник: http://sashanazarov.blogspot.com/201...continued.html
==============

After publishing a post about manipulating the Marking form from code, I got some feedback (special thanks to Maxim Gorbunov).

I would like my readers to remember, that forms should never be used like that in business logic executed on a daily basis. If this is something that should be run more often than once, this logic should preferably be run on the server, and in the case with the Marking form, it should rather be TmpInventTransMark::updateTmpMark() method called directly. You will need to prepare parameters for it, though, so you will first need to figure out how the form does that.

In other words, please use out-of-the-box solutions you find on the Internet with care.


Источник: http://sashanazarov.blogspot.com/201...continued.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 17.10.2012, 15:29   #7  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Спасибо. Я написал еще один пост, специально для начинающих программистов.

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

Там же как получилось: посмотрел я на форму, увидел там N-ное количество методов и переменных на уровне формы и сразу вспомнил картинку:



А поскольку я уже знал, как работать с формой из кода, я решил съэкономить время. Вот и всё .

Последний раз редактировалось Stitch_MS; 17.10.2012 в 15:30. Причина: орфография
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxtraining: Vendor returns Blog bot DAX Blogs 0 11.10.2012 00:11
dynamicsaxtraining: Sales Blog bot DAX Blogs 0 25.04.2012 03:18
dynamicsaxtraining: Purchase Blog bot DAX Blogs 0 11.03.2012 05:25
CRM DE LA CREME! Some more useful javascripts for MS CRM Blog bot Dynamics CRM: Blogs 0 04.05.2010 11:05
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43

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

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

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