Как в макросе запросом к БД выбрать максимальное значение в столбце?

Автор ivamartynov, 9 октября 2015, 09:14

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

ivamartynov

Есть подключенная база, хочу в этой базе выбрать максимальное значение в таблице PLAT в столбце DATE_PLAT и вставить его в ячейку Calc

Function ConnectToDataBase(dbName as String) as Object
Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("TEMP")
ConnectToDataBase=oDataSource.GetConnection("","")
End Function

Sub FN
sht = ThisComponent.Sheets.GetByName("IN")
DB = ConnectToDataBase("TEMP")
Statement = DB.createStatement()

ResultSet = Statement.executeQuery("select max(DATE_PLAT) from PLAT" '-----вот этот запрос не работает :(

If Not IsNull(ResultSet) Then
While ResultSet.next
sht.getCellByPosition(6,12).Formula = ResultSet '.GetString(7)
Wend
End If
Statement.Close()
End Sub

rami

Цитата: ivamartynov от  9 октября 2015, 07:14Есть подключенная база, хочу в этой базе выбрать максимальное значение в таблице PLAT в столбце DATE_PLAT и вставить его в ячейку Calc
Вот так:

Function ConnectToDataBase(dbName as String) as Object
Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName(dbName)
ConnectToDataBase=oDataSource.GetConnection("","")
End Function

Sub FN
sht=ThisComponent.Sheets.GetByName("IN")
DB=ConnectToDataBase("TEMP")
Statement=DB.createStatement()
ResultSet=Statement.executeQuery("SELECT MAX(""DATE_PLAT"") FROM ""PLAT""")
If NOT IsNull(ResultSet) AND NOT IsEmpty(ResultSet) Then
If ResultSet.next() Then sht.getCellByPosition(6,12).Formula=ResultSet.getString(1)
End If
DB.Close()
End Sub

JohnSUN

Во-первых, имена полей и таблиц нужно брать в двойные кавычки.
А во-вторых, в результате запроса всего одно значение. Так почему в .GetString() указана седьмая колонка?
Sub FN
sht = ThisComponent.Sheets.GetByName("IN")
DB = ConnectToDataBase("TEMP")
Statement = DB.createStatement()
ResultSet = Statement.executeQuery("SELECT MAX(""DATE_PLAT"") FROM ""PLAT""")

If Not IsNull(ResultSet) Then
ResultSet.next
sht.getCellByPosition(6,12).Formula = ResultSet.GetString(1)
Else
MsgBox ("Какой такой максимум?..")
End If
Statement.Close()
End Sub


PS. Хм, rami стреляет быстрее...  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ivamartynov

Спасибо товарищи! Как всегда оперативно! С утра попробую... И еще вопросик будет, надеюсь, как всегда на вашу помощь!

ivamartynov

Проверил :( не работает... пишет "Запрос не может быть выполнен. Слишком сложный, поддерживается только "COUNT(*)"". Может дело в том, что база данных, к которой идет обращение, создана в OpenOffice как связь с таблицей OOCalc?
Т.е. создал файл Calc в нем содержатся таблицы, создал Базу (odb) в которой данные из файла (ods).

rami

Цитата: ivamartynov от 10 октября 2015, 08:20Проверил  не работает... пишет "Запрос не может быть выполнен. Слишком сложный, поддерживается только "COUNT(*)"". Может дело в том, что база данных, к которой идет обращение, создана в OpenOffice как связь с таблицей OOCalc?
Т.е. создал файл Calc в нем содержатся таблицы, создал Базу (odb) в которой данные из файла (ods).
А какая надобность в таких "порочных связях"? Что это даёт?

ivamartynov

1. Ежедневно собираются боооольшие таблицы из программ в ods
2. Не умею, как в MS office импортировать таблицы в БД (выдает ошибки при "копировать" - "вставить", скорее всего из-за большого объема)
3. Пришлось сделать так: из разных файлов таблиц ods собираю все нужные листы в один файл ods (с ним и завязана odb) и потом из рабочего файла ods макросом собираю нужную информацию и работаю с ней...

rami

Цитата: ivamartynov от 10 октября 2015, 08:372. Не умею, как в MS office импортировать таблицы в БД (выдает ошибки при "копировать" - "вставить", скорее всего из-за большого объема)
Нужно не "копировать" - "вставить", а "перетащить" выделенный диапазон в Calc на категорию "Таблицы" в браузере баз данных (открывается по F4, откроется мастер экспорта данных.
Цитата: ivamartynov от 10 октября 2015, 08:373. Пришлось сделать так: из разных файлов таблиц ods собираю все нужные листы в один файл ods (с ним и завязана odb) и потом из рабочего файла ods макросом собираю нужную информацию и работаю с ней...
А напрямую связать все файлы .ods без использования базы?

ivamartynov

Цитата: rami от 10 октября 2015, 09:18А напрямую связать все файлы .ods без использования базы?
- не умею, когда делал подключение файла в Calc он создает odb на каждый файл таблицы, вот и подума, что лучше все таблицы собрать в один файл и уже его прикрутить к офису. Нужно, что бы все быстро работало и была возможность на разных рабочих местах все обновлять разом, т.е. задача такая была и есть:
1. Есть 5 рабочих мест
2. В локальной сети в общем каталоге лежит файл ods - в нем работают специалисты (Журнал)
3. Изначально у каждого специалиста был свой лист в ods и один общий (IN). Настроил одновременную работу с этим файлом, но потом пришлось отказаться, часто ОпенОфис "падал" при сохранении и терялись данные. А жаль приходится хотелось облегчить процесс администрирования. В общем теперь пункт 2 такой:
2*. В локальной сети в общем каталоге лежит пять файлов ods, в каждом есть Журнал (в своем файле каждый специалист вносит данные), так же в этих файлах есть лист IN на него работает макрос
4. Макрос собирает по введенному номеру (рег.номер) данные на лист IN, специалист анализирует полученные данные, сверяет и вносит свою информацию в свой журнал Журнал.
5. Ежедневно (иногда несколько раз в день), необходимо обновлять данные которые собираются макросом, вот тут то и решил сделать "из разных файлов таблиц ods собираю все нужные листы в один файл ods (с ним и завязана odb) и потом из рабочего файла ods макросом собираю нужную информацию и работаю с ней..." (Для чего? Для того, что бы работало быстро и дополнять данные нужно было только в одном месте, да и чтоб файлы каждого специалиста не весили по многу).
- вообще, по уму было бы сделать полноценную БД с формами ввода и таблицами хранения информации, но изучать некогда, коряво конечно сделал, но как смог... :(

что-то сумбурно получилось :( хотел все рассказать и поделиться проблемами:
1. Одновременная работа в одном файле не работает
2. Скорость заполнения данных должна быть быстрой
3. Обновление файлов Журналов (с точки зрения админа должно быть простым "один раз в одном месте")
4. Обновление файлов с данными для выборки должно быть простым (один раз в одном месте)