Microsoft_MVP_banner

D365O – How to add financial dimension in grid

This post outlines the steps; how to add financial dimensions (segmented control) in a grid in D365O. Let’s assume we are adding new table and form for below explanation; New table contains two fields AccountType and LedgerDimension with relation to DimensionAttributeValueCombination table  Form looks like this; Set properties for segmented control under form design; – Auto declaration = Yes – Account type field = AccountType – Controller class = DimensionDynamicAccountController – Filter expression = %1 1. Override modified method for LedgerDimension field under form’s datasource 2. Override lookup and checkUserCustomLookup method on ledger dimension segmented control in form desgin Datasource | D365O_FinancialDimension | LedgerDimension | modified [DataSource]     class D365O_FinancialDimension     {         [DataField]         class LedgerDimension         {             void modified()             {                 super();                 D365O_FinancialDimension_ds.refresh();             }         }     } Desgin | D365O_FinancialDimension_LedgerDimension | lookup         public void lookup()         {             switch (D365O_FinancialDimension.AccountType)             {                 case LedgerJournalACType::Bank:                     BankAccountTable::lookupBankAccount(this);                     break;                 case LedgerJournalACType::Cust:                     CustTable::lookupCustomer(this);                     break;                 case LedgerJournalACType::FixedAssets:                     AssetTable::lookupAccountNum(this);                     break;                 case LedgerJournalACType::Project:                     ProjTable::lookupProjId(this, D365O_FinancialDimension);                     break;                 case LedgerJournalACType::Vend:                     VendTable::lookupVendor(this);                     break;                 default:                     super();                     break;             }         } Desgin | D365O_FinancialDimension_LedgerDimension | checkUserCustomLookup public boolean checkUseCustomLookup(int _accountTypeEnumValue, int _secondaryAccountTypeEnumValue)         {             boolean returnValue;                         LedgerJournalACType accountType = any2Enum(_accountTypeEnumValue);             switch (accountType)             {                 case LedgerJournalACType::Bank:                 case LedgerJournalACType::Cust:                 case LedgerJournalACType::FixedAssets:                 case LedgerJournalACType::Project:                 case LedgerJournalACType::Vend:                     returnValue = true;                     break;                 default:                     returnValue = false;                     break;             }                         return returnValue;         } Set D365O_FinancialDimensions form as startup object and run the form. If you just want to see MainAccount in segmented control. set the segmented control property Is default account = True

D365O – Import CSV data through Data entity

Data entity is a new concept comes with D365O release where each entity related data can be accessed from a single view. A data entity is an abstraction from the physical implementation of database tables. For example, customer related data is stored in different tables in AX which could be customer address (access from  LogisticsPostalAddress), customer name (access from DirPartyTable), and customer electronic address (access from LogisticsElectronicAddress). Complete details are well explained here  https://ax.help.dynamics.com/en/wiki/data-entities/ Let’s create new data entity to import data from a CSV file, this data entity uses only one table to keep it simple. My following posts will show how to import data into through data entities using multiple tables. Create a new table [Optional step] I created a new table for this example. Create new data entity Method 1: Method 2: Add new item for Data entity Provide table as primary datasource Click Next and mark convert labels to field names Data entity will look like this in Visual Studio With both above methods (whatever you choose) it created few artifacts in your project. – data entity – security privileges – staging table Build your project Press Ctrl + Shift + B or Right click on project and Build Synchronize your tables by Right click on project and Sync  Validate staging table properties Set the configuration key to DMF and all other properties should be same as set below. Import data using this data entity System administration | Data management Provide a name, choose data source as CSV, and select entity name from the list. Upload file to import. My sample file has this data 101, Faisal 102, Fareed 103, Mohammad It prompts with fields mapping error Click on View map and connect fields as shown Refresh page to view this screen and click Run project. Follow next few prompts and execute the batch job to import data into the staging table, verify data in the staging table. Import data into the target which will change the transfer status to completed. Open DataImport data from table browser to see data. This data entity creates view in SQL server, you can even play around with the created view in SQL server. Refernces: https://ax.help.dynamics.com/en/wiki/building-and-consuming-data-entities/

AX 2012 : Add/Remove Dynalink through X++

DynaLinks can be removed and added between datasources on form using this code; ClearDynaLinks() will remove all existing dynaLinks [these can be seen by right click on the click > Personalise > Query tab > under dataSource node AddDynalink() method has three parameters; 1. Source table field 2. Destination table 3. Destination table field The following code is implemented in the Click event of a button. void clicked() {     SalesQuotationLine_ds.query().dataSourceNo(1).clearDynalinks();     SalesQuotationLine_ds.query().dataSourceNo(1).addDynalink(fieldNum(SalesQuotationLine, QuotationId),                                                          SAB_DocQuoteGroupRelation,                                                          fieldNum(SAB_DocQuoteGroupRelation,SalesQuotationId));          }

Microsoft Dynamics 365 for Operations – Number sequence

Number sequence framework in there for a while with the release of AX 2012 however, with the arrival of D365 we need to make a small addition on top of what we have been doing in AX 2012. Following my previous, post How to generate number sequence for new module in AX 2012 all steps remain same as summarizing below to generate number sequence for the newly developed module.  1. Create a new class similar to NumberSeqModuleCust but suffix it with your module name e.g. NumberSeqModuleMyModule extended from NumberSeqApplicationModule 2. Added loadModule() method 3. Add numberSeqModule() method with your new added enum value (for your module) in NumberSeqModule_extension (You should create an extension of NumberSeqModule base enum and not customizing it and add new element for your module into that extension) 4. This is an additional step for D365 you would need to perform otherwise it will claim “The value does not exist in the map”. Create a new delegate method to class NumberSeqGlobal which will append the current class to the map that links modules to number sequence data type generators. [SubscribesTo(classstr(NumberSeqGlobal),delegatestr(NumberSeqGlobal,buildModulesMapDelegate))] static void buildModulesMapSubsciber(Map numberSeqModuleNamesMap) { NumberSeqGlobal::addModuleToMap(classnum(NumberSeqModuleMyModule), numberSeqModuleNamesMap); } 5. Continue with executing the job to loadAll numberSequences and Generate it from Organization module as mentioned in previous post

MS D365 – Development Exam – A brief outlook

Having passed the Microsoft Dynamics 365 Development Introduction exam (MB6-890), here are few thoughts on the exam which might help someone who is planning to appear in this exam. If you are an experienced AX developer and have worked on AX 2012 – you don’t need to worry. Having said this “You don’t need to worry”, It would be the wiser step to watch all videos from https://mbspartner.microsoft.com/AX/CourseOverview/1181. You can visit the Microsoft Dynamics Learning Portal and access it via your CustomerSource Account or PartnerSource Account. The exam will consist of 90 Questions and you will have 115 minutes to complete. Brief outlook of the exam; 1. Basic X++ knowledge – For , do…while and while loops understanding and code flow 2. Extended data types – what properties can be extended from parent EDT 3. Menu item properties – key properties of menu items 4. Types of menu items and which one used for what purpose 5. Base enumeration – how these get stored in database 6. Table relationship and indexes 7. Class inheritance – spend more time on this topic (worth to read https://ax.help.dynamics.com/en/wiki/xpp-classes-and-methods/)  8. Best practices and advantages of creating labels instead hard code text 10. Understand Application stack and Server architecture 11. Update model dependencies  12. Check Break statement in switch cases 13. Exception handling 14. How to check properties of an element in Visual Studio 15. Security structure in AX 16. Form Patterns https://ax.help.dynamics.com/en/wiki/how-to-select-a-form-pattern/ 17. See ttsbegin and ttsCommit statement in insert statements 18. Naming convention – check camelCase naming convention 19. How to configure build option in Visual Studio 20. Projects, model and Packages 21. Use of resources Additionally and the most important step towards success is; Download D365 virtual machine (link) and practice with creating a small project. This really gives you hands-on experience rather purchasing dumps. Get yourself registered for the exam; https://www.microsoft.com/en-sa/learning/exam-mb6-890.aspx For list of Microsoft Dynamics Certifications https://www.microsoft.com/en-sa/learning/dynamics-certification.aspx Finally, If you ever need any help from my side please feel free to contact me. Wish you best of luck!!! Happy Dax!ng

MS Dynamics 365 – Create Model and Project – Development Part 1

This post describes how to create model with correct selection of package which leads to correct development approach either Extension or Overlayering (Customization) Go to Dynamics 365 or AX7 | Deploy | Create model Enter required information as shown Choose correct package If you decided to go with overlayering, existing package will be selected from dropdown.   Select referenced packages For this example; I will go with extension development approach, it is easy to upgrade with new versions or updates coming from MS. Marked all required packages (models) which can be referenced through your new created model. Through these references, you can actually use the element living in those packages (models), without these references you cannot access any element belongs to a different model. Lets’ say you want to access CustTable which belongs to Application Suite package then you have to checked Application Suite package in referenced package list. Create model Summary Create new project option will open a new window where you can put the project name linked with this model. NOTE: A project can only be linked with one model Project created in Visual Studio Update model parameters You may require updating model parameters by adding more reference packages. This can be done as follows; Select model name to update Add or remove reference packages  Click Next will take you model summary screen and will update the project in Visual Studio with updated references.

MS Dynamics 365 – Configure Visual Studio for better expereince

Few settings to configure in Microsoft Visual Studio to make the development experience with AX a little smoother. Go to Dynamics 365 Options Set Projects Options – organize project by element type Set Text Editor Options – Line number and word wrap Set Best practice options The definition of best practice rules set is per model, by default it is set to Application Common model and can be switched between the different model from the combo box in the upper right corner. For example; to work with Customization Analysis you have to check Microsoft.Dynamics.AX.Framework.CustomizationAnalysisRules best practice rule.  Build process itself does BP checking – there is an option to enable it. [To take into effect you might have to rebuild the solution/project in contrast to we usually do – build].

MS Dynamics 365 – Configure Visual Studio for better expereince

Few settings to configure in Microsoft Visual Studio to make the development experience with AX a little smoother. Go to Dynamics 365 Options Set Projects Options – organize project by element type Set Text Editor Options – Line number and word wrap Set Best practice options The definition of best practice rules set is per model, by default it is set to Application Common model and can be switched between different models from the combo box in the upper right corner. Let’s say if you are working with Customization Analysis you have to check Microsoft.Dynamics.AX.Framework.CustomizationAnalysisRules best practice rule. Set BP rules at Build level Build process itself does BP checking – there is an option to enable it. To take this into effect you might have to rebuild the solution/project rather build it.

AX 2012: How to use JumpRef method

JumpRef method is mostly used with fields which are not linked with an EDT however,  this depends on the design of the code and the requirement. I got a requirement to show ‘View Details’ options to the field of type notes (memo). There can be multiple ways to accomplish it but its always better to have your code at a central location (best to have it in Class or at table level) to reuse it. JumpRef method can be overridden at form level under control itself but we are not going to do [avoid code changes at form level] Better to override JumpRef method at datasource field level and call method from table. JumpRef Method: public void jumpRef() {     JumpRef::peformJumpRef(JumpRef.Notes); } PerformJumpRef method at table static void peformJumpRef(Notes _notes) {     MenuFunction    menuFunction;     Args            args = new Args();              DocumentNotes   documentNotes; // This is the table of the master where view details option will take you. Change table name here, this is just for sample     ;     if (_notes)     {         documentNotes = DocumentNotes::find(_notes);     }     args.record(documentNotes);     args.lookupRecord(documentNotes);          menuFunction = new MenuFunction(menuitemDisplayStr(DocumentNotes), MenuItemType::Display);     menuFunction.run(args); }

FaisalFareed@2025. All rights reserved

Design by T3chDesigns