Dynamics User Group
Since 1995 - The Microsoft Dynamics Online User Community

InventTrans Marking in Ax 3.0 via X++

rated by 0 users
This post has 5 Replies | 2 Followers

Not Ranked
Posts 3
Points 30
Member since 09-19-2007
rjAxapta Posted: 09-19-2007 22:23

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

  • | Post Points: 20
Top 75 Contributor
Male
Posts 247
Points 2,400
Member since 03-23-2005
Moderator
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("Îøèáêà ìàðêèðîâêè ñòðîêè æóðíàëà"); } }

Kashperuk Ivan (Vanya)
My blog
Dynamics AX links
Top 75 Contributor
Male
Posts 247
Points 2,400
Member since 03-23-2005
Moderator
Well, sorry. Wasn't able to fix the layout of code. If you want, i can e-mail it to you
Kashperuk Ivan (Vanya)
My blog
Dynamics AX links
  • | Post Points: 5
Top 75 Contributor
Male
Posts 247
Points 2,400
Member since 03-23-2005
Moderator

OK. Here it goes again, this time, correctly Embarrassed 

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

Kashperuk Ivan (Vanya)
My blog
Dynamics AX links
  • | Post Points: 20
Not Ranked
Posts 3
Points 30
Member since 09-19-2007

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

}

 

  • | Post Points: 5
Not Ranked
Posts 3
Points 30
Member since 09-19-2007

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. 

  • | Post Points: 5
Page 1 of 1 (6 items) | RSS


Copyright Dynamics User Group, 1995-2009, all rights reserved. The Dynamics User Group is not affiliated with Microsoft Corporation.