Friday, February 22, 2013

Adding a color bar per company

A common question users often ask for is to change the color of AX forms when logged in to a different company. This comes from may legacy systems having this behavior. It turns out changing the background color on AX form results in a pretty ugly experience due to the many different layouts of form, group and subgroups, and other controls that would all have to have their backgrounds changed.

However one interesting way I found to provide similar behavior to this is to add a color bar across the top of forms similar to the workflow status bar indicating the company logged in to.


Disable "Changing company accounts to: " infolog warning

If you are using multiple companies in Dynamics AX you likely have seen the "Changing company accounts to: <company>" infolog warning when changing between companies. This is particularly annoying when working with intercompany sales orders and purchase orders when your business process has you switching back and forth between companies. This is pretty easy to disable with a simple modification to the Application.setDefaultCompany() method.



Wednesday, February 20, 2013

Customs integration with Dynamics AX for EDITrade and CANData

I just wanted to give a quick update on what I've been working on recently. We import product into both the US and to Canada, so we have a need to supply data to both US and Canadian customs.
There are two companies we are working with on this: EDITrade from Descartes for US Customs and CANData Systems for Canadian customs.

I know everyone is gearing up for Convergence 2013, but I'll be back here in Seattle working away. I'd be interested in knowing if anyone finds any other companies that have integrated EDITrade or CANData with Dynamics AX.

Ultimately I plan on providing more details on our integration and some examples.

Friday, December 28, 2012

Costing items multiple different ways per item in Dynamics AX 2009

Background

In AX 2009 inventory costing is controlled by the Dimensions group assigned to an Item when using the weighted avg costing method.

Dimension group setup is found under "Inventory Management > Setup > Dimensions > Dimension groups" and the dimension group is assigned to an item under "Item details > General tab > Dimension group field".

On the dimension group inventory dimensions can be marked as Active to become available for entry and selected for "Financial inventory" to be considered for costing purposes.

Imagine if you setup your inventory dimension group to have Size (inventsize), Color (inventcolor), Site (inventsiteid), and Warehouse (inventlocationid) to be active and financial inventory. This means that when inventory is issued (sold) the cost of the inventory is calculated based on all existing inventory that matches the combination of size, color, site, and warehouse. Another way of saying this is that the inventory is averaged by these dimensions.

Example

Inventory is purchase at a cost of $10 per unit for a specific item, size, color, site, and warehouse. Then the same quantity is also purchases for $20 per unit with the same combination of item, size, color, site, and warehouse. If the inventory is now sold, it will be taken out of inventory at a cost of $15 per unit. Any inventory receipts that match this specific combination of item and dimensions will therefor effect the issue cost.

Problem

One problem with this approach is that an item can only be assigned to one inventory dimension group. An example of when this can be an issue is when we want to cost items of one color one way and items of a different color another way. It would be possible to setup up additional items to accomplish this, but if this is a common practice you would not want to have to duplicate items to handle this.

Solution

One work around for this problem is to modify the code where the dimension group is found and used to use a different dimension group based on a dimension value. The way we handled this was to add a new field to the dimension group table (inventDimGroup) which references another dimGroupId on the same table. In this way we can assign one dimension group to an item, but then also assign special purpose dimension groups.

Once this is done the class InventOnHand::newFinancialUpdate() method should be updated to first inspect the inventDim passed in and then choose whether to initFinancialInvent with the passed in _movement.dimGroupId or with the new field we added to that table.

Example code

//Find the dimGroupId for RED items
redGroupId = inventDimGroup::find(_movement.dimGroupId()).dimGroupIdRed;

if(_inventDim.InventColorId == inventparameters.redColor && asnGroupId != "")
{
    inventDimParm.initFinancialInvent(redGroupId);
}
else
{
    inventDimParm.initFinancialInvent(_movement.dimGroupId());
}
//End

Friday, July 27, 2012

Adding fields to the Batch (InventBatchId) lookup

Background

By default in Dynamics AX the lookup control for the inventory dimension Batch uses your item dimensions for the breakdown of inventory when providing a list of On Hand lots to choose from. However, we've re-used the Serial Number dimension (InventSerialId) as a sub dimension to break inventory down by and set it as both a Primary stocking and a Physical inventory dimension. Because of this we want to select an inventory dimension combination when choosing a lot that matches the values for all primary stocking and physical inventory dimension.

Problem

When viewing the lookup control there is an option to "Range inventory dimensions". If this is selected then the InventSerialId field will show in the On Hand grid, but it will only show rows that match the dimension value for the selected line. If the "Range inventory dimension" option is not selected then the lookup does not display the dimension in the grid and furthermore it does not consider the field in the group by fields, thereby aggregating all values together. Since our goal is to return the selected value to the caller form this is problematic because not only can users not select based on this field, the InventDim record returned has the field as blank.

Solution

The solution is two-fold. First we must set the dimension field to display in the grid and second we must make it as part of the group by field so that the values are returned to the caller.

The Batch lookup form is InventBatchIdLookup. This form uses the InventDimCtrl_Frm_Lookup class to control it's appearance and behavior. Our changes can be made to this class.

InventDimCtrl_Frm_Lookup.findGroupByDimensions() is the method which sets the visibility of fields in the grid. For my purposes adding the following line of code as the last line in the method makes the field visible.

dimParmVisibleGrid.(InventDim::dim2dimParm(fieldNum(InventDim, InventSerialId))) = NoYes::Yes;

InventDimCtrl_Frm_Lookup.executeInventDimQueryDatasource() is the method which controls the shape of the query used to display and return data in the lookup (the group by fields). Adding the following line of code to make InventSerialId a sort field to this method also puts the field in the group by.

qbdsDim.addSortField(fieldNum(InventDim, InventSerialId));

Monday, May 28, 2012

Enabling a new inventory dimension and the AllBlank dimension Id

I recently explored the idea of enabling a new inventory dimension to track a new type of inventory in Dynamics AX. There were a few goals that I wanted to stick to.
  1. Use one of the existing inventory dimensions rather than adding a new dimension. InventColor, InventSizeId, InventBatchId, and InventSerialId were all candidates.
  2. While technically we would allow blank values, I wanted to have two explicit values to use rather than assuming blank was a meaningful value.
  3. Due to #2, update all existing transactions in the system to be one of the explicit values.
The steps necessary to complete this are straight forward, but there are some words of caution I want to add along the way which I discovered in my investigation.

Tuesday, April 3, 2012

Aggregate, Group by, and Having functions in SysQueryForm

Have you ever wanted to use the SysQueryForm in Microsoft Dynamics AX to define a query that had an aggregate (sum, min, max, etc.) and a group by clause? In Microsoft Dynamics AX 2012 this is now possible. Read on to learn more about this little known feature.