Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

29 Апрель 2017, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Падение LibreOffice Calc в ходе выполнения макроса  (Прочитано 355 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ost
Пользователь
**
Offline Offline

Сообщений: 54


« Стартовое сообщение: 31 Март 2017, 15:56 »

Доброго.
При выполнении макроса
Код:
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)
« Последнее редактирование: 31 Март 2017, 16:09 от ost » Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 502


« Ответ #1: 31 Март 2017, 16:31 »

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

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

zz1=CreateResultArrayFromQuerry(oRS1)
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 055


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #2: 31 Март 2017, 16:33 »

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

rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 055


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 31 Март 2017, 17:41 »

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

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

ost
Пользователь
**
Offline Offline

Сообщений: 54


« Ответ #4: 31 Март 2017, 19:54 »

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

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

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

Записан
economist
Ветеран
*****
Offline Offline

Сообщений: 502


« Ответ #5: 2 Апрель 2017, 10:09 »

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

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!