Friday, October 2, 2015

How to lookup and set a new value for Financial dimension

Let's say we need to change a value for one of item financial dimension.

I created a simple form with the item list and their default financial dimensions that are controlled by a standard controller.



There are also two unbound controls that allows to select any related financial dimension attribute and its available value. It is done by means of two edit methods and one lookup method, which can be added to your class and used everywhere you need.


A new chosen value can be set for the item financial dimension by the Set new value button. Actually it uses a method that, again, can be added to your class a static one.

I would like to thank Carsten Glem for his comment on this topic.

Here comes the code for the main methods. Feel free also to download the whole project.




Form class declaration
public class FormRun extends ObjectRun
{
    // Standard controller placing predefined financial attributes on a form tab page (FinDimTab in this example)
    DimensionDefaultingController   dimensionDefaultingController;
    // New financial dimension attribute; placed on the form as an unbound control through its name and edit method
    // via editAttributeToChangeName
    DimensionAttributeRecId         attributeToChange;
    Name                            attributeToChangeName;
    // New value for a chosen financial dimension attribute; placed as an unbound control through edit method
    // via editAttributeToChangeValue
    DimensionValue                  attributeToChangeValue;

    // each time user change the attribute name, it changes attribute, if valid name, and clears its value on the form
    // the lookup method LookupDimensionValueByAttribute can be placed in a class as a static to be used everywhere
    
    // Set new value button calls SetDefaultDimensionValue method, 
    // which can actually be added to a class in a class as a static to be used everywhere
}

LookupDimensionValueByAttribute





/// <summary>
/// Creates and displays a lookup from which the user can select for parent category.
/// </summary>
/// <param name="_formReferenceControl">
/// The calling form reference control.
/// </param>
/// <param name="_parentCategory">
/// The RecId of parent category
/// </param>
/// <returns>
/// The selected record in the case of record mode selection; otherwise null.
/// </returns>
public void LookupDimensionValueByAttribute(FormStringControl _formControl, str _dimensionAttributeValueStr, DimensionAttribute _dimensionAttribute)
{
    Args                    args;
    FormRun                 lookupFormRun;
    Object                  object;

    if (_formControl != null && _dimensionAttribute)
    {
        // Construct arguments for the custom lookup
        args = new Args();
        args.name(formStr(DimensionDefaultingLookup));
        args.lookupValue(_dimensionAttributeValueStr);
        args.caller(_formControl);

        args.lookupField(_dimensionAttribute.ValueAttribute);
        args.record(_dimensionAttribute);

        // Run the custom lookup and init the lookup form
        lookupFormRun = classfactory.formRunClass(args);
        lookupFormRun.init();

        // Specify this is the callback on the lookup form by casting the
        // form to an object and late binding the setResultCallback method
        if (SysFormRun::hasMethod(lookupFormRun, identifierStr(setResultCallback)))
        {
            object = lookupFormRun;
            object.setResultCallback();
        }

        _formControl.performFormLookup(lookupFormRun);
    }
}

SetDefaultDimensionValue





/// <summary>
/// Sets a value in a default dimension field of a given record, i.e. InventTable, CustTable etc.
/// </summary>
/// <param name="_fromDefaultDimension">
/// <C>DimensionDefault</C> field from the existing record, i.e. InventTable.DefaultDimension.
/// </param>
/// <param name="_attributeName">
/// The name of the dimension attribute to set the value for.
/// </param>
/// <param name="_newDimAttributeValue">
/// The new value for the given dimension attribute.
/// </param>
/// <returns>
/// The new default dimension.
/// </returns>
/// Note: taken from https://sumitsaxfactor.wordpress.com/2012/01/18/replace-a-financial-dimension-in-default-dimensions-ax-2012/
public DimensionDefault SetDefaultDimensionValue(   DimensionDefault    _fromDefaultDimension,
                                                    Name                _attributeName,
                                                    Str                 _newDimAttributeValue)
{
    DimensionAttributeValueSetStorage   dimensionAttributeValueSetStorage   = new DimensionAttributeValueSetStorage();
    DimensionAttributeValue             dimensionAttributeValue;
    DimensionDefault                    toDefaultDimension;
    Map                                 dimensionSpecifiers                 = DimensionDefaultingEngine::getDefaultDimensionSpecifiers(_fromDefaultDimension);
    MapEnumerator                       enumerator;
    DimensionAttribute                  dimensionAttribute;

    //Add current dimension attribute values
    enumerator = dimensionSpecifiers.getEnumerator();
    while (enumerator.moveNext())
    {
        dimensionAttribute      = DimensionAttribute::find(enumerator.currentKey());
        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(dimensionAttribute.Name), enumerator.currentValue());
        dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
    }

    //Add the extra dimension attribute values
    dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(_attributeName), _newDimAttributeValue, true, true);
    dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); // Replaces since attribute already exists with different value
    toDefaultDimension      = dimensionAttributeValueSetStorage.save();

    return toDefaultDimension;
}

No comments: