Текущее время: Пт, июн 20 2025, 21:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Создание печатных форм на VBA
СообщениеДобавлено: Вт, мар 31 2009, 11:11 
Ассистент
Ассистент

Зарегистрирован:
Пт, июн 20 2008, 08:39
Сообщения: 31
Откуда: msk
Пол: Мужской
Привет.
Такой вопрос заказчик просит в BEX печатные формы.

Вопрос в том, что то что получается жутко тормозит.

Суть алгоритма:
1. На скрытый лист выводятся все поля, которые нам нужны для печатной формы (тексты разбитые по нескольким полям и т.д.)
2. Макрос должен «склеить» некоторые поля (тексты например) и сохранить в промежуточную таблицу. (вставка построчно)
3. скопировать данные блоками из промежуточной таблицы в нужные координаты на листе с печатной формой.

В отчете бывает до 3000 строк.
На каждую операцию вставки Bex запускает свой обработчик, естественно начинает все тормозить.
Печ форма формируется до 10 минут. Если книжку открыть просто в екселе, макрос отрабатывает сек 30.

Т.е получается что операция вставки под BEX очень "дорогая" по времени.
Тогда решили сделать так:
подключаемся к книге через ODBC соединение, запускаем SQL–запрос, который склеивает данные и БЛОКОМ вставляет их на скрытый лист, а от туда также блоками копируем в печатную форму. Т.е. все копируются блоками и количество операций вставки сведено к минимуму.

Макрос отрабатывает меньше минуты. Но проблема в том, что ODBC соединение работает очень не стабильно даже на одном и том же компьютере. Утром работает, вечером нет. Запускали монитор по ODBC соединению периодически там пусто :shock:


Вобщем поделитесь идеями кто как Печ формы на VBA собирал, может это у нас руки кривые :D
Или не мучаться и убедить заказчика в необходимости Crystala?

PS: Все это происходит на BI Addon 7.x sp 8.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Вт, мар 31 2009, 11:19 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 30 2007, 17:10
Сообщения: 488
На VBA все красиво собирается по первому описанному варианту. Тут скорее плохое знание VBA, а может каких-то конкретных финтифлюшечек типа отключение обновления экрана на время прорисовки печ. формы.

Делались и печатные формы на несколько тыс. строк, которые рисовались в районе минуты. Вы локализуйте проблему: у вас сам запрос выбирает данные долго или VBA долго рисует?

_________________
Карма - это суперпозиция граблей, на которые мы уже успели наступить, но которые еще не долетели...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Вт, мар 31 2009, 11:48 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, июл 03 2007, 10:26
Сообщения: 486
Откуда: Kazakhstan, Astana
Пол: Мужской
В Запросe Bex (Свойства Запроса) форматирование (Адаптировать форматирование после обновления) уберите. Оно вам ни к чему. И будет вам скорость. Ну и макрос продумайте лучше. На больших обхемах лучше выполнять операцию копирования, а не удаления.
Code:
  For i = RRow + 1 To RRow + RRowCount - 1
     If Sheets(MainSheet_1).Cells(i, ZColLD_Q01) <> CONDITION Then
            If ZDelRng Is Nothing Then
                Set ZDelRng = Sheets(MainSheet_1).Rows(i)
            Else
               Set ZDelRng = Union(Sheets(MainSheet_1).Rows(i), ZDelRng)
            End If
Next i

... На больших объемах будет работать медленнее, чем простое копирование типа:
Code:
For i = RRow + 1 To RRow + RRowCount - 1

    If Sheets(ZQUERY_01).Cells(i, RColCount) = CONDITION Then
         Sheets(ZQUERY_01).Range(Sheets(ZQUERY_01).Cells(i, RCol), _
         Sheets(ZQUERY_01).Cells(i, RepRColCount)).Copy
         Sheets(MainSheet_1).Range(Sheets(MainSheet_1).Cells(InitLine_Rep, RepRCol), _
         Sheets(MainSheet_1).Cells(InitLine_Rep, RepRColCount)).PasteSpecial
         InitLine_Rep = InitLine_Rep + 1
    End If
Next i

Здесь копируется со стилем Range, можно копировать сразу без заморочек.
Почитатайте эту статью очень полезна:
http://support.microsoft.com/kb/247412/ru

_________________
"Great minds discuss ideas. Average minds discuss events. Small minds discuss people-Eleanor Roosevelt--Knowledge is to share, Keep it free, Keep sharing"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Вт, мар 31 2009, 17:14 
Ассистент
Ассистент

Зарегистрирован:
Пт, июн 20 2008, 08:39
Сообщения: 31
Откуда: msk
Пол: Мужской
Ребят, я же написал, что если открыть книжку из екселя, то макрос отрабатывает за 10-15 сек.
Или по другому:
Запускаем BEX, логинимся на сервак, открываем книжку, запускаем макрос - получаем тормоза.
Отключаемся от BW-сервера, запускаем этот же макрос - все летает просто, макрос выполняется за 10-15 сек.

Теперь смотрим что происходит под отладчиком и видим что на каждую операцию вставки срабатывает BEX'совское событие OnChange и вызывается куча BEX-функций. Вот и получаем тормоза. Отрубить бы как-то Bex'ский обработчик событий на время работы макроса.....

Преимущество 2 варианта- сокращение в разы операций вставки. т.е. OnChange срабатывает мало, поэтому все работает быстро.

Но как вот сделать, чтобы ODBC соединени к книге работало стабильно, не понятно....

PS: Всякие отключения обновлений экрана конечно, форматирование и т.д. выключены.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Вт, мар 31 2009, 17:49 
Ассистент
Ассистент

Зарегистрирован:
Пт, июн 20 2008, 08:39
Сообщения: 31
Откуда: msk
Пол: Мужской
BORLAND написал:
Почитатайте эту статью очень полезна:
http://support.microsoft.com/kb/247412/ru


Спасибо, почитаем. но чую дело не в макросе....


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Пн, апр 13 2009, 14:22 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, фев 20 2007, 13:18
Сообщения: 63
Добрый день! В нашей организации тоже требуют наличие красивой печатной формы. У нас версия 3,5. На макросах все хорошо получалось. Но проблема возникла, когда запустили рабочие книги на более новой версии Microsoft office. Почти все, что написали на VBA перестало работать. Пришлось все построить на формулах. Муторно, но надежно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Пн, апр 13 2009, 19:26 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 13 2005, 10:41
Сообщения: 558
Откуда: Гондурас (округ Москвы)
Пол: Мужской
Пилите гирю, Шура, пилите.

Application.EnableEvents = false
...
Application.EnableEvents = true

и еще не забудьте, что bex открывает запросы и получает данные.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание печатных форм на VBA
СообщениеДобавлено: Пн, апр 20 2009, 21:25 
Специалист
Специалист

Зарегистрирован:
Вт, авг 21 2007, 18:36
Сообщения: 133
Еще можно отключить обновление экрана, эта штука сильно все тормозит
Applicationscreenpudating = false(что то вроде этого), в справке поищите.
Только после выполнения макроса не забудте вернуть начальное значение параметра.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB