Thursday, 20 February 2014

Import data from Excel file into EcoResProduct abstract table in ax 2012.

you can't insert any records directly to any abstract class, in the same way as you can't directly instantiate any abstract class. What you can do is to insert data to a concrete child of the abstract table (again, you can see the similarity with classes).
EcoResProduct has three children:
EcoResDistinctProduct, EcoResDistinctProductVariant and EcoResProductMaster.

Write Below Job For this:-
static void RecordsImports(Args _args)
{
    SysExcelApplication                      xlsApplication;
    SysExcelWorkBooks                    xlsWorkBookCollection;
    SysExcelWorkBook                     xlsWorkBook;
    SysExcelWorksheets                    xlsWorkSheetCollection;
    SysExcelWorksheet                     xlsWorkSheet;
    SysExcelRange                            xlsRange;
    SysExcelCells                              Cells;
    SysExcelCell                               RCell;
    CommaIO                                   inFile;
    int                                                nRow,i;
    DialogField                                 dialogPath;
    Dialog                                        dialog;
    Filename                                    filename;
    PdsCWProduct                         pdsCWProduct;
    EcoResProductDisplayProductNumber    ecoResProductDisplayProductNumber;
    EcoResProductSearchName                    ecoResProductSearchName;
    EcoResProductType                                ecoResProductType;
    EcoResDistinctProduct                             ecoResDistinctProduct;
    EcoResDistinctProductVariant                  ecoResDistinctProductVariant;
    EcoResProductMaster                              ecoResProductMaster;
    ;
    dialog = new Dialog("Import");
    dialogPath = dialog.addField(extendedTypeStr(Filenameopen), "File Name");
    dialog.run();
    if (dialog.run())
    {
        filename = (dialogPath.value());
    }
    inFile = new CommaIO (filename, 'R');
    if (!inFile || infile.status() != IO_Status::Ok )
    {
        throw error (strfmt("@SYS19312",filename));
    }
    try
    {
        xlsApplication          = SysExcelApplication::construct();
        xlsWorkBookCollection   = xlsApplication.workbooks();
        xlsWorkBookCollection.open(filename);
        xlsWorkSheetCollection  = xlsApplication.worksheets();
        xlsWorkSheet            = xlsWorkSheetCollection.itemFromNum(1);
        Cells                   = xlsWorkSheet.Cells();
        nRow = 2;
        RCell = Cells.Item(nRow, 1);
        while (RCell.value().bStr() != "")
        {
            ecoResProductDisplayProductNumber = RCell.value().bStr();
            RCell  = Cells.item(nRow,2);
            pdsCWProduct = any2enum( RCell.value().bStr());
            RCell  = Cells.item(nRow,3);
            ecoResProductType =str2enum(ecoresproducttype, RCell.value().bStr());
            RCell  = Cells.item(nRow,4);
            ecoResProductSearchName   = RCell.value().bStr();
                    ecoResDistinctProduct.DisplayProductNumber    = ecoResProductDisplayProductNumber;
                    ecoResDistinctProduct.PdsCWProduct    = pdsCWProduct;
                    ecoResDistinctProduct.ProductType  = ecoResProductType;
                    ecoResDistinctProduct.SearchName = ecoResProductSearchName;

                    ecoResDistinctProductVariant.DisplayProductNumber    =             ecoResProductDisplayProductNumber;
                    ecoResDistinctProductVariant.PdsCWProduct    = pdsCWProduct;
                    ecoResDistinctProductVariant.ProductType  = ecoResProductType;
                    ecoResDistinctProductVariant.SearchName = ecoResProductSearchName;


                    ecoResProductMaster.DisplayProductNumber    = ecoResProductDisplayProductNumber;
                    ecoResProductMaster.PdsCWProduct    = pdsCWProduct;
                    ecoResProductMaster.ProductType  = ecoResProductType;
                    ecoResProductMaster.SearchName = ecoResProductSearchName;
            ecoResProductMaster.insert();
            nRow++;
            RCell = Cells.Item(nRow, 1);
        }
        xlsApplication.quit ();
        xlsApplication.finalize ();
        info("Import completed");
    }
    catch( Exception::Error)
    {
        //Close Excel.
        xlsApplication.quit ();
        xlsApplication.finalize ();
        ttsabort;
        info("Unable to process the excel import ");
    }
}

Add Fields to a table using X++ code

static void createFieldFromCode(Args _args)
{
    #AOT
    TreeNode tableNode;
    AotTableFieldList myAOTTablefieldList;
    SysDictTable sysDictTable = new SysDictTable(tablenum(Table_Test));
    ;
    myAOTTablefieldList = new AotTableFieldList();
    tableNode = TreeNode::findNode(#TablesPath+'\\'+sysDictTable.name());
    myAOTTablefieldList = TreeNode::findNode(#TablesPath+'\\'+sysDictTable.name() + "\\Fields");
    if(!myAOTTablefieldList.AOTfindChild("newField")) // check if the field alredy exists
    {
    myAOTTablefieldList.addString("newField");
    }
    tableNode.AOTsave();
}

How to Create a New Table by using X++ code

static void newTableCreate(Args _args)
{
TreeNode      treeNode;
#AOT
;
treeNode = TreeNode::findNode(#TablesPath);
treeNode.AOTadd("Table_Test");
SqlDataDictionary::synchronize();
}

Tuesday, 11 February 2014

SSRS Report Code in AX 2012

Define Data Contract Class:-
[DataContractAttribute]
public class SrsRDPContractSample
{
    AccountNum accountNum;
    Name       name;
    Phone      phone;
}
[DataMemberAttribute("AccountNum")]
public AccountNum parmAccountNum(AccountNum _accountNum = accountNum)
{
    accountNum = _accountNum;
    return accountNum;
}
[DataMemberAttribute("Name")]
public Name Name (Name _name = name)
{
    name = _name ;
    return name;
}
[DataMemberAttribute("InclTax")]
public Phone phone(Phone_phone = phone)
{
    phone= _phone;
    return phone;
}
Now Define Report Data Provider Class:-
[
    SRSReportQueryAttribute('Cust'),
    SRSReportParameterAttribute(classstr(SrsRDPContractSample))
]
public class SrsRdpSampleClass extends SRSReportDataProviderBase
{
    TmpCustTableSample tmpCust;
}
[SRSReportDataSetAttribute('TmpCust')]
public TmpCustTableSample getTmpCustTable()
{
    select * from tmpCust;
    return tmpCust;
}

public void processReport()
{
    AccountNum              accntNum;
    CustAccountStatement    custAcctStmt;
    boolean                 boolInclTax;
    Query                   query;
    QueryRun                qr;
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    CustTable               queryCustTable;

    SrsRdpContractSample    dataContract;

    // Get the query from the runtime using a dynamic query.
    query = this.parmQuery();
        
    // Get the parameters passed from runtime.
    dataContract = this.parmDataContract();
    accntNum = dataContract.parmAccountNum();
    Name= dataContract.parmName();
    Phone= dataContract.parmPhone();
        
    // Add parameters to the query.
    queryBuildDataSource = query.dataSourceTable(tablenum(CustTable));
        
    if(accntNum)
    {
        queryBuildRange = queryBuildDataSource.findRange(fieldnum(CustTable, AccountNum));
        if (!queryBuildRange)
        {
            queryBuildRange = queryBuildDataSource.addRange(fieldnum(CustTable, AccountNum));
        }
        // If an account number has not been set, then use the parameter value to set it.
        if(!queryBuildRange.value())
            queryBuildRange.value(accntNum);
    }        
        
    if(name)
    {
        queryBuildRange = queryBuildDataSource.findRange(fieldnum(CustTable, Name));
        if (!queryBuildRange)
        {
            queryBuildRange = queryBuildDataSource.addRange(fieldnum(CustTable, Name));
        }
        // If an account statement has not been set, then use the parameter value to set it.
        if(!queryBuildRange.value())
            queryBuildRange.value(int2str(name));
    }
        
    if(phone)
    {
        queryBuildRange = queryBuildDataSource.findRange(fieldnum(CustTable, phone));
        if (!queryBuildRange)
        {
            queryBuildRange = queryBuildDataSource.addRange(fieldnum(CustTable, phone));
        }
        // If flag to include tax has not been set, then use the parameter value to set it.
        if(!queryBuildRange.value())
            queryBuildRange.value(phone);
    }        
        
    // Run the query with modified ranges.
    qr = new QueryRun(query);
    ttsbegin;
    while(qr.next())
    {
        tmpCust.clear();
        queryCustTable = qr.get(tablenum(CustTable));
        tmpCust.AccountNum = queryCustTable.AccountNum;
        tmpCust.Name = queryCustTable.name();
        tmpCust.Phone= queryCustTable.phone();
        tmpCust.insert();
    }
    ttscommit;
} 

Job for SSRS Report Debug in ax 2012

static void debugreport(Args _args)
    {
        DebugReportDP   DebugReportDP;
        DebugReportContract DebugReportContract;
        Query               q;
        DebugReportTmp      DebugReportTmp;
        ;
        DebugReportDP = new DebugReportDP();
        DebugReportContract = new DebugReportContract();
        q = new Query(querystr(DebugReportQuery));
        DebugReportDP.parmQuery(q);
        DebugReportDP.parmDataContract(DebugReportContract);
        DebugReportDP.processReport();
        DebugReportTmp = DebugReportDP.getDebugReportTmp();
    }

Monday, 10 February 2014

Change the language of Form based on the language selected by user.

Override the CanClose Method of the Form:-

public boolean canClose()
{
    boolean ret;
    ret = super();
    infolog.language("en-us");
    return ret;
}

Then Override the Clicked Method of the Form Control and  then write the below code-

void clicked()
{
    infolog.language("en-us");
     super();
}

Sunday, 9 February 2014

Export Records To Excel Through Code In Ax 2012

static void ExportImportData(Args _args)
{
   SysExcelApplication      xlsApplication;
   SysExcelWorkBooks    xlsWorkBookCollection;
   SysExcelWorkBook     xlsWorkBook;
   SysExcelWorkSheets   xlsWorkSheetCollection;
   SysExcelWorkSheet    xlsWorkSheet;
   SysExcelRange           xlsRange;
   Tablename                  exportImportRecords;
   int                               row = 1;
   str                               fileName;
   ;
   //Filename
   fileName = "C:\\Libraries\Documents\exportImportRecords.xlsx";
   //Initialize Excel instance
   xlsApplication           = SysExcelApplication::construct();
   //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("Account Num");
   xlsWorkSheet.cells().item(row,2).value("Name");
   xlsWorkSheet.cells().item(row,3).value("Phone");
   row++;
   //Fill Excel with exportImportRecords AccountNum and Name fields (only 10 records)
   while select exportImportRecords
   {
      if(row == 10)
        break;
      xlsWorkSheet.cells().item(row,1).value(exportImportRecords.ID);
      xlsWorkSheet.cells().item(row,2).value(exportImportRecords.Name);
       xlsWorkSheet.cells().item(row,3).value(exportImportRecords.Phone);
      row++;
   }
   //Check whether the document already exists
   if(WinApi::fileExists(fileName))
      WinApi::deleteFile(fileName);
   //Open Excel document
   xlsApplication.visible(true);
   info("Export Completed");
}