Бывает нужно, чтобы для какой-то конкретной формы указанная финансовая аналитика была обязательной для заполнения. В стандартном функционале 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; }
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!