InventTrans Marking in Ax 3.0 via X++

How do you mark 1 line to another using AX 3.0 in X++? I’ve looked through the code using the inventMarking form but can’t quite get it to work via coding.

Basically in all my coding examples, the findMovement function within the updateTmpMark doesn’t get called (since I somehow don’t have an _inventTrans). With the InventMarking Form it usually calls it just fine.

I’ve seen an example using 4.0, but it uses methods that don’t exist in 4.0 (on the TmpInventTransMark table).

Basically, you need to know only the InventTransId’s of the records you want to mark. Here is how I used inventory marking when creating purchase orders (return item)

void doInventMarking(PurchLine _purchLine) { InventTrans inventTrans; InventDim inventDim; VendInvoiceTrans vendInvoiceTrans; QueryRun queryRun; Map mapMarkNow; MapEnumerator mapEnumerator; container con; Qty qty, qtyMax; TmpInventTransMark tmpInventTransMark; TmpInventTransMark tmpInventTransMarkNow; ; super(_purchLine); queryRun = new QueryRun(this.initInventTransQuery(_purchLine.InventTransId)); queryRun.next(); inventTrans = queryRun.get(tableNum(InventTrans)); inventDim = inventTrans.inventDim(); vendInvoiceTrans = VendInvoiceTrans::findRecId(_purchLine.ZCH_InvoiceTransRefRecId); try { [con, qty] = InventTrans::packTmpMark(inventTrans.ItemId, inventDim, inventTrans.InventTransId, inventTrans.Qty); mapMarkNow = Map::create(con); mapEnumerator = mapMarkNow.getEnumerator(); while (mapEnumerator.moveNext()) { //You need to select the line you want to mark with (in my case, only 1 line) tmpInventTransMark = mapEnumerator.currentValue(); if (tmpInventTransMark.TransType == InventTransType::Purch && tmpInventTransMark.TransRefId == vendInvoiceTrans.PurchID && tmpInventTransMark.InventTransId == vendInvoiceTrans.InventTransId) { break; } } if (inventTrans.Qty < 0) qtyMax = min(tmpInventTransMark.QtyRemain, -inventTrans.OpenQty()); else { qtyMax = min(-tmpInventTransMark.QtyRemain, inventTrans.OpenQty()); qtyMax = -qtyMax; } buf2buf(tmpInventTransMark, tmpInventTransMarkNow); tmpInventTransMarkNow.qtyMarkNow = tmpInventTransMarkNow.QtyMarked ? -tmpInventTransMarkNow.QtyMarked : qtyMax; tmpInventTransMarkNow.insert(); mapMarkNow = new Map(Types::Integer, Types::Record); mapMarkNow.insert(tmpInventTransMarkNow.RecId, tmpInventTransMarkNow); InventTrans::updateTmpMark(inventTrans.InventTransId, inventDim, inventTrans.Qty, mapMarkNow.pack()); } catch { throw error(“Îøèáêà ìàðêèðîâêè ñòðîêè âîçâðàòà”); } }

Here is another, very similar example

// ZCH_070523_v3_IKash Ñêëàäñêàÿ Ìàðêèðîâêà 23.05.2007 IKASH → void doInventMarking(InventJournalTrans fromJournalTrans, InventJournalTrans toJournalTrans) { InventTrans inventTrans; InventDim inventDim; QueryRun queryRun; Map mapMarkNow; MapEnumerator mapEnumerator; container con; Qty qty, qtyMax; TmpInventTransMark tmpInventTransMark; TmpInventTransMark tmpInventTransMarkNow; ; queryRun = new QueryRun(InventTrans::inventMarkingQueryInit(fromJournalTrans.InventTransId, InventDirection::Receipt)); queryRun.next(); inventTrans = queryRun.get(tableNum(InventTrans)); inventDim = inventTrans.inventDim(); try { [con, qty] = InventTrans::packTmpMark(inventTrans.ItemId, inventDim, inventTrans.InventTransId, inventTrans.Qty); qty = qty; mapMarkNow = Map::create(con); mapEnumerator = mapMarkNow.getEnumerator(); while (mapEnumerator.moveNext()) { tmpInventTransMark = mapEnumerator.currentValue(); if (tmpInventTransMark.InventTransId == toJournalTrans.InventTransId) { break; } } if (inventTrans.Qty < 0) qtyMax = min(tmpInventTransMark.QtyRemain, -inventTrans.OpenQty()); else { qtyMax = min(-tmpInventTransMark.QtyRemain, inventTrans.OpenQty()); qtyMax = -qtyMax; } buf2buf(tmpInventTransMark, tmpInventTransMarkNow); tmpInventTransMarkNow.qtyMarkNow = tmpInventTransMarkNow.QtyMarked ? -tmpInventTransMarkNow.QtyMarked : qtyMax; tmpInventTransMarkNow.insert(); mapMarkNow = new Map(Types::Integer, Types::Record); mapMarkNow.insert(tmpInventTransMarkNow.RecId, tmpInventTransMarkNow); InventTrans::updateTmpMark(inventTrans.InventTransId, inventDim, inventTrans.Qty, mapMarkNow.pack()); } catch { throw error(“Îøèáêà ìàðêèðîâêè ñòðîêè æóðíàëà”); } }

Well, sorry. Wasn’t able to fix the layout of code. If you want, i can e-mail it to you

OK. Here it goes again, this time, correctly [:$]

void doInventMarking(PurchLine _purchLine)
{
InventTrans inventTrans;
InventDim inventDim;
VendInvoiceTrans vendInvoiceTrans;
QueryRun queryRun;
Map mapMarkNow;
MapEnumerator mapEnumerator;
container con;
Qty qty, qtyMax;
TmpInventTransMark tmpInventTransMark;
TmpInventTransMark tmpInventTransMarkNow;
;
super(_purchLine);

queryRun = new QueryRun(this.initInventTransQuery(_purchLine.InventTransId));
queryRun.next();

inventTrans = queryRun.get(tableNum(InventTrans));
inventDim = inventTrans.inventDim();
vendInvoiceTrans = VendInvoiceTrans::findRecId(_purchLine.ZCH_InvoiceTransRefRecId);

try
{
[con, qty] = InventTrans::packTmpMark(inventTrans.ItemId, inventDim, inventTrans.InventTransId, inventTrans.Qty);
mapMarkNow = Map::create(con);
mapEnumerator = mapMarkNow.getEnumerator();
while (mapEnumerator.moveNext())
{
tmpInventTransMark = mapEnumerator.currentValue();
if (tmpInventTransMark.TransType == InventTransType::Purch &&
tmpInventTransMark.TransRefId == vendInvoiceTrans.PurchID &&
tmpInventTransMark.InventTransId == vendInvoiceTrans.InventTransId)
{
break;
}
}

if (inventTrans.Qty < 0)
qtyMax = min(tmpInventTransMark.QtyRemain, -inventTrans.OpenQty());
else
{
qtyMax = min(-tmpInventTransMark.QtyRemain, inventTrans.OpenQty());
qtyMax = -qtyMax;
}

buf2buf(tmpInventTransMark, tmpInventTransMarkNow);
tmpInventTransMarkNow.qtyMarkNow = tmpInventTransMarkNow.QtyMarked ? -tmpInventTransMarkNow.QtyMarked : qtyMax;
tmpInventTransMarkNow.insert();

mapMarkNow = new Map(Types::Integer, Types::Record);
mapMarkNow.insert(tmpInventTransMarkNow.RecId, tmpInventTransMarkNow);

InventTrans::updateTmpMark(inventTrans.InventTransId, inventDim, inventTrans.Qty, mapMarkNow.pack());
}
catch
{
throw error(“Îøèáêà ìàðêèðîâêè ñòðîêè âîçâðàòà”);
}
}

Ok I created a method pretty similar using your example (which I thank you for immensely!). It still isn’t quite working though. Basically I already know how much I’m going to mark (I happen to have it already on a separate field in the salesLine). The kicker is when it goes into the InventTrans updateTmpMark method, there isn’t already a _inventTrans. In the UI, there ALWAYS is a _inventTrans. I don’t understand WHY it’s there in the UI, as it’s a static method and it’s not being passed in. Regardless, does anything jump out at you as being incorrect? I’m hard-coding my example just to really tie down my testing.

static void testMarkIvan()
{

InventTrans imjTrans;
InventTrans salesLineTrans;
TmpInventTransMark tmpInventTransMark;
SalesLine salesLine;
Map mapMarkNow;
InventDim inventDim;
MapEnumerator mapEnumerator;
Qty qtyMax;
container con;
Qty qty;
TmpInventTransMark tmpInventTransMarkNow;
;

salesLineTrans = InventTrans::findTransId(‘ILI-49118’, false);
imjTrans = InventTrans::findTransId(‘ILI-35458’, false);
select * from salesLine where salesLine.InventTransId == salesLineTrans.InventTransId;

inventDim = salesLineTrans.inventDim();

// setup marking
[con, qty] = inventTrans::packTmpMark(salesLine.ItemId, inventDim, salesLine.InventTransId, salesLine.quantityToMark);
mapMarkNow = Map::create(con);
mapEnumerator = mapMarkNow.getEnumerator();
while (mapEnumerator.moveNext())
{
tmpInventTransMark = mapEnumerator.currentValue();
if (tmpInventTransMark.InventTransId == imjTrans.InventTransId)
{
break;
}
}

buf2buf(tmpInventTransMark, tmpInventTransMarkNow);
tmpInventTransMarkNow.qtyMarkNow = salesLine.quantityToMark;

tmpInventTransMarkNow.insert();

mapMarkNow = new Map(Types::Integer, Types::Record);
mapMarkNow.insert(tmpInventTransMarkNow.RecId, tmpInventTransMarkNow);

inventTrans::updateTmpMark(salesLineTrans.InventTransId, inventDim, -salesLineTrans.Qty, mapMarkNow.pack());

}

I see now. Basically your qtyMax logic made it positive or negative. I changed the signs around a little in testing and got it to work. I REALLY appreciate the help Ivan.