Показать сообщение отдельно
Старый 28.07.2010, 16:06   #33  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Post
Цитата:
Сообщение от 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
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
За это сообщение автора поблагодарили: sukhanchik (2).