maandag 8 juli 2013

Dimension (Field Value) Search Utility in Dynamics Ax

Source: http://paruvellas.wordpress.com/2012/03/15/dimension-field-value-search-utility-in-dynamics-ax/

In recent days, I got a specific requirement…
At our place, finance controller has decided to close one dimension value and need to replace the same with new dimension value.

To support this, we need to update all the transactions which have old dimension value, to new one.

Assume all the transactions, which are created Dimension [10] – Business unit with value 201, need to update as 203

static void ininspar_Dimension201_Update_Alltables(Args _args)
{
     TreeNode                tn,fn;
     TreeNodeIterator        tni,fni,_tni;
     Str                     objName;
     SysDictField            sysDictField;
     Common                  common;
     Query                   query = new Query();
     QueryBuildDataSource    qbs;
     QueryBuildRange         qbr;
     TableId                 mTableId;
     QueryRun                qr;
     ;

    tn = TreeNode::findNode(“\\Data Dictionary\\Tables”);
     tni = tn.AOTiterator();
     tn = tni.next();

    while (tn)
     {
         objName = tn.treeNodeName();

        tn = tni.next();

        mTableId = tableName2id(objName);
         sysDictField = new SysDictField(mTableId, fieldname2id(mTableId, “Dimension”));  // Finding table object which have Dimension field

        if (sysDictField && Global::hasTableAccess(mTableId))
         {
             //info(objname);
             try
             {
                 qbs = query.addDataSource(mTableId);
                 qbr = qbs.addRange(fieldId2Ext(fieldname2id(mTableId, “Dimension”),10));   // using Dimension[10] in query range
                 qbr.value(“201?);

                qr = new QueryRun(query);
                 while (qr.next())
                 {

                    common = qr.get(mTableId);
                     if (common.RecId)
                     {
                         common.selectForUpdate(true);
                         ttsbegin;
                         common.(fieldId2Ext(fieldname2id(mTableId, “Dimension”),10)) = “203?; //assigning the Dimension[10] value by using Common
                         common.update();
                         ttscommit;
                         info(strfmt(“%1 %2?,objName, int2str(common.RecId)));
                     }
                 }
             }
             catch(Exception::Error)
             {
                 continue;
             }

        }
     }
}
With this, we can write some Advanced Search utilities, to find specific values for some fields for the tables.

donderdag 4 juli 2013

Force delete inventtrans

Source: http://agusriyadi.blogspot.be/2009/08/force-delete-inventtrans.html

Below is sample job to force delete inventtrans, which will take care of invent on hand update.
static void DeleteInventTrans(Args _args)
{
Dialog dlg = new Dialog("Delete inventtrans ?");
DialogField dlgFld;
InventMovement inventMovement;
PurchLine purchLine;
PurchLineRefRecId recId;
;
dlgFld = dlg.addField(typeid(PurchLineRefRecId));
if(dlg.run())
{
recId = dlgFld.value();
purchLine = PurchLine::findRecId(recId);
if(purchLine)
{
InventMovement = InventMovement::construct(purchLine);
InventUpd_DeleteMovement::newMovement(
inventMovement,true).updateNow();
info("done");
}
}
}

On Hand Inventory fields explained

source: http://social.technet.microsoft.com/wiki/contents/articles/6116.dynamics-ax-on-hand-inventory.aspx
MS Dynamics AX 2009 has a very detailed information about inventory items; it gives a comprehensive information regarding stock which gives a clear vision about what in stock, what is reserved for customer or to be issued out, what is ordered from vendor or received in, and what have been posted or still in open transaction.
The below table descript the information in Items On hand form under Inventory Management->Common Forms->Item details->On hand button

Or
it could be accessed through Sales Order/ Purchase Order/Inventory Movement/Production Order under Inventory button->On Hand

#
Label
Description
Comment
1
Physical inventory
Total available quantities
 
2
Physical reserved
Quantities reserved in Sales Order
 
3
Available Physical
Available physical quantities for transactions
3 = 1 – 2
4
Ordered in total
Total quantities in open
Purchase Order
(did not received yet)
 
5
Ordered reserved
Quantities reserved from Purchase Order (did not received yet)
 
6
Available for reservation
Quantities in open Purchase Orders
(did not received yet) available for reservation
6 = 3 + (4 – 5)
7
On order in total
Quantity in open Sales Order
(did not delivered yet)
 
8
Total Available
Net available physical quantities for transaction
8 = 6 – 7
       
9
Posted quantity
Quantities posted financially
 
10
Deducted
Quantities have physical packing list
updates in Sales Order
 
11
Picked
Quantities have picking list
update in Sales Order
 
12
Received
Quantities have physical updates
in Purchase Order
 
13
Registered
Quantities have registered
in Purchase Order
 
       
14
Physical cost amount
Amount posted in ledger physically
 
15
Financial cost amount
Amount posted in leader financially
 
16
Cost price
Item average cost