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

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

21 Сентябрь 2017, 11:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 114


« Ответ #30: 6 Декабрь 2016, 15:34 »

и вызвать calculate() для них
Т.е. метод calculate вызвать у объекта Range? Например shtReport.getCellRangeByName(Addrs).Calculate
где Addrs - ячейки с формулами?


ЗЫЖ Ошибка времени выполнения BASIC.
Свойство или метод не найдены: Calculate
« Последнее редактирование: 6 Декабрь 2016, 15:39 от Alex16 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #31: 6 Декабрь 2016, 15:40 »

И кстати об экспериментах... А точно пересчет блокируется именно из-за Begin/EndUpdateRep? Так, может, отказаться от него, как от не оправдавшего доверия?
Записан

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

Сообщений: 114


« Ответ #32: 6 Декабрь 2016, 15:43 »

А точно пересчет блокируется именно из-за Begin/EndUpdateRep? Так, может, отказаться от него, как от не оправдавшего доверия?
Я догадываюсь, что у вас тут есть другие решения, например как ты предлагал со стилями, но я пока хочу ограничится кодом. А без Begin/EndUpdateRep пока сильно тормозит.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #33: 6 Декабрь 2016, 15:52 »

Гм... А кто тормозит на этот раз?
Записан

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

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


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


WWW
« Ответ #34: 6 Декабрь 2016, 16:03 »

Если честно, то когда мы разбирали прошлый пример "тормознутости", я заподозрил неладное.
Насколько я понял, речь шла об итоговом листе с данными всех-всех пользователей. То есть, каждый из них, пользуясь большой и красивой формой ввода, подсчитывает сколько было выполнено "контактов с потребителем услуг" - по каждому типу (колонки) и по каждой услуге (строки). Теперь (или тогда?) ты бодаешься с листом, где эти данные собраны без лишних украшательств, просто по десятку колонок для данных каждого из юзеров и через обычный SUM итоговый подсчет по всем.
"Меня терзают смутные сомнения..."
А не растянуть ли всю эту беду по вертикали в "плоскую" таблицу с колонками
№ пользователя - Строка - Колонка - Количество
Не страшно, что она получится длинной, листать её не придётся, это только сырые данные для программы.
А вот собственно аккуратную табличку с итогами может сделать и Сводная таблица....
Записан

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

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #35: 6 Декабрь 2016, 16:09 »

Я догадываюсь, что у вас тут есть другие решения, например как ты предлагал со стилями, но я пока хочу ограничится кодом.
Давно хотел спросить: обязательно вставлять в ячейки(диапазоны) формулы? или посчитать всё и вставить массив значений?
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #36: 6 Декабрь 2016, 16:13 »

+++
Записан

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

Сообщений: 114


« Ответ #37: 6 Декабрь 2016, 16:13 »

Гм... А кто тормозит на этот раз?
Код:
Sub SelectListBox
Dim I as Integer, sViewData As String', oController as Object
'BeginUpdateRep
I = GetCtrl("SpisSotrud").SelectedItems(0)
if I < 0 then
 MsgBox "Ошибка! Не выбран отчет"
 EndUpdateRep
 Exit Sub
End If
LoadRep(I)
'EndUpdateRep
End Sub

Sub LoadData(ColInd%)
Dim N%, oCellRangeRep as Object, oCellRangeData as Object
StrColumnsArr = Split(StrColumns, ",")
For N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
 Addrs = StrColumnsArr(N) & StartColRow + 1 & ":" & StrColumnsArr(N) & EndColRow + 1
 oCellRangeData = shtData.getCellRangeByPosition(ColInd + N, 0,  ColInd + N,  EndColRow - StartColRow)
 oCellRangeRep  = shtReport.getCellRangeByName(Addrs)
 oCellRangeRep.setDataArray(oCellRangeData.getDataArray())
Next N
End Sub

Sub LoadRep(N as Integer)
if N = LastUserID then Exit Sub
if LastUserID = 0 then ColoredRep(False)
LastUserID = N
if N = 0 then
 LoadData((GetCtrl("SpisSotrud").ItemCount - 1) * ColumnCount)
 ColoredRep(True)
 GetCtrl("btnClear").Label = "Очистить всё"
 Exit Sub
End If  
LoadData((N - 1) * ColumnCount)
GetCtrl("btnClear").Label = "Очистить!"
End Sub

Sub ColoredRep(CommonRep as Boolean)
Dim N%, Range as String, CellProtection
StrColumnsArr = Split(StrColumns, ",")
For N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
 Range = StrColumnsArr(N) & StartColRow + 1 & ":" & StrColumnsArr(N) & EndColRow + 1
 CellProtection = shtReport.getCellRangeByName(Range).CellProtection
 if CommonRep then
shtReport.getCellRangeByName(Range).CellBackColor = 14540253
CellProtection.IsLocked = True
 else
   shtReport.getCellRangeByName(Range).CellBackColor = 15202046
   CellProtection.IsLocked = False
 endif
 shtReport.getCellRangeByName(Range).CellProtection = CellProtection
Next N
End Sub

Вот как-то так у меня сейчас. Понимаю, что особо разбираться тут никто не будет, но тормоза идут как в ColoredRep так и в LoadData
Но если с Begin/EndUpdateRep, то вроде сносно, а с пересчетом решил так:
BeginUpdateRep остался без изменений
Код:
Sub BeginUpdateRep
ThisReport.isUndoEnabled=False
if shtReport.isProtected() Then shtReport.UnProtect(Pass)
ThisReport.LockControllers()
ThisReport.AddActionLock()
End Sub
А EndUpdateRep
Код:
Sub EndUpdateRep
Dim I%
ThisReport.RemoveActionLock()
ThisReport.UnlockControllers()
with ThisReport.GetCurrentController
 .RestoreViewData(.GetViewData())
end with
shtReport.Protect(Pass)
I = GetCtrl("SpisSotrud").SelectedItems(0)
ThisReport.CalculateAll
GetCtrl("SpisSotrud").InsertItemText(0,"<(Общий)>")
GetCtrl("SpisSotrud").SelectedItems = Array(I)
ThisReport.isUndoEnabled=True
End Sub
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #38: 6 Декабрь 2016, 16:15 »

Давно хотел спросить: обязательно вставлять в ячейки(диапазоны) формулы? или посчитать всё и вставить массив значений?
Изначально тоже так думал, но этож надо каждый раз пересчитывать эти значения. Операторы в течении конца рабочего времени, а то и всего раб. дня вносят изменения каждый в свой отчет.
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #39: 6 Декабрь 2016, 16:21 »

Если честно,
Если честно, у меня уже башка скоро взорвется, ели ели вроде осилил пока этот отчет. А тут снова все переделывать - как то не утешает перспектива Грустный
Огромнейшее в любом случае СПАСИБО за помощь и желание помогать. Но пока остановлюсь на достигнутом. Завтра отдам на бета тестирование, а там война план покажет.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #40: 6 Декабрь 2016, 16:26 »

А! Если они результат еще не видели, то на всякий случай вставь внутри циклов Wait(100).
Тогда по результатам тестирования единственным замечанием будет "Сильно тормозит". Ты отвечаешь "Понятно, исправим" и сокращаешь паузу на треть...
Записан

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

Сообщений: 114


« Ответ #41: 6 Декабрь 2016, 16:38 »

А! Если они результат еще не видели, то на всякий случай вставь внутри циклов Wait(100).
Тогда по результатам тестирования единственным замечанием будет "Сильно тормозит". Ты отвечаешь "Понятно, исправим" и сокращаешь паузу на треть...
Смеющийся Всё хорошо
Записан
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 580


« Ответ #42: 6 Декабрь 2016, 17:25 »

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

Код, выполняющий calculate(), здесь: http://opengrok.libreoffice.org/xref/core/sc/source/ui/docshell/docsh4.cxx#1206 (метод ScDocShell::DoRecalc для calculate, метод ScDocShell::DoHardRecalc для calculateAll).

Можно увидеть, что текущая ячейка (получаемая из позиции курсора) явным образом пересчитывается (ей выставляется флаг наличия изменений SetDirty()). В принципе, это должно происходить при любом изменении ячеек, но что-то идёт не так.

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

С уважением,
Михаил Каганский
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #43: 7 Декабрь 2016, 08:54 »

почему же ячейки сами не "пачкаются" в процессе выполнения скрипта и какая из операций блокирования этому виной, может быть, это баг?
Может и баг. Я сделал тестовый файл, но в нем этот баг не проявился. Но и в тестовом файле ячейки с данными по другому заполняются.
Возможно это связано с oCellRangeRep.setDataArray(oCellRangeData.getDataArray()) - там где "баг" проявился, а вoт код тестового

Код:
Sub BeginUpdateRep
ThisComponent.isUndoEnabled=False
if ThisComponent.Sheets(0).isProtected() Then ThisComponent.Sheets(0).unprotect(1)
ThisComponent.lockControllers()
ThisComponent.AddActionLock()

End Sub

Sub EndUpdateRep
ThisComponent.RemoveActionLock()
ThisComponent.UnlockControllers()
ThisComponent.Sheets(0).protect(1)
ThisComponent.isUndoEnabled=True
End Sub

Sub Main
BeginUpdateRep
LoadData
EndUpdateRep
End Sub

Sub LoadData
For N = 0 to 2
  X = INT(RND * 100) + 10
  Y = INT(RND * 100) + 10
  Z = INT(RND * 100) + 10
  ThisComponent.Sheets(0).GetCellByPosition(1, 5 + N).Value = X
  ThisComponent.Sheets(0).GetCellByPosition(2, 5 + N).Value = Y
  ThisComponent.Sheets(0).GetCellByPosition(3, 5 + N).Value = Z
  ThisComponent.Sheets(0).GetCellByPosition(6, 5 + N).Value = X + Y + Z
Next N
End Sub
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #44: 7 Декабрь 2016, 09:01 »

Код, выполняющий calculate(), здесь: http://opengrok.libreoffice.org/xref/core/sc/source/ui/docshell/docsh4.cxx#1206 (метод ScDocShell::DoRecalc для calculate, метод ScDocShell::DoHardRecalc для calculateAll).
Это какой-то си наверное. Я с ним знаком немного, точнее просто си, а тут наверное какойнить ++ или еще какой... Но не в этом суть. В любом случае мне тяжело разобраться в том коде.
Можно создать курсор, пробежать по нужным ячейкам и в каждой позиции вызвать calculate для отчёта.
Мне кажется это добавит тормозов еще больше
Записан
Страниц: « 1 2 3 4 »   Вверх
  Печать  
 
Перейти в:  

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