В совете Сергея Пикина показано как программно добавить строку в складской журнал. Огромное спасибо Максиму Горбунову за ценные замечания и критику кода. Проект почти полностью переделан по совету Максима.
tInventTransAddJob_RNR.xpo (Проект для Axapta 3.0, 3.2Kb, Для загрузки требуется регистрация на форуме у Mazzy)
Сергей Пикин, pikin@rabota-na-rezultat.ru
Максим Горбунов (Maxim Gorbunov)
При работе с журналами в Axapta довольно часто возникает необходимость создания собственных процедур для формирования строк журнала. Примером могут служить складские журналы модуля «Управление запасами». В большинстве из них строки создаются вручную, а это не всегда быстро и удобно, в некоторых журналах возникает задача создания строк журнала, основываясь на внешних данных других систем и т.д.
Мы не будем досконально рассматривать весь цикл программного формирования журнала в Axapta, а рассмотрим небольшую задачу программного добавления строки журнала в уже существующий журнал инвентаризации.
Основные таблицы:
- InventJournalTable – таблица складских журналов;
- InventJournalTrans – строки складского журнала;
- InventDim – складские аналитики.
Пример:
// Job добавляет одну строчку в журнал инвентаризации:
// номер журнала - макрос JournalNum
// идентификатор номенклатуры - макрос ItemId
// инвентаризированное кол-во - макрос QtyCounted
static void InventTransAddJob_RNR(Args _args)
{
//Определяем константы
#Define.JournalNum("000015_061")
#Define.ItemId("ESB-007")
#Define.LocationId("MW")
#Define.QtyCounted(101)
//Определяем переменные
InventJournalTrans inventJournalTrans;
InventJournalTable inventJournalTable;
InventTable inventTable;
InventDim inventDim;
;
//Находим соответствующую номенклатуру
inventTable = inventTable::find(#ItemId);
if (!inventTable) throw error("Не найдена номенклатура!");
ttsbegin;
//Находим соответсвующий журнал (!!! Внимание - Журнал должен быть создан заранее.)
inventJournalTable = inventJournalTable::find(#JournalNum, true);
if (!inventJournalTable) throw error("Не найден журнал!");
//Очищаем поля в строке журнала
inventJournalTrans.clear();
//Заполняем значениями по-умолчанию
inventJournalTrans.initFromInventJournalTable(inventJournalTable);
inventJournalTrans.initFromInventTable(inventTable);
inventJournalTrans.transDate = systemDateGet();
//Инициализируем складскую аналитику
//В реальном примере инициализация аналитики должна быть более умной
// Берем уже заполненную на этапе инициализации аналитику из строки
inventDim = inventJournalTrans.inventDim();
inventDim.InventLocationId = #LocationId;
// Устанавливаем склад
inventDim = inventDim::findOrCreate(inventDim);
inventJournalTrans.inventDimId = inventDim.inventDimId;
//Обратите внимание на этот хитрый вызов
//В Аксапте есть целое семейство классов для работы со скласдкими журналами разных типов
//В базовом классе метод journalSetInventDimField устанавливает цены и накладные расходы
//Для журнала инвентаризации в этом методе рассчитывается inventOnHand
//См. InventMov_Jour_Loss_SumUp.journalSetInventDimField()
inventJournalTrans.inventMovement().journalSetInventDimField(inventDim, fieldNum(InventDim, InventLocationId));
//Запишем значение инвентаризированного количества
inventJournalTrans.Counted = #QtyCounted;
inventJournalTrans.inventMovement().JournalSetCounted();
//Подсчитаем итоги по журналу
// В этот момент вычисляется ваучер и обновляются итоги по журналу
inventJournalTrans.insertFromCode();
info("Все записано!");
ttscommit;
}
Результат работы данного примера можно посмотреть, открыв форму отображения строк соответствующего журнала.
В дальнейшем, используя данный пример, можно создать свой класс, обладающий необходимыми интерфейсами и использовать его, скажем при создании журнала инвентаризации из внешнего файла (см. рис.)
Сергей Пикин, pikin@rabota-na-rezultat.ru
Дополнение от Maxim Gorbunov (15.10.05)
Отличное дополнение высказал Maxim Gorbunov. В результате его дополнения пример полностью переписан. См. обсуждение на форуме.



