Как использовать функции минимума/максимума, округления вверх и вниз (используя кратность), а также об использовании скриптов на языке Ruby
Функции "Минимум/Максимум"
Функции "Округлить вверх/вниз"
Скрипты на языке Ruby
Арифметические и условные операторы
Математические функции
Секреты и Подсказки:
Сортировка записей
Сложные расчеты
Скрипты и даты
Ссылка на запись
На примере таблицы "Сотрудники" рассмотрим работу функций.
Данная таблица содержит колонку с ФИО сотрудника, его должность и колонки с процентом КТУ (коэффициент трудового участия) за прошлый и текущий кварталы.
Используя две последние колонки, рассчитаем размер премии, которая полагается сотруднику.
Премия рассчитывается так: берется самый высокий показатель КТУ и умножается на сумму.
В первую очередь нужно добавить поле Формула на форму.
В первом выпадающем списке нужно выбрать "Функция":
Во втором выпадающем списке выбираем "Максимум":
Далее, нужно выбрать два поля для сравнения. В данном случае - это КТУ за прошлый и текущий кварталы.
Остается нажать на кнопку "Создать".
Теперь в нашей таблице появилось поле "Макс. КТУ", которое сравнивает два значения в записи и берет максимальное:
Функция "Минимум" работает с точностью до наоборот:
Для демонстрации функции округления, создадим формулу следующего вида:
Получаем результат:
Чтобы округлить сумму, воспользуемся функцией округления. Для этого нужно:
- создать новое поле Формула и выбрать функцию "Округлить вверх" (или "Округлить вниз");
- выбрать нужное поле;
- указать точность округления.
В результате получаем колонку с круглым числом:
На примере все той же таблицы "Сотрудники", рассмотрим работу скриптов.
Создадим новое поле Формула, выберем опцию "Функция" и пункт "Script (Ruby)" в следующем списке.
В скриптах используются HTML названия полей в качестве операндов. Нажав на ссылку под полем функции «Как вставлять данные записи» появится список доступных полей:
Достаточно выбрать поле из списка и скопировать его HTML название.
Обратите внимание, вы можете изменить HTML название поля прямо здесь. Достаточно указать новое название и нажать на кнопку "Обновить":
Доступны следующие арифметические и условные операторы:
(+) сложение
(-) вычитание
(*) умножение
(/) деление
(>) true, если левый операнд больше правого
(<) true, если левый операнд меньше правого
(%) деление по модулю
(==) true, если значения двух операндов одинаковы.
Условные операторы:
(if) используется для проверки истинности условия. Значения условия false и nil являются ложными (false), тогда как все прочие — будут True.
(elsif) используется для дополнительных условий.
(||) используется для проверки несколько условий.
Вернемся, к примеру. Предположим, что коэффициент доплаты отличается в зависимости от должности сотрудника.
Создадим скрипт следующего вида:
if 'долж' == 'инженер 1 категории'
максКТУ*650
где: if - условный оператор, 'долж' - HTML название поля "Должность", содержит значение 'инженер 1 категории'
Если условие соблюдается, то выполнить расчет: максКТУ*650
Создадим еще одно условие. Если должность - бухгалтер или секретарь, то коэффициент доплаты будет составлять - 500.
Записывается таким образом:
elsif 'долж' == 'бухгалтер' || 'долж' == 'секретарь'
максКТУ*500
Для всех других условий, коэффициент будет равен - 450.5
else
максКТУ*450.5
По завершению скрипта, нужно обязательно указать end
Для того, чтобы в результате получить круглое число, используем метод .round
Похожие методы Ruby, которые можно применить:
(round) - возвращает ближайшее целое число к вещественному числу
(ceil) - возвращает наименьшее целое число большее или равное числу.
(floor) - возвращает наибольшее целое, меньшее или равное.
(ceiling_up) - округлить вверх.
(ceiling_down) - округлить вниз.
В результате получаем скрипт:
Теперь в колонке "Премия" выполняются расчеты, которые отличаются в зависимости от должности.
На странице редактирования настроек поля можно включить опцию "Показывать поле на форме":
Таким образом, можно увидеть результат расчета прямо на форме:
Доступные методы и операторы: to_f, to_i, to_s, round, floor, ceil, ceiling_up, ceiling_down, include?, if, elsif, else, end.
Чтобы проверить, содержит ли поле определенное значение, вы также можете использовать элемент [ ].
Пример использования:
if 'наличие' ['склад']
true
else
false
end
Также, вы можете использовать две переменные: a и b
Кроме арифметических операторов, вы можете использовать основные тригонометрические, логарифмические и трансцендентные функции, а также находить корни. Функции записываются следующим образом: Math::функция(Имя_поля). Например, Math::acos(Field_csIfon). Подробный перечень математических функций:
Тригонометрические функции
(::cos) возвращает косинус заданного аргумента.
(::sin) возвращает синус заданного аргумента.
(::tan) возвращает тангенс заданного аргумента.
Обратные тригонометрические функции
(::acos) возвращает арккосинус заданного аргумента.
(::asin) возвращает арксинус заданного аргумента.
(::atan) возвращает арктангенс заданного аргумента.
(::atan2) возвращает тангенс двух заданных аргументов.
Гиперболические тригонометрические функции
(::cosh) возвращает гиперболический косинус заданного аргумента.
(::sinh) возвращает гиперболический синус заданного аргумента.
(::tanh) возвращает гиперболический тангенс заданного аргумента.
Обратные гиперболические тригонометрические функции
(::acosh) возвращает аркгиперболический косинус заданного аргумента.
(::asinh) возвращает аркгиперболический синус заданного аргумента.
(::atanh) возвращает аркгиперболический тангенс заданного аргумента.
Сведение в степень и логарифмические функции
(::exp) возвращает значение заданного значения, сведенного в заданную степень.
(::log) возвращает логарифм заданного значения по заданному основанию.
(::log10) возвращает логарифм на основании 10 заданного аргумента.
(::log2) возвращает логарифм на основании 2 заданного аргумента.
Функции дроби и экспоненты
(::frexp) возвращает дробь и показатель степени заданного аргумента.
(::ldexp) возвращает значение для заданной дроби и показателя степени.
Корневые функции
(::cbrt) возвращает кубический корень заданного аргумента.
(::sqrt) возвращает квадратный корень заданного аргумента.
Функции ошибок
(::erf) возвращает значение функции ошибок Гаусса для этого аргумента.
(::erfc) возвращает значение дополнительной функции ошибок данного аргумента.
Гамма-функции
(::gamma) возвращает значение гамма-функции данного аргумента.
(::lgamma) возвращает значение логарифмической гамма-функции для данного аргумента.
Функция гипотенузы
(::hypot:) возвращает sqrt(a**2 + b**2)для этого aи b.
Рассмотрим еще несколько примеров, как упростить работу с использованием функций.
Перед вами таблица с отбором кандидатов на работу:
Задача разделить кандидатов на три группы: подходящий кандидат, резервный кандидат и неподходящий кандидат.
Для этого можно воспользоваться Формой поиска, но критериев довольно много, а может быть еще больше.
На помощь приходит поле с функцией. Создадим новую формулу "Отбор".
Разделим кандидатов на три условные группы.
Если кандидат имеет:
- Возраст до 45 лет;
- Высшее образование;
- Стаж работы больше 5 лет;
- Рекомендацию от предыдущего работодателя, то такой кандидат получает статус "Подходит".
Для "Резерва" кандидату достаточно иметь возраст до 50 лет, высшее или не полное высшее образование и стаж больше 5 лет.
Все другие кандидаты получают статус "Не подходит".
Такая функция в виде кода, выглядит следующим образом:
if возраст<45 && "образование" == "Высшее" && стаж>5 && "рекомендация" == "Есть"
"Подходит"
elsif возраст<50 && "образование" == "Высшее" || "Высшее не полное" && стаж>5
"Резерв"
else
"Не подходит"
end
Обратите внимание: числовые значения (включая html-названия полей) не берутся в кавычки. Кавычки применяются только для строковых значений.
Как видно на следующем скриншоте, каждому кандидату присвоился статус исходя из критериев.
Согласитесь, гораздо легче выполнить поиск по одному полю, вместо нескольких критериев.
Тоже самое касается Форматирования в таблице:
Используем поле "Отбор" для форматирования записей в таблице:
После поиска или группировки по одному полю гораздо удобнее сформировать Отчет:
В котором окажутся все кандидаты по нужным критериям:
Не стоит забывать и про Действия по условию и поле Действие.
Например, создать кнопку с действием "Отправить емейл", которая по условию доступна только в записи напротив "Подходящего" кандидата.
Посмотреть пример, как создать кнопку Действие, вы можете по этой ссылке.
Поле с функцией можно использовать в качестве критерия в Правилах для полей.
Для этого нужно включить поле "Отбор" на форме:
Далее создадим новое поле "Поставить в очередь" (Радио кнопка) с выбором из двух значений:
Создаем правило.
Если значение поля "Отбор" состоит из "Резерв", то показать поле "Добавить в очередь":
Так это выглядит на форме:
Применение функций позволит не только эффективнее управлять данными, но и проводить более сложные расчеты.
Для примера рассмотрим таблицу с расчетом заработной платы.
Оклад данного сотрудника составляет 55 000 рублей. Вместо 24 рабочих дней он отработал 20 в этом месяце. Также ему была начислена премия в размере 6 800 рублей.
В первую очередь нужно рассчитать налог на доход данного работника по ставке 13 %.
Налог на доход считается так: (55000/24)*20*0.13, получается 5958,3 руб.
Далее ЗП: ((55000/24)*20) + 6 800 - 5958,3 округлим результат и получим - 46 675 руб.
Если проводить такой расчет стандартными формулами, то нам бы пришлось делить расчет на несколько промежуточных формул.
С помощью Ruby функций можно провести такой расчет в одном поле:
((оклад/24.0*дни)+премия-(оклад/24.0*дни*0.13)).round
(Метод .round используется для округления результата).
Получаем результат:
Пожалуйста, обратите внимание: для корректного расчета необходимо использовать тип поля "Число с точкой".
Для примера используем таблицу с договорами.
Задача: определить, через сколько дней закончится договор.
Создаем скрипт следующего вида:
дата_окончания.mjd - DateTime.now
Где:
дата_окончания - html-названия поля,
метод .mjd - переводит дату в формат Юлианского календаря,
DateTime.now - объект, значение которого является текущим значением местной даты и времени.
В итоге получаем колонку с количеством дней до окончания договора.
Рассмотрим еще один пример использования функций и даты.
Задача: определить год рождения, имея только возраст пользователя.
Создаем скрипт следующего вида:
DateTime.year - возраст
Где:
возраст - html-названия числового поля,
DateTime.year - объект, значение которого является текущим годом.
В итоге получаем колонку с годом рождения для каждого.
С помощью скрипта можно создать ссылку на просмотр записи. Перейдите в меню Записи и откройте просмотр записи.
Скопируйте ссылку в адресной строке:
Создайте поле Формула. Выберите Скрипт (Ruby) из списка. Вам нужно использовать переменную "a" и ссылку на запись из предыдущего шага (записывается кавычках). Замените идентификатор записи на "Идентификационный записи (внутренний)" из списка на значение - |internal_id|:
Таким образом, вы получите ссылку на запись в таблице:
Вы также можете использовать ссылку на Виджет записи: