Thursday 29 December 2016

Code to cancel Sales order using SalesUpdateRemain class X++ AX 2012 R3

Note: In the below code, I am calling it from .Net using WCF parameter.

[SysEntryPointAttribute(true),
AifCollectionTypeAttribute('return', Types::String)]
public SalesId salesLineCancel(AMSSalesOrderContract _SOContract)
{
    boolean     ret;
    SalesId     lSalesID;
    SalesLine   lSalesLine;
    InventTrans     lInventTrans;
    str             errorStr;

    errorStr = this.validateInterfaceData(_SOContract);
    if ( errorStr!= "")
    {
        return errorStr;
    }
    try
    {
         /////////////////// CHANGE COMPANY/////////////////////
        changeCompany(_SOContract.company())
        {
            //Validate data
            errorStr = this.validateData(_SOContract);
            if (errorStr != "")
            {
                return errorStr;
            }

            ttsBegin;

            //Add your own logic to select and pass a specific sales line.
            lSalesLine.clear();
            if (literator != null)
            {
                lSalesLineContract = literator.value();
                /*select firstOnly forUpdate lSalesLine
                        where lSalesLine.PurchorderFormNum == lSalesLineContract.purchorderFormNum();*/
                select firstOnly forUpdate lSalesLine
                        where lSalesLine.SalesId == lSalesLineContract.salesId();
            }
            if(lSalesLine)
            {
                //lInventTrans    = InventTrans::findTransId(lSalesLine.InventTransId);
                if ( lSalesLine.SalesStatus != SalesStatus::Backorder)
                {
                   lSalesID = strFmt("@SYS4004577",lSalesLine.SalesId, lSalesLine.SalesStatus );
                    // ret         = SalesUpdateRemain::updateDeliveryRemainder(lSalesLine, 0, 0);
                }
                //Open order
                else
                {
                    //pass three parameters
                    //1.SalesLine buffer
                    //2.remainSalesPhysical, pass it as zero as you want to cancel full line
                    //3.remainInventPhysical, pass it as zero as you want to cancel full line
                    ret         = SalesUpdateRemain::updateDeliveryRemainder(lSalesLine, 0, 0);

                    if(ret)
                    {
                        lSalesID = strFmt("Sales Line # %1: of Sales id # %2 is Canceled",lSalesLine.LineNum, lSalesLine.SalesId);
                    }
                }

            }
            else
            {
                lSalesID = strFmt("Sales line not found/Invalid Line");
            }
            ttsCommit;
        }

    }
    catch
    {
        error("Sales line got exception while attempting to be cancelled.");
    }
    return lSalesID;
}

Create Sales order using X++ in AX2012 R3

Note: in the below code I am sending the parameter from .Net using WCF service 

private SalesId createAXSO(AMSSalesOrderContract _SOContract)
{

   SalesTable salesTable;
SalesLine salesLine;

AxSalesTable axsalesTable;
AxSalesLine axSalesLine;
SalesFormLetter salesFormLetter;

;
    //Create Sales order
    custTable = CustTable::find( _SOContract.custAccount());
    salesTable.initFromCustTable();

    axsalesTable = AxSalesTable::newSalesTable(salesTable);
    axsalesTable.parmCustAccount( _SOContract.custAccount());
    axsalesTable.parmSalesType(SalesType::Sales);

    axsalesTable.parmDocumentStatus(DocumentStatus::Confirmation);

    axsalesTable.parmDeliveryDate(systemDateGet()+ 30);
    axsalesTable.parmSalesStatus(SalesStatus::Backorder);

    axsalesTable.doSave();
    while (literator.more())
    {
            lSalesLineContract = literator.value();
            salesLine.initFromSalesTable(salesTable);

            axSalesLine = AxSalesLine::newSalesLine(salesLine);
            axSalesLine.parmItemId(lSalesLineContract.itemId());
             //////Mandatory Values
            inventDim.InventSiteId = "AUS";
            inventDim.InventLocationId = "EPH";
            inventDim = InventDim::findOrCreate(inventDim);

            axSalesLine.parmInventDimId(inventDim.inventDimId);
            axSalesLine.parmCurrencyCode("AUD");
            axSalesLine.parmSalesQty(4);
            axSalesLine.parmSalesPrice(20.00);
            axSalesLine.doSave();
        literator.next();
    }

    //SO confirmation
    salesTable = axSalesTable.salesTable(salesTable);
    salesFormLetter = SalesFormLetter::construct(DocumentStatus::Confirmation);
    salesFormLetter.update(salesTable);
// SO invoicing
salesFormLetter = salesFormLetter::construct(DocumentStatus::Invoice);
salesFormLetter.update(salesTable);

    return salesTable.SalesId;
}

Wednesday 28 December 2016

Cancel a specific Sales Line, using code (X++) AX2012

In AX2012, Using x++  a specific sales line can be cancelled, as by using the class "SalesUpdateRemain", in  below job we will see how to cancel a sales line using the class "SalesUpdateRemain" . 

static void mkCancelSalesLine(Args _args)
{
    boolean     ret;
    SalesLine   SalesLine;

   
    try
    {
        ttsBegin;       
       
        //Add your own logic to select and pass a specific sales line.
        SalesLine.clear();
        SalesLine   = SalesLine::findRecId(2137226141, true);   
        if(SalesLine)
        {
            //pass three parameters 
            //1.SalesLine buffer
            //2.remainSalesPhysical, pass it as zero as you want to cancel full line
            //3.remainInventPhysical, pass it as zero as you want to cancel full line
            ret         = SalesUpdateRemain::updateDeliveryRemainder(SalesLine, 0, 0);
   
            if(ret)
            {
                info(strFmt('Sales Line # %1: Canceled',SalesLine.LineNum));   
            }       
        }
        else
        {
            info('Sales line not found/Invalid Line');
        }
        ttsCommit;
    }
    catch
    {
        error("Sales line got exception while attempting to be cancelled.");
    }
}

Thursday 22 December 2016

Walk through major features of Microsoft Dynamics AX 2012 Trace Parser (Part 1)

https://blogs.msdn.microsoft.com/axperf/2011/08/15/walk-through-major-features-of-microsoft-dynamics-ax-2012-trace-parser-part-1/


Cancel the sales order Dynamics AX X++

Cancel the Sales order 


Case1: Check the Line status is delivered or picked


private boolean identifyLineStatus(InventTrans  _inventTrans)
{
    boolean     ret;
    // identified as delivered by 
    if(_inventTrans.statusIssue == StatusIssue::Deducted)
    {
        //delivered
        ret =  false;
    }
    //identified as picked by checking the status on the InventTrans table
    if(_inventTrans.statusIssue == StatusIssue::Picked)
    {
        // picked
        ret = false;
    }
    
    return  ret;
}

Delete sales line with Line status as delivered

private void deleteDelivered(SalesID _salesID,lineNum _lineNum)
{
 
ttsbegin;
//update Sales Line
salesLine = SalesLine::find(_salesID, _lineNum, true);
 
salesLine.SalesDeliverNow   = -1;
salesLine.setInventDeliverNow();
salesLine.doUpdate();
 
//Post the delivery note
salesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);
salesFormLetter.progressHide();                                // Hide the progress bar.
 
salesFormLetter.update(salesTable,                             // SalesTable
                       SystemDateGet(),                        // Delivery date
                       SalesUpdate::DeliverNow,                // Quantity to update (SpecQty)
                       AccountOrder::None,                     // AccountOrder
                       false,                                  // Proforma only?
                       false);                                 // Printout?
ttsCommit;

}

Delete sales line with Line status as picked

private void deleteDelivered(SalesID _salesID,lineNum _lineNum)
{
 
ttsBegin;
// Initialise classes
salesLine       = salesLine::find(_salesID, _lineNum, true);
inventMovement  = InventMovement::construct(salesLine);
inventTranspick = new InventTransWMS_Pick(inventMovement,tmpInventTransWMS);
 
// Create transaction record
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) )
    {
        // Post the pick update
        InventTransWMS_Pick::updateInvent(inventTranspick,TmpInventTransWMS);
    }
}
 
//cancel order
salesLine.RemainSalesPhysical = 0;
salesLine.remainInventPhysical = 0;
salesLine.update();
ttsCommit;
}

Case2: Open sales order

//cancel order
ttsBegin;
salesLine.RemainSalesPhysical = 0;
salesLine.remainInventPhysical = 0;
salesLine.update();
ttsCommit;




for more information click on here.

Saturday 10 December 2016

Code to create General Journal X++ (Dynamics AX 2012)

Code to create General Journal X++ (Dynamics AX 2012)

This post is mainly to guide you on how to use ledger dimension in AX 2012.


static void legerDimCreateGLJournal(Args _args)
{
    AxLedgerJournalTable journalTable;
    AxLedgerJournalTrans journalTrans;
    container            accCon;
    container            offSetCon;
    ;

    journalTable = new AxLedgerJournalTable();
    journalTrans = new AxLedgerJournalTrans();

    //Journal Name
    journalTable.parmJournalName("GenJrn");
    journalTable.save();

    journalTrans.parmJournalNum(journalTable.ledgerJournalTable().JournalNum);
    journalTrans.parmTransDate(systemDateGet());
    journalTrans.parmAccountType(LedgerJournalACType::Ledger);

    //LedgerDimension  => Ledgeraccount, DAX 2009
    accCon = ["500200", "500200", 0]; 
    journalTrans.parmLedgerDimension(AxdDimensionUtil::getLedgerAccountId(accCon));

    journalTrans.parmAmountCurDebit(2000);

    //OffsetLedgerDimension => OffsetLedgerAccount,  DAX 2009
    offSetCon = ["500300", "500300", 0];
    journalTrans.parmOffsetAccountType(LedgerJournalACType:: Ledger );
    journalTrans.parmOffsetLedgerDimension(AxdDimensionUtil::getLedgerAccountId( offSetCon));
  
    journalTrans.save();

    info(strFmt("Journal %1 created", journalTable.ledgerJournalTable().JournalNum));
}

How to post with Financial dimensions:

Format : 
["DisplayValue", "MainAccount", NumberOfDimensions, "DimensionName", "DimensionValue"]; 

E.g:
accCon = ["500200-Invent", "500200", 1, "Department", "Admin_1"]
AxdDimensionUtil::getLedgerAccountId(accCon)



Update NuGet package to new MS D365FO version

1. Import the NuGet package files from LCS for that particular version please take the PU version files only. a. Goto LCS-->Asset Libra...