Оригинал на GitHub
Вопрос
Есть таблица, необходимо взять значения 2 столбцов таблицы из строк, отмеченных галочками (динамические пользовательские галочки в столбце с id) и вывести на печать.
Поле код действия содержит следующее:
=: linkToPrint(template: "Reestr_sertif"; data: $row)
row: rowCreate(field: "reestr" = $example)
example: select(table: 'certificate_iss_tracking'; field: 'serial_numbers'; where: 'id' = $num)
num: var(name: "count"; value: $#ids)
На печать выводит только одно значение (с наименьшим ID) хотя выделено 3 строки.
Подскажите как сделать что бы выводились все значение на печать?
Ответ
Totum жестко разделяет одинарные значения и множественные — они же списки или list.
Соответственно, функции имеют два варианта — одинарные (например select) и множественные (selectList).
В коде, который вы привели в строке example
используется одинарный вариант (select
), поэтому берется одно значение с наименьшим id
(если не задан order
то не обязательно так — это определяет postgres
у себя внутри).
Я модифицирую код на множественный:
=: linkToPrint(template: "Reestr_sertif"; data: $row)
row: rowCreate(field: "reestr" = $example)
example: selectList(table: 'certificate_iss_tracking'; field: 'serial_numbers'; where: 'id' = $#ids)
Еще я убрал var
и прописал where: 'id' = $#ids
— тк тут не нужна дополнительная строка кода.
Сделав это, вы столкнетесь с ошибкой! тк они list
, а шаблон печати ожидает text
.
Добавим превращение list
—> text
функцией listJoin:
=: linkToPrint(template: "Reestr_sertif"; data: $row)
row: rowCreate(field: "reestr" = $example)
example: listJoin(list: $list; str: "<br>")
list: selectList(table: 'certificate_iss_tracking'; field: 'serial_numbers'; where: 'id' = $#ids)
В качестве разделителя используем <br>
, а не быструю переменную $#nl
(это сокращение от new line
) тк html
не понимает эти разделители линий.
Теперь уже должно работать нормально, но будет ошибка, когда галочки не стоят (ни одна). Добавим в начало проверку наличия галочек. Переменная $#ids
это список (list), поэтому нам надо сравнить ее с пустым list
— $#lc
:
=: if(condition: $#ids != $#lc; then: $print; else: $err)
err: linkToDataText(title: "Предупреждение печати"; text: "Выберите хотя бы одну позицию")
print: linkToPrint(template: "Reestr_sertif"; data: $row)
row: rowCreate(field: "reestr" = $example)
example: listJoin(list: $list; str: "<br>")
list: selectList(table: 'certificate_iss_tracking'; field: 'serial_numbers'; where: 'id' = $#ids)
Вот обычно в таком варианте это используется в наших проектах.