说到开发,首先想到的是对语言语法细节的熟悉,对面向对象的理解.对于AX的二次开发,这些当然也比较重要,但相对来说更加重要的是对系统已有的几千张表和几千个类的熟悉.决定二次开发速度的主要因素也是对这些表和类的理解,因为系统中有大量的功能已经封装成了比较好的类可以调用,比如获取库存的现有量想到InventOnhand可以使用,想获取此前某一天的库存量可以用InventSumDate,销售订单和采购订单的过账可以调用SaelsFormLetter和PurchFormLetter的update方法等等.
有些公司一些移库,采购销售的动作并不想通过人为操作过账,而是想让系统自己完成,这时用代码生成相应记录并自动过账就比较重要了.下面的代码是创建并装运转移单的代码.
static void newInventTransfer(Args _args)
{
InventTransferTable inventTransferTable;
InventTransferLine inventTransferLine;
InventTransferParmTable inventTransferParmTable;
InventTransferParmLine inventTransferParmLine;
InventDim inventDim;
InventTransferMultiShip inventTransferMultiShip = InventTransferMultiShip::construct();
InventTransferId inventTransferId;
NumberSeq numberSeq = NumberSeq::newReserveNumFromCode(InventParameters::numRefTransferId().NumberSequence);
Num parmId = NumberSeq::newReserveNumFromCode(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(ParmId))).NumberSequence).num();
;
ttsbegin;
//Insert inventTransferTable
inventTransferId = numberSeq.num();
inventTransferTable.TransferId = inventTransferId;
inventTransferTable.initValue();
inventTransferTable.InventLocationIdFrom = 'GW';
inventTransferTable.InventLocationIdTransit = 'GW-T';
inventTransferTable.InventLocationIdTo = 'EW';
inventTransferTable.insert();
//Insert inventTransferLine
inventTransferLine.initFromInventTransferTable(inventTransferTable,true);
inventTransferLine.ItemId = 'CN-01';
inventTransferLine.initFromInventTable(InventTable::find('CN-01'));
InventMovement::setAutoReserving(inventTransferLine);
InventMovement::bufferSetRemainQty(inventTransferLine,InventMovSubType::None); //Set Remain Qty
InventMovement::bufferSetRemainQty(inventTransferLine,InventMovSubType::TransferOrderTransitFrom); //Set Receive Qty
inventTransferLine.LineNum = 1;
inventDim.InventLocationId = 'GW';
inventTransferLine.InventDimId = InventDim::findOrCreate(inventDim).inventDimId;
inventTransferLine.RemainStatus = InventTransferRemainStatus::Shipping;
inventTransferLine.insert();
//Insert inventTransferParmTable and inventTransferParmLine
inventTransferParmTable.ParmId = parmId;
inventTransferParmTable.TransferId = inventTransferId;
inventTransferParmTable.UpdateType = InventTransferUpdateType::Shipment;
inventTransferParmTable.ShipUpdateQty = InventTransferShipUpdateQty::All;
inventTransferParmTable.EditLines = NoYes::No;
inventTransferParmTable.AutoReceiveQty = NoYes::No;
inventTransferParmTable.TransDate = SystemDateGet();
inventTransferParmTable.insert();
//Ship
inventTransferMultiShip.runUpdate(inventTransferParmTable);
ttscommit;
}
{
InventTransferTable inventTransferTable;
InventTransferLine inventTransferLine;
InventTransferParmTable inventTransferParmTable;
InventTransferParmLine inventTransferParmLine;
InventDim inventDim;
InventTransferMultiShip inventTransferMultiShip = InventTransferMultiShip::construct();
InventTransferId inventTransferId;
NumberSeq numberSeq = NumberSeq::newReserveNumFromCode(InventParameters::numRefTransferId().NumberSequence);
Num parmId = NumberSeq::newReserveNumFromCode(NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(ParmId))).NumberSequence).num();
;
ttsbegin;
//Insert inventTransferTable
inventTransferId = numberSeq.num();
inventTransferTable.TransferId = inventTransferId;
inventTransferTable.initValue();
inventTransferTable.InventLocationIdFrom = 'GW';
inventTransferTable.InventLocationIdTransit = 'GW-T';
inventTransferTable.InventLocationIdTo = 'EW';
inventTransferTable.insert();
//Insert inventTransferLine
inventTransferLine.initFromInventTransferTable(inventTransferTable,true);
inventTransferLine.ItemId = 'CN-01';
inventTransferLine.initFromInventTable(InventTable::find('CN-01'));
InventMovement::setAutoReserving(inventTransferLine);
InventMovement::bufferSetRemainQty(inventTransferLine,InventMovSubType::None); //Set Remain Qty
InventMovement::bufferSetRemainQty(inventTransferLine,InventMovSubType::TransferOrderTransitFrom); //Set Receive Qty
inventTransferLine.LineNum = 1;
inventDim.InventLocationId = 'GW';
inventTransferLine.InventDimId = InventDim::findOrCreate(inventDim).inventDimId;
inventTransferLine.RemainStatus = InventTransferRemainStatus::Shipping;
inventTransferLine.insert();
//Insert inventTransferParmTable and inventTransferParmLine
inventTransferParmTable.ParmId = parmId;
inventTransferParmTable.TransferId = inventTransferId;
inventTransferParmTable.UpdateType = InventTransferUpdateType::Shipment;
inventTransferParmTable.ShipUpdateQty = InventTransferShipUpdateQty::All;
inventTransferParmTable.EditLines = NoYes::No;
inventTransferParmTable.AutoReceiveQty = NoYes::No;
inventTransferParmTable.TransDate = SystemDateGet();
inventTransferParmTable.insert();
//Ship
inventTransferMultiShip.runUpdate(inventTransferParmTable);
ttscommit;
}
当然这里只是写了个Job,这个方法完全可以像SalesFormLetter的update方法那样封装一下放到类InventTransferUpd中供调用.