Alfasith AX

Alfasith AX
اللَّهُمَّ انْفَعْنِي بِمَا عَلَّمْتَنِي، وَعَلِّمْنِي مَا يَنْفَعُنِي، وَزِدْنِي عِلْمًا

Wednesday, July 24, 2013

Creating the Query in job - Dynamic AX

static void CustTableSales1(Args _args)

{
    Query       query;
    QueryRun    queryrun;
    QueryBuildDataSource    qbds1,qbds2;
    QueryBuildRange         qbr1,qbr2;
    CustTable               custTable;
    ;
    query   = new query();
    qbds1   =   query.addDataSource(tablenum(CustTable));
    qbds1.addSortField(fieldnum(custTable,AccountNum),Sortorder::Descending);
    qbr1    = qbds1.addRange(fieldnum(custTable,custGroup));
    qbr1.value(queryvalue('10'));
    qbr2    =  qbds1.addRange(fieldnum(custTable,Blocked));
    qbr2.value(queryvalue(CustVendorBlocked::No));
    qbds2   = qbds1.addDataSource(tablenum(SalesTable));
    qbds2.relations(false);
    qbds2.joinMode(joinmode::ExistsJoin);
    qbds2.addLink(fieldnum(CustTable,AccountNum),fieldnum(SalesTable,CustAccount));
    queryrun    = new queryrun(query);
    while(queryrun.next())
    {
        custTable   = queryrun.get(tablenum(custTable));
        info(strfmt('%1 – %2',custtable.AccountNum,custTable.name()));
    }
}





//Another sample code///

Query                   query; 
QueryRun                queryRun; 
QueryBuildDataSource    queryBuildDataSource; 
QueryBuildRange         queryBuildRange; 
CustTable               custTable; 
query = new Query(); 
queryBuildDataSource = query.addDataSource(TableNum(CustTable)); 
queryBuildRange = queryBuildDataSource.addRange(FieldNum(CustTable,AccountNum)); 
queryBuildRange.value("4000..5000"); 
queryRun = new queryRun(query); 
if (queryRun.prompt()) 
{ 
    while (queryRun.next()) 
    { 
        custTable = queryRun.get(TableNum(CustTable)); 
        print custTable.AccountNum; 
    } 
}

How to add multiple parameter in to SSRS report as Query range in Dynamic AX

Hi,
Adding the fields in the Contract directly reflect on the parameter fields in the report dialog.
Adding the QueryBuildRange and its datasource makes the querying of the ranges value.

CategoryContractClass:
[
    DataContractAttribute,
    SysOperationGroupAttribute('Case', "Case",'1'),
    SysOperationGroupAttribute('Date', "Date",'2'),
    SysOperationGroupAttribute('PrintOut', "@SYS12608", '3')

]
public class CategoryContract implements SysOperationValidatable
{

    FromDate   FromDate;
    ToDate     ToDate;
    CaseCategoryType CaseCategoryType;
    CaseCategory CaseCategory;
}
/******************************************************************/
[
    DataMemberAttribute('CaseCategory'),
    SysOperationLabelAttribute(literalstr("Case Category")),
    SysOperationHelpTextAttribute(literalstr("Case Category")),
    SysOperationGroupMemberAttribute('Case'),
    SysOperationDisplayOrderAttribute('2')

]
public CaseCategory parmCaseCategory(CaseCategory _CaseCategory = CaseCategory)
{

    CaseCategory = _CaseCategory;
    return CaseCategory;

}
/******************************************************************/
[
    DataMemberAttribute('CaseCategoryType'),
    SysOperationLabelAttribute(literalstr("Category Type")),
    SysOperationHelpTextAttribute(literalstr("Category Type")),
    SysOperationGroupMemberAttribute('Case'),
    SysOperationDisplayOrderAttribute('1')

]
public CaseCategoryType parmCaseCategoryType(CaseCategoryType _CaseCategoryType = CaseCategoryType)
{

    CaseCategoryType = _CaseCategoryType;
    return CaseCategoryType;

}

/******************************************************************/
[
    DataMemberAttribute('FromDate'),
    SysOperationLabelAttribute(literalstr("From Date ")),
    SysOperationHelpTextAttribute(literalstr("From Date")),
    SysOperationGroupMemberAttribute('Date'),
    SysOperationDisplayOrderAttribute('1')

]
public FromDate parmFromDate(FromDate _FromDate = FromDate)
{

    FromDate = _FromDate;
    return FromDate;

}

/******************************************************************/
[
    DataMemberAttribute('ToDate'),
    SysOperationLabelAttribute(literalstr("To Date")),
    SysOperationHelpTextAttribute(literalstr("ToDate")),
    SysOperationGroupMemberAttribute('Date'),
    SysOperationDisplayOrderAttribute('2')

]
public ToDate parmToDate(ToDate _ToDate = ToDate)
{

    ToDate = _ToDate;
    return ToDate;

}

/******************************************************************/
public boolean validate()
{
    boolean             isValid = true;
    if (!CaseCategoryType)
    {
        isValid = checkFailed("Category Type should be entered");
    }
     return isValid;
}
/******************************************************************/
CategoryDPClass
[
SRSReportQueryAttribute(queryStr(CategoryQry)),
SRSReportParameterAttribute(classStr(CategoryContract))
]
class CategoryDP extends SRSReportDataProviderBase
{
    CategoryTmp  CategoryTmp;
    CaseCategory CaseCategory;
    CaseCategoryType CaseCategoryType;
    FromDate FromDate;
    ToDate ToDate;
}
/******************************************************************/
private Query buildQuery( Query             _query,
                          CaseCategoryType  _CaseCategoryType,
                          CaseCategory      _CaseCategory,
                          FromDate          _FromDate,
                          ToDate            _ToDate)
    {

        if(_CaseCategoryType)
            _query.dataSourceTable(tablenum(CaseCategoryHierarchyDetail),1).addRange(fieldnum(CaseCategoryHierarchyDetail, CategoryType)).value(queryValue(_CaseCategoryType));

       if(_CaseCategory)
           _query.dataSourceTable(tablenum(CaseCategoryHierarchyDetail),1).addRange(fieldnum(CaseCategoryHierarchyDetail, CaseCategory)).value(queryValue(_CaseCategory));

        if(_FromDate && _ToDate)
          _query.dataSourceTable(tablenum(CaseDetailBase),1).addRange(fieldnum(CaseDetailBase, CreatedDateTime)).value(queryRange(_FromDate,_ToDate));

        return _query;

     }
/******************************************************************/
[
SRSReportDataSetAttribute(tableStr(CategoryTmp))
]
public CategoryTmp getCategoryTmp()
{

    select * from CategoryTmp;
    return CategoryTmp;

}
/******************************************************************/
private void getReportParameters()
{

    CategoryContract CategoryContract = this.parmDataContract();
    if (CategoryContract)
     {

         CaseCategoryType     = CategoryContract.parmCaseCategoryType();
         CaseCategory         = CategoryContract.parmCaseCategory();
         FromDate             = CategoryContract.parmFromDate();
         ToDate               = CategoryContract.parmToDate();

     }

 }
/******************************************************************/
public void InsertCategoryTmp(CaseDetailBase _CaseDetailBase,CaseCategoryHierarchyDetail _CaseCategoryHierarchyDetail)
{
    HcmWorker HcmWorker;
    DirPartyTable DirPartyTable;
    CaseDetailBase CaseDetailBase;
    CategoryTmp.CaseId      = _CaseDetailBase.CaseId;
    CategoryTmp.Logo        = CompanyImage::findByRecord(CompanyInfo::find()).Image;
   // CaseCategoryTmp.Name        = _CaseDetailBase.displayOwnerName();
    CategoryTmp.Status      = _CaseDetailBase.Status;
    CategoryTmp.Description = _CaseDetailBase.Description;
    CategoryTmp.Priority    = _CaseDetailBase.Priority;
   // CaseCategoryTmp.OwnerWorker = _CaseDetailBase.OwnerWorker;
    select DirPartyTable join HcmWorker join CaseDetailBase where DirPartyTable.RecId == HcmWorker.Person
                          && CaseDetailBase.CaseId == _CaseDetailBase.CaseId
                          && CaseDetailBase.OwnerWorker == HcmWorker.RecId;
    CategoryTmp.Name = DirPartyTable.Name;

    CategoryTmp.DateTime    = _CaseDetailBase.createdDateTime;
    CategoryTmp.CategoryType = _CaseCategoryHierarchyDetail.CategoryType;
    CategoryTmp.CaseCategory = _CaseCategoryHierarchyDetail.CaseCategory;
    CategoryTmp.insert();

}
/******************************************************************/
[SysEntryPointAttribute(false)]
public void processReport()
{

    CaseDetailBase              CaseDetailBase;
    CaseCategoryHierarchyDetail CaseCategoryHierarchyDetail;
     QueryRun queryrun;
    ;
    this.getReportParameters();
    queryRun = new QueryRun(this.buildQuery(this.parmQuery(),CaseCategoryType,CaseCategory,FromDate,ToDate));
    //queryRun = new QueryRun(this.parmQuery());
    while(queryRun.next())
    {
         CaseDetailBase                   =queryrun.get(tableNum(CaseDetailBase));
         CaseCategoryHierarchyDetail      =queryrun.get(tableNum(CaseCategoryHierarchyDetail));
        this.InsertCategoryTmp(CaseDetailBase , CaseCategoryHierarchyDetail);
    }
}
/******************************************************************/

Cross row manipulation of SSRS reports 2012

Hi,

Cross summation or manipulation in SSRS reports.
Consider the below image has credits and debit, The Balance is calculated by 
=Credit - Debit + Balance.



 From my knowledge it is not possible in Visual Studio. Instead we can make this possible by below procedure.
1.Create a field in the temp table as balance.
2. In contract class just in the insert method make this 
TmpTableName.Balance =  TmpTableName.Balance + TmpTableName.Credit - TmpTableName.Debit ;
3.Refresh the dataset add the fields in to the expected position then observe the application.

Enjoy it 

Tuesday, July 23, 2013

Change company in Dynamics AX 2009

Hi, 

In Microsoft Dynamics AX Axapta, sometimes, we can to insert/update/delete records in different companies or insert/update/delete according to the company we are... 

In Dynamics AX, exists the "changeCompany" function, that allow us to do that easily.

Here's an example:



static void main()
{
    CustTable custTable;
    ;

    //Assume that you are running in company 'aaa'.
    changeCompany('bbb') //Default company is now 'bbb'.
    {
        custTable = null;
        while select custTable
        {
            //custTable is now selected in company 'bbb'.
        }
    }


    //Default company is again set back to 'aaa'.

    changeCompany('ccc') //Default company is now 'ccc'.
    {  
        //Clear custTable to let the select work
        //on the new default company.
        custTable = null;
    

        while select custTable
        {
            //custTable is now selected in company 'ccc'.
        }  
    }

    //Default company is again 'aaa'.

}

Monday, July 22, 2013

Difference between two dates in days in Dynamic AX

To get the difference between two dates in dynamics ax just convert the dates into numbers and subtract one from the other. The result would be the amount of days between these dates.

today() - mkdate(31,01,2011) ;
or
days = date2num(Date123) - date2num(Date234);
or
TblName.FieldName= date2num(today()) - date2num(AnotherTblName.DatefeildName);


days = date2num(Date123) - date2num(Date234);

To get the difference between two DateTime Values just use the DateTimeUtil Class. The result is the difference in seconds. So just divide these through #secondsPerDay and you'll get the days

#timeConstants

days = DateTimeutil::getDifference(DateTime123, DateTime234) / #secondsPerDay;
-------------------------------------------------------------------
date2num(systemdateget()) - date2num(urtable.date);
---------------------------------------------------------------------------------------------------------
static void DateDiff(Args _args)
{
    TransDate   d1,d2;
    int daysdiff;
    ;
    d1  = 31\12\2010;
    d2  = today();
    daysDiff = d2 - d1;
    info(strfmt("%1",daysDiff));
}
-----------------------------------------------------------------------------------------------------
Or just override the field in datasource level as modified()

then
tablename.fieldName3 = tablename.fieldName2 - tablename.fieldName1;
filedName1 - Out put field,
filedName2 - To date field,
filedName2 - from date field,


Wednesday, July 17, 2013

Save the SSRS report as pdf or print it through code in Dynamic AX

Ax 2012 Reports (SSRS) Print Utilities
This article gives the examples, to print the reports of Dynamics Ax 2012 (SSRS Reports), in different ways.
1)Sending the Ax report through mail.
2)Save the report as file in local computer. (example covered to save the report as .pdf file)
Mail the report

static void myJobPrintReportMail(Args _args)
{
SrsReportRun                        reportRun;
Query                               query;
SRSReportPrintDestinationSettings   SRSReportPrintDestinationSettings;
SRSPrintDestinationSettings         srsPrintSettings;
;
delete_from SRSReportPrintDestinationSettings;
reportRun = new SRSReportRun();
reportRun.reportName(“Vend.Report”);  //<ReportName>.<DesignName>
// Set printersettings
srsPrintSettings = reportRun.printDestinationSettings();
srsPrintSettings.printMediumType(SRSPrintMediumType::Email);
srsPrintSettings.emailTo(“mail@gmail.com”);
srsPrintSettings.emailAttachmentFileFormat(SRSReportFileFormat::PDF);
srsPrintSettings.emailSubject(strfmt(‘vendor report – %1′, systemdateget()));
srsPrintSettings.pack();
reportRun.showDialog(false);
reportRun.init();
reportRun.run();
}
Save the Report To PDF File
static void myJobPrintReportPDF(Args _args)
{
SrsReportRun                        reportRun;
SRSPrintDestinationSettings         srsPrintSettings;
SRSReportPrintDestinationSettings   SRSReportPrintDestinationSettings;
;
delete_from SRSReportPrintDestinationSettings;
reportRun = new SRSReportRun();
reportRun.reportName(“Vend.Report”);  //<ReportName>.<DesignName>
// Set printersettings
srsPrintSettings = reportRun.printDestinationSettings();
srsPrintSettings.overwriteFile(true);
srsPrintSettings.printMediumType(SRSPrintMediumType::File);
srsPrintSettings.fileFormat(SRSReportFileFormat::PDF);
srsPrintSettings.fileName(“D:\\Vendors.pdf”);
srsPrintSettings.pack();
reportRun.showDialog(false);
//reportRun.saveParameters();                         //For Report parameters
reportRun.init();
reportRun.run();
}
In case of Parameterized reports
If the report has parameters (Using Contract Class),
Use the following line, to read the parameters and save to the table called,SRSReportParameters
reportRun.saveParameters();
For the same parameters, provide the required values to run the report.
I have tried the example of Vendor Transactions report, with my customized version. This standard report has 4 parameters, have used same parameters and provided the values inSRSReportParameters table to run the report.
For clear idea, have a quick look in to the following picture.



UI Builder class in Dynamic AX

UI Builder class 

Today i will share how to give a filter lookup using an UI Builder class.                                                                                            

Step1 : First create a DP class for a customer report


[
    SRSReportQueryAttribute(queryStr(BSCustTable)),
    SRSReportParameterAttribute(classStr(SRCustomLookUpContract))

]
class SRCustomLookupDP extends SRSReportDataProviderBase
{
    SRCustomLookUpContract contract;
    CustNameTmp        CustNameTmp;
    AccountNum         AccountNum;
    CustGroupId       CustGroupId;

}

private Query buildQuery(
    Query                   _query,
    AccountNum                _AccountNum
    )
    {

    if(_AccountNum)
        _query.dataSourceTable(tablenum(CustTable), 1).addRange(fieldnum(CustTable, AccountNum)).value(queryvalue(_AccountNum));

        return _query;
     }

[
    SRSReportDataSetAttribute('CustNameTmp')
]
public CustNameTmp getCustNameTmp()
{
    select * from CustNameTmp;

    return CustNameTmp;
}

private void getReportParameters()
{
    SRCustomLookUpContract SRCustomLookUpContract = this.parmDataContract();

    if (SRCustomLookUpContract)
    {
        AccountNum    = SRCustomLookUpContract.parmAccountNum();
        CustGroupId  = SRCustomLookUpContract.parmCustGroup();
        //AccountNum    = SRCustomLookUpContract.parmAccountNum2();
    }
 }


public  void insertCustNameTmp(AccountNum _accountNum)
{
    CustTable  CustTable;

    ;
    while select CustTable where CustTable.AccountNum == _accountNum
    {
       CustNameTmp.AccountNum = _accountNum;
       CustNameTmp.Name     = CustTable.name();

       CustNameTmp.insert();
    }

}


/// <summary>
/// executes the logic based on the parameter entries
/// </summary>
/// <remarks>
/// fills up the temp table
/// </remarks>
[SysEntryPointAttribute]
public void processReport()
{
    Query query;
    QueryRun queryRun;
    CustTable       custTable;
    ;
    this.getReportParameters();
    queryRun = new QueryRun(this.buildQuery(this.parmQuery(),AccountNum));
    while(queryRun.next())
    {
        custTable = queryRun.get(tableNum(custTable));
        this.insertCustNameTmp(custTable.AccountNum);
    }
}

Step2 : Second create a Contract class for a customer report


[DataContractAttribute,
SysOperationContractProcessingAttribute(classstr(SRCustomLookupsUIBuilder))
]
class SRCustomLookUpContract
{
    AccountNum        accountNum;
    CustGroupId      CustGroupId;

}


[DataMemberAttribute('AccountNum')
    ]
public AccountNum parmAccountNum(AccountNum _accountNum = accountNum)
{
    accountNum = _accountNum;
    return accountNum;
}


[DataMemberAttribute('CustGroup')
    ]
public CustGroupId parmCustGroup(CustGroupId _CustGroupId = CustGroupId)
{
    CustGroupId = _CustGroupId;
    return CustGroupId;
}


Step3 : Third create a UI Builder class for a customer report


class SRCustomLookupsUIBuilder extends SrsReportDataContractUIBuilder
{
      DialogField   dialogAccountNum,dialogCustGroup; //dialogCreditRating;
      DialogGroup   dialogGroup, dialogGroup2;
      boolean       enable;


}


private void accountNumLookup(FormStringControl accountNumLookup)
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds_CustTable;
    SysTableLookup          sysTableLookup;
    QueryBuildRange         qbr;

    if (accountNumLookup != null)
    {
        // Create an instance of SysTableLookup with
        // the current calling form control.

        sysTableLookup = SysTableLookup::newParameters(tablenum(CustTable), accountNumLookup);
        //sysTableLookup.addLookupMethod(
        // Add fields to be shown in the lookup form.
        qbds_CustTable = query.addDataSource(tableNum(CustTable));
         sysTableLookup.addLookupfield(fieldnum(CustTable, CustGroup),true);
        sysTableLookup.addLookupfield(fieldnum(CustTable, AccountNum), false);

        qbr = qbds_CustTable.addRange(fieldNum(CustTable,CustGroup));
        qbr.value("");
        sysTableLookup.parmUseLookupValue(false);

        sysTableLookup.parmQuery(query);

        // Perform the lookup.
        sysTableLookup.performFormLookup();

    }
}


/// <summary>
///    Builds the dialog.
/// </summary>
/// <remarks>
///    The dialog appears with the parameters.
/// </remarks>

public void build()
{
    SRCustomLookUpContract rdpContract =  this.dataContractObject();

    dialogAccountNum = this.addDialogField(methodstr(SRCustomLookUpContract,parmAccountNum),rdpContract);
    dialogAccountNum.lookupButton(3);

    dialogCustGroup = this.addDialogField(methodstr(SRCustomLookUpContract,parmCustGroup),rdpContract);
    dialogAccountNum.lookupButton(2);
}


private void CustGroupLookup(FormStringControl CustGroupLookup)
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds_CustTable;
    SysTableLookup          sysTableLook;
    QueryBuildRange         qbr;
    CustTable               CustTable;
    if (CustGroupLookup != null)
    {
        // Create an instance of SysTableLookup with
        // the current calling form control.

        sysTableLook = SysTableLookup::newParameters(tablenum(CustTable), CustGroupLookup);
        //sysTableLookup.addLookupMethod(
        // Add fields to be shown in the lookup form.
        qbds_CustTable = query.addDataSource(tableNum(CustTable));
        sysTableLook.addLookupfield(fieldnum(CustTable, CustGroup),false);
         sysTableLook.addLookupfield(fieldnum(CustTable, AccountNum), true);

        qbr = qbds_CustTable.addRange(fieldNum(CustTable,CustGroup));
        qbr.value(dialogAccountNum.value());
        sysTableLook.parmUseLookupValue(false);

        sysTableLook.parmQuery(query);

        // Perform the lookup.
        sysTableLook.performFormLookup();

    }
}


public boolean customerAccModified(FormStringControl _control)
{
    dialogAccountNum.value(_control.valueStr());

    return true;
}


public void postRun()
{
    Dialog dialogLocal = this.dialog();
    DialogField dialogField, dialogField1;

    super();

    // This method should be called in order to handle events on dialogs.
    dialogLocal.dialogForm().formRun().controlMethodOverload(false);

    // Override the methods of department  field.

    dialogField1 = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(SRCustomLookUpContract, parmCustGroup));
    dialogField1.registerOverrideMethod(methodstr(FormStringControl, lookup), methodstr(SRCustomLookupsUIBuilder,CustGroupLookup), this);

    dialogField = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(SRCustomLookUpContract, parmAccountNum));
    dialogField.registerOverrideMethod(methodstr(FormStringControl, lookup), methodstr(SRCustomLookupsUIBuilder,accountNumLookup), this);

}

RDP Class in Dynamic AX

Style 1.

[
SRSReportQueryAttribute (querystr(CustTableQry)),
SRSReportParameterAttribute(classstr(CustContractClass))
]
class CustTableRDP extends SRSReportDataProviderBase
{
CustTableTmp custTableTmp;
}
*********************************
[
SysEntryPointAttribute(false)
]
public void processReport()
{
QueryRun             queryRun;
Query                query;
CustTable            custTable;
CustContractClass    CustContractClass;
AccountNum           accountNum;
QueryBuildDataSource queryBuildDataSource;
QueryBuildRange     queryBuildRange;
query = this.parmQuery();
   
CustContractClass = this.parmDataContract() as CustContractClass;
accountNum = CustContractClass.parmAccountNum();
// Add parameters to the query.
queryBuildDataSource = query.dataSourceTable(tablenum(CustTable));
if(accountNum)
{
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(accountNum);
}
queryRun = new QueryRun(query);
while(queryRun.next())
{
custTable = queryRun.get(tableNum(CustTable));
this.insertTmpTable(CustTable);
}
}
________________________________________________
/// This method inserts data into the temporary table.
/// Table buffer of CustTable table.

private void insertTmpTable(CustTable _custTable)
{
custTableTmp.AccountNum = _custTable.AccountNum;
custTableTmp.Blocked = _custTable.Blocked;
custTableTmp.PriceGroup = _custTable.PriceGroup;
custTableTmp.Currency = _custTable.Currency;
custTableTmp.insert();

}
____________________________________________
[SRSReportDataSetAttribute("CustTableTmp")]
public custTableTmp getcustTableTmp()
{
select * from custTableTmp;
return custTableTmp;
}

Styel 2
// *************Alternative code sample*************//

SSRS report DP class And Contract Class Example
/// <summary>
///    The <c>LedgerJournalDP</c> class declares the variables, tables, and so on, that are used in the
///    <c>LedgerJournal</c> report.
/// </summary>
[
    SRSReportQueryAttribute(queryStr(HcmWareHouseQry)),
    SRSReportParameterAttribute(classStr(WareHouseReportContract))
]
public class WarehouseReportDP extends SRSReportDataProviderBase
{
    WarehouseTmp WarehouseTmp;
    TransDate    fromDate;
    TransDate    toDate;
 }
 private Query buildQuery(    Query                   _query,
                             FromDate                _fromDate,
                             ToDate                  _toDate)

    {
    if(_fromDate && _toDate)
        _query.dataSourceTable(tablenum(HcmWarehouseHeaderTable),1).addRange(fieldnum(HcmWarehouseHeaderTable, InvoiceDate)).value(queryRange(_fromDate,_toDate));
        return _query;
    }
 private void getReportParameters()
{
    WareHouseReportContract WareHouseReportContract = this.parmDataContract();
        fromDate         = WareHouseReportContract.parmFromDate();
        toDate           = WareHouseReportContract.parmTodate();
}
 // <summary>
/// Executes temporary table.
/// </summary>
/// <returns>
/// The temporary table <c>LedgerJournalTmp</c>.
/// </returns>
[
    SRSReportDataSetAttribute('WarehouseTmp')
]
public WarehouseTmp getWarehouseTmp()
{
    select WarehouseTmp;
    return WarehouseTmp;
}
 private void insertWarehouseTmp(
    HcmWarehouseHeaderTable _HcmWarehouseHeaderTable,
    HcmWarehouseLinesTable _HcmWarehouseLinesTable)
{
    WarehouseTmp.Logo           = _HcmWarehouseHeaderTable.image();
    WarehouseTmp.WarehouseID    = _HcmWarehouseHeaderTable.WarehouseID;
    WarehouseTmp.InvoiceNumber  = _HcmWarehouseHeaderTable.InvoiceNumber;
    WarehouseTmp.InvoiceDate    = _HcmWarehouseHeaderTable.InvoiceDate;
    WarehouseTmp.VendName       = _HcmWarehouseHeaderTable.VendName;
    WarehouseTmp.VendorAccount  = _HcmWarehouseHeaderTable.VendorAccount;
    WarehouseTmp.Address        = _HcmWarehouseHeaderTable.vendorAddress();
    WarehouseTmp.SerialNumber   = _HcmWarehouseLinesTable.SerialNumber;
    WarehouseTmp.ITAssetCode    = _HcmWarehouseLinesTable.ITAssetCode;
    WarehouseTmp.Type           = _HcmWarehouseLinesTable.Type;
    WarehouseTmp.Manufacturer   = _HcmWarehouseLinesTable.Manufacturer;
    WarehouseTmp.Model          = _HcmWarehouseLinesTable.Model;
    WarehouseTmp.ProductDescription = _HcmWarehouseLinesTable.ProductDescription;
    WarehouseTmp.BaseConfiguration  = _HcmWarehouseLinesTable.BaseConfiguration;
    WarehouseTmp.ProductSerialNumber = _HcmWarehouseLinesTable.ProductSerialNumber;
    WarehouseTmp.Quantity       = _HcmWarehouseLinesTable.Quantity;
    WarehouseTmp.AcquisitionCost = _HcmWarehouseLinesTable.AcquisitionCost;
    WarehouseTmp.WarrantyPeriod = _HcmWarehouseLinesTable.WarrantyPeriod;
    WarehouseTmp.insert();
}
 [SysEntryPointAttribute(false)]
public void processReport()
{
    HcmWarehouseHeaderTable HcmWarehouseHeaderTable;
    HcmWarehouseLinesTable HcmWarehouseLinesTable;
    WareHouseReportContract contract;
    QueryRun queryRun;
     this.getReportParameters();
    queryRun = new QueryRun(this.buildQuery(this.parmQuery(),fromDate,toDate));
     while (queryRun.next())
    {
        HcmWarehouseHeaderTable = queryRun.get(tableNum(HcmWarehouseHeaderTable)) as HcmWarehouseHeaderTable;
        HcmWarehouseLinesTable = queryRun.get(tableNum(HcmWarehouseLinesTable)) as HcmWarehouseLinesTable;
        this.insertWarehouseTmp(HcmWarehouseHeaderTable, HcmWarehouseLinesTable);
     }
}
/// <summary>
///    The <c>LedgerJournalContract</c> class is the Data Contract class for the <c>LedgerJournal</c> SSRS
///    report.
/// </summary>
[
    DataContractAttribute,
    SysOperationGroupAttribute('PrintOut', "@SYS12608", '1')
]
public class WareHouseReportContract
{
    TransDate    fromDate;
    TransDate    toDate;
 }
 /// <summary>
/// Gets or sets the value of the datacontract parameter ShowAccrualTrans.
/// </summary>
/// <param name=”_showAccrualTrans”>
/// The new value of the datacontract parameter ShowAccrualTrans; optional.
/// </param>
/// <returns>
///  The current value of datacontract parameter ShowAccrualTrans
/// </returns>
[
    DataMemberAttribute('fromDate'),
    SysOperationLabelAttribute(literalstr("FromDate")),
    SysOperationHelpTextAttribute(literalstr("FromDate")),
    SysOperationGroupMemberAttribute('PrintOut'),
    SysOperationDisplayOrderAttribute('2')
]
public TransDate parmFromDate(TransDate _fromDate = fromDate)
{
    fromDate = _fromDate;
    return fromDate;
}
 // <summary>
/// Gets or sets the value of the datacontract parameter Specification.
/// </summary>
/// <param name=”_specification”>
/// The new value of the datacontract parameter Specification; optional.
/// </param>
/// <returns>
///  The current value of datacontract parameter Specification
/// </returns>
[
    DataMemberAttribute('todate'),
    SysOperationLabelAttribute(literalstr("Todate")),
    SysOperationHelpTextAttribute(literalstr("Todate")),
    SysOperationGroupMemberAttribute('PrintOut'),
    SysOperationDisplayOrderAttribute('3')
]
public TransDate parmTodate(TransDate _todate = todate)
{
    todate = _todate;
    return todate;
}

Regards,

Controller Class in Dynamic AX

Controller Class
public static CustController construct(Args _args)
{
    CustController controller=new CustController();
    controller.parmArgs(_args);
    return controller;
}
/**********************************************************************/
public static void main(Args _args)
{
    CustController controller = new CustController();
    controller.parmReportName(#ReportName);
    controller.parmArgs(_args);
    controller.setRange(_args, controller.parmReportContract().parmQueryContracts().lookup(controller.getFirstQueryContractKey()));
    controller.parmShowDialog(false);
    controller.startOperation();
 }
/****************************************************/
public boolean showQueryValues(str parameterName)
{
    return true;
}
/*****************************************************/
public void setRange(Args _args, Query _query)
{
    QueryBuildDataSource qbds;
    QueryBuildRange qbr;
    if (_args && _args.dataset())
    {
        switch(_args.dataset())
        {
            case tableNum(CustTable) :
                CustTable = _args.record();
                break;
        }
    }
    qbds = _query.dataSourceTable(tableNum(CustTable));
    qbds.clearRanges();
    qbr = qbds.findRange(fieldName2id(tableNum(CustTable),fieldStr(CustTable, AccountNum)));
    if (!qbr)
    {
        qbr = qbds.addRange(fieldNum(CustTable, AccountNum));
    }
    if(CustTable)
    {
        qbr.value(CustTable.AccountNum);
    }
}
/**********************************************************/
protected void prePromptModifyContract()
{
      super();
}
/************************************************************************/
class CustController extends SrsReportRunController
{
    #define.ReportName('CustReport.PrecisionDesign1')
    SRSRDPCustTableContractClass sRSRDPCustTableContractClass;
    CustTable custTable ;

 }

Contract Class in Dynamic AX

Contract Class
class SRSRDPCustTableContractClass
{
AccountNum accountNum;
}
______________________________________________
Add one more parm method to it as shown below 

[DataMemberAttribute("AccountNum")]
public AccountNum parmAccountNum(AccountNum _accountNum = accountNum)
{
accountNum = _accountNum;
return accountNum;
}

Simple UI Builder Class in Dynamic AX

This UI Builder class is simple class with less code and less effort. UI Builder Class is needed when you want to customize your dialog which pop ups when you open a Report. UI Builder Class helps you to add run time lookups and other controls on the dialog form.
Step1 : Your Class must extends SrsReportDataContractUIBuilder
class SimpleDemoUIBuilder extends SrsReportDataContractUIBuilder
{
DialogField dialogEmplId;
DialogField dialogName;
boolean enable;
SimpleDemoContract contract;
}// two fields emplId and Name will reflect in the lookup in dialog form at the time of report opening.
Step2 : Override the build method
public void build()
{
contract = this.dataContractObject();
dialogEmplId = this.addDialogField(methodStr(SimpleDemoContract, parmEmplId),contract);
}// this method used for adding the field  which is from contract class.
Step3 : Write this below code to get lookup
private void emplIdLookup(FormStringControl emplIdlookup)
{
Query query = new Query();
QueryBuildDataSource qbds_EmplTable;
SysTableLookup sysTableLookup;
// Create an instance of SysTableLookup with the current calling form control.
sysTableLookup = SysTableLookup::newParameters(tableNum(FilterDemo), emplIdlookup);
// Add fields to be shown in the lookup form.
sysTableLookup.addLookupfield(fieldNum(FilterDemo,EmplId));
sysTableLookup.addLookupfield(fieldNum(FilterDemo,Name));
qbds_EmplTable = query.addDataSource(tableNum(FilterDemo));
sysTableLookup.parmQuery(query);
// Perform the lookup
sysTableLookup.performFormLookup();
}
Step4 : Override this method
public void getFromDialog()
{
contract = this.dataContractObject();
super();
}
Step5 : Override this method
public void initializeFields()
{
contract = this.dataContractObject();
}
Step6 : Override this method

public void postBuild()
{
super();
dialogEmplId = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SimpleDemoContract,parmEmplId));dialogEmplId.registerOverrideMethod(methodStr(FormStringControl, lookup),
methodStr(SimpleDemoUIBuilder,emplIdLookup), this);dialogEmplId.lookupButton(2);
}
the Contract Class code and DP class have already been added to the blog. please check it for further reference but one important part has to be added to the contract class i.e in class declaration, the following part has to be updated.

Monday, July 15, 2013

addLookMethod() Structure in Dynamic AX

    sysTableLookup.addLookupMethod(tablemethodstr(CustTable,Name));

Lookup() in Dynamic AX

Right click on the field method and override the lookup method in for that stringedit method.

public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource queryBuildDataSource;
    QueryBuildRange queryBuildRange;
    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(custTable), this);
    sysTableLookup.addLookupField(fieldNum(CustTable, AccountNum));
    sysTableLookup.addLookupMethod(tablemethodstr(CustTable,Name));
    queryBuildDataSource = query.addDataSource(tableNum(CustTable));
    queryBuildRange = queryBuildDataSource.addRange(fieldNum(CustTable, AccountNum));
    queryBuildRange.value();
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
    //super();
}

/// Another method////
public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource queryBuildDataSource;
    QueryBuildRange queryBuildRange; 
    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(custTable), this); 
    sysTableLookup.addLookupField(fieldNum(CustTable, AccountNum));
    sysTableLookup.addLookupField(fieldNum(CustTable, CustGroup)); 
    queryBuildDataSource = query.addDataSource(tableNum(CustTable));
    queryBuildRange = queryBuildDataSource.addRange(fieldNum(CustTable, CustGroup));
    queryBuildRange.value('40');
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
    //super();
}

Saturday, July 13, 2013

File Handling in Dynamic AX

Writing to a Text File
static void textFileWrite(Args _args)
{
TextBuffer tb = new TextBuffer();
;
tb.appendText(“Hello World!”);
tb.appendText(“\nWelcome to MIT”);
tb.appendText(“\nHyderabad”);
tb.toFile(“c:\\Sample.txt”);
}
Reading from a Text File
static void textFileRead(Args _args)
{
TextBuffer tb = new TextBuffer();
;
if(WinApi::fileExists(“c:\\Sample.txt”))
{
tb.fromFile(“c:\\Sample.txt”);
info(tb.getText());
}
else
{
info(“No file exists”);
}
}
Writing to a CSV File
static void cSVFileWrite(Args _args)
{
CommaIO commaIO;
Container readCon;
FileIOPermission fio;
FileDemo ct;
;
commaIO = new CommaIO(“c:\\FileDemo.csv”, “w”);
commaIO.outFieldDelimiter(“,”);
commaIO.outRecordDelimiter(“\r\n”);
if(commaIO)
{
while select ct
{
commaIO.write(ct.Id,ct.Name);
}
}
}
Reading from a CSV File
static void cSVFileRead(Args _args)
{
CommaIO commaIO;
Container readCon;
FileIOPermission fio;
FileDemo ct;
;
if(!WinAPI::fileExists(“c:\\FileDemo.csv”))
{
throw error(“File not available”);
}
fio = new FileIOPermission(“c:\\FileDemo.csv”, “r”);
fio.assert();
commaIO = new CommaIO(“c:\\FileDemo.csv”, “r”);
commaIO.inFieldDelimiter(“,”);
commaIO.inRecordDelimiter(“\r\n”);
if(commaIO)
{
while(CommaIO.status() == IO_Status::Ok)
{
readCon = commaIO.read();
if(conlen(readcon) > 0)
{
ct.Id = conpeek(readcon, 1);
ct.Name = conpeek(readcon, 2);
ct.insert();
}
}
}
}
Writing to a XML File
static void writeXML(Args _args)
{
XMLTextWriter xw;
FileDemo ct;
;
xw = XMLTextWriter::newFile(“c:\\FileDemo.xml”);
xw.writeStartDocument();
xw.writeStartElement(“Details”);
while select ct
{
xw.writeStartElement(“CustomerDetails”);
xw.writeElementString(“Id”,ct.Id);
xw.writeElementString(“Name”,ct.Name);
xw.writeEndElement();
}
xw.writeEndElement();
xw.writeEndDocument();
xw.close();
}
Reading from a XML File
static void readingXML(Args _args)
{
XMLDocument xmlDoc = XMLDocument::newFile(“c:\\FileDemo.xml”);
int i, nooftags;
;
nooftags = xmlDoc.getElementsByTagName(“CustomerDetails”).length();
for(i=0; i<nooftags; i++)
{
info(strfmt(“%1″, xmlDoc.getElementsByTagName(“Id”).item(i).text()));
info(strfmt(“%1″, xmlDoc.getElementsByTagName(“Name”).item(i).text()));
}
}
TableData_to_File
static void TableData_to_File(Args _args)
{
commaIO commaIO;
container readLine;
CustTable k;
FileIOPermission fio;
FileName nameOfTheFile = “c:\\anil.txt”; //csv
;
fio = new FileIOPermission(nameOfTheFile, ‘w’);// read – r, write – w, append – a
fio.assert(); // demand
commaIO = new commaIO(nameOfTheFile,’w');
commaIO.outFieldDelimiter(‘,’); // \t | // outFieldDelimiter
commaIo.outRecordDelimiter(‘\r\n’); // OutRecorDelimiter
commaIO.writeExp(["Accno", "AccountStatement", "CommissionGroup","DefaultDimention"]);
while select k
{
commaIO.writeExp([k.AccountNum,
k.AccountStatement,k.CommissionGroup,k.DefaultDimension]);
}
CodeAccessPermission::revertAssert();
}
TableDataFrom_File
static void TableDataFrom_File(Args _args)
{
commaIO commaIO;
container readLine;
Tab2 k;
FileIOPermission fio;
FileName nameOfTheFile = “c:\\anil.txt”; //csv
;
if (winapi::fileExists(nameOfTheFile) == false)
throw error(strfmt(“file %1 not found”, nameOfTheFile) );
fio = new FileIOPermission(nameOfTheFile, ‘r’);// read – r, write – w, append – a
fio.assert(); // demand
commaIO = new commaIO(nameOfTheFile,’r');
commaIO.inFieldDelimiter(‘,’); // \t – tab, | // outFieldDelimiter
commaIo.inRecordDelimiter(‘\r\n’); // OutRecorDelimiter – read line by line
ttsbegin;
if(commaIO)
{
while(commaIO.status() == IO_status::Ok)
{
readLine = commaIO.read(); //writeExp
if (conlen(readLine) > 1) // check whether there are values in the next line
{
k.Address = conpeek(readLine,1);
k.DName = conpeek(readLine, 2);
k.insert();
}
}
}
ttscommit;
CodeAccessPermission::revertAssert();
}

Dimension Lookup for both standard and Custom dimension in D365

Hi,  /// <summary>     /// Provides the look-up interaction for the individual dimension value lookup controls.     /// </summary&g...