Обязательное заполнение финансовой аналитики в Dynamics AX 2012

Бывает нужно, чтобы для какой-то конкретной формы указанная финансовая аналитика была обязательной для заполнения. В стандартном функционале Microsoft Dynamics AX 2012 такая возможностью не предусмотрена, поэтому его приходится немного дорабатывать. Предлагаю вариант, как это можно сделать.

  1. Во-первых, нужно решить, как будет настраиваться обязательность аналитики.  Тут могут быть разные варианты. Для нашего примера, пусть эта логика будет описана в новом методе таблицы DimensionAttribute. Метод будет вызываться для конкретной аналитики, принимая в качестве параметров имя формы и код таблицы с аналитикой:
    public boolean mandatoryDimAttr(str _formName, TableId _tableId)
    {
        // логика, определяющая будет ли текущая аналитика обязательной для указанной формы и таблицы
    }
  2. Для вывода на форме финансовых аналитик используется класс DimensionDefaultingController. Добавим в него метод, который будет работать с нашим методом, созданном на предыдущем шаге:
    protected boolean mandatoryDimAttr(RecId _dimAttrRecId)
    {
        return DimensionAttribute::find(_dimAttrRecId).mandatoryDimAttr(formRun.name(), valuesDataSource.table());
    }
  3. Добавление на форму контролов, с помощью которых отображаются значения аналитик, выполняется в методе addEditControls класса DimensionDefaultingControllerBase, который является родительским для класса DimensionDefaultingController. В этом методе есть установка свойства mandatory для контрола. Расширим условие, при котором устанавливается это свойство:
    private void addEditControls(fieldId _enumType, boolean _valuesAppearLast, boolean _showValues, boolean _allowEdit, DimensionAttribute _dimAttr)
    {    
        FormStringControl   valueStringControl;
        //...
        if (   dimLinkMarkFieldOptionalEventArgs.parmCancel()          
            || this.mandatoryDimAttr(_dimAttr.RecId))	//наш новый метод, который будет определять, должна ли текущая аналитика быть обязательной
        {
            valueStringControl.mandatory(true);
        }      
        //... 
    }
    

    Нам остается добавить в класс DimensionDefaultingControllerBase метод mandatoryDimAttr, который будет перекрываться уже созданным ранее методом в классе-наследнике:

    protected boolean mandatoryDimAttr(RecId _dimAttrRecId)
    {
        return false;
    }

    Теперь, в результате нашей доработки, обязательные для заполнения аналитики будут подчеркиваться красной волнистой линией: 

  4. Но просто выделение волнистой линией никак не помешает пользователю сохранить запись с незаполненной обязательной аналитикой. Чтобы исправить это, немного дополним нашу доработку. Нам понадобится метод, который проверит, что все обязательные аналитики заполнены. Разместим его так же, как и метод определяющий обязательность аналитики, в таблице DimensionAttribute. Метод будет статическим, и кроме имени формы и кода таблицы, будет принимать в качестве параметра значение финансовой аналитики, заполненность которой и будет проверять:
    public static boolean сheckFillDimension(str _formName, TableId _tableId, DimensionDefault _dimension)
    {
        // здесь должна быть проверка и вывод сообщения, какая именно аналитика не заполнена
    }
  5. Теперь метод сheckFillDimension можно вызвать в методе validateWrite соответствующего dataSource-а:
    public boolean validateWrite()
    {
        boolean ret;
        //...
        ret = DimensionAttribute::сheckFillDimension(element.name(), someTable.TableId, someTable.DefaultDimension) && ret;
              
        return ret;
    }

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar