Формулы позволяют создавать вычисляемые свойства в [[Введение в Базы|Базах]] на основе данных из других [[Свойства|свойств]]. С их помощью можно выполнять вычисления, обрабатывать текст, работать с датами и многое другое. ## Возможности формул Формулы помогают: - **Вычислять значения** — складывать цены, подсчитывать итоги или выполнять математические операции. - **Обрабатывать текст** — объединять строки, изменять регистр или извлекать подстроки. - **Работать с датами** — вычислять разницу во времени, форматировать даты или определять сроки. - **Применять логику** — использовать условные выражения для отображения различных значений. - **Обрабатывать списки** — фильтровать, сортировать, преобразовывать или агрегировать данные списков. ## Создание свойства-формулы Чтобы создать свойство-формулу: 1. В базе нажмите **Свойства** на панели инструментов. 2. Нажмите **Добавить формулу** в нижней части меню. 3. Введите название свойства-формулы. 4. Введите формулу в поле **Формула**. 5. Закройте диалоговое окно. Редактор формул автоматически дополняет имена [[Функции|функций]] и свойств по мере ввода, а также проверяет синтаксис формулы. Зелёная галочка означает, что формула корректна. После создания свойство-формулу можно использовать так же, как любое другое свойство в базе. Добавляйте его в [[Виды|виды]], используйте в фильтрах, сортируйте по нему и многое другое. ## Написание формулы В редакторе формул введите выражение, используя свойства, операторы и функции. ### Ссылки на свойства В формулах можно ссылаться на различные типы свойств: - **Свойства заметки** — свойства из [[Свойства|начальных метаданных]] заметки. - **Свойства файла** — встроенные свойства, такие как `file.name`, `file.size` или `file.mtime`. - **Свойства-формулы** — другие формулы через `formula.formula_name`. **Примеры:** - `price * quantity` — умножение двух свойств заметки - `file.name + " - " + description` — объединение имени файла со свойством заметки - `formula.price_per_unit * 1.1` — использование другого свойства-формулы ### Использование операторов **Арифметические операторы** выполняют математические операции с числами: - `price + tax` — сложение - `price - discount` — вычитание - `price * quantity` — умножение - `price / quantity` — деление - `(part / whole) * 100` — скобки для задания порядка операций **Операторы сравнения** сравнивают значения: - `price > 100` — больше - `age < 18` — меньше - `status == "Done"` — равно - `status != "Done"` — не равно - `file.mtime > now() - '7d'` — сравнение дат **Логические операторы** объединяют логические условия: - `!completed` — отрицание - `price > 0 && quantity > 0` — и - `urgent || important` — или Подробнее в разделе [[Синтаксис Баз#Операторы|Синтаксис Баз]]. ### Использование функций Функции выполняют операции над значениями. Доступные функции зависят от типа данных, с которыми вы работаете. Полный список см. в разделе [[Функции]]. **Основные категории функций:** - **Глобальные функции** — `if()`, `now()`, `date()`, `link()`, `max()`, `min()` - **Строковые функции** — `contains()`, `replace()`, `split()`, `lower()`, `title()` - **Числовые функции** — `round()`, `ceil()`, `floor()`, `abs()`, `toFixed()` - **Функции дат** — `format()`, `relative()`, `date()`, `time()` - **Функции списков** — `filter()`, `map()`, `sort()`, `join()`, `unique()` **Примеры:** - `if(price, "quot; + price.toFixed(2), "")` — условное выражение с форматированием числа. - `file.name.lower()` — преобразование в нижний регистр. - `tags.contains("urgent")` — проверка, содержит ли список тегов определённое значение. - `due_date.format("YYYY-MM-DD")` — форматирование даты. ## Примеры формул ### Расчёт срока Установка срока проекта через 2 недели после даты начала: ```js start_date + "2w" ``` ### Отображение статуса просрочки Показать «Просрочено», если срок прошёл и статус не «Готово»: ```js if(due_date < now() && status != "Done", "Overdue", "") ``` ### Форматирование валюты Отображение цены с 2 знаками после запятой и символом валюты: ```js if(price, "quot; + price.toFixed(2), "") ``` ### Подсчёт элементов списка Подсчёт количества элементов в свойстве-списке: ```js tasks.length ``` ### Расчёт приоритета Объединение нескольких факторов в оценку приоритета: ```js (impact * urgency) / effort ``` ### Объединение текстовых полей Создание полного имени из имени и фамилии: ```js first_name + " " + last_name ``` ### Расчёт общей стоимости Умножение ежемесячной стоимости на количество месяцев владения: ```js monthlyUses * formula.Owned.round() ``` ## Типы данных Формулы работают с различными типами данных: - **Строки** — текст в кавычках: `"hello"` или `'world'` - **Числа** — числовые значения: `42`, `3.14`, `(2 + 2)` - **Логические значения** — истина или ложь: `true`, `false` - **Даты** — создаются с помощью `date()`, `today()` или `now()` - **Списки** — коллекции значений: `[1, 2, 3]` - **Объекты** — пары ключ-значение: `{"name": "value"}` Тип результата формулы определяется используемыми данными и функциями. ## Ссылки на другие формулы Формулы могут ссылаться на другие формулы, создавая производные вычисления. Например, если у вас есть формула `price_per_unit`: ```js price / quantity ``` Вы можете сослаться на неё в другой формуле: ```js formula.price_per_unit * 1.1 ``` > [!warning] Избегайте циклических ссылок > Формула не может ссылаться на саму себя напрямую или косвенно через другие формулы.