Saturday, July 25, 2015

Enable filter option in Display method Ax 2012

/// To Enable filter option in Display method Ax 2012


public void context()
{
    int             selectedMenu;
    formrun         fr;
    Args            ag;
    Name            strtext;
    querybuilddataSource qb1;
    queryrun    qr;
    query       q;
    PopupMenu menu = new PopupMenu(element.hWnd());
    int a = menu.insertItem('Filter By Field');
    int b = menu.insertItem('Filter By Selection');
    int c = menu.insertItem('Remove Filter');
    ;

    selectedMenu = menu.draw();
    switch (selectedMenu)
    {
    case -1:
            break;
    case a:
            ag = new args('SysformSearch');
            fr = new formrun(ag);
            fr.run();
            fr.wait();
            strtext = fr.design().controlName('FindEdit').valueStr();
            if(strtext)
            {
                q   = TestDisplayLkp_ds.query();
                qb1 = q.dataSourceTable(tablenum(TestDisplayLkp));
                qb1 = qb1.addDataSource(TableNum(InventTable));
                qb1.addLink(FieldNum(TestDisplayLkp,ItemId1),FieldNum(InventTable,ItemId));
                qb1.addRange(FieldNum(InventTable,NameAlias)).value(strtext);
                TestDisplayLkp_ds.query(Q);
                TestDisplayLkp_ds.executeQuery();
            }
            break;

    case b:
            q   = TestDisplayLkp_ds.query();
            qb1 = q.dataSourceTable(tablenum(TestDisplayLkp));
            qb1 = qb1.addDataSource(TableNum(InventTable));
            qb1.addLink(FieldNum(TestDisplayLkp,ItemId1),FieldNum(InventTable,ItemId));
            qb1.addRange(FieldNum(InventTable,NameAlias)).value(strtext);
            TestDisplayLkp_ds.query(Q);
            TestDisplayLkp_ds.executeQuery();
            break;
    case c :
            q   = new Query();
            qb1 = q.addDataSource(tablenum(TestDisplayLkp));
            qb1.clearLinks();
            qb1.clearRanges();
            TestDisplayLkp_ds.query(Q);
            TestDisplayLkp_ds.removeFilter();
            break;

    Default:
            break;
    }

}

Monday, July 20, 2015

Retail AX

Retail Blogs:

http://axretail.blogspot.ae/

http://ax-retail.com/ 

Entity Relationship Diagram in Ax 2012 ( New Creation and Existing ER)

ER Diagram for System Default Table in Ax 2012 for all Modules

https://www.microsoft.com/dynamics/ax/erd/ax2012r2/

And We can also create new ER diagram for our Customize Table (New Functionality) also by using Below Link tutorial

https://www.visual-paradigm.com/tutorials/reverse-ddl.jsp
.bak
.sql

.sql and .bak file to Reverse ddl to make ER in SQL server 2012

Wednesday, July 15, 2015

Inventory Marking Functionality x++ Batch in Ax 2012

// Inventory Marking Functionality in X++ for All Transaction:

 Create New Batch Class , Extends RunBaseBatch

public void InventAutoMarkingRec()
{
    //InventTransOrigin InventTransOrigin,InventTransOriginL;
    InventTrans InventTrans,InventTransL;
    InventTransOriginId receiptInventTransOriginId;
    CostAmountValue CostAmountValue1,CostAmountValue2;

   while select forupdate InventTransOrigin
                    where InventTransOrigin.ReferenceId == ‘Reference Id’
            join InventTrans where InventTransOrigin.RecId == InventTrans.InventTransOrigin
                     && InventTransOrigin.ReferenceCategory == inventtranstype::InventTransaction
                            && InventTrans.StatusReceipt ==StatusReceipt::Purchased
                                //&& (InventTransOrigin.itemid == '9696'||InventTransOrigin.itemid == '9697')
    {
        //qtyToMark = InventTrans.Qty;
       // inventDim        = InventTrans.inventDim();
      while  select forupdate InventTransOriginL
                                where InventTransOriginL.ReferenceId == ‘Reference Id’

                    join InventTransL where InventTransOriginL.RecId == InventTransL.InventTransOrigin
                                && InventTransOriginL.ReferenceCategory == inventtranstype::InventTransaction
                                    && InventTransL.StatusIssue == StatusIssue::Sold
                                        && InventTransL.Qty * -1 == InventTrans.Qty
                                            // && InventTransOrigin.itemid ==InventTransOriginL.itemid
                                            //&& InventTrans.CostAmountPosted == InventTransL.CostAmountPosted *-1
                                            //&& InventTransOrigin.itemid =='1004'
            {
                CostAmountValue1=  InventTrans.CostAmountPosted;
                CostAmountValue2=  InventTransL.CostAmountPosted * -1;
                if(CostAmountValue1 == CostAmountValue2)
                {

                    this.AdremTek_San_InvMarkAuto(InventTransOriginL.InventTransId,InventTransOrigin.InventTransId,InventTrans.Qty);
                    info(strFmt("%1 -Lot Id %2 - Ref Lot %3",InventTransOrigin.ItemId,InventTransOriginL.InventTransId,InventTransOrigin.InventTransId));
                }
            }
     }
}


void Adt_San_InvMarkAuto(InventTransId _issueInventTransId,InventTransId _receiveInventTransId,InventQty _qty)
{
    InventTrans issueInventTrans;
    TmpInventTransMark tmpInventTransMask;
    Map mapMarkNow;
    container con;
    real qty;
    Map mapTmp;
    MapEnumerator mapEnumerator;

    //for Issue Lot Id
    InventTransOriginId issueInventTransOriginId =
        InventTransOrigin::findByInventTransId(_issueInventTransId).RecId;
    //For ReceiptL  Lot Id
    InventTransOriginId receiptInventTransOriginId =
        InventTransOrigin::findByInventTransId(_receiveInventTransId).RecId;
    InventQty qtyToMark = _qty; // Qty Need to Mark

    ttsBegin;

    issueInventTrans = InventTrans::findByInventTransOrigin(issueInventTransOriginId);

    [con, qty] = TmpInventTransMark::packTmpMark(InventTransOrigin::find(issueInventTransOriginId),issueInventTrans.inventDim(),issueInventTrans.Qty);

    mapTmp = Map::create(con);
    mapEnumerator = mapTmp.getEnumerator();
    while (mapEnumerator.moveNext())
    {
        tmpInventTransMask = mapEnumerator.currentValue();

        if (tmpInventTransMask.InventTransOrigin == receiptInventTransOriginId)
        {
            tmpInventTransMask.QtyMarkNow = qtyToMark;
            tmpInventTransMask.QtyRemain -= tmpInventTransMask.QtyMarkNow;
            mapMarkNow = new Map(Types::Int64, Types::Record);
            mapMarkNow.insert(tmpInventTransMask.RecId, tmpInventTransMask);

            TmpInventTransMark::updateTmpMark(
                issueInventTransOriginId,
                issueInventTrans.inventDim(),
                -qtyToMark,
                mapMarkNow.pack());

            break;
        }
    }

    ttsCommit;
}


Sunday, June 14, 2015

Cancel SO , Return order as Open Order and Picked and delivered in X++

//Cancel SO
-->Open Order in X++

private void toCancelSo()
{
    //info(strFmt("%1 -- %2 ",transDate,salesOrder));
    Query                   query;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbrSalesId,qbrDate;
    QueryRun                qr;
    InventTrans             inventTrans;
    InventMovement          inventMovement;
    InventTransWMS_Pick     inventTranspick;
    TmpInventTransWMS       TmpInventTransWMS;
    ;
    query = new query();
    qbds= query.addDataSource(tableNum(SalesTable));
    qbds.addRange(fieldNum(SalesTable,SalesType)).value("Sales Order");
    if (transDate != dateNull())
    {
        qbds.addRange(fieldNum(SalesTable,ShippingDateRequested)).value(SysQuery::range(dateNull(),transDate));
    }
    //qbds.addRange(fieldNum(SalesTable,CustAccount)).value("R0003");
    if (salesOrder != "")
    {
        qbrSalesId = qbds.addRange(fieldNum(SalesTable,SalesId));
        qbrSalesId.value(salesOrder);
    }
    qr = new QueryRun(query);
    while(qr.next())
    {
        salesTable = qr.get(tableNum(SalesTable));

        ttsBegin;
        while select forupdate salesLine
                where salesLine.SalesId == salesTable.SalesId
                    && salesLine.SalesStatus == SalesStatus::Backorder
        {
            inventTrans = InventTrans::findTransId(salesLine.InventTransId);
            if (!inventTrans)
            {
                salesLine.RemainInventPhysical = 0;
                salesLine.RemainSalesPhysical  = 0;
                salesLine.update();
            }
            else if(inventTrans.StatusIssue == StatusIssue::OnOrder
                    || inventTrans.StatusIssue == StatusIssue::ReservOrdered
                    || inventTrans.StatusIssue == StatusIssue::ReservPhysical
                    || inventTrans.StatusIssue == StatusIssue::None)
            {
                    salesLine.RemainInventPhysical = 0;
                    salesLine.RemainSalesPhysical  = 0;
                    salesLine.update();
            }

        }
        ttsCommit;
    }
}

/*

Identifying the Status of a Line

if(salesLine.remainSalesFinancial != 0)
{
    // I am delivered
}

or

if(invnetTrans.statusIssue == StatusIssue::Deducted)
{
    // I am delivered
}

if(inventTrans.statusIssue == StatusIssue::Picked)
{
    // I am Picked
}

cancel Status as deleivered

ttsbegin;
salesLine = SalesLine::find(_salesID, _lineNum, true);
 
salesLine.SalesDeliverNow   = -1;
salesLine.setInventDeliverNow();
salesLine.doUpdate();
salesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);
salesFormLetter.progressHide();                                
 
salesFormLetter.update(salesTable,                           
                       SystemDateGet(),                      
                       SalesUpdate::DeliverNow,              
                       AccountOrder::None,                 
                       false,                             
                       false);                            
ttsCommit;


cancel Status as Picked 

ttsBegin;
salesLine       = salesLine::find(_salesID, _lineNum, true);
inventMovement  = InventMovement::construct(salesLine);
inventTranspick = new InventTransWMS_Pick(inventMovement,tmpInventTransWMS);
 
TmpInventTransWMS.clear();
TmpInventTransWMS.initFromInventTrans(inventTrans::findTransId(salesLine.InventTransId));
TmpInventTransWMS.LineNum     = _LineNum;
TmpInventTransWMS.InventDimId = InventTrans::findTransId(salesLine.InventTransId).InventDimId;
TmpInventTransWMS.InventQty   = ( ABS( InventTrans::findTransId(salesLine.InventTransId).Qty ) * -1 );
TmpInventTransWMS.insert();
 
if( TmpInventTransWMS.InventQty != 0 )
{
    if( inventTranspick.validateTmp(TmpInventTransWMS) )
    {
        InventTransWMS_Pick::updateInvent(inventTranspick,TmpInventTransWMS);
    }
}
 
//cancel order
salesLine.RemainSalesPhysical = 0;
salesLine.remainInventPhysical = 0;
salesLine.update();
ttsCommit;

Cancel a Return Order in AX


    SalesLine       returnLine;
    SalesTable      returnTableUpdate;
    Counter         numberOfRecords;
    SalesTable      salesTable;
    PurchTable      purchTable;
    PurchLine       purchLine;
    ;
 
    ttsbegin;
 
        if (_returnTable.ReturnStatus == ReturnStatusHeader::Created && !_returnTable.existRegisteredReceivedInvoicedLines() && !_returnTable.type().interCompanyIsDerivedOrder())
        {
            while select forupdate returnLine
                  where returnLine.SalesId == _returnTable.SalesId
                  &&    returnLine.InventTransId
            {
                if (returnLine.interCompanySalesLineExist())
                {
                    purchLine            = PurchLine::findInventTransId(returnLine.InventRefTransId,true);
                    purchTable           = PurchTable::find(purchLine.PurchId);
 
                    purchLine.SkipUpdate = InterCompanySkipUpdate::Internal;
                    purchLine.delete(false);
 
                    if (!purchTable.existPurchLine())
                    {
                        if (purchTable.InterCompanyCompanyId
                        &&  purchTable.InterCompanySalesId)
                        {
                            changecompany(purchTable.InterCompanyCompanyId)
                            {
                                salesTable = null;
                                salesTable = SalesTable::find(purchTable.InterCompanySalesId,true);
                                if (salesTable)
                                    salesTable.delete();
                            }
                        }
                    }
                }
 
                returnLine.SalesQty     = 0;
                returnLine.salesQtyModified();
                returnLine.DeliveryType = TradeLineDlvType::None;
                returnLine.SkipUpdate   = InterCompanySkipUpdate::Internal;
                returnLine.update();
            }
 
            returnLine.skipDataMethods(true);
            update_recordset returnLine
            setting     ReturnStatus         = ReturnStatusLine::Canceled,
                        CostPrice            = 0,
                        InventTransIdReturn  = '',
                        SalesStatus          = SalesStatus::Canceled,
                        ReturnClosedDate     = systemdateget()
            where returnLine.SalesId == _returnTable.SalesId;
 
            returnTableUpdate = SalesTable::find(_returnTable.SalesId, true);
            returnTableUpdate.ReturnStatus               = ReturnStatusHeader::Canceled;
            returnTableUpdate.SalesStatus                = SalesStatus::Canceled;
            returnTableUpdate.InterCompanyDirectDelivery = false;
            returnTableUpdate.update();
        }
 
    ttscommit;

*/

Cancel Purchase Order in x++

// Cancel Purchase Order
--> Open order Purchase order line
-->Partial Product Receipt  line also through x++

private void toCancelPo()
{
    //info(strFmt("%1 -- %2 ",transDate,purchaseOrder));
    Query                   query;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbrPurchId,qbrDate;
    QueryRun                qr;
    List _list = New List(Types::String);
    ListIterator    lt;
    str 100 PurchNumber;
    ;

    query = new query();
    qbds= query.addDataSource(tableNum(PurchTable));
    qbds.addRange(fieldNum(PurchTable,PurchaseType)).value("Purch");
    qbds.addRange(fieldNum(PurchTable,PurchStatus)).value("Backorder");
    if (transDate != dateNull())
    {
        qbds.addRange(fieldNum(PurchTable,CreatedDateTime)).value(SysQuery::range(fromdate,transDate));
    }
    //info(strFmt("%1 -- %2 -- %3",fromdate,transDate,purchaseOrder));
    //qbds.addRange(fieldNum(PurchTable,OrderAccount)).value("R0003");
    if (purchaseOrder != "")
    {
        _list = Global::strSplit(purchaseOrder,";");
        lt = new ListIterator(_list);
        while(lt.more())
        {
            purchNum += lt.value();
            lt.next();
        }
        for(i = 0; i<= conLen(purchNum);i++)
        {
            PurchNumber = conPeek(purchNum,i);
            qbds.addRange(fieldNum(PurchTable,PurchId)).value(PurchNumber);
        }
    }
    qr = new QueryRun(query);
    while(qr.next())
    {
        purchTable = qr.get(tableNum(PurchTable));
        ttsBegin;
        while select forupdate purchLine
                where purchLine.PurchId == purchTable.PurchId
                    && purchLine.PurchStatus == PurchStatus::Backorder
            join inventTrans
                    join inventTransOrigin
                where inventTransOrigin.RecId         ==  inventTrans.InventTransOrigin
                    && inventTransOrigin.InventTransId == purchLine.InventTransId
        {
                //while select
                //{
                    if(inventTrans.StatusReceipt == StatusReceipt::Ordered)
                    {
                        //purchLine.selectForUpdate(true);
                        purchLine.RemainInventPhysical = 0.00;
                        purchLine.RemainPurchPhysical  = 0.00;
                        purchLine.reread();
                        purchLine.update();
                        InventMovement::bufferSetRemainQty(purchLine);
                    }
               // }
            }
        ttsCommit;
    }
}

Receive and ship a transfer order through X++

// Receive and ship a transfer order through X++

private void toCancelTo()
{
    //info(strFmt("%1 -- %2 ",transDate,Transferid));
    Query                   query;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbrtransId,qbrDate;
    QueryRun                qr;
    ;
    query = new query();
    qbds= query.addDataSource(tableNum(InventTransferTable));
    if(transDate != dateNull())
    {
        qbds.addRange(fieldNum(InventTransferTable,CreatedDateTime)).value(SysQuery::range(dateNull(),transDate));
    }
    //qbds.addRange(fieldNum(SalesTable,CustAccount)).value("R0003");
    if (Transferid != "")
    {
        qbrtransId = qbds.addRange(fieldNum(InventTransferTable,Transferid));
        qbrtransId.value(Transferid);
    }
    qr = new QueryRun(query);
    while(qr.next())
    {
        transferTable = qr.get(tableNum(InventTransferTable));

        ttsBegin;
        while select forupdate transferLine
                where transferLine.Transferid == transferTable.Transferid
        {
            //FUAE-000770
            if (transferLine.QtyRemainShip >= 0.00)
            {
                transferLine.QtyRemainShip = 0.00; //Status shipped
                transferLine.QtyRemainReceive = 0.00; // Status Receive
             
                transferLine.update();
                InventMovement::bufferSetRemainQty(transferLine);
            }

        }
        ttsCommit;
    }
}

Skip Inventory reservation on Sales order lines in D365FO

[ExtensionOf(classStr(InventUpd_Reservation))] final class InventUpd_ReservationCls_SAN_Extension {     void updateNow()     {         if(mo...