Падение LibreOffice Calc в ходе выполнения макроса

Автор ost, 31 марта 2017, 15:56

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

ost

Доброго.
При выполнении макроса

Sub Service4
sBD="SQLite_LO_test"
sQuerry="SELECT * FROM U_"

oRS=CreateRowSet(sBD,sQuerry)
zz=MyTools.MySet.CreateResultArrayFromQuerry(oRS)

oRS1=CreateRowSet1(sBD,sQuerry)
zz1=MyTools.MySet.CreateResultArrayFromQuerry(oRS1)
End Sub

'===Делаем RowSet
Function CreateRowSet(sBD, sQuerry as String) as Array
RowSet = createUnoService("com.sun.star.sdb.RowSet") ' создаем
RowSet.DataSourceName = sBD ' указываем зарегистрированную базу данных, без *.odb!
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND ' вызываем команду
RowSet.EscapeProcessing=FALSE

RowSet.Command = sQuerry
RowSet.execute() ' выполняем

CreateRowSet=RowSet
End Function


'===Делаем RowSet
Function CreateRowSet1(sDBName, sSQLCommand as String) As Array
RowSet = createUnoService("com.sun.star.sdb.RowSet") ' создаем
RowSet.DataSourceName = dbName ' указываем зарегистрированную базу данных, без *.odb!
RowSet.CommandType = com.sun.star.sdb.CommandType.COMMAND ' вызываем команду
RowSet.EscapeProcessing=FALSE

RowSet.Command=sSQLCommand
RowSet.execute() ' выполняем

CreateRowSet=RowSet
End Function



в строке

zz=MyTools.MySet.CreateResultArrayFromQuerry(oRS)


возникает ошибка:
Ошибка времени выполнения BASIC.
Свойство или метод не найдены: MySet.


Однако, после разворачивания в каталоге объектов редактора макросов ветки "Мои макросы и диалоги / MyTools" макрос выполняется без ошибок, но в момент выполнения RowSet.execute() функции CreateRowSet1 офис тихо падает "вследствие неожиданной ошибки...". Не могу понять почему, ведь функции CreateRowSet и CreateRowSet1 одинаковы. Как избежать обеих ошибок, растолкуйте, пожалуйста.

LibreOffice 5.3.1.2 (x64), Windows 7 (x64)

economist

Вероятно библиотеку MyTools с модулем MySet надо явно загрузить.

Вопрос: что будет если макрос CreateResultArrayFromQuerry(oRS1) поместить в сам документ и код заменить на просто:

zz1=CreateResultArrayFromQuerry(oRS1)
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

rami

Для начала уберите as Array из Function CreateRowSet(sBD, sQuerry as String) as Array, затем добавьте строку кода:
GlobalScope.BasicLibraries.LoadLibrary("MyTools") в макрос Service4. Теперь надо смотреть что есть в библиотеке MyTools, модуле MySet и далее.

rami

В макросе CreateRowSet1 в строке RowSet.DataSourceName = dbName ' указываем зарегистрированную базу данных, без *.odb! — откуда взялось dbName ??? если переданный параметр sDBName  :-\

И зачем нужно было дублировать макрос CreateRowSet как CreateRowSet1, да ещё с ошибками  ??? ??? ???

ost

Цитата: economist от 31 марта 2017, 14:31Вероятно библиотеку MyTools с модулем MySet надо явно загрузить.
Действительно, проблема с ошибкой времени выполнения решилась явной загрузкой библиотеки.

Цитата: rami от 31 марта 2017, 14:33Для начала уберите as Array...
Тестировал без этого " as Array". Падения это не исключило. К падениям приводила замеченная вами ошибка в имени параметра sDBName, переданного в функцию CreateRowSet1. Модуль MySet из библиотеки MyTools содержит процедуру, формирующую из набора данных RowSet массив, пригодный для вставки в лист Calc. Эта процедура отрабатывает без ошибок.

Цитата: rami от 31 марта 2017, 15:41И зачем нужно было дублировать макрос CreateRowSet как CreateRowSet1, да ещё с ошибками
Дублирование - результат попыток разобраться в чем причина падений.
Изначально это были разные более сложные функции. Одна из них находилась с вызывающей процедурой в одном модуле, вторая - в другой библиотеке. Первая отрабатывала без ошибок, вторая вызывала падение. Руководствуясь известным принципом, сокращал сущности в стремлении установить корень проблем. В ходе этих манипуляций пришел к "парадоксальной" ситуации, =) которую и описал стартовым постом.
Не программист я, но жить то как-то надо.
Спасибо участие и терпение.


economist

ost - если копируете код отовсюду - не пренебрегайте Option Explicit в начале каждого модуля. За рубежом в техлитературе и форумах давно сложилась устойчивая терминология, для них sDBName - считай как привычное слово. Нам этого не хватает. А StarBasic-у не хватает автокапитализации команд, как в VBA: вводишь msgbox - получаешь MsgBox. И сразу все опечатки видны.

Или сделали бы еще проще - как в Python, LUA и др.:  - все команды строчными буквами, в нижнем регистре.

А насчет "не программист" - это вы зря, раз уже занимаетесь программированием. Это как здоровый образ жизни - вещь, доступная всем. Думаю, каждый второй на форуме не является профессиональным кодером, но кодит. Продолжайте, и всё получится!
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...