Обязательное заполнение финансовой аналитики в Dynamics AX 2012
Бывает нужно, чтобы для какой-то конкретной формы указанная финансовая аналитика была обязательной для заполнения. В стандартном функционале Microsoft Dynamics AX 2012 такая возможностью не предусмотрена, поэтому его приходится немного дорабатывать. Предлагаю вариант, как это можно сделать.
- Во-первых, нужно решить, как будет настраиваться обязательность аналитики. Тут могут быть разные варианты. Для нашего примера, пусть эта логика будет описана в новом методе таблицы DimensionAttribute. Метод будет вызываться для конкретной аналитики, принимая в качестве параметров имя формы и код таблицы с аналитикой:
public boolean mandatoryDimAttr(str _formName, TableId _tableId) { // логика, определяющая будет ли текущая аналитика обязательной для указанной формы и таблицы }
- Для вывода на форме финансовых аналитик используется класс DimensionDefaultingController. Добавим в него метод, который будет работать с нашим методом, созданном на предыдущем шаге:
protected boolean mandatoryDimAttr(RecId _dimAttrRecId) { return DimensionAttribute::find(_dimAttrRecId).mandatoryDimAttr(formRun.name(), valuesDataSource.table()); }
- Добавление на форму контролов, с помощью которых отображаются значения аналитик, выполняется в методе 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; }
Теперь, в результате нашей доработки, обязательные для заполнения аналитики будут подчеркиваться красной волнистой линией:
- Но просто выделение волнистой линией никак не помешает пользователю сохранить запись с незаполненной обязательной аналитикой. Чтобы исправить это, немного дополним нашу доработку. Нам понадобится метод, который проверит, что все обязательные аналитики заполнены. Разместим его так же, как и метод определяющий обязательность аналитики, в таблице DimensionAttribute. Метод будет статическим, и кроме имени формы и кода таблицы, будет принимать в качестве параметра значение финансовой аналитики, заполненность которой и будет проверять:
public static boolean сheckFillDimension(str _formName, TableId _tableId, DimensionDefault _dimension) { // здесь должна быть проверка и вывод сообщения, какая именно аналитика не заполнена }
- Теперь метод с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!