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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.10.2005, 14:03   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
В совете Сергея Пикина показано как программно добавить строку в складской журнал.

http://axapta.mazzy.ru/lib/journaltrans_insert/

psststInventTransAddJob_RNR.xpo - оригинальная версия job'а
InventTransAddJob_RNR.xpo - после ценных дополнений Максима Горбунова.
Вложения
Тип файла: xpo psststInventTransAddJob_RNR.xpo (4.9 Кб, 519 просмотров)
Тип файла: xpo InventTransAddJob_RNR.xpo (3.2 Кб, 690 просмотров)
__________________
полезное на axForum, github, vk, coub.
Старый 05.10.2005, 14:05   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Если вас интересует, как добавить строку в журнал ГК, смотрите класс TutorialJournalCreateExample в Аксапте.
__________________
полезное на axForum, github, vk, coub.
Старый 15.10.2005, 12:58   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Вместо
Код:
inventJournalTrans.JournalId            = #JournalNum;
inventJournalTrans.JournalType          = inventJournalTable.JournalType;
правильнее было бы использовать
Код:
journalTransData.initFromJournalTable();
В этом случае будут так же инициализированы поля EmplId и LedgerAccountIdOffset. Возможно, для данного примера это не принципиально. Тем не менее стоит учитывать, что в дальнейшем возможны изменения приложения, которые затронут как раз процедуру создания строк журналов (например, в строки журнала будет добавлено новое поле, которое будет инициализироваться из заголовка журнала). Тогда после такого обновления Вам придется переписывать Вашу процедуру создания строк, чтобы включить в нее новую логику работы.
Кстати, можно обойтись без всех этих ритуальных танцев в JournalTableData и JournalTransData, а просто использовать
Код:
inventJournalTrans.initFromInventJournalTable(inventJournalTable);
Аналогично, вместо
Код:
inventJournalTrans.itemId               = inventTable.itemId;
inventJournalTrans.dimension            = inventTable.dimension;
inventJournalTrans.projCategoryId       = inventTable.projCategoryId;
лучше
Код:
inventJournalTrans.initFromInventTable(inventTable);
А вот так делать не стоит:
Код:
//Инициализируем складскую аналитику
...
Дело в том, что складскую аналитику таким образом Вы полностью затрете своим складом. А как быть с конфигурацией, например? В общем, перед тем, как инициализировать складскую аналитику, неплохо бы добавить еще одну строчку:
Код:
inventDim = inventJournalTrans.inventDim();
Код:
//Инициализируем активную аналитику из настроке журнала для расчета количества
    inventDimParm = InventJournalTable::journalId2inventDimParm(inventJournalTable.JournalId);

    //*** Специфика заполнения строки для журнала инвентаризации ***
    //Подсчитаем и запишем значение количества запасов в наличии на текущую дату
    inventJournalTrans.inventOnHand = InventSumDatePhysicalDim::onHandQty(
                                          inventJournalTrans.transDate,
                                          inventJournalTrans.itemId,
                                          inventDim,
                                          inventDimParm);
Очень сложно. Можно просто вот так:
Код:
inventJournalTrans.inventMovement().journalSetInventDimField();
Код:
//Заполним номер документа ГК (если необходимо)
if (inventJournalTable.voucherDraw == JournalVoucherDraw::Entering)
    journalTransData.initVoucher(voucher_last,false);

//Присвоим номер строки журнала
inventJournalTrans.lineNum  = InventJournalTrans::lastLineNum(#JournalNum) + 1;

//Добавим запись
// !!! Внимание - по умолчанию при добавлении записи в строку журнала формируется
// складская проводка. Чтобы этого избежать, необходимо вызывать insert c параметром true.
inventJournalTrans.insert();

//Подсчитаем итоги по журналу
journalTransData.addTotal(false,false);
Опять же, все придумано до нас. Используйте
Код:
inventJournalTrans.insertFromCode();
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?

В целом, хотелось бы отметить, что для работы с журналами в Аксапте уже существует очень широкий набор функций. Создание строк журнала из кода - вполне типичная задача, которая решена много раз. Стоит посмотреть, как это делается в стандартном приложении.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 15.10.2005, 16:01   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо, Maxim Gorbunov.

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

С чем согласен - конструкция initFrom...() и логически, и технически более правильная. Это я поправлю.

а замена inventOnHand и insertFromCode. Является правильной технически, но полностью затуманивает логику. Думаю, что оставим их в статье как есть. А твой совет выделим в дополнениях.
__________________
полезное на axForum, github, vk, coub.
Старый 15.10.2005, 16:05   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Maxim Gorbunov
А вот так делать не стоит:
Код:
//Инициализируем складскую аналитику
...
Дело в том, что складскую аналитику таким образом Вы полностью затрете своим складом. А как быть с конфигурацией, например? В общем, перед тем, как инициализировать складскую аналитику, неплохо бы добавить еще одну строчку:
Код:
inventDim = inventJournalTrans.inventDim();
Хм... может быть. Мы думали об этом.
Но эта строчка опять же таки сильно затуманивает смысл ОБУЧАЮЩЕГО совета.
Инициализация аналитики сделана нарочито элементарно.
Вообще говоря, корректная установка аналитики здесь должна добавить еще столько же кода... который не относится к журналу, а относится к работе со слакдской аналитикой. Думаю, что работа со складской аналитикой требует отдельного совета.
__________________
полезное на axForum, github, vk, coub.
Старый 15.10.2005, 16:26   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Maxim Gorbunov
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?
Таким образом Сергей дал описание этого параметра
А где ты еще видел его описание?

Пример скорее обучающий. Реальный должен быть раза в три длиннее.
Разве не так?
__________________
полезное на axForum, github, vk, coub.
Старый 16.10.2005, 12:12   #7  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от mazzy
С чем согласен - конструкция initFrom...() и логически, и технически более правильная. Это я поправлю.
Кроме того, хотелось бы заметить, что в экзамене по программированию есть вопросы на эту тему.
Цитата:
Сообщение от mazzy
а замена inventOnHand и insertFromCode. Является правильной технически, но полностью затуманивает логику.
На счет inventOnHand - как знаешь. Фактически, в статье просто переписан код из метода journalSetInventDim(). И все-таки, ИМХО, даже в рамках обучающего примера стоит пользоваться функциональностью классов InventMovement.
По поводу insertFromCode() - не согласен. Это один из pattern'ов. Похожий метод есть не только у строк журналов, но и у строк заказов и закупок, например. Этот метод надо использовать. Особенно в обучающих примерах.
Цитата:
Сообщение от mazzy
Хм... может быть. Мы думали об этом.
Но эта строчка опять же таки сильно затуманивает смысл ОБУЧАЮЩЕГО совета.
Инициализация аналитики сделана нарочито элементарно.
Вообще говоря, корректная установка аналитики здесь должна добавить еще столько же кода... который не относится к журналу, а относится к работе со слакдской аналитикой. Думаю, что работа со складской аналитикой требует отдельного совета.
Да я бы не сказал, что она что-то затуманивает. Идея лишь в том, чтобы не переписывать все поля складской аналитики, а заменить только то одно, которое нам известно. Работу со складской аналитикой в отрыве от складских журналов рассматривать - дело долгое и неблагодарное. Если же рассматривать конкретно работу со складской аналитикой в складских журналах (быть может, за исключением журнала переноса), ничего сложного там нет.
Цитата:
Сообщение от mazzy
Цитата:
Сообщение от Maxim Gorbunov
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?
Таким образом Сергей дал описание этого параметра
А где ты еще видел его описание?
Да я вообще видел мало описаний для параметров методов Дело в том, что, не очевидно, что это описание параметра. Скорее, это звучит так, что де бывают ситуации, когда проводку создавать не надо. Вот тогда передавайте в этот метод false и будет Вам счастье. Я вот и поинтересовался, когда бывает нужно не создавать проводку по складскому журналу. Впрочем, ответ здесь такой: этот параметр используется сугубо для повышения быстродействия, когда Вы заранее знаете, что по строке складского журнала никаких проводок не должно быть создано (когда количество в строке равно 0).
Цитата:
Сообщение от mazzy
Пример скорее обучающий. Реальный должен быть раза в три длиннее.
Разве не так?
Ну, на счет "в три раза" я не согласен. Пример-то в статье тоже взят, на самом деле, из реального кода. Фактически, это чуть-чуть дополненный метод InventCountCreate_Base.createInventJournalTrans(). Правда, из него выкинута вся работа со складской аналитикой. Конечно, то, что есть в стандартном методе - избыточно, но вот прямо всю логику выкидывать я бы не стал.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 16.10.2005, 12:28   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Maxim Gorbunov
Ну, на счет "в три раза" я не согласен. Пример-то в статье тоже взят, на самом деле, из реального кода. Фактически, это чуть-чуть дополненный метод InventCountCreate_Base.createInventJournalTrans(). Правда, из него выкинута вся работа со складской аналитикой. Конечно, то, что есть в стандартном методе - избыточно, но вот прямо всю логику выкидывать я бы не стал.

Да. Именно этот.
Да. Именно выкинули. Сознательно и намеренно.
Я добавил комментарий.

Я дополнил статью твоим особым мнением.
Не хочешь написать насчет работы со складской аналитикой.
__________________
полезное на axForum, github, vk, coub.
Старый 16.10.2005, 13:40   #9  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от mazzy
Да. Именно выкинули. Сознательно и намеренно.
Так вот я и говорю, что Вы не корректно поступили Может работать с ней и не надо в рамках примера, но затирать ту, что уже проставлена, тоже не есть гут.

Цитата:
Сообщение от mazzy
Не хочешь написать насчет работы со складской аналитикой.
Нет смысла писать просто про работу со складской аналитикой. Нельзя рассматривать ее в отрыве от конкретной функции.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 16.10.2005, 14:16   #10  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от mazzy
Я дополнил статью твоим особым мнением.
Эх... Неточно я процитирован

Во-первых, в исходном примере надо писать не
Код:
inventJournalTrans.initFromJournalTable();
а
Код:
journalTransData.initFromJournalTable();
У inventJournalTrans такого метода просто нет. А вообще я предлагал вообще удалить все обращения к JournalTableData и JournalTransData и вместо строк:
Код:
//Инициализируем класс для операций с записью в таблице журнала
journalTableData    = JournalTableData::newTable(inventJournalTable);

//Очищаем поля записи
inventJournalTrans.clear();
// Инициализируем класс для операций с записью в таблице строк журнала
journalTransData    =
    journalTableData.JournalStatic().newJournalTransData(
                                         inventJournalTrans,
                                         journalTableData);
написать
Код:
inventJournalTrans.initFromInventJournalTable(inventJournalTable);
Ну, clear() можно оставить, конечно.

Во-вторых, "сложная конструкция, которая считает остаток", включает в себя так же инициализацию InventDimParm, которая, честно сказать, никому не нужна. В общем, из исходного текста надо убрать
Код:
//Инициализируем активную аналитику из настроке журнала для расчета количества
inventDimParm = InventJournalTable::journalId2inventDimParm(inventJournalTable.JournalId);

//*** Специфика заполнения строки для журнала инвентаризации ***
//Подсчитаем и запишем значение количества запасов в наличии на текущую дату
inventJournalTrans.inventOnHand = InventSumDatePhysicalDim::onHandQty(
                                      inventJournalTrans.transDate,
                                      inventJournalTrans.itemId,
                                      inventDim,
                                      inventDimParm);
а добавить
Код:
inventJournalTrans.inventMovement().journalSetInventDimField();
В итоге, мой вариант метода следующий:
<div class='XPPtop'>X++</div><div class='XPP'>#Define.JournalNum([color=:red]"000015_061"[/color])
#Define.ItemId([color=:red]"ESB-007"[/color])
#Define.LocationId([color=:red]"MW"[/color])
#Define.QtyCounted(101)

InventJournalTrans      inventJournalTrans;
InventJournalTable      inventJournalTable;
InventTable             inventTable;

InventDim               inventDim;
;

inventTable = inventTable::find(#ItemId);
[color=:blue]if[/color] (!inventTable)
 [color=:blue]throw[/color] error(strfmt(InventTable::txtNotExist(), #ItemId));

[color=:blue]ttsbegin[/color];
 inventJournalTable  = inventJournalTable::find(#JournalNum, [color=:blue]true[/color]);
 [color=:blue]if[/color] (!inventJournalTable)
   [color=:blue]throw[/color] error(strfmt(InventJournalTable::txtNotExist(), #JournalNum));

 inventJournalTrans.clear();
 inventJournalTrans.initFromInventJournalTable(inventJournalTable);
 inventJournalTrans.initFromInventTable(inventTable);
 inventJournalTrans.transDate = systemDateGet();

 inventDim = inventJournalTrans.inventDim();
 inventDim.InventLocationId = #LocationId;
 inventJournalTrans.inventDimId  =  InventDim::findOrCreate(inventDim).inventDimId;
 inventJournalTrans.inventMovement().journalSetInventDimField(inventDim, [color=:blue]fieldNum[/color](InventDim, InventLocationId));

 inventJournalTrans.Counted = #QtyCounted;
 inventJournalTrans.inventMovement().JournalSetCounted();
 inventJournalTrans.insertFromCode();
[color=:blue]ttscommit[/color];</div>
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 16.10.2005, 15:44   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Хм... В твоем варианте из демопримера полностью скрыт аспект подсчета итогов по журналу...
Однако ж, ты прав.

Хорошо. Убедил, черт языкастый.
Переделаю совет.
__________________
полезное на axForum, github, vk, coub.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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