Friday, 23 June 2017

Table Method Calling Sequences in Ax -2012

         Table Method Calling Sequences in Ax -2012

When we arecreating a new record  CTrl+N
----> InitValue()
When we are Changed the data in a field.
àValidateFieldValue() à validateField() àModifiedFieldValue() àModifiedField().
When we are save the table after entering some data and close the table.
àvalidateWrite() à aosvalidateInsert() à Insert().
When we are Open the Table which will contain some data.
à  aosValidateRead ().
When we are Save the Record.
à ValidateDelete() à aosValidateInsert() à Insert().
When we are modifying the record.
àValidateDelete() à aosValidateUpdate() à Update().
When We are delete the Record.
àValidateDelete() à aosValidateDelete() à Delete().

Examples and Methods Working Progress.
I have taken Student Table and enter some Records.
When we are opening a Table Below Methods will be calling.

Open table: 1. PostLoad,2. aosValidateRead.




When we are Create New Record or CTrl+N.
Then below method will be Calling.
New Record:1. InitValue


When we are move to Next Field then below methods will be calling.


Move Record: validate Field Value, Validate Field, Get Extension, Modified field Value, preremoting, aosValidateInsert, insert, Preremoting, Modified.


When we are Modifying The record then below methods will be calling.


Modify Record: Validate Field Value, ValiadteField, get extension, modified Field Value, Preremoting, aosValidateInsert, Preremoting, Modified Field.




When we are Update the Record then below Method will be Calling.



Update Record: Validate Field value, Validate Field, Get Extension, Modified Field Value, Preremoting, aosValidateInsert, insert, Preremoting, Modified Field, Validate write, Preremoting, aosValidateUpdate, Update, Preremoting.























When we are delete the Record then below Methods will be calling.



Delete Record:  Validate Delete, Preremoting, aosValidateDelete, Delete, Preremoting.


























When we are save the record then below methods will be calling.


Save Record: Validate Write, Preremoting, aosValidateUpdate, Update, Preremoting.























Caption ():


























Help Field (): 

àRetrieves the help text of the control.
public str helpField(FieldId _fieldId)
{
    str     ret;
    str     name;

    ret = super(_fieldId);
    //info("Called helpField Method");
    name = this.helpField(1);
    return ret;
}

Caption ():

àGet and set the Caption property of a table.
public str caption()
{
    str ret;

    ret = super();
    info("Called caption Method");
    ret = strFmt("%1 %2",this.StudentId,this.StudentName);

    return ret;
}


Clear ():

àRemove all Rows from the table Buffer.
This. Clear ()
Tablebufffer.Clear();


Equal ():

àDetermines Whether the specified Object is Equal to the Current one.
static void Na_equal(Args _args)
{
    VendTable       vendTable;
    VendTable       v1,v2;

    v1 = vendTable::find("1003");
    v2 = vendTable::find("1003");
    info(strFmt("%1",v1.equal(v2)));

}
ReturnsàTrue  Or false.


Post Load ():

àIs Executed after Record Is Read.
it is used to read records from database and you can perform any custom logic by overriding this method on any table.

Executed when record loaded.
public void postLoad()
{
    super();

    if (this.Name == 'MEL')
        this.Value = 5;
}

Merge ():
àMerges the current table with the specified table.
static void merge(Args _args)
{
    Na_ClassTable       na_ClassTableDelete;
    Na_ClassTable       na_ClassTable;
    //ReasonTable reasonTableDelete;
    //ReasonTable reasonTable;

    ttsBegin;
        select firstOnly forUpdate na_ClassTableDelete
            where na_ClassTableDelete.Address == 'Guntur';
        select firstonly forupdate na_classtable
            where na_classtable.address == 'hyderabad';

    na_ClassTableDelete.merge(na_ClassTable);
    na_ClassTable.doUpdate();
    na_ClassTableDelete.doDelete();
    ttsCommit;
}



Using List Class and Merge.

static void Na_ListMerge(Args _args)
{
    List list1  = new List(Types::Integer);
    List list2  = new List(Types::Integer);
    List combinedList  = new List(Types::Integer);
    int  i;

    for(i=1; i<6; i++)
    {
        List1.addEnd(i);
    }
     for(i=6; i<11; i++)
    {
        List2.addEnd(i);
    }

    combinedList = List::merge(list1, list2);
    info(strFmt("%1",combinedList.toString()));
    //pause;
}


Preremoting ():
àIs Executed Before a Cross-tire call being about to Executed for the Table That Would Pack its state to the Other tier.



get Extension ():
àReturns the Table extension.


get SQL Statements ():
àit is used to Return record from the database.
                ReturnsàString;


get Field Value ():
àGets the Value of the Specified field from a table buffer.
                Returnsàany type;


ISFormDataSource ():
àIndicates Whether the Data Source is a Form.
                ReturnsàBoolean;


Get Presence Field Data ():
àRetrieves the presence info value from the specified field.
                ReturnsàFieldId—EDT;FieldValue—any type.


Default Field ():
àPopulates Default values in a Field in the table.


Default Row ():
àPopulates Default values in a Field in the table in the non-interactive case.


Write ():
à Updates a Record if it exists otherwise insert Record.


Wait ():
à The most common use for this method is to start an object that asks the user for some input and then call the wait method on that object, such as a form. The next line of code is not executed until the object has called the notify or notifyAll method.
When the wait method is called from a form, you do not have to call the notify methods manually because forms call the Object.notifyAllmethod when the user either closes the form or presses the Apply button.
.
Reread ():
à Current Record from the database. It should not use to refresh the form data.
                 Data if you have added/removed records. It's often used if you change some values in the current   record in some code, and commit them to the database using. update () on the table, instead of through the form data source. 


To String ():
à Returns a string that represents the current object.
static void Na_tostring(Args _args)
{
     Object obj = new Object();

    info(strFmt("%1", obj.toString()));
  
}
Table Access Right ():
à Returns the table access right.
è  Type- Access Right Enumeration.
   like –NoAccess,View,Edit,Add,correction,delete.(0,1,2,3,4,5).

Buf2Con () && Con2Buf ():

à Converts a record into a container. (or) Converts Table Buffer Record to container.
à Converts a container into a record. (or) Converts container to Table Buffer Record.

static void Na_buf2con(Args _args)
{
    Na_ClassTable    na_ClassTable;
    Na_ClassTable    na_ClassTable2;
    container       packedTable;  
   
    ttsBegin;  
    na_ClassTable.StudentId = "Stu_119";
    na_ClassTable.insert();
    info(na_ClassTable.StudentId);
    info(na_ClassTable2.StudentId);
    ttsCommit;
    // pack
    packedTable = buf2Con(na_ClassTable);
    // unpack in a different table buffer
    na_ClassTable2 = con2Buf(packedTable);
    info(na_ClassTable2.StudentId);
    if (na_ClassTable2.StudentId == na_ClassTable.StudentId)
    {
        info("Values are equal");      
        info(na_ClassTable.StudentId);
        info(na_ClassTable2.StudentId);
    }
}



Data Import/Export Frame Work in AX 2012

Data Import/Export Frame Work

If we want to Export/Import Data Using DIXF and DMF frame work, then we will follow these Bellow steps:
we  will work  Mainly on five Forms.



Step1: Now first we will set the Path certain directory. And it should be Shared.
And It Should Be set by Admin Level.
Data Import Export Frame Work>>Setup>>Data Import/Export Framework Parameters>>
Here Select our File. Like: DIXF && Validate.







Step2:  Set source Data Formats.
àCreate Source File and Type and Make sure to Choose File Format.
àHere Source File Type is 3 types:
1.File      ---------------->It is used to importing. Using File Formats like: Delimited, Fixed Width, XML, Excel.
2.Ax       ---------------->It is used to Exporting.

3.ODBC ---------------->It is used to Importing Data through ODBC (Open Data Base Connectivity) like: SqlServer (or) Oracle (or) MySQL etc.







Step3:  we are working Processing Group from.
In this processing Group form we have 9 tabs.
1.New.
2.Delete.
3.Entities.
4.GetStagging Data.
5.Copy data to Target.
6.Exection History
7.Export to Ax.
8.Export to File.
9.company.

II àStep1:  First  worked on Importing Data Using Csv File Format.
Here first Create Source File and Type Must File. File means ---> Delimited (or) Fixed Width.
And Set Column Delimiter and Row delimiter. Like; :|{CR}{LF},
Step2:  Go to Data Import Export Frame work>>Common>Processing Group>>
Create New Group and Click Entities Button.







When we create Group name and save that one , Then Automatically Entities Button Is Enabled.
Once clicked Entities Button the Sub Form will be Opened.

àIn this Sub form have 7 major Tabs.
1.New
2.Delete.
3.Select.                                         -------------------->Using Exporting.
4.Generate Source mapping.
5.Modify Source mapping.
6.Validate.
7.View target mapping.
8.preview Source File.

Step3:  Here We Selecting Entity and Source data format and then Click Generate Source File.





Step4:  And Generate Wizard. And select entities Related Fields.




Step5:  Clicked Generate Sample File Button. And Generate Sample File, save that file Particular drive and add some data Regarding Importing.
And Then click Finish Button.

Step6:  Select sample File (Before We save File).
When we will select sample file Automatically Enable Generate Source Mapping and Modify Source Mapping.
Then click Generate Source mapping button.




If you want any Modification We will click Modify Source mapping.





Here Apply Mapping Using Conversion and Mapping Details.
Step7:  Before We go to Staging tab we will check Preview Source File.





Step 8: Close That Sub Form. And Open Main Form.
Then Get staging Data Tab is enable.
Click That tab and Open Dialog Form there was One Job Id and Description.






And Click Ok.
Then Open Staging Data Execution Form.





Then Click Run Button and open Batch Form.
Click ok.







Step 9: When we will close Run Base Form the Copy Data to target button Enable.
This is the Final Step of Importing data Using CSv.





if you Click Ok. Target Data Execution Form will be open
Then click Run. it opens batch Form.
Then Click ok.




Step 10: Data Success Fully Imported.





Here We Can Check Execution History also.



As A  Developer. We  should Know About Which Forms and tables are Using.
Main Form ---->Processing Group Form
1.DMFDefinitionGroup                  --------->Form
2.DMFDefinitionGroup                  --------->Table
3. DMFDefinitionGroupDataArea -------->Table

Entities Form----->Sub Form.
1.DMFDefinitionGroupEntity.   ------->Form.
2.DMFDefinitionGroupEntity.   ------->Table.
3.DMFEntity.                                 -------->Table.

Modify Source Mapping Form.
1.DMFSourceXMLToEntityMap ------> Form.
2.DMFSourceXMLToEntityMap ------>Table.

Thursday, 22 June 2017

Args in AX

                                                               ARGS IN AX
We can Pass the Args Three ways:
1.Form to Form
2.Form to Class
3.Class to Form
1.Form to Form:
Here I am passing args from one form to another form.
I have taken two forms i.e.   
1.Na_FirstForm

2.Na_FormToForm





The First Form -------> Na_FirstForm
















Note: Here Na_FirstForm there is no Data source fields. only unbound Control fields.
Here Enter all details and click the submit button. Then we will pass the records from Na_FirstForm to Na_FormToForm.
When will we click Submit button all records added in second Form( Na_FormToForm) Data Source Table.

Step2: Here we retrieve the args in Na_FormToForm.
And here we write a method in Form Data Source Init.







àHere Second Form(Na_FormToForm)  data was Inserted.






2.Form to Class:
Here I am passing Args from Form to Class.
Here I have Taken One Form and One Class.
1.Na_FormToClass—(Form)
2. Na_GettingArgsRecords----(Class)
àHere I am inserting Data in Form and Selecting more than 2 Records. And Then click Sending Args Button.






àIn this Button Write This Code.



àAnd Then we will Retrieve the Records in class(Na_GettingArgsRecords)




àAnd Write A code In Class Main Method.



è So We Will See record in Infolog.







3.Class to Form
Here I am Passing Args from Class to Form.
I have Taken One Class and One Form.
1. Na_PassingRecords---(Class)
2. Na_ClassToForms ----(Form)





àHere We take three fields in container and then we will send Three fields to Form(Na_ClassToForm) Through Args.






è Here We will receive Fields In Form Data Source init() method. 







We can See in Form(Na_ClassToForm).

























Monday, 29 May 2017

import fixed assets through X++

Import Fixed Assets From Excel(with duplicate location, bookid, assetgroup) To AX

static void importAsset2(Args _args)
{
    Dialog                      dialog;
    Dialogfield                 dialogfield;

    SysExcelApplication         application;
    SysExcelWorkbooks           workBooks;
    SysExcelWorkbook            workBook;
    SysExcelWorksheets          workSheets;
    SysExcelWorksheet           workSheet;
    SysExcelCells               cells;

    AssetLocation               assetLocation;
    AssetGroup                  assetGroup;
    AssetTable                  assetTable;
    AssetBook                   assetBook;
    AssetBookTable              assetBookTable;

    AssetLocationId             location;
    AssetGroupId                assetGrp;
    AssetBookId                 assetBkId;
    AssetId                     assetId;
    Name                        name;
    AssetAcquisitionDate        assetAcqDate;
    AssetAcquisitionPrice       assetAcqPrice;
    AssetDepreciate             assetDepreciate;
    AssetServiceLife            assetServiceLife;
    AssetPostingProfile         assetPostingProfile;
    AssetStatus                 assetStatus;

    Filename                    fileName;
    COMVariantType              type;
    int                         row = 1   ;
    int                         recordcnt;
    str COMVariant2Str(COMVariant _cv, int _decimals = 0,int _characters = 0,int _separator1 = 0,int _separator2 = 0)
       {
            switch(_cv.variantType())
            {
                case (COMVariantType::VT_BSTR):
                    return _cv.bStr();
                case (COMVariantType::VT_R4):
                    return num2str(_cv.float(),_characters,_decimals, _separator1,_separator2);
                case (COMVariantType::VT_R8):
                    return num2str(_cv.double(),_characters,_decimals,_separator1,_separator2);
                case (COMVariantType::VT_DECIMAL):
                    return num2str(_cv.decimal(),_characters,_decimals, _separator1, _separator2);
                case (COMVariantType::VT_DATE):
                    return date2str(_cv.date(),123,2,1,2, 1,4);
                case (COMVariantType::VT_EMPTY):
                    return "";
                default:
                    throw error(strfmt("@SYS26908",_cv.variantType()));
            }
            return "";
        }

    application =   SysExcelApplication::construct();
    workBooks   =   application.workbooks();
    dialog      = new Dialog("FileOpen");
    dialogfield = dialog.addField(extendedTypeStr(Filenameopen), "File Name");
    dialog.run();

    if (dialog.run())
    {
    filename = (dialogfield.value());
    }

    //fileName    =   @"C:\Users\Sandeep.Madupu\Desktop\Mine.xlsx";
    try
    {
        workBooks.open(fileName);
    }
    catch (Exception::Error)
    {
        throw error("File Cannot be opened");
    }

    workBook    =   workBooks.item(1);
    workSheets  =   workBook.worksheets();
    workSheet   =   workSheets.itemFromNum(1);
    cells       =   workSheet.cells();

    //try
    //{
    do
    {

        row++;
        location    = cells.item(row, 11).value().bStr();
        assetGrp    = cells.item(row, 1).value().bStr();
        assetBkId   = cells.item(row, 3).value().bStr();
        assetId     = cells.item(row, 2).value().bStr();
        name        = cells.item(row, 4).value().bStr();
        assetAcqDate = cells.item(row, 6).value().date();
        assetDepreciate = str2enum(assetDepreciate,cells.item(row, 10).value().bStr());
        assetStatus = str2enum(assetStatus,cells.item(row, 9).value().bstr());
        assetPostingProfile = cells.item(row, 7).value().bstr();
        assetServiceLife = cells.item(row, 8).value().double();
        assetAcqPrice   =  cells.item(row, 5).value().double();

        ttsBegin;


        select assetLocation where assetLocation.Location == location;


        select assetGroup where assetGroup.GroupId == assetGrp;


        select assetBookTable where assetBookTable.BookId == assetBkId;


        select assetTable where assetTable.AssetId == assetId;

        select assetBook where assetBook.BookId == assetBkId;



        if(assetLocation.Location)
        {
            select forupdate assetlocation where assetLocation.Location ==  location;
            ttsbegin;
            assetlocation.location = location;
            assetlocation.name     = location;
            assetlocation.Update();
            ttscommit;

        }

        else
        {
            assetlocation.clear();
            assetLocation.initValue();
            assetLocation.Location = location;
            assetLocation.Name     = location;
            assetLocation.insert();
        }
            //assetTable.Location   = assetLocation.Location;


        if(assetGroup.GroupId)
        {
            select forUpdate assetGroup where assetGroup.GroupId == assetGrp;
            ttsBegin;
            assetGroup.GroupId  =   assetGrp;
            assetGroup.Name     =   assetGrp;
            assetGroup.Location =   assetLocation.Location;
            assetGroup.Update();
            ttsCommit;

        }

        else
        {
            assetGroup.clear();
            assetGroup.initValue();
            assetGroup.GroupId  =   assetGrp;
            assetGroup.Name     =   assetGrp;
            assetGroup.Location =   assetLocation.Location;
            assetGroup.insert();

        }

        if(assetTable.AssetId)
        {

            select forUpdate assetTable where  assetTable.AssetId    == assetId;

            ttsBegin;
            assetTable.initValue();
            assetTable.AssetId  =   assetId;
            assetTable.Name     =   name;
            assetTable.AssetGroup = assetGroup.GroupId;
            assetTable.Location   = location;
            assetTable.Update();
            ttsCommit;
        }

        else
        {
            assetTable.clear();
            assetTable.initValue();
            assetTable.AssetId  =   assetId;
            assetTable.Name     =   name;
            assetTable.AssetGroup = assetGroup.GroupId;
            assetTable.Location   = location;
            assetTable.insert();
        }



        if(assetBookTable.BookId)
        {
            select forUpdate assetBookTable where assetBookTable.BookId == assetBkId;
            ttsBegin;
            assetBookTable.initValue();
            assetBookTable.BookId = assetBkId;
            assetBookTable.Description = assetBkId;
            assetBookTable.Update();
            ttsCommit;

        }
        else
        {
            assetBookTable.clear();
            assetBookTable.initValue();
            assetBookTable.BookId = assetBkId;
            assetBookTable.Description = assetBkId;
            assetBookTable.insert();
        }





       select forupdate assetBook join  assetTable  where assetBook.AssetId == assetTable.AssetId
                                                            && assetTable.AssetId == assetId
                                                            && assetBook.BookId   == assetBkId;



        if(assetBook.BookId)
        {

            ttsBegin;
            assetBook.BookId    =   assetBookTable.BookId;
            assetBook.AcquisitionDate = assetAcqDate;
            assetBook.AcquisitionPrice = assetAcqPrice;
            assetBook.ServiceLife      = assetServiceLife;
            assetBook.PostingProfile   = assetPostingProfile;
            assetBook.Status           = assetStatus;
            assetBook.Depreciation     = assetDepreciate;
            assetBook.AssetId          = assetTable.AssetId;
            //assetBook.selectForUpdate(true);
            assetBook.Update();
            ttsCommit;

    }

        else
        {
            assetBook.clear();
            select assetBookTable where assetBookTable.BookId == assetBkId;

            select assetTable where assetTable.AssetId == assetId;

            assetBook.initValue();
            assetBook.BookId    =   assetBookTable.BookId;
            assetBook.AcquisitionDate = assetAcqDate;
            assetBook.AcquisitionPrice = assetAcqPrice;
            assetBook.ServiceLife      = assetServiceLife;
            assetBook.PostingProfile   = assetPostingProfile;
            assetBook.Status           = assetStatus;
            assetBook.Depreciation     = assetDepreciate;
            assetBook.AssetId          = assetTable.AssetId;
            assetBook.insert();
        }



        ttsCommit;

        type = cells.item(row+1, 1).value().variantType();

    }
    while (type != COMVariantType::VT_EMPTY);

        application.quit();
        workbooks.close();
        info("Done");
    }



Important Links


importing general journal using DIXF
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
https://blogs.msdn.microsoft.com/axsupport/2014/07/17/importing-a-general-journal-using-data-importexport-framework-ax-2012/


TFS
--------------------------------------
https://blogs.msdn.microsoft.com/axinthefield/why-you-should-be-using-team-foundation-server-for-dynamics-ax-lifecycle-management/


Rfresh,re-read,re search
-------------------------------------------------------------------------------------------------------------------------
https://community.dynamics.com/ax/b/mafsarkhan/archive/2010/05/26/refresh-reread-research-executequery-which-one-to-use


diff between VIEW and table
-------------------------------------------------------------------------------------------------------
http://www.geekinterview.com/question_details/29308


dmf in R2 and R3
-----------------------------------------------------------------------------------------
https://us.hitachi-solutions.com/blog/data-migration-microsoft-dynamics-ax-2012-r2-r3/



dmf/dixf
--------------------------------------------------------------
http://ax2012dixf.blogspot.com/




X++ code to Read/Write Dynamics Ax data to excel
--------------------------------------------------------------------------------------------
http://learnax.blogspot.com/2010/01/x-code-to-readwrite-dynamics-ax-data-to.html

https://dynamicsaxinsight.wordpress.com/2015/03/25/ax-2012-off-the-shelf-excel-reader/



dynamicsw 365
================================================
http://axguide.blogspot.in/


Dialog Runbase Example in AX 2012
------------------------------------------------------------------------------
http://axhelper.blogspot.com/2014/02/dialog-runbase-example-in-ax-2012.html


interview questios
------------------------------------------------------------------------
http://arsalanax.blogspot.com/2012/01/dynamics-ax-technical-consultant.html



Custom AIF Service in Dynamics Ax 2012 R3 from Scratch.
--------------------------------------------------------------------------------------
http://www.tech.alirazazaidi.com/custom-aif-service-in-dynamics-ax-2012-r3-from-scratch/





How to make Relation in Extended Data Type and add 'View Details' for field on a form in AX 2012
------------------------------------------------------------------------------------------------------------------------------
http://axvuongbao.blogspot.in/2013/09/how-to-make-relation-in-extended-data_19.html




Run, Save and Email Purchase order report through X++ code
=======================================================================
http://theaxapta.blogspot.in/2015/01/run-save-and-email-purchase-order.html



passing parameters between forms in AX
-------------------------------------------------------------------------
https://calebmsdax.wordpress.com/2013/02/22/passing-parameters-between-forms-in-ax/



Add Controls to the Filter Pane
-------------------------------------------
https://msdn.microsoft.com/en-us/library/cc577231.aspx



workflow
---------------------------
http://dynamicsaxforum.blogspot.in/2014_07_01_archive.html


Custom Workflow from scratch, Dynamics Ax 2012
------------------------------------------------------
http://www.tech.alirazazaidi.com/custom-workflow-from-scratch-dynamics-ax-2012/



SSRS Reports
------------------------------------------------------------------------------------------------------
https://stoneridgesoftware.com/report-parameters-in-dynamics-ax-2012-ssrs-reports/

https://axssrsguide.wordpress.com/

https://ax2012anant.blogspot.com/2015/02/developing-ssrs-report-using-report.html

https://community.dynamics.com/ax/b/dynamics101trainingcenterax/archive/2013/09/16/developing-a-ssrs-report-using-the-report-data-provider-in-microsoft-dynamics-ax-2012

http://dynamics-resources.com/ssrs-tutorial-2/

https://community.dynamics.com/ax/b/faisalfareedaxlibrary/archive/2014/12/27/rdp-contract-ui-builder-and-controller-classes-for-ssrs-report-development







Friday, 3 February 2017

validations for date ranges(fromdate and todate) in ssrs report

validations for date ranges(fromdate and todate) in ssrs report .That date ranges are

report parameters and we will give the dates dynamically. So I want to do like this,

"fromdate "  should be less than "todate" and "todate" should be greater than

"fromdate".




 Create Contract class

[

DataContractAttribute,

SysOperationContractProcessingAttribute(classStr(SL_SimpleDateLookUIBuilder),

SysOperationDataContractProcessingMode::CreateUIBuilderForRootContractOnly),

]

class SL_SimpleDateLookContract  implements SysOperationValidatable

{

StartDate                   startDate;

EndDate                     endDate;

}

we need to create the parm method in the contract class.

2: Create parmStartDate Method

[

DataMemberAttribute(‘startDate’),

]

public StartDate parmStartDate(StartDate _fromDate = startDate)

{

startDate = _fromDate;

return startDate;

}

3: Create parmEndDate Method

[

DataMemberAttribute(‘endDate’),

]

public EndDate parmEndDate(EndDate _toDate = endDate)

{

endDate = _toDate;

return endDate;

}

4: Create Validate method

validation for check correct date

/// <summary>

/// Validates the SSRS report parameters.

/// </summary>

/// <returns>

/// true if successful; otherwise, false.

/// </returns>

public boolean validate()

{

boolean ret = true;

if (startDate && endDate

&& (startDate > endDate))

{

ret = checkFailed(“@SYS16982”);

}

return ret;

}
remove UI builder code