05.11.2014, 18:11 | #1 |
Участник
|
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 |
Участник
|
А мне кажется, очень стрёмно делать ветвления в коде на основе текстовых строк - метками ли они задаются или нет. Фактически тут в код зашит строковый литерал, который в зависимости от языка, настроенного у пользователя, может быть подменен ядром на другой строковый литерал. Кто-то может залезть и поменять текст метки, потому что ему больше нравится другой вариант, и чего, все сломается?
Текстовые строки надо преобразовывать в Enum, если не преобразовалось - слать куда подальше, а если преобразовалось, то в коде уже принимать решения на основе значения Enum (в switch), включая обработку значений, которые не предусмотрены в коде (в default - выбрасывать ошибку). Если строк может быть очень много для Enum и они могут произвольно меняться, то можно настроечную таблицу завести и логику уже привязывать к найденной записи настроечной таблицы... Строковые литералы приемлемы, если они в макросах зашиты (скажем, названия элементов XML-схемы), а с метками их сравнивать - нафиг... PS. А еще бывают экзотические языки, на которые те или иные метки еще не перевели, и тогда сравнение будет идти с пустой строкой. В случае преобразования строки в енум мы от таких ситуаций абстрагируемся. Последний раз редактировалось gl00mie; 05.11.2014 в 20:24. Причина: PS |
|
|
За это сообщение автора поблагодарили: Logger (3). |
05.11.2014, 21:04 | #3 |
Боец
|
Не в защиту такого подхода, но коллега упоминал, если label содержит {locked} в поле "description", то она не переводится на другие языки. Если это так, то для какого языка этот {locked} нужно указать?
|
|
06.11.2014, 00:26 | #4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
06.11.2014, 02:34 | #5 |
Участник
|
В подавляющем большинстве случаев это английский, но отнюдь не всегда, см. @SYS321896 .. @SYS322032 в AX 2012
|
|
06.11.2014, 03:07 | #6 |
Участник
|
ну, так я о том и написал, что BP не разрешает делать такие трюки с метками!
кстати говоря, а как проверить, что мы при импорте из текстового поля получили существующее значение перечисления (enum)? как известно, первым идёт значение 0, оно же выбирается по умолчанию. как быть? вот это вот "если не преобразовалось" - это как?
__________________
Felix nihil admirari |
|
06.11.2014, 07:15 | #7 |
Участник
|
Цитата:
При создании enum не присваивать ни одному из его значений код 0. Значение по умолчанию, все равно останется ноль, т.к. enum - это int, но теперь оно не будет совпадать ни с одним из его реальных значений. Вариант 2. Перед использованием явно проинициализировать переменную enum несуществующим значением, например отрицательным. |
|
06.11.2014, 12:12 | #8 |
Участник
|
я обычно проверяю так: если 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 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Вариант 1.
При создании enum не присваивать ни одному из его значений код 0. Значение по умолчанию, все равно останется ноль, т.к. enum - это int, но теперь оно не будет совпадать ни с одним из его реальных значений. Вариант 2. Перед использованием явно проинициализировать переменную enum несуществующим значением, например отрицательным. Вариант 3 - добавить в enum значение с 0 под названием None |
|
|
За это сообщение автора поблагодарили: Logger (3). |
06.11.2014, 15:10 | #10 |
Дмитрий Ерин
|
Цитата:
X++: #define.axdUnknownEnumValue(255) |
|
|
За это сообщение автора поблагодарили: mazzy (2), gl00mie (1), S.Kuskov (1). |
07.11.2014, 17:41 | #11 |
Участник
|
речь изначально шла об импорте значений из файла. соответственно нет нужды что-то менять на существующих enum. тем более для таких, как NoYes, например.
__________________
Felix nihil admirari |
|
07.11.2014, 17:43 | #12 |
Участник
|
Цитата:
Сообщение от gl00mie
я обычно проверяю так: если enum2str(enumValue) дает пустую строку, значит, предшествующий вызов enumValue = str2enum(...) завершился неудачно, стало быть, метка значения енума, переданная функции str2enum(), была неправильная.
PS. Технически при невозможности по метке определить значение енума функция str2enum() возвращает число 255, при том что максимальное число для значения енума - 250. Но зашивать в код такие особенности реализации типа if (any2int(enumValue) > 250) - это как-то совсем некрасиво, к тому же все может измениться в последующих версиях системы.
__________________
Felix nihil admirari |
|
07.11.2014, 17:48 | #13 |
Участник
|
Цитата:
Можно еще хранить признак корректности импорта где-то еще - в другом поле или даже в другой таблице. Но лучше не декларировать что в поле может быть только No и Yes и писать туда 3.145928 Последний раз редактировалось belugin; 07.11.2014 в 17:55. |
|
07.11.2014, 17:50 | #14 |
Участник
|
боюсь, я не понял, что ты сказал про декларацию. можешь пример привести?
__________________
Felix nihil admirari |
|
07.11.2014, 19:27 | #15 |
Участник
|
Когда мы пишем
X++: NoYes value; Введение неявных элементов перечисления нехорошо. Ибо по объявлению переменной становится непонятно, что собственно туда может попасть. Более того, получается, что мы врем - говорим что там может быть либо No либо Yes, а там может оказаться что-то другое. Правильнее, по-поему сделать либо так X++: NoYesEmpty value; X++: NoYes value; NoYes valueIsEmpty; |
|
07.11.2014, 21:40 | #16 |
Дмитрий Ерин
|
Цитата:
Сообщение от wojzeh
нет стандартных функций для этого, и единственный вариант это перебор внутри цикла по всем элементам перечисления через DictEnum.
X++: info(strfmt('%1', new DictEnum(enumNum(SysDimension)).symbol2Value("Purpose"))); |
|
14.11.2014, 00:38 | #17 |
Участник
|
потому что для symbol2Value это метка, а не name.
__________________
Felix nihil admirari |
|
14.11.2014, 01:16 | #18 |
Дмитрий Ерин
|
Нет. Метка - dictEnum.name2Value(), name - dictEnum.symbol2Value()
Только что проверил в AX2009: Последний раз редактировалось Ruff; 14.11.2014 в 01:18. |
|
14.11.2014, 01:39 | #19 |
Участник
|
Цитата:
интересно, то, что мы оба правы: похоже, эта функция всеядна -- берёт и метку и имя. что name2Value важно лишь совпадение по первым буквам.
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 14.11.2014 в 01:44. |
|
|
За это сообщение автора поблагодарили: Ruff (2), Logger (1). |
14.11.2014, 02:05 | #20 |
Дмитрий Ерин
|
ага, но совпадение именно в метке. В твоем случае просто name совпадает с началом метки. У меня на русском так:
symbol2Value("Purch") = 1 name2Value("Purch") = 255 name2Value("Покупная") = 1 Последний раз редактировалось Ruff; 14.11.2014 в 02:10. Причина: недочитал предыдущий апдейт) |
|