...

Работа с таблицами через сценарии

Тема в разделе "Примеры сценариев", создана пользователем ELMA365, 1 дек 2021.

  1. ELMA365

    ELMA365 Moderator

    Рассмотрим несколько примеров работы с типом данных таблица в сценариях.

    В примерах будем использовать два приложения.

    Заказы (orders) с полем типа таблица (content), которая состоит из четырех колонок:

    • Товар (item) — ссылка на приложение Товары;
    • Цена (price) — цена товара берется из приложения Товары с помощью формулы;
    • Количество (amount) — количество товара в заказе;
    • Стоимость (total) — формула $price * $amount . По этой колонке также рассчитывается общая сумма.
    [​IMG]

    Приложение Товары (products), содержит поля:

    • Наименование (__name) — ключевое поле;
    • Цена (price) — деньги;
    • Остаток (stock) — число;
    [​IMG]

    Для каждого примера будем создавать простой бизнес-процесс и запускать его с помощью кнопки на карточке элемента приложения.

    [​IMG]


    Работа с результатом колонки таблицы
    Сгенерируем счет по шаблону с указанием общей стоимости заказа из таблицы.

    [​IMG]

    В контексте бизнес-процесса нам понадобится два поля: Заказ (order), типа приложение и Сумма заказа (total_price), типа деньги.

    Для того, чтобы использовать сумму заказа в генерации файла, нужно сначала записать ее в контекст. Сделаем это с помощью сценария:

    Код:
    
    async function getTotal(): Promise {
    // Получаем заказ
    const order await Context.data.order!.fetch();
    // Записываем в контекст результат колонки total
    Context.data.total_price order.data.content!.result.total;
    }
    После этого можно использовать контекстную переменную Сумма заказа в блоке генерация по шаблону.

    [​IMG]


    Удаление строк таблицы
    Проверим, есть ли в таблице заказа позиции, в которых не указано количество товара, и удалим такие строки:

    [​IMG]

    Код:
    
    async function deleteEmptyRows(): Promise {
    // Получаем заказ
    const order await Context.data.orders!.fetch();
    // Проходим циклом по каждой строке
    for (let i order.data.content!.length 1>= 0i--) {
    const 
    row order.data.content![i];
    // Проверяем, заполнено ли поле Количество
    if(!row.amount) {
    // Удаляем строку, если не заполнено
    order.data.content!.delete(i);
    }
    }
    // Сохраняем заказ
    await order.save();
    }
    [​IMG]

    Подобным образом можно итерировать строки таблицы и удалять, исходя из любых параметров.


    Добавление строк в таблицу
    Предположим, клиент решил добавить в заказ еще один товар. Предусмотрим для менеджера возможность выбрать в задаче элемент приложения Товар и указать количество.

    [​IMG] [​IMG]

    Затем добавим выбранный товар в таблицу заказа с помощью сценария:

    Код:
    
    async function addToOrder(): Promise {
    // Получаем заказ
    const order await Context.data.orders!.fetch();
    // Вставляем строку
    const row order.data.content!.insert();
    // Заполняем строку
    row.item Context.data.product!;
    row.amount Context.data.amount!;
    // Сохраняем заказ
    await order.save();
    }
    [​IMG]
    Обновление элементов приложения, используемых в таблице
    После успешно выполненного заказа, можно посчитать остатки на складе.

    Напишем сценарий, который обновит значение поля Остаток (stock) для всех элементов приложения Товары, выбранных в таблице:

    Код:
    
    async function updateStock(): Promise {
    // Получаем заказ
    const order await Context.data.orders!.fetch();
    // Используем цикл, чтобы применить действия к каждой строке таблицы в заказе
    for (let row of order.data.content!) {
    // Получаем выбранный в строке элемент приложения Товары
    const product await row.item.fetch();
    // Считаем остаток
    product.data.stock! -= row.amount;
    // Сохраняем элемент приложения
    await product.save();
    }
    }
    После выполнения сценария остатки обновятся.
  2. elma

    elma Участник

    Подскажите, а каким образом можно реализовать сценарий работы с таблицей, когда нужно при изменении значения в одной ячейке другие ячейки обновлялись/ пересчитывались?
  3. pozhidaev

    pozhidaev Новичок

    Поддерживаю, тоже интересно.
  4. grebina

    grebina Техническая поддержка

    Добрый день. На текущий момент нет возможности задать событие при изменении колонки таблицы (чтобы изменить значения в других колонках). Задача по реализации данной функциональности передана в отдел разработки и будет рассмотрена при разработке новых версий системы.