10.08.2010, 17:33 | #1 |
Модератор
|
Забавный глюк с Enum
Из \Data Dictionary\Tables\InventTable\ беру поле ItemType в свою табличку.
В таблице у поля ItemType выставляю свойство Mandatory = Yes. На форме вывожу поле на Grid. В выпадающем списке исчезает значение "Номенклатура" У поля ItemType выставляю Mandatory = No. Перехожу на форму, открываю lookup, и вижу При чем данный глюк не появляется, если 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 |
Участник
|
Для обязательного поля нельзя будет устанавливать значение, равное 0 - вот лукап и не показывать "Номенклатуру" (Value=0)
PS На трешке ровно такое же поведение
__________________
Axapta v.3.0 sp5 kr2 |
|
10.08.2010, 17:49 | #3 |
Axapta
|
Поле с типом 'Энум' не должно быть мандатори. Но если программист все-таки сделал его мандатори, то умная Аксапта убирает из энума нулевое значение. Так всегда было.
|
|
10.08.2010, 18:07 | #4 |
Модератор
|
Нет ничего удивительного. Отрабатывает штатный механизм - запрещает пустой элемент, с типом ноль. К уму акспты отношения мало имеет
С Уважением, Георгий |
|
10.08.2010, 18:52 | #5 |
Участник
|
Либо делать enum со значением "пусто" и id равным 0. Тогда можно указывать mandatory
|
|
10.08.2010, 21:08 | #6 |
Axapta
|
|
|
10.08.2010, 22:10 | #7 |
Участник
|
|
|
10.08.2010, 22:36 | #8 |
Axapta
|
Потому, что это не соответствует тому, что принято в Аксапте. Потому, что программист, который будет потом с этим работать, не будет этого ожидать. Потому, что в разных случаях в лукапе этот энум будет показывать разный список значений. Зачем вообще Бест Практис нужен? Энум - он на то и энум. У него всегда какое-то значение есть.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
10.08.2010, 23:11 | #9 |
Administrator
|
Цитата:
А вообще в свое время участник db очень грамотно сказал в отношении отклонения от Best Practice:
__________________
Возможно сделать все. Вопрос времени |
|
11.08.2010, 10:17 | #10 |
MCTS
|
Цитата:
Теряется фильтр из-за того, что не задан label
__________________
Dynamics AX Experience |
|
11.08.2010, 13:05 | #11 |
Модератор
|
Цитата:
Делали бы тогда однотипно.
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
11.08.2010, 13:16 | #12 |
Axapta
|
Не знаю. Да и не хочу знать, честно говоря. Так ли это важно? Как выше уже сказали, если в Best Practices написано "Острожно! злая собака" значит за порванные штаны и порванное то что под штанами претензии предъявлять почти бесполезно.
|
|
12.08.2010, 11:37 | #13 |
Участник
|
Цитата:
В бизнес-логике много ситуаций, когда необходимо при изменениях, например статуса записи, ОБЯЗАТЕЛЬНО указать значение перечисления (подразумевается есть 0 = пусто = неопределено - до смены статуса записи). Так вот по бест-практик и надо подсветить такое поле красным, мало того не контрол, а объект-поле на дата-соурсе, чтобы не сломать механизм, когда пользователь может через настройки пользователя добавить свой контрол в произвольную группу контролов на форме. Вот второй дубль контрол также станет обязательным. В данном примере форма - форма смены статуса записи и указания нужного значения перечисления. При этом до этой формы - смены статуса значение перечисления может быть неопределено, а записи создаются на другой форме, где значение поля НЕОБЯЗАТЕЛЬНО и это требование бизнес-логики. Насчет возможности сделать поле енум на таблице обязательным - да бест практик РЕКОМЕНДУЕТ не делать чего-то, а как бы Аксапта разрешает. Пример - две таблицы - первая имеет запись с полем енум - необязательно, вторая - история этой записи - вот там енум ставим обязательно, да отходим от бест-практик - в истории не может быть неопределенного статуса записи - тут приоритет другого требования бест-практик - в таблице не должно быть записи с некорректным значением, и закрывается такая ситуация именно на таблице. Смысл такой - если вторую таблицу открыть даже в обозревателе (что делается консультантами часто), то не смогут создать, изменить там запись некорректно. Здесь как раз ситуация что программист ожидает такого поведения, потому-что во второй таблице она логична. |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
12.08.2010, 11:48 | #14 |
Участник
|
|
|
12.08.2010, 12:42 | #15 |
Axapta
|
Цитата:
Сообщение от titov
При этом до этой формы - смены статуса значение перечисления может быть неопределено, а записи создаются на другой форме, где значение поля НЕОБЯЗАТЕЛЬНО и это требование бизнес-логики.
... вот там енум ставим обязательно, да отходим от бест-практик - в истории не может быть неопределенного статуса записи - тут приоритет другого требования бест-практик - в таблице не должно быть записи с некорректным значением, и закрывается такая ситуация именно на таблице. Upd. У BaseEnum любое значение - уже "непустое". Просто потому, что это "перечисление". Даже если вы некое из значений почему-то рассматриваете "пустым". И если по бизнес-логике в какой-то ситуации какое-то из значений не должно иметь место быть, то проверка на это должна быть прозрачно видна из кода, а не переложена в неожиданное место, на свойство поля. Свойство "мандатори" проверяет заполненность поля, а в вашем случае поле будет заполнено. Аналогично, например, нехорошо для поля с типом Энум (за исключением, возможно, типа NoYes), писать 'if (table.enumField)' вместо 'if (table.enumField != BaseEnum::None). Последний раз редактировалось oip; 12.08.2010 в 13:18. Причина: Добавил |
|
12.08.2010, 13:23 | #16 |
Участник
|
джоб нашел 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 |
MCP
|
Столкнулся с таким же поведением enum'а в существующей нестандартной таблице. Не догадался обратить внимание на свойство mandatory табличного поля, почему-то казалось что что-то хитрое с enum'ом или EDT. Респект за тему
|
|
Теги |
ax2009, enum |
|
Похожие темы | ||||
Тема | Ответов | |||
Как получить из элемента enum-а код типа (enum-а)? | 12 | |||
Странный баг при расширении Enum | 1 | |||
Глюк компилятора | 5 | |||
Enum: глюк? | 11 | |||
Фильтрация по полю Enum в Query | 8 |
|