Bojensen Blogs

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).

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(“Îøèáêà ìàðêèðîâêè ñòðîêè âîçâðàòà”);
    }
}

Or this example:

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());

}

 

InventTrans Marking in Ax 3.0 via X++ – M
icrosoft Dynamics AX / Axapta – Developer Forum – Dynamics User Group

Comments are closed.