News: LimeReport new version 1.5 has been released
Вышла новая версия LimeReport 1.5

Author Topic: В LimeReport есть ли возможность добавлять свои функции?  (Read 268 times)

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
Доброго времени суток!
Хотелось бы иметь управляемую функцию, которая возвращает строку, зависящую от входных данных. Допустим, функция принимает значение, которая внутри функции передается в WHILE x=параметр и, в результате формируется строка.
Наверняка, это можно сделать вручную, но, непонятно с чего начать.
С документацией тяжко. Допустим непонятно что делает вкладка Script. Возможно, что моя проблема решается где-то там.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1019
    • View Profile
Приветствую, совершено верно, на в кладке Script можно описать свои функции (язык JS) и потом использовать их в своем отчете. Можно поискать на форуме это довольно часто всплывавшая тема.   
« Last Edit: November 25, 2025, 01:36:24 pm by Arin Alex »

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
Оно, может и описано, но недостаточно понятно.
Допустим я написал скрипт
function reg_1(p, l)
{
   s = $V{SerNo};
   y = $V{Year};
   res = ${ SELECT regul_1 FROM report_table WHERE page = p AND line = l AND serno=s AND year=y } ;
   return res;
}
Чтобы потом использовать в ячейке, типа
$S{ reg_1(1,5) }
И получаю ошибку, что вполне ожидаемо.
Непонятна область видимости этой вкладки Script. Да и можно ли вообще вызывать такое, непонятно.
« Last Edit: November 25, 2025, 04:10:20 pm by Tux »

Subst

  • Sr. Member
  • ****
  • Posts: 464
    • View Profile
Хай!
Ошибка какая?

мне не нравится у тебя использование запроса внутри JS функции

я бы, пожалуй, определил DataSource, парамтеры запроса вытащил через переменные отчета...
ну, собственно, обычно в таких случаях именно так и делаю.

Проверь просто заомменть свой запрос и верни из ф-ии какое-то число

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
Дело не столько в ошибке, а в том, как вообще выполнить запрос и вернуть его результаты в переменную, например.
С DataSource понятно, что будет работать. Просто расписывать 100500 переменных не хочется. Тем более, что они будут отличаться незначительно. Функцией будет явно компактнее и быстрее.

Subst

  • Sr. Member
  • ****
  • Posts: 464
    • View Profile
в отчете никак, вроде бы
вообще - выполнить запрос в коде программы и передать переменную в отчет

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
Этих переменных, в моём варианте, должно быть 240 штук. Хотя, самих данных немного.
Не во всех же отчётах пишут 1 запрос и получают 50 строк. Потом другой запрос - ещё 50 строк. И так далее.
Подожду автора, может что подскажет...

Subst

  • Sr. Member
  • ****
  • Posts: 464
    • View Profile
ну никому, кроме тебя, пока не ясна постановка задачи :o)

но из JS доступ к самому соединению с БД кажется неосуществимым
но подождем Алекса, может что я упустил
могу в телегу ему крикнуть, чтоб заглянул...

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
ну никому, кроме тебя, пока не ясна постановка задачи :o)
Задача простая - калибровка прибора. Одно значение на одну калибровку. Отчёт был в бумажном виде, заполнялся вручную. Потом сделали программу автоматизации. Потом изменили отчёт. Потом перемешали строки. Обычное дело - вся разработка без какого либо ТЗ и документации.   :D

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1019
    • View Profile
Приветствую.
Я если честно не совсем понимаю логику этих действий :)
Можно заслать в меня отчет я его хоть гляну если там нет секретных данных ?

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
Можно заслать в меня отчет я его хоть гляну если там нет секретных данных ?
Отчёт обычный, особо секретных данных нет. Но, сам отчёт показать не могу - ДСП.
Запрос я показал- там хитрость в том, что в самой БД данные лежат не последовательно. Запросить единым запросом не  выйдет. Можно взять и разложить по одному - но однотипных запросов много выходит.
Может можно как то из отчёта вызвать функцию из вызывающей его программы?

Subst

  • Sr. Member
  • ****
  • Posts: 464
    • View Profile
ну я наверное чего-то недогоняю все же...
но однотипные вопросы, определил датасорс, который параметры из переменных берет

в нужном месте задал переменные, сделал prepareDatasource (не помню точно, там нескольк овариантов, Алекс подскажит или я копну), забрал то, что в датасорсе лежит

как-то так вроде

Tux

  • Newbie
  • *
  • Posts: 17
    • View Profile
ну я наверное чего-то недогоняю все же...
Вы, видимо, просто не работали в организациях, где нет ни ТЗ, ни документации, зато есть  100500 программистов, работающих над одной программой в разные интервалы времени.  :)
Простая функция с аргументами в отчёте, выполняющая запрос к БД,  решила бы мои проблемы - осталось только узнать, как именно это сделать.

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1019
    • View Profile
Где мы только не работали :)

Если нужно запихать плюсовую функцию в лайму можно сделать следующее

class FuncManager: public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE QString sayHello(const QString& name) {
        return "Hello " + name;
    }
};

report->scriptManager()->moveQObjectToScript(new FuncManager(),"MyFunc");

в отчете можно юзать

$S{MyFunc.sayHello("Tux")}