Monday, August 4, 2014

What's new in Microsoft Dynamics AX 2012 R3


Microsoft Dynamics AX 2012 R3 comes out with new and changed features. Below are the major topic lists of feature changes by module.

S.No
Module
Changes
1
                  Call center


·         A new retail channel type is added: call center. In a call center, workers take customer orders over the phone and create sales orders. Call centers can be added to organization hierarchies, and can be managed together with online stores and retail stores.
·         You can create catalogs for call centers, and use new catalog features.
·         You can prompt the clerk who enters sales orders to up-sell or cross-sell products.  
2
General ledger


·          You can transfer the opening balances for balance sheet accounts to a new fiscal year in multiple companies at the same time.
·          The results of the accounting entries for stocked items on product receipts and vendor invoices are combined into one sub ledger journal entry and voucher.

3
Inventory and warehouse
management


·         The Compare item prices report lets you compare the prices in a costing version to the pending prices in another costing version, or to the active prices on an effective date.
·         The Inventory aging report displays the on-hand quantity, the inventory value, and the related aging periods for a selected item or an item group. You can use the report parameters to filter the data that is displayed on the report.

4
Master Planning

Demand
forecasting is a set of tools that enable you to estimate future demand and create demand forecasts based on historical transaction data.
The demand forecasting process includes the following tasks:
·         Complete the prerequisite setup tasks before you can use demand forecasting.
·         Create a baseline forecast from historical demand data that is gathered and loaded in a Microsoft SQL Server Analysis Services cube.
·         Open the demand forecast file, and use the PivotTable tools in Excel to filter and display the forecast data that is stored in the cube.
·         Optional: Make manual adjustments to the forecasted quantities in the demand forecast file.
·         Import a demand forecast to Microsoft Dynamics AX so specific companies and forecast models can use the forecast data as input to master planning.

5
       Procurement and sourcing


·         You can create your own solicitation types for requests for quotation (RFQs). This feature lets you match the procurement requirements for your organization. You can filter on those categories to find documents more easily.
·         Each line in an RFQ is assigned a number. You can add items and renumber the list as you require. The numbers appear in all the RFQ-related documents.
·         You can quickly add vendors for your RFQ who are approved for selling at least one of the categories on the RFQ lines.
·         You can publish your RFQ to the public Vendor portal, so that unregistered vendors can see it. All lines on the RFQ are also sent to the vendors that are selected in the RFQ.

6
Production control


·         A new option for automating material reservations has been added to the Reservation field in the Production orders form, where the value is set for a specific production order. A new option has also been added to the Production control parameters form, where the default value is specified.
In the Reservation field, if you select Release, all materials are reserved when the production order is released.

7
Project management and accounting


·          You can create an on-account billing rule type that is based on the milestones that you specify in the billing rule.
·          You can create fee transactions and modify the sales price of lines in an invoice proposal.

8
Public Sector


·         You can publish a request for quotation (RFQ) to the public Vendor portal, so that unregistered vendors can view it.
·         Public sector vendors can view all open and closed purchase orders, RFQs, and their details.

9
Retail

·         The call center is a new channel type that you can set up in the Retail module.
·         The Catalogs form contains functionality that is available to users who are associated with a call center.
·         Gift card enhancements are added. KITS functionality has been added.
·         The Retail loyalty program has been completely redesigned.

10
           Sales and marketing


·         You can now also register serial numbers during the sales process when you prepare the packing slip or the invoice for a sales order.
·         You can register serial numbers on the packing slip or invoice either by entering them manually or by using a scanner.

The following list illustrates some of the scenarios that this feature is intended for:
·         Registering serial numbers for items on sales orders on the packing slip or invoice.
·         Customer pickup of sales orders with serialized items.
·         Partial delivery and invoicing of sales orders with serialized items.
·         Correcting packing slips and invoices with serialized items.
·         Returning serialized items.
·         Tracing the history of orders that include serialized items.

11
Trade allowance management


·         You can define merchandising events, assign a trade allowance to them, and manage customers, invoices, or vendors that are related to the agreement.
·         You can manage your trade fund budgets so that they include specific merchandise, promotion dates, and monetary values.
·         You can process customer payments that include deductions.

12
Transportation management


·         You can plan transportation for inbound and outbound shipments, manage routes, and consolidate shipments.
·         You can configure rating structures and shop for rates, based on charges such as fuel and customs duties.
·         You can view driver check-in and check-out history and driver logs.

13
         Warehouse management


·         You can configure inbound and outbound intelligent workflows.
·         You can assign orders to clusters to pick from a single location, and configure profiles to control the validation and packing of items into shipping containers. You can also alternate between picking strategies for batch and non-batch items.
·         You can set up container groups to order the sequence of the packing process and create templates to support packing strategies.
·         You can use scanners or other mobile devices to optimize precision in the picking and put-away processes.

Wednesday, February 26, 2014

Flushing AOS cache without AOS restart


Below link explains this.Please go through this.

Top 10 issues discovered from Dynamics AX Code Review

Hello All,

Below is MS blog that talks about top 10 issues during Ax development. I assume many of us has come across these at some or other time.
Thought of sharing it with larger audience. Please go thru it whenever you have time. I must say it should help us immensely.
And thereby become more aware and alert during Ax development/customizations J


Wednesday, January 15, 2014

Compare objects among 2 or more layers in Ax2012


Sometime we might like to find objects existing in two or more  layers i.e. layer 1 AND layer 2. Out of box we have a feature of creating a project for objects present in specific layers i.e. layer 1 OR layer 2.
So with below job you can build on this standard feature thereby finding common objects i.e. objects present in all(AND condition) the specified layers only.


Note : If you try to iterate whole AOT thru code it becomes performance intensive hence not advisable to do it. So always create one project and then further work on it. 

static void listAllObjectosFromProject(Args _args)
{

  ProjName                         projName = "CompilerOutput"; // Specify your project area name here

  ProjectListNode                  list = infolog.projectRootNode().AOTfindChild("Shared");

  TreeNodeIterator                 ir = list.AOTiterator();
  ProjectNode                      pnProj,projectNode;
  ProjectNode                      pn = list.AOTfindChild(projName);
  SetEnumerator                    setEnumerator;
  Set                              set;
  container                       layers;
  #define.ProjectName("Compileroutput_Sub") // Sub project Name. You may like to change it as per you like.


   void searchAllObj(projectNode rootNode)
    {
    #TreeNodeSysNodeType

    TreeNode          childNode;
    TreeNodeIterator  rootNodeIterator;
    ;

    projectNode = SysTreeNode::getPrivateProject().AOTfindChild(#ProjectName);
    if(!projectNode)
    {
        projectNode = SysTreeNode::createProject(#ProjectName,ProjectSharedPrivate::ProjPrivate);
    }

    if (rootNode)
    {
      rootNodeIterator = rootNode.AOTiterator();
      childNode = rootNodeIterator.next();
      while (childnode)
      {

        if (childNode.treeNodeType().id() == #NT_PROJECT_GROUP)
         searchAllObj(childNode);

        else
          {
            //info(strfmt("Group :%1 - Object: %2", rootNode.AOTname(), childNode.AOTname()));
            set = childNode.AOTLayers(false);

            setEnumerator = set.getEnumerator();
            layers = conNull();

            while(setEnumerator.moveNext())
            {
               layers = layers +enum2Symbol(enumName2Id('UtilEntryLevel'),setEnumerator.current());

            }

            if(confind(layers,'syp') && confind(layers,'usr')) // Put your layers here in which you want to check objects
            {


                info(strFmt('Name: %1, Layers: %2', childNode.AOTname(),con2Str(layers) ));

                projectNode.addNode(childNode);
                projectNode.AOTsave();

            }


        }
          childNode = rootNodeIterator.next();
    }
  }
}





  if (pn)
  {
    info(strFmt("Project %1:", projName));
    pnProj = pn.loadForInspection();
    searchAllObj(pnProj);
    pnproj.treeNodeRelease();
  }
  else
    info("Projet objects");

}

Monday, January 13, 2014

Finding out which tables were updated by an operation in AX 2012

Hello All,

Many a times we simply wants to know what all tables get updated during an operation in Ax. Here is link which shows how to do it in most simplest way.


Microsoft Dynamics AX R3 Training Blitz - Event Invitation

Hello All,

You may like to keep your updated with what is coming up on Dynamics Ax front! Here is link which outlines Microsoft online training/info program for Dynamics Ax 2012 R3.



Please do register for the same.

Dynamics Ax Tips.

Hello All,

Below is link that talks about some nice tips on Dynamics Ax.

http://www.dynamicstips.com/dynamics-ax/getting-started-with-dynamics-ax-2012-getting-crafty-with-formulas/



Thursday, January 2, 2014

How To Iterate all the fields of a table in Ax2012 using x++ code.

In my recent implementation I was having one requirement in this I had to retrieve all the fields of a table and then on certain criteria I had to update these fields in another table. I could do this sing If-else condition but it requires lot of code. So I did it in a better way.

public void updateEstimatesFromCase()
{
    CopyEstimates                   copyEstimates;
    SysDictTable                    dictTable;
    SysDictTable                    caseDictTable;
    SysDictTable                    activityDictTable;
    SysDictField                    dictField;
    SysDictField                    caseDictField;
    SysDictField                    activityDictField;
    FieldId                         fieldId;
    FieldId                         caseFieldId;
    FieldId                         activityFieldId;
    CaseDetailBase                  caseDetailBase = caseDetailBase::find(this.caseId());
    CaseTimeEstimatesTable          caseTimeEstimatesTable;
    ActivityTimeEstimatesTable      activityTimeEstimatesTable;
    ActivityTimeEstimatesTable      buffer;
    ;

    select firstonly caseTimeEstimatesTable
        where caseTimeEstimatesTable.CaseDetailBase == caseDetailBase.RecId;

    select firstOnly activityTimeEstimatesTable
        where activityTimeEstimatesTable.smmActivities == this.smmActivities;

    buf2Buf(buffer,activityTimeEstimatesTable);
    if (activityTimeEstimatesTable.RecId)
    {
        activityTimeEstimatesTable.selectForUpdate(true);
        activityTimeEstimatesTable.update();
    }
    caseDictTable = new SysDictTable(caseTimeEstimatesTable.TableId);
    dictTable = new SysDictTable(this.TableId);
    fieldId = dictTable.fieldNext(0);


    while (fieldId)
    {
        dictField = dictTable.fieldObject(fieldId);
        if (dictField.isSql() && !dictField.isSystem())
        {
            activityTimeEstimatesTable.smmActivities = this.smmActivities;
            if (this.(fieldId) && fieldId != fieldNum(copyEstimates, smmActivities))
            {

                caseFieldId = fieldName2id(tableNum(CaseTimeEstimatesTable),dictField.name());
                activityFieldId = fieldName2id(tableNum(ActivityTimeEstimatesTable),dictField.name());
                activityTimeEstimatesTable.(activityFieldId) = caseTimeEstimatesTable.(caseFieldId);
                if (activityTimeEstimatesTable.RecId)
                {
                    activityTimeEstimatesTable.selectForUpdate(true);
                    activityTimeEstimatesTable.update();
                }
                else
                {
                    activityTimeEstimatesTable.insert();
                }
            }
    }
        fieldId = dictTable.fieldNext(fieldId);
   }
}