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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.02.2008, 17:40   #1  
Blog bot is offline
Blog bot
Участник
 
25,617 / 848 (80) +++++++
Регистрация: 28.10.2006
Ruslan Goncharov: Posting InventJournal from X++
Источник: http://rusgon.blogspot.com/2008/02/p...al-from-x.html
==============

Once I was faced the problem to post InventJournal from code.
At first glance it's easy. Let's open AOT. Then we find corresponding Menu Item in \Menu Items\Action\InventJournalPost. Open class InventJournalCheckPost... And looking at main() method of this class we are coming to conclusion that this class is tightly tied to the journalForm. What's a pity!

So let's try to write own code.

X++:
static void main(Args args)
{
        InventJournalCheckPost journalCheckPost;
        journalForm journalForm;

        ;

        journalForm = journalForm::fromArgs(args);
        journalCheckPost = InventJournalCheckPost::newFromForm(args,journalForm);

        journalForm.runbaseMainStart();

        if (!journalCheckPost.PROMPT())

        {
                if (! journalCheckPost.BatchInfo().parmBatchExecute())
                        journalForm.runbaseMainCancel();
        
                return;
        }

        try
        {
                journalCheckPost.run();
                journalForm.runbaseMainEnd(journalCheckPost,false);

        }
        catch (Exception::Error)
        {
                journalForm.runbaseMainEnd(journalCheckPost,true);
        }
}
First of all we need to get rid of journalForm.
Let's rewrite newFromForm() method. The parameters wich passing into this method are used to achieve InventJournalTable. So we may just pass InventJournalTable into our new method.

X++:
JournalCheckPost getJournalCheckPost(InventJournalTable _inventJournalTable)
{
        // \Menu Items\Action\InventJournalPost
        switch(inventJournalTable.journalType)
        {
                case InventJournalType::Movement:
                case InventJournalType::LossProfit:
                case InventJournalType::Transfer:
                case InventJournalType::BOM:
                case InventJournalType::Count:
                case InventJournalType::project:
                case InventJournalType::Asset:
                        journalCheckPost_Mov = InventJournalCheckPost_Movement::newJournalCheckPost(
                        false,true, JournalCheckPostType::Post, _inventJournalTable.tableId,                    _inventJournalTable.journalId);
                        // journalTransData = _journalForm.JournalTransData();
                        // if (journalTransData)
                        // journalCheckPost_Mov.parmVoucher(journalTransData.journalTrans().voucher);
                return journalCheckPost_Mov;

                case InventJournalType::TagCounting:
                        journalCheckPost = InventJournalCheckPost_Tag::newJournalCheckPost(
                        false, true, JournalCheckPostType::Post, inventJournalTable.tableId,                    _inventJournalTable.journalId);
                return journalCheckPost_Tag;
        }
}
Look at JournalFormTable class. It extends journalForm class.

Inside of runbaseMainStart() method we may find following line
journalTableData.updateBlock(JournalBlockLevel::None,JournalBlockLevel::System,false);

inside of runbaseMainCancel() method:
journalTableData.updateBlock(JournalBlockLevel::System,JournalBlockLevel::None,false);

and inside of runbaseMainEnd() method:
journalTableData.updateBlock(JournalBlockLevel::System,JournalBlockLevel::None,false);

That's enough. Now we may rewrite main() method:

X++:
// Posting start. According to \Classes\InventJournalCheckPost
// journalForm.runbaseMainStart();
        journalTableData::updateBlockServer(
        inventJournalTable, JournalBlockLevel::None, JournalBlockLevel::System, false);

        journalCheckPost = getJournalCheckPost(inventJournalTable);
        if (!journalCheckPost.PROMPT())
        {
                if (! journalCheckPost.BatchInfo().parmBatchExecute())
                {
                        // journalForm.runbaseMainCancel();
                        journalTableData::updateBlockServer(
                        inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, false);
                }
                return;
        }

        try
        {
                journalCheckPost.run();
                // journalForm.runbaseMainEnd(journalCheckPost,false);
                journalTableData::updateBlockServer(
                        inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, false);
        }
        catch (Exception::Error)
        {
                // journalForm.runbaseMainEnd(journalCheckPost,true);
                journalTableData::updateBlockServer(
                inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, true);
        }
// Posting end
Finally, we are ready to write our remarkable job:

X++:
static void JobInventJournalPost(Args _args)
{
        InventJournalCheckPost_Movement journalCheckPost_Mov;
        InventJournalCheckPost_Tag journalCheckPost_Tag;

        InventJournalCheckPost journalCheckPost;

        InventJournalTable inventJournalTable;
        InventJournalId inventJournalId = 'Inv002372';

        JournalCheckPost getJournalCheckPost(InventJournalTable _inventJournalTable)
        {
                // \Menu Items\Action\InventJournalPost
                switch(_inventJournalTable.journalType)
                {
                        case InventJournalType::Movement:
                        case InventJournalType::LossProfit:
                        case InventJournalType::Transfer:
                        case InventJournalType::BOM:
                        case InventJournalType::Count:
                        case InventJournalType::project:
                        case InventJournalType::Asset:
                                journalCheckPost_Mov = InventJournalCheckPost_Movement::newJournalCheckPost(
                                false,true, JournalCheckPostType::Post, _inventJournalTable.tableId,                            _inventJournalTable.journalId);
                                // journalTransData = _journalForm.JournalTransData();
                                // if (journalTransData)
                                // journalCheckPost_Mov.parmVoucher(journalTransData.journalTrans().voucher);
                                return journalCheckPost_Mov;

                        case InventJournalType::TagCounting:
                                journalCheckPost = InventJournalCheckPost_Tag::newJournalCheckPost(
                                false, true, JournalCheckPostType::Post, _inventJournalTable.tableId,                           _inventJournalTable.journalId);

                                return journalCheckPost_Tag;
                }
        }
        ;

        inventJournalTable = InventJournalTable::find(inventJournalId);
        if(inventJournalTable)
        {
                // Posting start. According to \Classes\InventJournalCheckPost
                // journalForm.runbaseMainStart();

                journalTableData::updateBlockServer(
                inventJournalTable, JournalBlockLevel::None, JournalBlockLevel::System, false);

                journalCheckPost = getJournalCheckPost(inventJournalTable);
                if (!journalCheckPost.PROMPT())
                {
                        if (! journalCheckPost.BatchInfo().parmBatchExecute())
                        {

                                // journalForm.runbaseMainCancel();
                                journalTableData::updateBlockServer(
                                inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, false);
                        }

                        return;

                }

                try
                {
                        journalCheckPost.run();
                        // journalForm.runbaseMainEnd(journalCheckPost,false);
                        journalTableData::updateBlockServer(
                        inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, false);
                }

                catch (Exception::Error)
                {
                        // journalForm.runbaseMainEnd(journalCheckPost,true);
                        journalTableData::updateBlockServer(
                        inventJournalTable, JournalBlockLevel::System, JournalBlockLevel::None, true);
                }
                // Posting end
Источник: http://rusgon.blogspot.com/2008/02/p...al-from-x.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 26.02.2008, 19:12   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Blog bot Посмотреть сообщение
Once I was faced the problem to post InventJournal from code. At first glance it's easy. Let's open AOT. Then we find corresponding Menu Item in \Menu Items\Action\InventJournalPost. Open class InventJournalCheckPost... And looking at main() method of this class we are coming to conclusion that this class is tightly tied to the journalForm. What's a pity! Let's rewrite newFromForm() method.
Какой ужас! После навигации по пунктам меню следовало копнуть чуть глубже, и тогда вместо переписывания метода InventJournalCheckPost::newFromForm() можно было бы просто написать
X++:
InventJournalCheckPost::newPostJournal(inventJournalTable).run();
За это сообщение автора поблагодарили: mazzy (5), belugin (5), kashperuk (1), vladz (1).
Старый 26.02.2008, 19:38   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Какой ужас! После навигации по пунктам меню следовало копнуть чуть глубже, и тогда вместо переписывания метода InventJournalCheckPost::newFromForm() можно было бы просто написать
X++:
InventJournalCheckPost::newPostJournal(inventJournalTable).run();
+1

То-то я удивился, что как-то много кода
Решил почитать на выходных.

Спасибо, что сэкономил мне время
Старый 26.02.2008, 21:57   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Какой ужас! После навигации по пунктам меню следовало копнуть чуть глубже, и тогда вместо переписывания метода InventJournalCheckPost::newFromForm() можно было бы просто написать
X++:
InventJournalCheckPost::newPostJournal(inventJournalTable).run();
Ай, спасибо. Именно так! И только так!

Что-то пропустил я этот блог...
__________________
полезное на axForum, github, vk, coub.
Старый 27.02.2008, 01:51   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Все равно, хотелось бы выразить спасибо Руслану. Предполагаю, что здесь на форуме он тоже присутствует.

Его блог - один из тех, которые интересно читать.
Все четко и по делу- не то что у DaxGuy или Брендон Джордж..
Старый 27.02.2008, 11:02   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Таки выберусь из тени Как правильно здесь уже заметили, данная заметка, вызвашая живое обсуждение, не что иное как "изобретение велосипеда". Но...

Блог имеет подзаголовок "Советы и _трюки_" и большинство заметок этого блога не что иное, как "отморозковщина" в чистом виде. Я недаром выбрал стиль заметки-джоба. Ведь, согласитесь, гораздо проще запустить небольшой джоб на своём компьютере и своими
глазами убедиться, как работает та или иная идея, нежели скачивать, разархивировывать, экспортировать .xpo, а то и просто "фтыкать", что хотел сказать автор.

В данном случае всё просто и наглядно.

Возвращаясь назад к разноске, я хотел показать как _своими руками_ можно создать разноску.
И не просто создать, но и дать возможность поэксперементировать, порассуждать, в конце концов, а что будет если...

Эта заметка не что иное, как "препарирование" операции, так сказать, возможность заглянуть в нутро такой операции, как
InventJournalCheckPost::newPostJournal(inventJournalTable).run();

Тем более я сознательно выдал на-гора не сразу окончательный результат, а подробно рассписывал шаги, откуда что следует.
Данная заметка - это не попытка выдать читателю рыбу. Это даже не удочка. Это посыл, это призыв читателю не боятся исследовать, экспериментировать, не быть зависимыми от манулов. Ибо разобравшись с существующим механизмом разноски, читатель уже сам сможет создать что-то своё.
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
За это сообщение автора поблагодарили: mazzy (5), belugin (5), kashperuk (11).
Старый 27.02.2008, 12:22   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Russland Посмотреть сообщение
Тем более я сознательно выдал на-гора не сразу окончательный результат, а подробно рассписывал шаги, откуда что следует.
Это замечательно. Но с дидактической точки зрения было бы чертовски полезно, если бы в конце апофеозом всей статьи была бы рекомендована одна строчка кода.

работа программиста в Аксапте зачастую заключается как раз в том, что он копается несколько дней, лопатит кучу кода, а в конце правит одну две строчки кода или говорит консультанту где надо переключить галочку.

аналогичный случай был с этой статьей http://axapta.mazzy.ru/lib/journaltrans_insert/
в результате чертовски полезных советов Максима Горбунова статью пришлось почти полностью переписать и выложить два проекта - один пошаговый, другой правильный и рекомендуемый.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).
Старый 27.02.2008, 12:52   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А еще бывает, что у программиста просто нет времени разбираться, а его уже тыкают в бок: "Давай-давай-давай". И тогда можно несколькими строчками кода сымитировать действия пользователя и получить желаемое минимальными усилиями: Запустить метод контрола
Старый 27.02.2008, 13:07   #9  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
была бы рекомендована одна строчка кода
Согласен
пропустил этот момент

Ответьте кто-нибудь в комментариях к заметке
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 27.02.2008, 13:12   #10  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
можно несколькими строчками кода сымитировать действия пользователя и получить желаемое минимальными усилиями
опять же согласен
Иногда бывает просто необходимо "выцарапать" необходимую функциональность
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Теги
inventjournal, программно, разноска

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ruslan Goncharov: A few words about sorting codes Blog bot DAX Blogs 0 18.02.2009 21:05
Ruslan Goncharov: From Microsoft Dynamics AX Programming newsgroup tricks Blog bot DAX Blogs 0 24.05.2008 00:08
Ruslan Goncharov: Dynamic enabled() property for StringEdit and arrows Blog bot DAX Blogs 0 18.04.2008 20:05
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43

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

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

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