Как с помощью макроса выполнить параметрический запрос?

Автор vasyun, 22 августа 2014, 03:42

0 Пользователи и 1 гость просматривают эту тему.

vasyun

Есть база в которой хранится запрос с именем "Кол-во звонков в г.Москва". Этот запрос с параметрами, например такой:
SELECT * FROM table1 WHERE minutes > :min

Я хочу с помощью макроса передать в этот запрос значение параметра "min", выполнить этот запрос, его результат получить и дальше уже заниматься дальнейшей обработкой и выводом в Calc.

Как в таком случае передать параметр?
LibreOffice 5.0.4.2
Apache OpenOffice 4.1.2

vasyun

#1
Пока нашёл возможность посмотреть эти параметры через свойства по индексу, но не знаю как его можно использовать чтобы эти параметры задать.
oDBConnection=oDBContext.getByName(db_name).GetConnection("", "")
sSQL="SELECT * FROM table1 WHERE minutes > :min AND minutes < :max"
oRowSet = createUnoService("com.sun.star.sdb.RowSet")
oRowSet.activeConnection = oDBConnection
oRowSet.Command = sSQL
oRowSet.Parameters.getByIndex(0).Value = "3"
oRowSet.Parameters.getByIndex(1).Value = "60"
LibreOffice 5.0.4.2
Apache OpenOffice 4.1.2

JohnSUN

Поле minutes - это то же поле, что и minitus? И обозначает "минуты"? Так почему в качестве параметров запроса подставляются строки похожие на даты?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

vasyun

#3
Да параметр тот же.
Дата - это я просто торопился и не исправил после копирования.
И хотя Мне нужна дата, я для простоты и наглядности примера сделал минуты поле то может быть любым в принципе.
В примере поправил.
LibreOffice 5.0.4.2
Apache OpenOffice 4.1.2

JohnSUN

Ну? И в чём, собственно, проблема? Отобрать в Calc только значения BETWEEN "значения от сих до сих" и дополнительно их обработать? Или наложить на запрос ещё более навороченный фильтр (в смысле - макросом отсеять лишнее) и получить в Calc'овской таблице окончательный результат?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Цитата: JohnSUN от 22 августа 2014, 17:21И в чём, собственно, проблема?
Как я понял, проблема в том, как написать запрос с параметром, т.е., как будет выглядеть эта строка запроса в тексте кода макроса.

JohnSUN

Без приложенных к вопросу  .odb+.ods файлов запрос "Кол-во звонков в г.Москва" всегда будет выдавать ошибку.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Если нужно интерактивно (вручную) вводить параметры, например, xmin и ymax, то нужно использовать InputBox, как-то так:
xmin=InputBox("Введите значение xmin","xmin",0)
ymax=InputBox("Введите значение ymax","ymax",0)
oSql = "SELECT Модель FROM Активы WHERE КодАктива > " & xmin & "AND КодАктива < " & ymax


А вот такой вариант:
oSql = "SELECT Модель FROM Активы WHERE КодАктива > :xmin AND КодАктива < :ymax"
выдаст ошибку.

vasyun

Мне не нужна интерактивность.
Запросы я привёл простые для наглядности.

У меня есть макрос который по кнопке выполняет некий алгоритм и получает результат две переменные min и max.
Дальше нужно результаты алгоритма передать в SQL-запрос.

Я могу это сделать если 2 способами
1) способ:
Например прямо в коде буду хранить этот гигантский SQL-запрос как string  и в него с помощью переменных передавать результаты алгоритма. Наверное это просто когда у тебя одна кнопка и один запрос. Но если представить что таких кнопок более 10 и все запросы разные, то код макроса становится гигантским.

2) способ:
Я решил вынести из кода все SQL-запросы, чтобы в них передавать переменные кроме как интерактивные SQL ни чего не нашёл. Ну а дальше встал вопрос из темы топика. Как в запрос передать параметры из макроса?

База PostgreSQL поэтому могу выложить только то что есть без таблиц.
LibreOffice 5.0.4.2
Apache OpenOffice 4.1.2

Hasim

#9
Цитата: vasyun от 25 августа 2014, 12:241) способ:
Например прямо в коде буду хранить этот гигантский SQL-запрос как string  и в него с помощью переменных передавать результаты алгоритма.
Очень гигантский запрос можно хранить в отдельных файлах и читать эти файлы в макрос.
Или вы можете использовать запрос в макросе, предварительно программно заменив в строке запроса выражение :x на распознающееся макросом.

Цитата: vasyun от 25 августа 2014, 13:24
2) способ:
Я решил вынести из кода все SQL-запросы, чтобы в них передавать переменные кроме как интерактивные SQL ни чего не нашёл. Ну а дальше встал вопрос из темы топика. Как в запрос передать параметры из макроса?
Практически никак.
Вы хотите программно передать данные в интерактивный запрос (:x), простым способом этого не сделать - нужен метод программного управления этим интерактивным окном - это невозможно без геморроя с управлением окнами.

Hasim

Теоретически должно работать, но не работает.
Например, для запроса Запрос_п:
SELECT "Модель" FROM "Активы" WHERE "КодАктива" > :x
выдает ошибку:

vasyun

Да я так и пробовал и получил именно эту ошибку.
Хранить SQL-запросы в файлах не догадался. Но это решение для меня новое и пугает тем, что не знаешь на какие ещё грабли там наступишь.
Интересно, а кто-то сталкивался с такой проблемой, когда в коде появляются огромные SQL-запросы, из-за которых код тяжело читать и править? Кто как решает такую проблемку?
LibreOffice 5.0.4.2
Apache OpenOffice 4.1.2

Hasim

Теоретическое описание использования параметров в SQL запросах:
http://www.openoffice.org/api/docs/common/ref/com/sun/star/sdbc/XParameters.html

На практике, похоже, этим никто никогда не пользовался.
Можно было бы поспрашивать на oooforum.org, но он недоступен, как всегда.

Hasim

Цитата: vasyun от 25 августа 2014, 17:58Хранить SQL-запросы в файлах не догадался. Но это решение для меня новое и пугает тем, что не знаешь на какие ещё грабли там наступишь.
Можно хранить в самой БД в строках отдельной таблицы.

vladboscaneanu

Я не знаю,правильно ли понял задание,нo месяц назад написал одному типу макрос,где он
вводил даты и получал результаты ,возможно это будет дополнительной идеей для Вас.Откыть форм "Cerca per Data".