Sunday, July 3, 2016

Dynamics Integration using AIF

dynamics Integration using AIF

http://ax2012aifintegration.blogspot.com/2013_10_01_archive.html

Web service to get Data in AX 2012

static void WebService(Args _args)
{
    ClrObject clientType;
    ClassLibrary1.ServiceReference1.ClearerServiceClient              serviceclient;      
    ClassLibrary1.ServiceReference1.ClsClearerDataContract[]          lstClearerDbContractArray;
    ClassLibrary1.ServiceReference1.ClsClearerDataContract            lstClearerDbContract;
    int                                                               i, numElement;   
    Str                                                               accountNo,Code,name;
    System.Exception ex;
    new InteropPermission(InteropKind::ClrInterop).assert();
    try
    {
        clientType = CLRInterop::getType("ClassLibrary1.ServiceReference1.ClearerServiceClient");
        serviceclient = AifUtil::createServiceClient(clientType);
        lstClearerDbContractArray  = serviceclient.GetAllClearers("GT");
        numElement =lstClearerDbContractArray.get_Count();
        for(i = 0; i < numElement; i++)
        {
            lstClearerDbContract   = lstClearerDbContractArray.get_Item(i);
            accountNo = lstClearerDbContract.get_CLR_ACCOUNT_NO();
            Code = lstClearerDbContract.get_CLR_CODE();
            name = lstClearerDbContract.get_CLR_NAME();
            info(strFmt("%1,%2,%3",accountNo,Code,name));
        }
    }
    catch(Exception::CLRError)
    {
        ex = CLRInterop::getLastException();
        info(ex.ToString());
    }
}

Check Developer, System Admin access in ax 2012 x++

static void CheckDevSysAdmin(Args _args)
{
    SecurityRights  rights = SecurityRights::construct();
    info(strFmt("%1",rights.isDeveloper()));
    info(strFmt("%1",rights.isSystemAdministrator()));
}

Code profilier Test X++

static void san_codeProfilerTest()
{
    int   i, j;
    ;  
    #profileBegin("test")  
   
    for(i=1;   i<=10; i++)
    {  
        j+=   i*i;
    }  
   
    info(strfmt("%1",j));  
    #profileEnd  
}

Open Debugger in x++

static void main(Args args)
{
    str filePath;
    str cmdLine;
    int pos;
    ;
    filePath = xInfo::componentName();
    pos = strfind(filePath, '\\', strlen(filePath), -strlen(filePath));
    if (pos < 0)
    {
        return;
    }
    filePath  = substr(filePath, 1, pos);
    filePath += 'axdebug.exe';
    cmdLine   = ' "-debugee=axapta"';
    if (!WinAPI::fileExists(filePath))
    {
        error("@SYS70498");
    }
    else if (!WinAPI::shellExecute(filePath, cmdLine))
    {
        error("@SYS70499");
    }
}

To join Table InventDim ExistsJoin Ax 2012 Macro

// To join Table InventDim ExistsJoin Ax 2012

#inventDimExistsjoin(InventDimId(Field),InventDim(Table Buffer),InventDim(Table Buffer),InventDimParm(set flag for Dim Parm);

#inventDimSelect(InventDim,InventDim,inventDimParm,forcePlaceholders tableId(InventDim) from,serialIdIdx(index Name))

On Hand Opening Qty for item wise and dimension Wise by date

Onhand Opening Qty
// Opening Qty for item wise and dimension Wise

enable flag in InventDimParm

Class -->InventSumFinancial
Class--> InventSettlement

static void Fcc_OnhandOpenQTyTest(Args _args)
{
    InventDim           inventDimSum;
    InventDimParm       inventDimParm;
    InventSum           inventSum;
    InventSumFinancial  inventSumFinancial;
    TransDate           Start = mkDate(1,1,2016);
    Qty                 balanceQty;
    Amount              totalBal;
    Amount              amount;
    ;
   
    inventDimParm.ItemIdFlag            = NoYes::Yes;
    inventDimParm.InventLocationIdFlag  = NoYes::Yes;
    inventDimParm.InventSiteIdFlag  = NoYes::Yes;
    while select inventSum
            where inventSum.ItemId == "CW-AR-PCB-4CX25MM"
    {
        inventDimSum = inventSum.inventDim();
        inventSumFinancial                  = InventSumFinancial::newSumReport(Start-1, inventSum, inventDimSum, inventDimParm);
        balanceQty                          = inventSumFinancial.qty(); // on hand Physical Qty
        totalBal                            = inventSumFinancial.value(); // On Hand Financial COst Amount Posted
        amount = InventSettlement::dateCostAmountAdjustment(Start -1 ,inventSum.ItemId,inventDimSum,inventDimParm); // Cost Amount Adjustment
        info(strFmt("%1,%2,  %3,%4,%5",inventSum.ItemId,balanceQty,totalBal,inventSum.costPricePcs(),amount));
    }
}
Write into the System Event Viewer from Dynamics AX

Source Link :

https://chaituax.wordpress.com/2014/04/09/write-into-the-system-event-viewer-from-dynamics-ax/


static void writeEventLogEntry(Args _args)
{
    System.Diagnostics.EventLog eventlog;
#Define.LogSource(“Dynamics AX”)
  #Define.LogName(“Application”)    ;
// check if the log already exists
 if(!System.Diagnostics.EventLog::SourceExists(#LogSource))
{
// create new log        System.Diagnostics.EventLog::CreateEventSource(#LogSource, #LogName);
}
 eventlog = new System.Diagnostics.EventLog();    eventlog.set_Source(#LogSource);
// write info entry    eventlog.WriteEntry(“<Info>: Just writing in the event viewer.”);
// write error entry    eventlog.WriteEntry(“<Error>: Please check the stack trace below. \n\n” +    con2str(xSession::xppCallStack()), System.Diagnostics.EventLogEntryType::Error);
// write warning entry    eventlog.WriteEntry(“Job finished.” , System.Diagnostics.EventLogEntryType::Warning);
}

static void WriteEventLog(Exception _exception, str _event)
 {
 str eventSource = “AX event”;
 str logType = “Application”;
 System.Diagnostics.EventLogEntryType eventLogEntryType;
 int eventCategory = 9999;
 ;
switch(_exception)
 {
 case Exception::Info:
 eventLogEntryType = System.Diagnostics.EventLogEntryType::Information;
 break;
 case Exception::Warning:
 eventLogEntryType = System.Diagnostics.EventLogEntryType::Warning;
 break;
default:
eventLogEntryType = System.Diagnostics.EventLogEntryType::Error;
 }
 if (!System.Diagnostics.EventLog::Exists(eventSource))
 {
 System.Diagnostics.EventLog::CreateEventSource(eventSource, logType);
 }
        System.Diagnostics.EventLog::WriteEntry(eventSource, _event, eventLogEntryType, eventCategory);
 }





static void EventViewer(Args _args)
{
     System.Diagnostics.EventLog eventlog;
     #Define.LogSource("Dynamics AX")
     #Define.LogName("Dynamics AX Log")
    
     ;
     // check if the log already exists
     if(!System.Diagnostics.EventLog::SourceExists(#LogSource))
     {
         // create new log
         System.Diagnostics.EventLog::CreateEventSource(#LogSource, #LogName);
     }
     eventlog = new System.Diagnostics.EventLog();
     eventlog.set_Source(#LogSource);
     // write info entry
     eventlog.WriteEntry("Just writing in the event viewer.");
     // write error entry
     eventlog.WriteEntry("Error! Please check the stack trace below. \n\n" +
         con2str(xSession::xppCallStack()), System.Diagnostics.EventLogEntryType::Error);
     // write warning entry
     eventlog.WriteEntry("Job finished." , System.Diagnostics.EventLogEntryType::Warning);
    
     info("Check the event viewer!");
}

Number Generation by EDT's reference without Parameter Number Sequence Reference

Number Sequence

Number Generation by EDT's reference without Parameter Number Sequence Reference

static void testnumseq(Args _args)
{
     theaxaptaEDT   _theaxaptaEDT   ;
     ExtendedTypeId id = TypeID2ExtendedTypeId(TypeId(theaxaptaEDT));//EDT NAME
     NumberSeq num = NumberSeq::newGetNum(NumberSequenceReference::find(id));
     ;
     //_theaxaptaEDT.NextNumseq = num.num();//NEXT NUM SEQ
     num.used(); // mark the number as used
     info(num.num()); // NEXT NUM SEQ
}
NumberSeq  num;
num = NumberSeq::newGetNumFromCode('SAO-Y');
info(num.num());

Sunday, March 6, 2016

Delete AOT Object via Code X++

// Delete AOT Object via Code X++

//Sample 1
tatic void TestJob_San(Args _args)
{
    #AOT
    TreeNode treeNode;
    TreeNode treeNodeTable; ;
    treeNode = TreeNode::findNode(#JobsPath);
    treeNodeTable = treeNode.AOTfindChild('Job1');
    treeNodeTable.AOTdelete();
}

//Sample 2
static void DeleteTables(Args _args)
{
    TreeNode tree1, tree2;
    ;
    tree1 = TreeNode::findNode("Data Dictionary\\Tables");
    if (tree1 != null)
    {
        tree2 = tree1.AOTfindChild("tablename");
        if (tree2 != null)
        {
            tree2.AOTdelete();
        }
    }
}

//Sample 3
static void Job1(Args _args)
{
    UtilIdElements utilElement;
    ;
    ttsbegin;
    select utilElement
        where utilElement.name == 'myElementName'
        && utilElement.utilLevel == utilEntryLevel::cus // any layer
        && utilElement.recordType == utilElementType::Table; // object type
    if (utilelement)
    {
        utilElement.delete();
        ttscommit;
        info('Record should be deleted now.');
    }
    else
    {
        ttsAbort;
        info('Could not delete record, or it was not found.');
    }
}

Skip Inventory reservation on Sales order lines in D365FO

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