Wednesday, 20 August 2014

Calling SSRS Report from X++ code.

Run SSRS Report without a modified contract using X++ code

static void Job_RunSSRSReport(Args _args)
{

///srsreportruninterface class provides a set of APIs to run report programmatically.
SrsReportRunInterface        reportRun;

//Create an instance of the report
//Pass in the report that you want to run by using the syntax
// '<ReportName>.<DesignName>'
reportRun           =        new    SrsReportRunImpl('SampleReport.Design');

// Run the report that is passed.

reportRun.runReport();

}

Tuesday, 19 August 2014

Global Address Book Transition from AX 4.0 to AX 2012

Address transition from AX 4.0 to AX 2012

In Microsoft Dynamics AX 4.0:

Entity's data was stored in the entity table itself.
e.g: CustTable holds consumer name,contact information and address.


In Microsoft Dynamics AX 2009:

Although Global Address Book was introduced it was not fully functional.The entity tables still holds the entity data but the data is synchronized to global address book tables.


In Microsoft Dynamics AX 2012:

Now data is just stored in the global address book tables.The transition is complete and now there is no need of synchronization.
Also it is global data i.e one record per entity for one system.Unlike previous versions where it was stored one record per entity for every company.
So address data duplication has reduced to a large extent.

  

Saturday, 16 August 2014

Ways to open AOT in AX 2012

Ways to open AOT/Developer workspace in AX 2012:

  1. Press Ctrl-Shift-W.
  2. Navigate to Windows > New Development Workspace.
  3. Press CTRL + D.
  4. Add the -development switch to the ax32.exe command when starting Microsoft Dynamics AX.


Note:
Once the development workspace is open we can add multiple AOT's by pressing CTRL+D.This is helpful in using the drag n drop functionality. 


The port 'TestServiceGroup' could not be deployed.\nError: The port 'TestServiceGroup' has no service operations.

Solution:

This error comes up when we are trying to deploy a service group and create a inbound port.
And the service that is added to the service group has no operations added to it.


  • Go back to AOT > Service >'Service with error' >Operations > right-click and click Add Operation.
  • A new 'Add Service Operations' form is opened up.
  • Select the Operations to be added by marking the checkbox >Add.
  • This will add the operations to the service and the service group will now deploy without any errors.


Note: 

  • Operations once added will not be visible in the form.
  • The operation is a method of the service contract class and applies the [SysEntryPointAttribute] to it.

Tuesday, 12 August 2014

Export to excel in AX using X++

Export AX data to excel file using X++ code and with a directory select option.
Use the following code:

static void Export_to_excel(Args _args)
{
   //Excel classes
   SysExcelApplication          xlsApplication;
   SysExcelWorkBooks            xlsWorkBookCollection;
   SysExcelWorkBook             xlsWorkBook;
   SysExcelWorkSheets           xlsWorkSheetCollection;
   SysExcelWorkSheet            xlsWorkSheet;
   SysExcelRange                xlsRange;
   //tables used
   CustTable                    custTable;
   BILLDetailsTable             billdetailstable;
   CustTransHistoryTable        custtranshisttable;
   CustTransHistoryLines        custtranshistlines;
   //variables
   int                          row = 1;
   str                          fileName;
   transdate                    frmdate,todate;
   Area                          area;
   //Dialog instances
   Dialog                       dlg;
   DialogGroup                  dlgGroup;
   DialogField                  digfield,digfield1,digfield2;
   DialogField                  dialogFilename;
   ;
 
    dlg         = new Dialog("AX Export");
    dlgGroup    = dlg.addGroup("Enter details");
    digfield    = dlg.addField(TypeID(transdate),"From Date");
    digfield1   = dlg.addField(TypeID(transdate),"To Date");
    digfield2   = dlg.addField(TypeID(MIDCarea),"Area");
     //this will provide directory window where you can save the file.Don't forget to write a filename at the end of the path.
     //e.g C:\newexcel.xls
    dialogFilename = dlg.addFieldValue(typeid(Filepath),filename);

    dlg.run();
    frmdate     =digfield.value();
    todate      =digfield1.value();
    area        =digfield2.value();

    if(!frmdate||!todate||!area)//validating dialog values
    {
     throw error("Enter complete data");
    }

     //Filename
   fileName = dialogFilename.value();
   //Initialize Excel instance
   xlsApplication           = SysExcelApplication::construct();
   //Open Excel document
   //xlsApplication.visible(true);
   //Create Excel WorkBook and WorkSheet
   xlsWorkBookCollection    = xlsApplication.workbooks();
   xlsWorkBook              = xlsWorkBookCollection.add();
   xlsWorkSheetCollection   = xlsWorkBook.worksheets();
   xlsWorkSheet             = xlsWorkSheetCollection.itemFromNum(1);
   //Excel columns captions
   xlsWorkSheet.cells().item(row,1).value("CustAccount");
   xlsWorkSheet.cells().item(row,2).value("PaymentVoucher");
   xlsWorkSheet.cells().item(row,3).value("ReceiptDate");
   row++;
   //newcode


    while select  custtranshisttable
    order by custtranshisttable.CustAccount
    where custtranshisttable.Area == area
    && custtranshisttable.ReceiptDate >= frmdate
    && custtranshisttable.ReceiptDate <= todate
    {
    while select sum(amountsettled),ItemId,InvoiceId from custtranshistlines
    group by custtranshistlines.ItemId
    where custtranshistlines.PaymentReceiptID == custtranshisttable.PaymentReceiptID
    && custtranshistlines.InvoiceId == custtranshisttable.InvoiceNo//current
            {
                    xlsWorkSheet.cells().item(row,1).value(custtranshisttable.CustAccount);
                    xlsWorkSheet.cells().item(row,2).value(custtranshisttable.PaymentVoucher);
                    xlsWorkSheet.cells().item(row,3).value(custtranshisttable.ReceiptDate);
                    row++;//current row is complete now incrementing to new row.
            }
    }
   //Check for duplicate files
   if(WinApi::fileExists(fileName))
      WinApi::deleteFile(fileName);//if found delete it
   //Save Excel document
   xlsWorkbook.saveAs(fileName);
   //Open Excel document
   xlsApplication.visible(true);
   //Close Excel
   xlsApplication.quit();
   xlsApplication.finalize();
}

Sorry for bad editting :P

Thanks

Calling number sequence from X++code in AX

At times we need to call the next number from a particular number sequence using X++ code.
Following is the code to do so:

static void numberSeq_Demo(Args _args)
{
NumberSeq    numberSeq;
int                   nextNo;
;
ttsbegin;

numberSeq = numberSeq::newGetNum
(NumberSeqReference::findReference(typeid2extendedtypeid(typeid(WaterConApplicationId))));
//WaterConApplicationId is the EDT that is used to create the number sequence.
info(numberSeq.num());

numberSeq = numberSeq::newGetNum
(NumberSeqReference::findReference(typeid2extendedtypeid(typeid(CustRelNo))));

nextNo =  numberSeq.num();

//info(strfmt("%1",nextNo));

ttscommit;
}

Sunday, 10 August 2014