AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.08.2010, 13:05   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от oip Посмотреть сообщение
Поле с типом 'Энум' не должно быть мандатори. Но если программист все-таки сделал его мандатори, то умная Аксапта убирает из энума нулевое значение. Так всегда было.
Тогда почему "умная" аксапты не убирает 0 значение из lookup, если Mandatory = Yes выставить у поля в Data Source формы?

Делали бы тогда однотипно.
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
Старый 12.08.2010, 11:37   #2  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Poleax Посмотреть сообщение
Тогда почему "умная" аксапты не убирает 0 значение из lookup, если Mandatory = Yes выставить у поля в Data Source формы?

Делали бы тогда однотипно.
Все объясняется.
В бизнес-логике много ситуаций, когда необходимо при изменениях, например статуса записи, ОБЯЗАТЕЛЬНО указать значение перечисления (подразумевается есть 0 = пусто = неопределено - до смены статуса записи). Так вот по бест-практик и надо подсветить такое поле красным, мало того не контрол, а объект-поле на дата-соурсе, чтобы не сломать механизм, когда пользователь может через настройки пользователя добавить свой контрол в произвольную группу контролов на форме. Вот второй дубль контрол также станет обязательным. В данном примере форма - форма смены статуса записи и указания нужного значения перечисления. При этом до этой формы - смены статуса значение перечисления может быть неопределено, а записи создаются на другой форме, где значение поля НЕОБЯЗАТЕЛЬНО и это требование бизнес-логики.

Насчет возможности сделать поле енум на таблице обязательным - да бест практик РЕКОМЕНДУЕТ не делать чего-то, а как бы Аксапта разрешает. Пример - две таблицы - первая имеет запись с полем енум - необязательно, вторая - история этой записи - вот там енум ставим обязательно, да отходим от бест-практик - в истории не может быть неопределенного статуса записи - тут приоритет другого требования бест-практик - в таблице не должно быть записи с некорректным значением, и закрывается такая ситуация именно на таблице. Смысл такой - если вторую таблицу открыть даже в обозревателе (что делается консультантами часто), то не смогут создать, изменить там запись некорректно. Здесь как раз ситуация что программист ожидает такого поведения, потому-что во второй таблице она логична.
За это сообщение автора поблагодарили: Poleax (1).
Старый 12.08.2010, 12:42   #3  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от titov Посмотреть сообщение
При этом до этой формы - смены статуса значение перечисления может быть неопределено, а записи создаются на другой форме, где значение поля НЕОБЯЗАТЕЛЬНО и это требование бизнес-логики.
...
вот там енум ставим обязательно, да отходим от бест-практик - в истории не может быть неопределенного статуса записи - тут приоритет другого требования бест-практик - в таблице не должно быть записи с некорректным значением, и закрывается такая ситуация именно на таблице.
Не согласен. А сделать проверку где-нибудь, да хоть в validateWrite() не подойдет? Приведите, пожалуйста, пример обязательного поля с типом Энум в стандартной Аксапте. Согласитесь, что маловероятно, чтобы было так, что в очень большом стандартном приложении такого примера не было, а в неком проекте с количеством доработок явно на несколько порядков меньше уже имеющегося кода без этого не обойтись.

Upd. У BaseEnum любое значение - уже "непустое". Просто потому, что это "перечисление". Даже если вы некое из значений почему-то рассматриваете "пустым". И если по бизнес-логике в какой-то ситуации какое-то из значений не должно иметь место быть, то проверка на это должна быть прозрачно видна из кода, а не переложена в неожиданное место, на свойство поля. Свойство "мандатори" проверяет заполненность поля, а в вашем случае поле будет заполнено.

Аналогично, например, нехорошо для поля с типом Энум (за исключением, возможно, типа NoYes), писать 'if (table.enumField)' вместо 'if (table.enumField != BaseEnum::None).

Последний раз редактировалось oip; 12.08.2010 в 13:18. Причина: Добавил
Старый 12.08.2010, 13:23   #4  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
джоб нашел 100 объектов для ах2009

X++:
static void EnumTypeMandatory(Args _args)
{
    Dictionary      dictionary = new Dictionary();
    DictTable       dictTable;
    DictField       dictField;
    int             countFiledsTotal;
    tableId         tableId;
    fieldId         fieldId;
    ;
    setprefix('Сканирование АОТ. Таблицы, имеющие поле enum mandatory');
    for (tableId = dictionary.tableNext(0);tableId;tableId = dictionary.tableNext(tableId))
    {
        dictTable = new DictTable(tableId);
        if ( (! dictTable.isMap()) && (! dictTable.isTmp()) && (! dictTable.isView()))
        {
            setPrefix(dictTable.name() + '-' + dictTable.label());
            for (fieldId = dictTable.fieldNext(0);fieldId;fieldId = dictTable.fieldNext(fieldId))
            {
                dictField = dictTable.fieldObject(fieldId);
                

                if(         dictField.type()        == types::Enum
                        &&  dictField.mandatory()   == true
                  )
                {
                    info(dictField.name() + '-' + dictField.label());
                    countFiledsTotal++;
                }
            }
        }
    }
 
    info(strFmt("Total found %1 objects",countFiledsTotal));
}
За это сообщение автора поблагодарили: oip (1).
Старый 05.04.2011, 14:52   #5  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Столкнулся с таким же поведением enum'а в существующей нестандартной таблице. Не догадался обратить внимание на свойство mandatory табличного поля, почему-то казалось что что-то хитрое с enum'ом или EDT. Респект за тему
Старый 12.08.2010, 11:48   #6  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Poleax Посмотреть сообщение
Тогда почему "умная" аксапты не убирает 0 значение из lookup, если Mandatory = Yes выставить у поля в Data Source формы?

Делали бы тогда однотипно.

А на вопрос то не ответил... Да есть такое. Мало того еще и не подсвечивает красным контрол.
Теги
ax2009, enum

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить из элемента enum-а код типа (enum-а)? Romb DAX: База знаний и проекты 12 27.06.2013 16:17
Странный баг при расширении Enum DTD DAX: Программирование 1 07.05.2009 18:45
Глюк компилятора Eldar9x DAX: Программирование 5 21.01.2008 14:03
Enum: глюк? Gorlum DAX: Программирование 11 10.02.2006 07:43
Фильтрация по полю Enum в Query Cooper DAX: Программирование 8 04.07.2004 09:21

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:47.