Im trying to write x++ code to do the pick & pack of serial numbers in a transfer order. I managed to do that in sales orders, but i got at the last point in the transfer order and got stuck! I made a class to handle the transfer order <MPOSTransferOrders> in it I have a few methods.
The first method is the one handles the creation of the transfer order:
(Note: I have created two tables <MPOSTransOrders> which is a regular table, and <MPOSTransOrdersTemp> which is an inmemory table to hold my initial serial numbers
public void createOrder(int TransferID)
{
MPOSTransOrders mposTransOrders;
MPOSTransOrdersTemp mposTransOrdersTemp;
MPOSDeviceSerialInfo mposDeviceSerialInfo;
InventTransferTable inventTransferTable;
InventTransferLine inventTransferLine;
InventDim inventDim;
select mposTransOrders where mposTransOrders.TransferID == TransferID;
try
{
ttsbegin;
// loop into sold serials & fill temp table
while select
mposTransOrders
join mposDeviceSerialInfo
where mposTransOrders.DeviceSerial == mposDeviceSerialInfo.InventSerialID
&& mposTransOrders.TransferID == TransferID
{
mposTransOrdersTemp.TransferDate = mposTransOrders.TransferDate;
mposTransOrdersTemp.TransferFromSite = mposTransOrders.TransferFromSite;
mposTransOrdersTemp.TransferFromWH = mposTransOrders.TransferFromWH;
mposTransOrdersTemp.TransferToWH = mposTransOrders.TransferToWH;
mposTransOrdersTemp.DeviceID = mposDeviceSerialInfo.ItemID;
mposTransOrdersTemp.DeviceName = mposDeviceSerialInfo.NameAlias;
mposTransOrdersTemp.DeviceSerial = mposTransOrders.DeviceSerial;
mposTransOrdersTemp.insert();
}
info('Temp table populated ...');
// transfer header
inventTransferTable.clear();
inventTransferTable.initValue();
inventTransferTable.TransferId = InventTransferTable::numberSeq().num();
inventTransferTable.InventLocationIdFrom = mposTransOrdersTemp.TransferFromWH;
inventTransferTable.InventLocationIdTo = mposTransOrdersTemp.TransferToWH;
inventTransferTable.DlvModeId = CustVendTransportPointLine::defaultDeliveryMode(inventTransferTable.InventLocationIdFrom,'','','','',inventTransferTable.InventLocationIdTo);
inventTransferTable.InventLocationIdTransit = InventLocation::find(inventTransferTable.InventLocationIdFrom).InventLocationIdTransit;
inventTransferTable.initFromAddress();
inventTransferTable.initToAddress();
inventTransferTable.ShipDate = mposTransOrdersTemp.TransferDate;
inventTransferTable.ReceiveDate = mposTransOrdersTemp.TransferDate;
if (!inventTransferTable.validateWrite())
{
throw Exception::Error;
}
// insert transfer header
inventTransferTable.insert();
info('Trans Order header created ...');
while select DeviceID, count(DeviceName), TransferFromSite, TransferFromWH, TransferDate
from mposTransOrdersTemp group by DeviceID, TransferFromSite, TransferFromWH, TransferDate
{
// transfer item line
inventDim.clear();
inventDim.InventSiteId = mposTransOrdersTemp.TransferFromSite;
inventDim.InventLocationId = mposTransOrdersTemp.TransferFromWH;
inventTransferLine.clear();
inventTransferLine.initValue();
inventTransferLine.ItemId = mposTransOrdersTemp.DeviceID;
inventTransferLine.InventDimId = InventDim::findOrCreate(inventDim).inventDimId;
inventTransferLine.QtyTransfer = str2int(mposTransOrdersTemp.DeviceName);
inventTransferLine.initFromInventTableModule(InventTableModule::find(inventTransferLine.ItemId,ModuleInventPurchSales::Invent));
inventTransferLine.QtyRemainReceive = inventTransferLine.QtyTransfer;
inventTransferLine.QtyRemainShip = inventTransferLine.QtyTransfer;
inventTransferLine.ShipDate = mposTransOrdersTemp.TransferDate;
inventTransferLine.ReceiveDate = mposTransOrdersTemp.TransferDate;
inventTransferLine.initFromInventTransferTable(inventTransferTable, false);
inventTransferLine.LineNum = InventTransferLine::lastLineNum(inventTransferLine.TransferId) + 1.0;
if (inventTransferLine.validateWrite())
{
inventTransferLine.insert();
info('Item: ' + mposTransOrdersTemp.DeviceID + ' & Qty: ' + mposTransOrdersTemp.DeviceName);
}
else
{
throw Exception::Error;
}
}
ttscommit;
// start the split
this.splitItemLines(inventTransferTable.TransferId);
// link the serials
this.pickSerials(inventTransferTable.TransferId);
}
catch
{
throw Exception::Error;
}
info("Done!");
}
Then second method is <splitItemLines> which handles the items splitting in the pick screen (and this one works fine)
public void splitItemLines(InventTransferId transferID)
{
// declerations for item splitting (picking)
InventTrans inventTrans;
InventTransOrigin inventTransOrigin;
InventTransferLine inventTransLine;
int rowCount;
int i = 0;
int j = 0;
ttsBegin;
/* start splitting lines - pick process */
// starting split process
info('starting split process');
// get rows count in transferLine
select count(RecId) from inventTransLine where inventTransLine.TransferId == transferID;
info(strFmt("TransferLine has %1 records.", inventTransLine.RecId));
// loop on items in transferLine
while select InventTransId from inventTransLine where inventTransLine.TransferId == transferID
{
info(strFmt("Splitting InventTransID: %1.", inventTransLine.InventTransId));
// get InventTransOrigin record using sales line InventTransId
inventTransOrigin = InventTransOrigin::findByInventTransId(inventTransLine.InventTransId, false);
info(strFmt("Locating InventTransOrigin RecId: %1", inventTransOrigin.RecId));
// get invent trans line to split
inventTrans = InventTrans::findByInventTransOrigin(inventTransOrigin.RecId, false);
// get qty to split into lines
rowCount = real2int(abs(inventTrans.Qty));
info(strFmt("Qty: %1", abs(inventTrans.Qty)));
for (i = 1; i < rowCount; i++)
{
inventTrans = InventTrans::findByInventTransOrigin(inventTransOrigin.RecId, false);
inventTrans.updateSplit(-1);
}
}
ttsCommit;
info('split process completed');
/* end splitting lines - pick process */
}
The third method is the <pickSerials> method, which supposed to handle the passing / selection of serials into the pick screen, and here is where i am stuck.
public void pickSerials(InventTransferId transferID)
{
InventTransferLine inventTransLine;
InventTrans inventTrans;
InventTrans inventTransRecord;
InventTransOrigin inventTransOrigin;
InventDim inventDim;
MPOSTransOrders mposTransOrders;
try
{
ttsbegin;
info('starting pick process...');
// loop on <SalesLine> using the <SalesId> to get items sold
// each item will have a line with a unique <SalesLine>.<InventTransId>
// which will be used in the <InventTrans> loop
while select inventTransLine where inventTransLine.TransferId == transferID
{
// get <inventTransOrigin.RecId> to loop item lines in <inventTrans>
select inventTransOrigin where inventTransOrigin.InventTransId == inventTransLine.InventTransId;
// start loop on <inventTrans> to get each item line
while select inventTrans where inventTrans.InventTransOrigin == inventTransOrigin.RecId
{
// select record from <MPOSCustSales> with no <InventDimID>
select forupdate mposTransOrders where mposTransOrders.TransferID == 1;
//mposTransOrders.TransferId == transferID && mposTransOrders.InventDimID == '';
// get record from <inventDim> using <MPOSCustSales.DeviceSerial> &
// <MPOSCustSales.MPOSUserID> which equals <inventDim.InventLocationId>
select inventDim where inventDim.inventSerialId == mposTransOrders.DeviceSerial
&& inventDim.InventLocationId == mposTransOrders.TransferFromWH;
// update <MPOSCustSales> with new <InventDimID>
//mposTransOrders.InventDimID = inventDim.InventDimId;
//mposTransOrders.update();
// execute the pick & packing
this.pickAndPackingSlip(inventTransLine.InventTransId , inventDim.inventDimId, 1);
info(strFmt("Updated Serial: '%1' with InventDimID: '%2'", mposTransOrders.DeviceSerial, inventDim.inventDimId));
}
}
ttscommit;
}
catch (Exception::Error)
{
throw Global::error("need to get warning");
//info('Error ...');
}
}
This method calls another method <pickAndPackingSlip>, which I found and works just fine for sales orders:
private void pickAndPackingSlip(
InventtransId _InventtransId,
InventDimId _InventDimId,
Int _Qty)
{
TmpInventTransWMS tmpInventTransWMS;
InventMovement InventMovement;
InventTransOrigin InventTransOrigin;
SalesLine SalesLine;
InventTrans InventTrans;
MPOSinventTransWMS_Pick inventTransWMS_Pick;
Query inventTransQuery;
QueryBuildDataSource QueryBuildDataSource;
SalesFormLetter SalesFormLetter;
SalesTable SalesTable;
System.String netString = "Net string.";
System.Exception netExcepn;
try
{
inventTransQuery = new Query();
QueryBuildDataSource = inventTransQuery.addDataSource(tableNum(InventTrans));
InventTrans = InventTrans::findTransId(_InventtransId);
InventTransOrigin = InventTransorigin::findByInventTransId(_InventtransId);
QueryBuildDataSource.addRange(fieldNum(InventTrans,RecId)).value(int642str(InventTrans.recid));
delete_from tmpInventTransWMS;
tmpInventTransWMS.clear();
inventTransWMS_Pick = MPOSInventTransWMS_Pick::newStandard(tmpInventTransWMS,inventTransQuery);
tmpInventTransWMS.initFromInventTrans(InventTrans);
tmpInventTransWMS.initFromInventTransOrigin(InventTransOrigin);
tmpInventTransWMS.InventQty = _Qty;
tmpInventTransWMS.InventDimId = _InventDimId;
inventTransWMS_Pick.writeTmpInventTransWMS(tmpInventTransWMS);
inventTransWMS_Pick.updateInvent();
/*
SalesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);
SalesLine = salesline::findInventTransId(_InventtransId);
SalesTable = SalesTable::Find(SalesLine.salesId);
SalesFormLetter.update(SalesTable,systemDateGet(), SalesUpdate::PickingList, AccountOrder::None, false, false);
*/
}
catch(Exception::Error)
{
throw Exception::Error;
}
catch(Exception::Info)
{
throw Exception::Info;
}
catch(Exception::CLRError)
{
//throw Exception::CLRError;
netExcepn = CLRInterop::getLastException();
}
}
As you can notice, the last few lines, which in the sales orders update the actual sales order through using the <SalesFormLetter> class, and that what I would like to find its equivalent in transfer order?
*This post is locked for comments
I have the same question (0)

Report
All responses (
Answers (