Цитата:
Сообщение от
sukhanchik
и еще вдогонку. Штатная проверка пустых аналитик действует сразу на все таблицы по всем аналитикам. Поэтому ее неудобно устанавливать. Я сделал аналог штатной проверки - для этого мне пришлось добавить всего одно поле DenyEmptyDimension в таблицу DimensionSetRuleTable (плюс вывести галку в нижний грид формы правил набора аналитик) и написать буквально 5 строчек кода в \Classes\DimensionSetValidation\checkDimension:
X++:
public boolean checkDimension(Common _caller,
fieldId _dimensionFieldId,
boolean _checkWriteValidation,
boolean _silent = false)
{
........
if (validateDimension != emptyDimension)
{
if (_silent)
{
isValid = isValid && this.isValidCombination(setId, hierarchyId, validateDimension, prefixDimension);
}
else
{
isValid = isValid && this.checkCombination(setId, hierarchyId, validateDimension, prefixDimension);
}
}
//Проверка на пустую аналитику -->
else
{
if (_checkWriteValidation && dimensionSetRuleSearch.dimensionSetRuleTable().DenyEmptyDimension)
{
isValid = checkFailed("@SYS79468");
}
}
// Проверка на пустую аналитику <--
........
}
Добавление таким образом галки позволило мне применить правило к целому набору (но не всему массиву) на уровне конкретной таблицы (а не всех таблиц)
Рассматривая данный код в Ax 2009 Rollup 5 было выявлено.
метод вызывается с параметром _checkEmptyDimension
X++:
public boolean checkDimension(Common _caller,
fieldId _dimensionFieldId,
boolean _checkWriteValidation,
boolean _silent = false,
boolean _checkEmptyDimension = false,
boolean _isPrefix = false)
только теперь принудительно включена проверка на пустые аналитики (#define.ValidateEmptyDimensions(true)), т.е.
X++:
public boolean checkDimensions(boolean _checkWriteValidation)
{
#LedgerJournalFaults
#define.ValidateEmptyDimensions(true)
boolean ok = true;
DimensionSetCaller dimensionSetCaller;
;
if (isConfigurationkeyEnabled(configurationkeynum(DimensionSetHierarchy)))
{
dimensionSetCaller = DimensionSetCaller::construct(this, fieldnum(LedgerJournalTrans, Dimension));
ok = appl.dimensionSetValidation(false, dimensionSetCaller.getCompanyId()).checkDimension(this,
fieldnum(LedgerJournalTrans, Dimension),
_checkWriteValidation,
false,
#ValidateEmptyDimensions) && ok;
if (ok)
{
// InterCoDimension field should only be set when the two accounts
// are different or there is an offset account.
В методе \Classes\DimensionSetValidation\checkDimension отрабатывает ELSE
X++:
// don't check empty dimensions unless expressely told to
if (validateDimension != emptyDimension || _checkEmptyDimension)
{
if (_silent)
{
isValid = this.isValidCombination(setId, hierarchyId, validateDimension, prefixDimension, _isPrefix) && isValid;
}
else
{
isValid = this.checkCombination(_caller, _dimensionFieldId, setId, hierarchyId, validateDimension, dimensionSetRule.RefLedgerAccount, prefixDimension, _isPrefix) && isValid;
}
}
Проблема по вопросу
Заблокировать финансовую аналитику? в \Classes\DimensionSetValidation\checkCombination строка 36
Стек вызова.
Код:
[s] \Classes\DimensionSetValidation\checkCombination 36
[s] \Classes\DimensionSetValidation\checkDimension 123
[s] \Data Dictionary\Tables\LedgerJournalTrans\Methods\checkDimensions 13
[s] \Classes\LedgerJournalCheckPost\checkJournal 212
[s] \Classes\LedgerJournalCheckPost\run 72
[c] \Classes\LedgerJournalCheck\main 41
[c] \Classes\FormFunctionButtonControl\Clicked