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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.11.2014, 18:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
Labels and Best Practices
Источник: http://alexvoy.blogspot.com/2014/11/...practices.html
==============





Guys, please, do not forget that AX is really multilingual system and there are many other languages than English. Happy labelling!


Источник: http://alexvoy.blogspot.com/2014/11/...practices.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 05.11.2014, 20:20   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
А мне кажется, очень стрёмно делать ветвления в коде на основе текстовых строк - метками ли они задаются или нет. Фактически тут в код зашит строковый литерал, который в зависимости от языка, настроенного у пользователя, может быть подменен ядром на другой строковый литерал. Кто-то может залезть и поменять текст метки, потому что ему больше нравится другой вариант, и чего, все сломается?
Текстовые строки надо преобразовывать в Enum, если не преобразовалось - слать куда подальше, а если преобразовалось, то в коде уже принимать решения на основе значения Enum (в switch), включая обработку значений, которые не предусмотрены в коде (в default - выбрасывать ошибку). Если строк может быть очень много для Enum и они могут произвольно меняться, то можно настроечную таблицу завести и логику уже привязывать к найденной записи настроечной таблицы... Строковые литералы приемлемы, если они в макросах зашиты (скажем, названия элементов XML-схемы), а с метками их сравнивать - нафиг...

PS. А еще бывают экзотические языки, на которые те или иные метки еще не перевели, и тогда сравнение будет идти с пустой строкой. В случае преобразования строки в енум мы от таких ситуаций абстрагируемся.

Последний раз редактировалось gl00mie; 05.11.2014 в 20:24. Причина: PS
За это сообщение автора поблагодарили: Logger (3).
Старый 05.11.2014, 21:04   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Не в защиту такого подхода, но коллега упоминал, если label содержит {locked} в поле "description", то она не переводится на другие языки. Если это так, то для какого языка этот {locked} нужно указать?
Старый 06.11.2014, 00:26   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Если это так, то для какого языка этот {locked} нужно указать?
для английского.
первичными считаются метки на en-us
За это сообщение автора поблагодарили: wojzeh (1).
Старый 06.11.2014, 02:34   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В подавляющем большинстве случаев это английский, но отнюдь не всегда, см. @SYS321896 .. @SYS322032 в AX 2012
Старый 06.11.2014, 03:07   #6  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
ну, так я о том и написал, что BP не разрешает делать такие трюки с метками!

кстати говоря, а как проверить, что мы при импорте из текстового поля получили существующее значение перечисления (enum)?

как известно, первым идёт значение 0, оно же выбирается по умолчанию. как быть?

вот это вот "если не преобразовалось" - это как?
__________________
Felix nihil admirari
Старый 06.11.2014, 07:15   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а как проверить, что мы при импорте из текстового поля получили существующее значение перечисления (enum)?

как известно, первым идёт значение 0, оно же выбирается по умолчанию. как быть?
Вариант 1.
При создании enum не присваивать ни одному из его значений код 0. Значение по умолчанию, все равно останется ноль, т.к. enum - это int, но теперь оно не будет совпадать ни с одним из его реальных значений.

Вариант 2. Перед использованием явно проинициализировать переменную enum несуществующим значением, например отрицательным.
Старый 06.11.2014, 12:12   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
я обычно проверяю так: если enum2str(enumValue) дает пустую строку, значит, предшествующий вызов enumValue = str2enum(...) завершился неудачно, стало быть, метка значения енума, переданная функции str2enum(), была неправильная.

PS. Технически при невозможности по метке определить значение енума функция str2enum() возвращает число 255, при том что максимальное число для значения енума - 250. Но зашивать в код такие особенности реализации типа if (any2int(enumValue) > 250) - это как-то совсем некрасиво, к тому же все может измениться в последующих версиях системы.

Последний раз редактировалось gl00mie; 06.11.2014 в 12:17. Причина: PS
За это сообщение автора поблагодарили: Logger (3), wojzeh (1).
Старый 06.11.2014, 13:31   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вариант 1.
При создании enum не присваивать ни одному из его значений код 0. Значение по умолчанию, все равно останется ноль, т.к. enum - это int, но теперь оно не будет совпадать ни с одним из его реальных значений.

Вариант 2. Перед использованием явно проинициализировать переменную enum несуществующим значением, например отрицательным.


Вариант 3 - добавить в enum значение с 0 под названием None
За это сообщение автора поблагодарили: Logger (3).
Старый 06.11.2014, 15:10   #10  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Но зашивать в код такие особенности реализации типа if (any2int(enumValue) > 250) - это как-то совсем некрасиво, к тому же все может измениться в последующих версиях системы.
С другой стороны, можно понадеяться на то, что в следующих версиях не забудут поправить строчку
X++:
#define.axdUnknownEnumValue(255)
в макросе Axd... Или это наивно?
За это сообщение автора поблагодарили: mazzy (2), gl00mie (1), S.Kuskov (1).
Старый 07.11.2014, 17:41   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от belugin Посмотреть сообщение
Вариант 3 - добавить в enum значение с 0 под названием None
речь изначально шла об импорте значений из файла. соответственно нет нужды что-то менять на существующих enum. тем более для таких, как NoYes, например.
__________________
Felix nihil admirari
Старый 07.11.2014, 17:43   #12  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от gl00mie Посмотреть сообщение
я обычно проверяю так: если enum2str(enumValue) дает пустую строку, значит, предшествующий вызов enumValue = str2enum(...) завершился неудачно, стало быть, метка значения енума, переданная функции str2enum(), была неправильная.

PS. Технически при невозможности по метке определить значение енума функция str2enum() возвращает число 255, при том что максимальное число для значения енума - 250. Но зашивать в код такие особенности реализации типа if (any2int(enumValue) > 250) - это как-то совсем некрасиво, к тому же все может измениться в последующих версиях системы.
это не совсем то. нужно не по метке найти значение, а по name. но я так понимаю, нет стандартных функций для этого, и единственный вариант это перебор внутри цикла по всем элементам перечисления через DictEnum.
__________________
Felix nihil admirari
Старый 07.11.2014, 17:48   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от wojzeh Посмотреть сообщение
речь изначально шла об импорте значений из файла. соответственно нет нужды что-то менять на существующих enum. тем более для таких, как NoYes, например.
Не важно откуда взялось значение, если оно допустимо, а декларация типа поля показывает, что недопустимо - декларация врет и при использовании поля могут быть ошибки.

Можно еще хранить признак корректности импорта где-то еще - в другом поле или даже в другой таблице. Но лучше не декларировать что в поле может быть только No и Yes и писать туда 3.145928

Последний раз редактировалось belugin; 07.11.2014 в 17:55.
Старый 07.11.2014, 17:50   #14  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от belugin Посмотреть сообщение
Не важно откуда взялось значение, если оно допустимо, а декларация типа поля показывает, что недопустимо - декларация врет и при использовании поля могут быть ошибки.
боюсь, я не понял, что ты сказал про декларацию. можешь пример привести?
__________________
Felix nihil admirari
Старый 07.11.2014, 19:27   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Когда мы пишем

X++:
NoYes value;
Все кто читает этот код ожидает, что в value будет либо No либо Yes.

Введение неявных элементов перечисления нехорошо. Ибо по объявлению переменной становится непонятно, что собственно туда может попасть.

Более того, получается, что мы врем - говорим что там может быть либо No либо Yes, а там может оказаться что-то другое.

Правильнее, по-поему сделать либо так
X++:
NoYesEmpty value;
Либо так:

X++:
NoYes value;
NoYes valueIsEmpty;
Старый 07.11.2014, 21:40   #16  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от wojzeh Посмотреть сообщение
нет стандартных функций для этого, и единственный вариант это перебор внутри цикла по всем элементам перечисления через DictEnum.
Да ну, зачем цикл... вот так, например:
X++:
    info(strfmt('%1', new DictEnum(enumNum(SysDimension)).symbol2Value("Purpose")));
Старый 14.11.2014, 00:38   #17  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Ruff Посмотреть сообщение
Да ну, зачем цикл... вот так, например:
X++:
    info(strfmt('%1', new DictEnum(enumNum(SysDimension)).symbol2Value("Purpose")));
потому что для symbol2Value это метка, а не name.
__________________
Felix nihil admirari
Старый 14.11.2014, 01:16   #18  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Нет. Метка - dictEnum.name2Value(), name - dictEnum.symbol2Value()
Только что проверил в AX2009:
Миниатюры
Нажмите на изображение для увеличения
Название: 02036-clip-15kb.png
Просмотров: 336
Размер:	14.9 Кб
ID:	9050  

Последний раз редактировалось Ruff; 14.11.2014 в 01:18.
Старый 14.11.2014, 01:39   #19  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Ruff Посмотреть сообщение
Нет. Метка - dictEnum.name2Value(), name - dictEnum.symbol2Value()
Только что проверил в AX2009:
твоя правда!

интересно, то, что мы оба правы: похоже, эта функция всеядна -- берёт и метку и имя.
что name2Value важно лишь совпадение по первым буквам.

Нажмите на изображение для увеличения
Название: enum.png
Просмотров: 335
Размер:	18.6 Кб
ID:	9051

Нажмите на изображение для увеличения
Название: enum2.png
Просмотров: 305
Размер:	16.3 Кб
ID:	9052
__________________
Felix nihil admirari

Последний раз редактировалось wojzeh; 14.11.2014 в 01:44.
За это сообщение автора поблагодарили: Ruff (2), Logger (1).
Старый 14.11.2014, 02:05   #20  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
ага, но совпадение именно в метке. В твоем случае просто name совпадает с началом метки. У меня на русском так:

symbol2Value("Purch") = 1
name2Value("Purch") = 255
name2Value("Покупная") = 1

Последний раз редактировалось Ruff; 14.11.2014 в 02:10. Причина: недочитал предыдущий апдейт)
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:58.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.