24.02.2008, 17:40 | #1 |
Участник
|
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); } } 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; } } 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 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
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
26.02.2008, 19:12 | #2 |
Участник
|
Цитата:
Сообщение от 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.
X++: InventJournalCheckPost::newPostJournal(inventJournalTable).run(); |
|
|
За это сообщение автора поблагодарили: mazzy (5), belugin (5), kashperuk (1), vladz (1). |
26.02.2008, 19:38 | #3 |
Участник
|
Цитата:
То-то я удивился, что как-то много кода Решил почитать на выходных. Спасибо, что сэкономил мне время |
|
26.02.2008, 21:57 | #4 |
Участник
|
Цитата:
Что-то пропустил я этот блог... |
|
27.02.2008, 01:51 | #5 |
Участник
|
Все равно, хотелось бы выразить спасибо Руслану. Предполагаю, что здесь на форуме он тоже присутствует.
Его блог - один из тех, которые интересно читать. Все четко и по делу- не то что у DaxGuy или Брендон Джордж.. |
|
27.02.2008, 11:02 | #6 |
MCTS
|
Таки выберусь из тени Как правильно здесь уже заметили, данная заметка, вызвашая живое обсуждение, не что иное как "изобретение велосипеда". Но...
Блог имеет подзаголовок "Советы и _трюки_" и большинство заметок этого блога не что иное, как "отморозковщина" в чистом виде. Я недаром выбрал стиль заметки-джоба. Ведь, согласитесь, гораздо проще запустить небольшой джоб на своём компьютере и своими глазами убедиться, как работает та или иная идея, нежели скачивать, разархивировывать, экспортировать .xpo, а то и просто "фтыкать", что хотел сказать автор. В данном случае всё просто и наглядно. Возвращаясь назад к разноске, я хотел показать как _своими руками_ можно создать разноску. И не просто создать, но и дать возможность поэксперементировать, порассуждать, в конце концов, а что будет если... Эта заметка не что иное, как "препарирование" операции, так сказать, возможность заглянуть в нутро такой операции, как InventJournalCheckPost::newPostJournal(inventJournalTable).run(); Тем более я сознательно выдал на-гора не сразу окончательный результат, а подробно рассписывал шаги, откуда что следует. Данная заметка - это не попытка выдать читателю рыбу. Это даже не удочка. Это посыл, это призыв читателю не боятся исследовать, экспериментировать, не быть зависимыми от манулов. Ибо разобравшись с существующим механизмом разноски, читатель уже сам сможет создать что-то своё.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
|
За это сообщение автора поблагодарили: mazzy (5), belugin (5), kashperuk (11). |
27.02.2008, 12:22 | #7 |
Участник
|
Цитата:
работа программиста в Аксапте зачастую заключается как раз в том, что он копается несколько дней, лопатит кучу кода, а в конце правит одну две строчки кода или говорит консультанту где надо переключить галочку. аналогичный случай был с этой статьей http://axapta.mazzy.ru/lib/journaltrans_insert/ в результате чертовски полезных советов Максима Горбунова статью пришлось почти полностью переписать и выложить два проекта - один пошаговый, другой правильный и рекомендуемый. |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (1). |
27.02.2008, 12:52 | #8 |
Moderator
|
А еще бывает, что у программиста просто нет времени разбираться, а его уже тыкают в бок: "Давай-давай-давай". И тогда можно несколькими строчками кода сымитировать действия пользователя и получить желаемое минимальными усилиями: Запустить метод контрола
|
|
27.02.2008, 13:07 | #9 |
MCTS
|
Цитата:
была бы рекомендована одна строчка кода
пропустил этот момент Ответьте кто-нибудь в комментариях к заметке
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
27.02.2008, 13:12 | #10 |
MCTS
|
Цитата:
можно несколькими строчками кода сымитировать действия пользователя и получить желаемое минимальными усилиями
Иногда бывает просто необходимо "выцарапать" необходимую функциональность
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
Теги |
inventjournal, программно, разноска |
|
|