Единицы измерения

Коллеги, подскажите, возможно у кого-то есть опыт разработки решений, использующих различные единицы измерения.
Т.е. в форме мы вводим (и показываем) данные в неком региональном формате (например, футы), а в базу пишем значения в СИ (метры).

Поделитесь, пожалуйста, опытом.

Добрый день.

Для такой задачи, я бы посоветовал реализовать кастомный Datatype, который определяет методы конвертации значение в строку и из строки (formatting & parsing). В документации можно найти пример реализации кастомного Datatype.

1 симпатия

Спасибо, Глеб.

А каким образом посоветуете осуществить привязку “регионального формата” к пользователю и как отображать ее в сущности? “Региональных форматов” полагаю будет несколько, реализованы они будут в виде соответствующей сущности системы.

Если подразумевается системный пользователь (sec$User), то Вы можете расширить системного пользователя в Студии и добавить ему поле “Региональный формат”. В Datatype можно получить текущего пользователя, используя UserSessionSource. После чего получить данные о региональном формате и использовать их для отображения значения.

Важно помнить, что Datatype будет использоваться для отображения значения (таблицы, поля) и для парсинга значения из полей.

1 симпатия

Глеб, а расширение sec$User из студии не предусмотрено?
Нужные классы я, конечно, создам. В документации это подробно описано. Просто хотелось бы понимать, может быть я что-то делаю не так, что не наблюдаю в списке предков sec$User для нового класса.

Добрый день.

Не могли бы Вы создать новую тему для этого вопроса, чтобы другим членам сообщества было проще искать подобную проблему, и подробнее описать шаги по созданию расширения системного пользователя?

Глеб, с вашего позволения, отложу в сторону этот вопрос. К тому же сейчас все нормально (до этого просто не наблюдал в списке родителей sec$User).

Задам другой. Есть мысль привязать региональные настройки не к пользователю ( sec$User), а к группе пользователей (sec$Group). Скажите, возможно ли расширить sec$Group таким образом, чтобы эти данные были доступны через userSession. Может быть можно расширить Seesion Attributes в sec$Group?

Используя UserSessionSource Вы можете получить текущего пользователя, а у пользователя список его групп. Таким образом Вы можете реализовать необходимый фунционал как вам удобнее (расширяя пользователей или группы)

1 симпатия

Глеб, доброго дня.
А подскажите еще пару вещей:

  • Если у группы пользователей задать session attribute. Затем задать его с таким же именем, но другим значением у группы-родителя, то будет использоваться session atribute родителя? UPD: Можно взять атрибут у группы.
  • Как вы считаете каким образом лучше сделать отображение (переключение) найденной для пользователя размерности на форме? Меня в принципе, устроит и изменение caption у поля, только не вижу хорошего способа поймать какая размерность. Еще раз вызывать те же методы, которые уже отработали в data type?
  • Можно ли при объявлении кастомного типа данных в сущности задать какое-то свойство/константу, которая была бы доступна в классе типа данных? Поясню. У меня получается несколько типов данных, например, длина, вес, объем и т.п. Но по своей сути друг от друга они ничем не отличаются, кроме указания какого типа запись (длина, вес и т.п.) получать из сета.

И есть несколько “странностей” с data type. У меня на форме сейчас один атрибут с кастомным типом. При открытии объекта с пустым значением этого атрибута вижу, что метод public String format(@Nullable Object value, Locale locale) вызывается 5 раз с одинаковыми данными на входе null, "en". Тут нет ошибки?
При открытии объекта с заполненным атрибутом, сначала метод формат вызывается с null, "en", затем дважды с "30.480", "en"
Потом вызов public BigDecimal parse(@Nullable String value, Locale locale) throws ParseException (при отображении, как я понимаю вообще не должен использоваться) и снова дважды вызывается format.