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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.08.2010, 17:33   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
:) Забавный глюк с Enum
Из \Data Dictionary\Tables\InventTable\ беру поле ItemType в свою табличку.
В таблице у поля ItemType выставляю свойство Mandatory = Yes.

На форме вывожу поле на Grid. В выпадающем списке исчезает значение "Номенклатура"
Название: gluk.png
Просмотров: 2208

Размер: 3.4 Кб

У поля ItemType выставляю Mandatory = No.

Перехожу на форму, открываю lookup, и вижу
Название: prav.png
Просмотров: 2165

Размер: 3.7 Кб

При чем данный глюк не появляется, если Mandatory = Yes выставить у поля в Data Source формы.

DAX 2009 SP1 GLS EE Rollup 5
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
За это сообщение автора поблагодарили: kornix (2).
Старый 10.08.2010, 17:49   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Для обязательного поля нельзя будет устанавливать значение, равное 0 - вот лукап и не показывать "Номенклатуру" (Value=0)

PS На трешке ровно такое же поведение
__________________
Axapta v.3.0 sp5 kr2
Старый 10.08.2010, 17:49   #3  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Поле с типом 'Энум' не должно быть мандатори. Но если программист все-таки сделал его мандатори, то умная Аксапта убирает из энума нулевое значение. Так всегда было.
Старый 10.08.2010, 18:07   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Нет ничего удивительного. Отрабатывает штатный механизм - запрещает пустой элемент, с типом ноль. К уму акспты отношения мало имеет

С Уважением,
Георгий
Старый 10.08.2010, 18:52   #5  
dmitro is offline
dmitro
Участник
 
48 / 19 (1) ++
Регистрация: 18.07.2008
Адрес: Москва, РФ
Либо делать enum со значением "пусто" и id равным 0. Тогда можно указывать mandatory
Старый 10.08.2010, 21:08   #6  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от dmitro Посмотреть сообщение
Тогда можно указывать mandatory
Плохой совет. Не должно поле Enum быть мандатори.

Цитата:
Best Practices for Table Field Properties

Mandatory - You should set this to No for enum fields.
Старый 10.08.2010, 22:10   #7  
Geo is offline
Geo
Участник
Аватар для Geo
 
258 / 47 (2) +++
Регистрация: 04.04.2008
Цитата:
Сообщение от oip Посмотреть сообщение
Плохой совет. Не должно поле Enum быть мандатори.
Помимо ссылки на БестПрактис, есть какие-нибудь логические соображения, почему этого не стоит делать (с описанным приемом: нулевым значением держать "Пустое")?
Старый 10.08.2010, 22:36   #8  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Потому, что это не соответствует тому, что принято в Аксапте. Потому, что программист, который будет потом с этим работать, не будет этого ожидать. Потому, что в разных случаях в лукапе этот энум будет показывать разный список значений. Зачем вообще Бест Практис нужен? Энум - он на то и энум. У него всегда какое-то значение есть.
За это сообщение автора поблагодарили: sukhanchik (4).
Старый 10.08.2010, 23:11   #9  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от oip Посмотреть сообщение
Потому, что это не соответствует тому, что принято в Аксапте. Потому, что программист, который будет потом с этим работать, не будет этого ожидать.
Этот аргумент уже более чем достаточен, чтобы так не делать. Другой программист не будет знать про прием с пустым значением и наступит на "сюрприз" (допустим захочет переименовать пустое значение и будет долго думать - почему при выборе значения в таблице - этого значения нет).

А вообще в свое время участник db очень грамотно сказал в отношении отклонения от Best Practice:

Цитата:
Сообщение от db Посмотреть сообщение
Да никто и не спорит. Но на заборе было написано "Острожно! злая собака" - было. Значит за порванные штаны и порванное то что под штанами претензии предъявлять почти бесполезно
__________________
Возможно сделать все. Вопрос времени
Старый 11.08.2010, 10:17   #10  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от Geo Посмотреть сообщение
Помимо ссылки на БестПрактис, есть какие-нибудь логические соображения, почему этого не стоит делать (с описанным приемом: нулевым значением держать "Пустое")?
Вообще-то, рекомендуется вообще избегать пустых нулевых значений в енумах.

Теряется фильтр из-за того, что не задан label
__________________
Dynamics AX Experience
Старый 11.08.2010, 13:05   #11  
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.
Старый 11.08.2010, 13:16   #12  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Не знаю. Да и не хочу знать, честно говоря. Так ли это важно? Как выше уже сказали, если в Best Practices написано "Острожно! злая собака" значит за порванные штаны и порванное то что под штанами претензии предъявлять почти бесполезно.
Старый 12.08.2010, 11:37   #13  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Poleax Посмотреть сообщение
Тогда почему "умная" аксапты не убирает 0 значение из lookup, если Mandatory = Yes выставить у поля в Data Source формы?

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

Насчет возможности сделать поле енум на таблице обязательным - да бест практик РЕКОМЕНДУЕТ не делать чего-то, а как бы Аксапта разрешает. Пример - две таблицы - первая имеет запись с полем енум - необязательно, вторая - история этой записи - вот там енум ставим обязательно, да отходим от бест-практик - в истории не может быть неопределенного статуса записи - тут приоритет другого требования бест-практик - в таблице не должно быть записи с некорректным значением, и закрывается такая ситуация именно на таблице. Смысл такой - если вторую таблицу открыть даже в обозревателе (что делается консультантами часто), то не смогут создать, изменить там запись некорректно. Здесь как раз ситуация что программист ожидает такого поведения, потому-что во второй таблице она логична.
За это сообщение автора поблагодарили: Poleax (1).
Старый 12.08.2010, 11:48   #14  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Poleax Посмотреть сообщение
Тогда почему "умная" аксапты не убирает 0 значение из lookup, если Mandatory = Yes выставить у поля в Data Source формы?

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

А на вопрос то не ответил... Да есть такое. Мало того еще и не подсвечивает красным контрол.
Старый 12.08.2010, 12:42   #15  
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   #16  
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   #17  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Столкнулся с таким же поведением enum'а в существующей нестандартной таблице. Не догадался обратить внимание на свойство mandatory табличного поля, почему-то казалось что что-то хитрое с enum'ом или EDT. Респект за тему
Теги
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, время: 10:14.