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

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

26 Октябрь 2020, 14:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Сделать активным новый лист. Как?  (Прочитано 8421 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dndn
Форумчанин
***
Offline Offline

Сообщений: 93


WWW
« Стартовое сообщение: 23 Август 2013, 15:03 »

Помогите решить задачку.
Надо нарисовать 3 таблицы на 3-х разных листах, но так, чтобы видна была прорисовка каждого листа, а затем снова сделать активным первый...  Непонимающий
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 23 Август 2013, 16:00 »

Код:
Sub SelectSheetToShow
Dim oCurrentController As Variant
Dim oSheets As Variant
Dim oSheet As Variant
Dim oCellByPosition As Variant
Dim emptyRng As Variant
Dim i%, j%
REM Активировать листы будет oCurrentController
oCurrentController = ThisComponent.getCurrentController()
REM А этот пустой диапазон поможет сбросить выделение
emptyRng = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oSheets = ThisComponent.getSheets()
For i = 0 To 2
oSheets.insertNewByName("Test"+i, 0)
oSheet = oSheets.getByIndex(0)
oCurrentController.select(oSheet)
oCurrentController.select(emptyRng)
REM Имитируем заполнение листов данными
For j = 0 to 9
oCellByPosition = oSheet.getCellByPosition(j, j)
oCellByPosition.setValue(j*10+j)
Wait(300) ' Чтобы не слишком быстро мельтешило
Next j
For j = 0 to 9
oCellByPosition = oSheet.getCellByPosition(j, 9-j)
oCellByPosition.setValue((9-j)*10+j)
Wait(300)
Next j
Next i
REM Выделяем финальный лист
oCurrentController.select(oSheets.getByIndex(2))
REM и снимаем выделение
oCurrentController.select(emptyRng)
End Sub
Записан

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

Сообщений: 93


WWW
« Ответ #2: 23 Август 2013, 17:07 »

Я знал, кто может мне ответить  Всё хорошо
Спасибо огромнейшее Влад, и низкий тебе поклон, жаль, что я не женщина, а то бы -  Целующий (шутка)...
Заказчика плющит от того, как это самогеневарьируется -не путать с "самогоноворится"  Смеющийся
Еще раз спасибо. Есичё - можно обращацца?  Рот на замке

ЗЫ. Я - не программист. Первая проба в ОпенОффисе - 17 мая (по дате создания первой пробной базы данных). Заказчик - не крутой бабломан, а форумское сообщество обычных юзеров. А я их пытаюсь повеселить поделками в теме конкурса спортивных прогнозов...  Да уж...
« Последнее редактирование: 23 Август 2013, 17:18 от dndn » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #3: 23 Август 2013, 17:21 »

Есичё - можно обращацца?  Рот на замке
А пуркуа бы, собссно, и не па?  Всё хорошо
Записан

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

Сообщений: 93


WWW
« Ответ #4: 23 Август 2013, 17:46 »

Строка
Код:
emptyRng = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
выдает ошибку
Вызвано исключение
Type: com.sun.star.lang.ServiceNotRegisteredException
Message:.
 Плачущий

ЗЫ. Использую OpenOffice 4.0.0
« Последнее редактирование: 23 Август 2013, 18:06 от dndn » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #5: 23 Август 2013, 19:08 »

А запускаешь на выполнение из Calc'а? Из Бэйсика? Так в Бэйсике действительно такой штуки нет... Если ThisComponent это книга Calc'а - обязано работать
Записан

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

Сообщений: 93


WWW
« Ответ #6: 23 Август 2013, 20:29 »

Схема такая - есть база данных, внутренняя на встроенной hsqldb.
Базу искусственно разделил - файл *.odb содержит собственно данные, а главную форму сохранил как документ Writer'a *.ods, ну чтоб если я что-то меняю в коде, то чтоб оно не коснулось данных. Все модули перенес в файл главной формы *.ods. Оттуда все и запускается...
Если нельзя, то не особо критично, в принципе все строится в неактивных листах, но их просто не видно...

Т.е. Calc запускаю не из-под Calc'а, а из формы Base, сохраненной как документ Writer...
« Последнее редактирование: 23 Август 2013, 22:45 от dndn » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #7: 24 Август 2013, 08:16 »

А, понятно...
У тебя две опечатки - оба раза, когда пишешь .ods имеется в виду .odt.  Показывает язык

Достаточно запомнить ссылку на созданную книгу Calc в какой-то переменной (например, oDoc) и заменить все ссылки ThisComponent на этот самый oDoc.
Ты как отчет открываешь? Покажи-ка эти строчки...
Записан

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

Сообщений: 93


WWW
« Ответ #8: 11 Сентябрь 2013, 15:52 »

Извиняюсь, вынужденно отсутствовал... Грустный
Да, имелось в виду odt.  В замешательстве
Calc открываю этими строками:
Код:
  oDesk = createUnoService ("com.sun.star.frame.Desktop")
  oUrl = "private:factory/scalc"
  oDoc = oDesk.loadComponentFromURL (oUrl, "_blank", 0, Array() )
  oSheet = oDoc.sheets (0)
и т.д.
Замена ThisComponent на oDoc все решила - листает!!!  Всё хорошо
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #9: 11 Сентябрь 2013, 16:47 »

Calc открываю этими строками:
А, ну да... Я предпочитаю вариант чуть короче
Код:
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oDoc = OpenDocument("private:factory/scalc", Array())
Замена ThisComponent на oDoc все решила - листает!!!  Всё хорошо
Вот и славно, поздравляю!  Всё хорошо
Записан

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

Сообщений: 93


WWW
« Ответ #10: 12 Сентябрь 2013, 07:33 »

Краткость - сестра таланта! Беру на вооружение вариант чуть короче!  Веселый
Записан
dndn
Форумчанин
***
Offline Offline

Сообщений: 93


WWW
« Ответ #11: 12 Сентябрь 2013, 09:26 »

А есть метод обновить лист? Что-нибудь типа oSheet.Reload() ?
А то недопрорисованный лист как бы замирает пока в это время выполняется запрос для следующего листа?


Решилось вставкой небольшой задержки в 50 миллисекунд
« Последнее редактирование: 12 Сентябрь 2013, 10:17 от dndn » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #12: 12 Сентябрь 2013, 09:57 »

Ой, даже не знаю... А что, запрос такой уж шибко большой и медленный? Или после получения данных много преобразований идёт?
Может стоит перед формированием всей книги выполнить все-все нужные запросы, а потом по-быстрому отрисовать результаты?
Обычно, чтобы пользователь не скучал, ему мультик с прогресс-баром показывают. Или хотя бы песочные часы крутят...
Принудительный пересчет - это, кажется, метод всей книги calculate() или (чуть ниже) calculateAll()
Записан

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

Сообщений: 754

Woe from wit


« Ответ #13: 12 Сентябрь 2013, 10:06 »

А то недопрорисованный лист как бы замирает пока в это время выполняется запрос для следующего листа?
А покажите-ка весь ваш код, а лучше сам файл.
Есть подозрение, что там искусственно вставлен замедлитель.
Записан
dndn
Форумчанин
***
Offline Offline

Сообщений: 93


WWW
« Ответ #14: 12 Сентябрь 2013, 10:47 »

Запрос действительно медленный.
Сначала сделал все поля одним запросом с подзапросами на каждое поле - считалось чуть меньше 3-х минут...  Смеющийся
Затем оптимизировал - оставил только 2 поля, определяющие порядок сортировки, а остальные считались новым запросом для каждой строки.
После такой оптимизации расчет всей таблицы длится около 4-х секунд.

Щас подделаю и выложу весь код.

Пока могу привести 2 запроса - до и после...
Этот после оптимизации:
Код:
SELECT users.id, users.uname,
  ( SELECT SUM( bets.ball )
  FROM bets
  WHERE bets.userid = users.id ) balls,
  ( SELECT COUNT( wontours.place )
  FROM wontours
  WHERE wontours.userid = users.id
  AND wontours.place = 1 ) wons
FROM users, bets, matches
WHERE bets.userid = users.id
AND bets.matchid = matches.id
AND EXISTS
  ( SELECT * FROM users
  WHERE matches.tourid >= 5 )
  GROUP BY users.id, users.uname
  ORDER BY balls DESC, wons DESC

users - таблица участников, tours - таблица туров, matches - таблица матчей, bets - таблица прогнозов.
wontours - связующая таблица между tours и users, учитывающая победы в турах. Поле place - занятое место в туре. При расчете тура заполняются только призовые места, которые затем в набранных баллах отмечаются цветом.
Количество побед в турах имеет приоритет при равенстве баллов.
Условие exists отсеивает участников, пропустивших более 2-х последних тура. Их результаты продолжают храниться и при условии возобновления игры учитываются.

Полный свод правил конкурса придуман не мной и находится здесь:
http://forum.sportbox.ru/index.php?showtopic=294353

ЗЫ. Щас откопаю старый, полный вариант запроса...
Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

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