Сделать активным новый лист. Как?

Автор dndn, 23 августа 2013, 16:03

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

dndn

Помогите решить задачку.
Надо нарисовать 3 таблицы на 3-х разных листах, но так, чтобы видна была прорисовка каждого листа, а затем снова сделать активным первый...  ???

JohnSUN

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

#2
Я знал, кто может мне ответить  :beer:
Спасибо огромнейшее Влад, и низкий тебе поклон, жаль, что я не женщина, а то бы -  :-* (шутка)...
Заказчика плющит от того, как это самогеневарьируется -не путать с "самогоноворится"  ;D
Еще раз спасибо. Есичё - можно обращацца?  :-X

ЗЫ. Я - не программист. Первая проба в ОпенОффисе - 17 мая (по дате создания первой пробной базы данных). Заказчик - не крутой бабломан, а форумское сообщество обычных юзеров. А я их пытаюсь повеселить поделками в теме конкурса спортивных прогнозов...  :roll:

JohnSUN

Цитата: dndn от 23 августа 2013, 18:07
Есичё - можно обращацца?  :-X
А пуркуа бы, собссно, и не па?  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dndn

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

ЗЫ. Использую OpenOffice 4.0.0

JohnSUN

А запускаешь на выполнение из Calc'а? Из Бэйсика? Так в Бэйсике действительно такой штуки нет... Если ThisComponent это книга Calc'а - обязано работать
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dndn

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

Т.е. Calc запускаю не из-под Calc'а, а из формы Base, сохраненной как документ Writer...

JohnSUN

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

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

dndn

Извиняюсь, вынужденно отсутствовал... :(
Да, имелось в виду 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 все решила - листает!!!  :beer:

JohnSUN

Цитата: dndn от 11 сентября 2013, 16:52
Calc открываю этими строками:
А, ну да... Я предпочитаю вариант чуть короче
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oDoc = OpenDocument("private:factory/scalc", Array())

Цитата: dndn от 11 сентября 2013, 16:52
Замена ThisComponent на oDoc все решила - листает!!!  :beer:
Вот и славно, поздравляю!  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

dndn

Краткость - сестра таланта! Беру на вооружение вариант чуть короче!  :D

dndn

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


Решилось вставкой небольшой задержки в 50 миллисекунд

JohnSUN

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

Hasim

Цитата: dndn от 12 сентября 2013, 09:26А то недопрорисованный лист как бы замирает пока в это время выполняется запрос для следующего листа?
А покажите-ка весь ваш код, а лучше сам файл.
Есть подозрение, что там искусственно вставлен замедлитель.

dndn

Запрос действительно медленный.
Сначала сделал все поля одним запросом с подзапросами на каждое поле - считалось чуть меньше 3-х минут...  ;D
Затем оптимизировал - оставил только 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

ЗЫ. Щас откопаю старый, полный вариант запроса...