Программно сжать базу. Как?

Автор dndn, 2 августа 2013, 15:07

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

dndn

Точно видел на каком-то из англоязычных форумов, но потерял...  :( Даже проверял - работало.
Если через "Сервис", "SQL..." вбить "CHECKPOINT DEFRAG" - сжимает, программное же выполнение этого же запроса эффекта не дает...  :'(

P.S. Да, забыл добавить - использую OpenOffice Base со встроенной базой HSQLDB.

JohnSUN

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

dndn


dndn

#3
К сожалению код в таком виде, как там описано:
Sub DefragDatabase()
 ' The next line retrieves the currently open database connection
 ' (and requires that a .odb document is openend and active at the moment)
 oCon = ThisComponent.DataSource.getConnection("", "")
 oStmt = oCon.createStatement("checkpoint defrag") ' the macro counterpart for typing in the SQL Window
 oStmt.executeUpdate()                             ' Clicking the button
 oStmt.close()
 ' Don't close the connection oCon here, it is only borrowed from the .odb document
 ' and that document will still need it.
End Sub


базу данных не сжимает, т.е. реально размер файла базы данных после этого не уменьшается  :(

Нашел работающий код, который реально уменьшает размер файла базы данных:
sub CompactDatabase
Dim oViewDatabase,oCon,oStatement,sSQL
oViewDatabase = ThisDatabaseDocument.CurrentController
' When there is not a connection to the database make the connection
' The DatabaseDocument must have all the data for this.
if  oViewDatabase.isConnected = false then oViewDatabase.connect
oCon=oViewDatabase.ActiveConnection
'sQuote = oCon.getMetaData().getIdentifierQuoteString()
oStatement = oCon.CreateStatement()
sSQL = "Checkpoint defrag" 'For HSQLDB
oStatement.execute(sSQL) ' This execute the the line
ThisDatabaseDocument.store ' Store the database
end sub


Но это работает, если макрос запускать в модуле самой базы. У меня же база данных подключается из вэб-формы.
Помогите доработать макрос, чтобы можно было сжать базу из другого открытого документа...

dndn

Хорошо, тогда хоть подскажите, как из-под вэб-формы Writer'а открыть в фоновом режиме базу данных, запустить записанный там макрос сжатия БД, сохранить базу и закрыть ее  ???

Hasim

Вы задаете конкретный вопрос по вашей конкретной базе. Чтобы ответить на него, нужно видеть и вашу базу и веб-форму.
На абстрактный вопрос будет абстрактный ответ.
Например, дописать макрос отсюда Открытие формы при загрузке базы данных (невидимой)

dndn

#6
Главная форма базы данных была сохранена как документ Writer и удалена из базы.
Как описывалось здесь: http://myooo.ru/content/view/101/97/
В точности такой же случай.
Просто мне предстоит делать временные таблицы, заполнять и удалять их. Хотелось самому после этого незаметно все чистить, а не посылать конечного пользователя в "сервис", "sql..." файла базы.

Пример хороший, спасибо. Будем брать на вооружение.


Hasim

У вас сверхсекретная БД? Ее нельзя показывать?
Никто не будет изобретать вашу БД со всеми прибамбасами.
Выложите вашу базу.
Цените время других.

dndn

Только не смейтесь, ладно?  ;D

Hasim

Запуск команды SQL в БД из другого файла ODS макросом, находящимся в ODS, описан в Копирование данных из CALC в BASE.
Можно использовать и для запуска макроса и из ODT, немного переработав.

dndn


dndn

#11
Цитата: dndn от 20 июля 2014, 22:02К сожалению код в таком виде, как там описано:
Код:
Sub DefragDatabase()
 ' The next line retrieves the currently open database connection
 ' (and requires that a .odb document is openend and active at the moment)
 oCon = ThisComponent.DataSource.getConnection("", "")
 oStmt = oCon.createStatement("checkpoint defrag") ' the macro counterpart for typing in the SQL Window
 oStmt.executeUpdate()                             ' Clicking the button
 oStmt.close()
 ' Don't close the connection oCon here, it is only borrowed from the .odb document
 ' and that document will still need it.
End Sub

базу данных не сжимает, т.е. реально размер файла базы данных после этого не уменьшается

Решил! К приведенному выше примеру нужно добавить одну строчку:

Sub DefragDatabase()
 ' The next line retrieves the currently open database connection
 ' (and requires that a .odb document is openend and active at the moment)
 oCon = ThisComponent.DataSource.getConnection("", "")
 oStmt = oCon.createStatement("checkpoint defrag") ' the macro counterpart for typing in the SQL Window
 oStmt.executeUpdate()                             ' Clicking the button
 oStmt.close()
 ' Don't close the connection oCon here, it is only borrowed from the .odb document
 ' and that document will still need it.
 ThisComponent.DataSource.DataBaseDocument.store ' Store the database
End Sub

dndn

Вот такое наблюдение. В базе есть макрос по расчету значений полей в таблицах. Вставок новых записей и удаления существующих не производится, только обновление полей.
Делаем дефрагментацию базы. Закрываем базу.
1. Открываем предварительно дефрагментированную базу. Производим расчет.
2. Делаем повторную дефрагментацию. Производим расчет.
Во втором случае макрос работает ощутимо быстрее. Т.е., выполнение дефрагментации непосрдественно перед обновлением полей в предварительно дефрагментированной базе существенно ускоряет работу макроса! Никто не замечал?