Showing posts with label dynamics ax. Show all posts
Showing posts with label dynamics ax. Show all posts

Saturday, March 9, 2019

concept of extensions d365

concept of extensions d365

An extension is a way to add functionality to an object in D365FO without modifying the base code of that object.  

Your extensions are compiled into their own DLLs, which are separate from the D365 base system libraries. It also makes it easier for Microsoft to patch their sys layer code.

Microsoft has added to allow customizations without allowing the base code to be changed, because they plan to not allow any overlayering of SYS layer code. 

https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/extensibility/customization-overlayering-extensions

thanks,
Vikas Mehta.

Wednesday, August 22, 2018

ECORESCATEGORY Table in Dynamics-SSC -Vikas Mehta MULTISELECT

ECORESCATEGORY Table in Dynamics-SSC

Query to get the ecorescategory branches and nodes in ax 2012 

  this.parmQuery().dataSourceTable(tablenum(EcoResCategory), 1).clearRanges();
        categoryBuildRange = this.parmQuery().dataSourceTable(tablenum(EcoResCategory), 1).addRange(fieldnum(EcoResCategory, RecId));

        categoryEnum = category.getEnumerator();
        while (categoryEnum.moveNext())
        {
            categoryRecid = categoryEnum.current();
            select ecoResCategory where ecoResCategory.RecId == categoryRecid;
            currentLevel = ecoResCategory.Level;
            lowestlevel = ecoResCategory.getLowestLevel();
            categoryHierarchy = ecoResCategory.CategoryHierarchy;
            while(currentLevel <= lowestlevel)
            {
            while select ecoResCategoryChild where ecoResCategoryChild.CategoryHierarchy == categoryHierarchy
                                                && ecoResCategoryChild.Level ==  currentLevel
            {
                categoryRecid = ecoResCategoryChild.RecId;
                while select * from ecoResCat
                    order by ecoResCat.NestedSetLeft
                    where   ecoResCat.CategoryHierarchy == ecoResCategoryChild.CategoryHierarchy
                            && ecoResCat.NestedSetLeft  <= ecoResCategoryChild.NestedSetLeft
                            && ecoResCat.NestedSetRight >= ecoResCategoryChild.NestedSetRight
                {
                    if(ecoResCategory.RecId == ecoResCat.RecId)
                    {
                        select * from ecoResCategoryisLeaf
                            order by ecoResCategoryisLeaf.Name
                            where   ecoResCategoryisLeaf.CategoryHierarchy == ecoResCategoryChild.CategoryHierarchy
                             && ecoResCategoryisLeaf.ParentCategory  == ecoResCategoryChild.RecId
                                && ecoResCategoryisLeaf.IsActive == true;

                        if(!ecoResCategoryisLeaf)
                        {
                            allCategory.addEnd(categoryRecid);
                        }
                        break;
                    }
                }
            }
            currentLevel++;
        }


        }
 

Item lookup of ecorescategory in ui builder class

private void itemLookup(FormStringControl _control)
{
    Query query;
    QueryBuildDataSource qbdscategory,qbdsProductCategory,qbdsInvent,qbdsEcoProduct;
    container brandCon;
    int counter;
    RecId brandCategoryRecid,categoryRecid,segmentRecid;
    EcoResCategory category,segmentCategory;
    ;
    query = new query();
    qbdsInvent = query.addDataSource(tableNum(InventTable));
    qbdsEcoProduct = qbdsInvent.addDataSource(tableNum(EcoResProduct));
    qbdsEcoProduct.relations(false);
    qbdsEcoProduct.addLink(fieldNum(EcoResProduct,RecId),fieldNum(InventTable,Product));

    qbdsProductCategory = qbdsEcoProduct.addDataSource(tableNum(EcoResProductCategory));
    qbdsProductCategory.relations(false);
    qbdsProductCategory.addLink(fieldNum(EcoResProduct,RecId),fieldNum(EcoResProductCategory,Product));

    qbdscategory = qbdsProductCategory.addDataSource(tableNum(EcoResCategory));
    qbdscategory.relations(false);
    qbdscategory.addLink(fieldNum(EcoResProductCategory,Category),fieldNum(EcoResCategory,RecId));

 ECORESCATEGORY LOOKUP MULTISELECT

public void categoryLookup()
{
    Query           query = new Query(querystr(ProcCategoryEcoResCategory));
    int             mutiSelectTableNum = tablenum(EcoResCategory);

    container selectedFields = [mutiSelectTableNum, fieldname2id(mutiSelectTableNum, fieldstr(EcoResCategory, Name))];

    SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), categoryField.control(), query, false, selectedFields);
}

Wednesday, November 8, 2017

AX DEBUGGER NOT OPENING : DYNAMICS AX DEBUGGER IS BLANK BREAKPOINT

AX DEBUGGER NOT OPENING : DEBUGGER IS BLANK

Many a times we have faced a problem that, when we try to debug our X++ code, we simply put break points in our code and run the functionality, but it happens that the AX debugger opens but with a blank screen and the break point is not called.
So to overcome this issue,here are the few things that needs to be checked in order to properly run the debugger.

Make sure that enable breakpoint on server configuration as well as client configuration is checked.
On development environment, go to Tools--> Options--> Development. Make sure that the Debug mode is set to "When Breakpoint".
Make sure that the user must belong to the Microsoft Dynamics AX Debugging Users local group on the computer.

If not added, add the user to this group. After being added to the group, you'll need to logout of your windows session and log back in. Once you log back in, open AX, set your breakpoints, run your process and see if things work out for you.


Thursday, November 10, 2016

DIALOG AND GET VALUE FROM DIALOG BOX USING AXAPTA X++ DYNAMICS AX

DIALOG AND GET VALUE FROM DIALOG BOX USING AXAPTA
Below is a Code how  to add dialog and get value from dialog box in dynamics Axapta. This is very simple you just need to create one method which is overridden method is dialog. Dialog method used to initialized dialog box for your form or report but without using get from dialog method you can not get value of dialog control.

So both method is important dialog and getfromdialog.

 public Object dialog(Object _dialog)
 {
 DialogRunbase dialog = _dialog;
 DialogGroup dateGroup;
 ;
 dateGroup = dialog.addGroup("");
 dateGroup.frameType(1);
 dateGroup.columns(2);
 fromdate = LedgerPeriod::findOpeningDate(systemdateget());
 toDate= systemdateget();
 dialog.addGroup("@SYS4083",dateGroup);
 dialogFromDate = dialog.addFieldValue(typeid(FromDate),fromDate,'',"@SYS67");
 dialog.addGroup("@SYS8828",dateGroup) ;
 dialogToDate = dialog.addFieldValue(typeid(ToDate),toDate,'',"@SYS67");
 dialog.addGroup("@SYS24500");
 dialogPageChange = dialog.addFieldValue(typeid(NoYes),pageChange,"@SYS15349","@SYS24755");
 dialogResetPage = dialog.addFieldValue(typeid(NoYes),resetPage,"@SYS9358","@SYS24756");
 dialog.addGroup("@SYS12608");
 dialogDetailSummary = dialog.addFieldValue(typeid(DetailSummary),detailSummary,'',"@SYS24757");
 dialogNoneBeginTransEnd = dialog.addFieldValue(typeid(NoneBeginTransEnd),noneBeginTransEnd,
 "@SYS1046","@SYS69638");
 dialogIncludeOpening = dialog.addFieldValue(typeid(NoYes),includeOpening,"@SYS23250","@SYS54008");
 dialogIncludeClosing = dialog.addFieldValue(typeid(NoYes),includeClosing,"@SYS14844","@SYS82258");
 dialog.addGroup("Opening Balance Account");
 dialogOpeningBalance = dialog.addField(typeId(LedgerAccount)
 ,"Opening Balance Account");
 return dialog;
 }
 public boolean getFromDialog()
 {
 ;
 fromDate = dialogFromDate.value();
 toDate = dialogToDate.value();
 detailSummary = dialogDetailSummary.value();
 pageChange = dialogPageChange.value();
 resetPage = dialogResetPage.value();
 noneBeginTransEnd = dialogNoneBeginTransEnd.value();
 includeOpening = dialogIncludeOpening.value();
 includeClosing = dialogIncludeClosing.value();
 OpLedgerAccount = dialogOpeningBalance.value();
 return true;
 }  

DYNAMICS AX CREATE CUSTOM NUMBER SEQUENCE X++ CODE SAMPLE

|| DYNAMICS AX NUMBER SEQUENCE ||

Suppose we want create number sequence for Test field on form in General  ledger module
Consideration: EDT-Test, Table-NumSeqTable and Form- NumSeqTable

Step1. Create new EDT with name Test
Step 2. Modify load module() method on  NumberSeqModuleLedger class

{
     datatype.parmDatatypeId(extendedTypeNum(Test));
     datatype.parmReferenceHelp(literalStr("Test"));
     datatype.parmWizardIsManual(NoYes::No);
     datatype.parmWizardIsChangeDownAllowed(NoYes::No);
     datatype.parmWizardIsChangeUpAllowed(NoYes::No);
     datatype.parmWizardHighest(999);
     datatype.parmSortField(30);
     datatype.addParameterType(NumberSeqParameterType::DataArea, true, false);
     this.create(datatype);
}

Step 3.Create a method on LedgerParameters Table

     client server static NumberSequenceReference numRefTest()
{
     return NumberSeqReference::findReference(extendedTypeNum(Test));
}

Step 4.Write and run following job

static void NumberSeqLoadAll(Args _args)
{
         NumberSeqApplicationModule::loadAll();
}


Step 5.Then run the wizard

Organization Administration -> CommonForms -> Numbersequences->Numbersequences-> Generate -> run the wizard.

Step 6.Now we have to check the number sequence  is correctly working  for that write a job:

static void NumSeq(Args _args)
{
    NumberSeq  numberSeq;
    Test num;
    ;
    numberSeq = NumberSeq::newGetNum(ProjParameters:: numRefTest ());
    num = numberSeq.num();
    info(num);
}


Step 7.Now we want that Number Sequence in form level(Test Table):


 Write below code in class declaration  
public class FormRun extends ObjectRun
{
    NumberSeqFormHandler numberSeqFormHandler;

}

 Step 8.Write the NumberSeqFormHandler() in form methods node.

NumberSeqFormHandler numberSeqFormHandler()
{
    if (!numberSeqFormHandler)
    {
       numberSeqFormHandler = NumberSeqFormHandler::newForm(LedgerParameters:: numRefTest ().NumberSequenceId,
                                                             element,
                                                             NumSeqTable_DS,
                                                             fieldNum(NumSeqTable, Test)
                                                            );
    }
    return numberSeqFormHandler;
}


Step 9.Write the  Create(),Delete(),Write() , Validate Write(),Link Active() on the Data source methods node.
 Create() Method
void create(boolean append = false,
            boolean extern = false) 
{
    element.numberSeqFormHandler().formMethodDataSourceCreatePre();

    super(append);

    if (!extern)
    {
        element.numberSeqFormHandler().formMethodDataSourceCreate(true);
    }
}

Delete() Method

public void delete()
{
    element.numberSeqFormHandler().formMethodDataSourceDelete();
    super();
}

Write()Method

public void write()
{
    super();
    element.numberSeqFormHandler().formMethodDataSourceWrite();
}



Validate Write() Method

public boolean validateWrite()
{
    boolean         ret;
    ret = super();
    ret = element.numberSeqFormHandler().formMethodDataSourceValidateWrite(ret) && ret;
    if (ret)
    {
        NumSeqTable.validateWrite();
    }
    return ret;
}

Link Active() Method

public void linkActive()
{
    ;
    element.numberSeqFormHandler().formMethodDataSourceLinkActive();
    super();
}
Step 10.Finally add Close() method on form 
void close()
{
    if (numberSeqFormHandler)
    {
        numberSeqFormHandler.formMethodClose();
    }
    super();
}


Related Posts Plugin for WordPress, Blogger...