05.10.2005, 14:03 | #1 |
Участник
|
В совете Сергея Пикина показано как программно добавить строку в складской журнал.
http://axapta.mazzy.ru/lib/journaltrans_insert/ psststInventTransAddJob_RNR.xpo - оригинальная версия job'а InventTransAddJob_RNR.xpo - после ценных дополнений Максима Горбунова. |
|
05.10.2005, 14:05 | #2 |
Участник
|
Если вас интересует, как добавить строку в журнал ГК, смотрите класс TutorialJournalCreateExample в Аксапте.
|
|
15.10.2005, 12:58 | #3 |
Administrator
|
Вместо
Код: inventJournalTrans.JournalId = #JournalNum; inventJournalTrans.JournalType = inventJournalTable.JournalType; Код: journalTransData.initFromJournalTable(); Кстати, можно обойтись без всех этих ритуальных танцев в 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 |
Участник
|
Спасибо, Maxim Gorbunov.
Прежде всего, совет имел сугубо обучающую цель. Читающий должен понять что именно надо делать для заполнения журнала. Поэтому было расписано и разжевано до полей. С чем согласен - конструкция initFrom...() и логически, и технически более правильная. Это я поправлю. а замена inventOnHand и insertFromCode. Является правильной технически, но полностью затуманивает логику. Думаю, что оставим их в статье как есть. А твой совет выделим в дополнениях. |
|
15.10.2005, 16:05 | #5 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
А вот так делать не стоит:
Код: //Инициализируем складскую аналитику ... Код: inventDim = inventJournalTrans.inventDim(); Но эта строчка опять же таки сильно затуманивает смысл ОБУЧАЮЩЕГО совета. Инициализация аналитики сделана нарочито элементарно. Вообще говоря, корректная установка аналитики здесь должна добавить еще столько же кода... который не относится к журналу, а относится к работе со слакдской аналитикой. Думаю, что работа со складской аналитикой требует отдельного совета. |
|
15.10.2005, 16:26 | #6 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?
А где ты еще видел его описание? Пример скорее обучающий. Реальный должен быть раза в три длиннее. Разве не так? |
|
16.10.2005, 12:12 | #7 |
Administrator
|
Цитата:
Сообщение от mazzy
С чем согласен - конструкция initFrom...() и логически, и технически более правильная. Это я поправлю.
Цитата:
Сообщение от mazzy
а замена inventOnHand и insertFromCode. Является правильной технически, но полностью затуманивает логику.
По поводу insertFromCode() - не согласен. Это один из pattern'ов. Похожий метод есть не только у строк журналов, но и у строк заказов и закупок, например. Этот метод надо использовать. Особенно в обучающих примерах. Цитата:
Сообщение от mazzy
Хм... может быть. Мы думали об этом.
Но эта строчка опять же таки сильно затуманивает смысл ОБУЧАЮЩЕГО совета. Инициализация аналитики сделана нарочито элементарно. Вообще говоря, корректная установка аналитики здесь должна добавить еще столько же кода... который не относится к журналу, а относится к работе со слакдской аналитикой. Думаю, что работа со складской аналитикой требует отдельного совета. Цитата:
Сообщение от mazzy
Цитата:
Сообщение от Maxim Gorbunov
Кроме того, не понял, а почему может понадобиться не создавать складскую проводку при создании журнала?
А где ты еще видел его описание? Цитата:
Сообщение от 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, 12:28 | #8 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Ну, на счет "в три раза" я не согласен. Пример-то в статье тоже взят, на самом деле, из реального кода. Фактически, это чуть-чуть дополненный метод InventCountCreate_Base.createInventJournalTrans(). Правда, из него выкинута вся работа со складской аналитикой. Конечно, то, что есть в стандартном методе - избыточно, но вот прямо всю логику выкидывать я бы не стал.
Да. Именно этот. Да. Именно выкинули. Сознательно и намеренно. Я добавил комментарий. Я дополнил статью твоим особым мнением. Не хочешь написать насчет работы со складской аналитикой. |
|
16.10.2005, 13:40 | #9 |
Administrator
|
Цитата:
Сообщение от 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 |
Administrator
|
Цитата:
Сообщение от mazzy
Я дополнил статью твоим особым мнением.
Во-первых, в исходном примере надо писать не Код: inventJournalTrans.initFromJournalTable(); Код: journalTransData.initFromJournalTable(); Код: //Инициализируем класс для операций с записью в таблице журнала journalTableData = JournalTableData::newTable(inventJournalTable); //Очищаем поля записи inventJournalTrans.clear(); // Инициализируем класс для операций с записью в таблице строк журнала journalTransData = journalTableData.JournalStatic().newJournalTransData( inventJournalTrans, journalTableData); Код: inventJournalTrans.initFromInventJournalTable(inventJournalTable); Во-вторых, "сложная конструкция, которая считает остаток", включает в себя так же инициализацию 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 |
Участник
|
Хм... В твоем варианте из демопримера полностью скрыт аспект подсчета итогов по журналу...
Однако ж, ты прав. Хорошо. Убедил, черт языкастый. Переделаю совет. |
|