Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как избежать повторного запуска запроса, если запрос используется несколько раз 
:(
    Опции темы
Vlad_Spb
Дата 22.6.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.6.2007

Репутация: нет
Всего: нет



Здравствуйте.

Есть запрос в MS Access, который работает через несколько других запросов с большими массивами данных через ODBC. Среднее время выполнения запроса составляет примерно 2-3 минуты.
На основе этого запроса формируется отчёт, далее этот отчёт выгружается в EXCEL с помощью DoCmd.OutputTo.
В коде сначала формирую и открываю отчёт, потом - выгружаю в EXCEL

Код

DoCmd.OpenReport "Report_Advanced_NoWC", acViewPreview, , , acWindowNormal
DoCmd.OutputTo acOutputQuery, "2ndOpNoWc_FinalForReport", acFormatXLS, fname, True


Обратил внимание, что после формирования отчёта перед выгрузкой в EXCEL запрос запускается заново, т. е. 2-3 минуты превращаются в 4-6 минут, что не радует.

А теперь вопрос: как избежать повторного запуска запроса? можно ли использовать для выгрузки в EXCEL данные запроса , использованные для формирования отчёта? Есть ли более грамотный способ, кроме сливания запроса в таблицу и последующей работой уже с таблицей, а не с запросом?

Просмотрел темы за этот год - чёт не нашёл ничего похожего... Честно говоря, даже не знаю, по каким ключевым словам искать...

Заранее благодарен.
PM MAIL   Вверх
Akina
Дата 22.6.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Vlad_Spb @  22.6.2007,  16:03 Найти цитируемый пост)
В коде сначала формирую и открываю отчёт, потом - выгружаю в EXCEL

А зачем он сначала формируется? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 23.6.2007, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Можно напрямую писать в Excel...

Выдержка из класса для работы с Excel:

заголовок клсса
Код

Dim objXlApp As Object
Dim objWorkBook As Object
Dim objSheet As Object
Dim bNoClose As Boolean
Dim bIsRun As Boolean
Dim bIsErr As Boolean


создание/уничтожение приложения Excel
Код

Private Sub Class_Initialize()

On Error GoTo Err_
    Dim bIsGet As Boolean
    
    bNoClose = True
    bIsGet = True
    bIsRun = True
    bIsErr = False
    Set objXlApp = GetObject(, "Excel.Application")
    
Exit_:
    Exit Sub
Err_:
    If bIsGet Then
        bIsGet = False
        bNoClose = False
        Set objXlApp = CreateObject("Excel.Application")
        bIsRun = True
    Else
        bIsRun = False
        bIsErr = True
    End If
    
'    MsgBox Err.Description
    Resume Exit_
End Sub

Private Sub Class_Terminate()
    If bNoClose Then
        Set objXlApp = Nothing
        Exit Sub
    End If
    
    bIsRun = False

    objXlApp.Quit
    
    Set objXlApp = Nothing
End Sub


открытие документа
Код

Public Function XLS_Open(ByVal stPathName As String) As Boolean

On Error GoTo Err_
    XLS_Open = True
    
    objXlApp.Workbooks.Open FileName:=stPathName
    Set objWorkBook = objXlApp.ActiveWorkbook
    Set objSheet = objXlApp.ActiveWorkbook.Sheets(1)

Exit_:
    Exit Function
Err_:
    'MsgBox Err.Description
    bIsErr = True
    XLS_Open = False
    Resume Exit_
End Function


запись/чтиение в/из ячейку(-и)
Код

Public Property Get Cells(iRow As Integer, iCollumn As Byte) As Variant
On Error GoTo Err_

    
    Cells = objSheet.Cells(iRow, iCollumn)
Exit_:
    Exit Property
Err_:
'    MsgBox Err.Description
    bIsErr = True
    Resume Exit_
End Property

Public Property Let Cells(iRow As Integer, iCollumn As Byte, ByVal vNewValue As Variant)
On Error GoTo Err_
    objSheet.Cells(iRow, iCollumn) = vNewValue
Exit_:
    Exit Property
Err_:
'    MsgBox Err.Description
    bIsErr = True
    Resume Exit_
End Property


PM MAIL WWW ICQ Skype GTalk   Вверх
Vlad_Spb
Дата 25.6.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.6.2007

Репутация: нет
Всего: нет



Цитата(Akina @ 22.6.2007,  17:14)
Цитата(Vlad_Spb @  22.6.2007,  16:03 Найти цитируемый пост)
В коде сначала формирую и открываю отчёт, потом - выгружаю в EXCEL

А зачем он сначала формируется?

Спасибо всем за отклики.

Akina, я, наверное, не совсем правильно сформулировал.

Под "формированием и открытием" я имел в виду только те действия, которые делает Access при выполнении 

Код

DoCmd.OpenReport "Report_Advanced_NoWC", acViewPreview, , , acWindowNormal

Если я правильно понимаю, в случае, когда отчёт использует запрос в качестве источника данных, то Docmd запускает этот запрос, формирует отчёт и открывает в режиме просмотра.

В результате всей этой кухни пользователь хочет:
1) просмотреть и напечатать отчёт
2)выгружать запрос, который лежит в основе отчёта в п. 1), в EXCEL

Тот код из двух строчек, который я привёл в своём первом посте, запускает запрос два раза (для отчёта и для выгрузки запроса в EXCEL), что занимает достаточно много времени.

Есть ли способ заставить DoCmd.OutputTo не перезапускать запрос, который он выгружает?

Bopoha, у меня проблема не с выгрузкой в EXCEL как таковой, DoCmd.OutputTo меня вполне устраивает, кроме того, что он запускает запрос.
Твой способ работы с EXCEL поможет этого избежать?


PM MAIL   Вверх
Akina
Дата 25.6.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Vlad_Spb @  25.6.2007,  13:21 Найти цитируемый пост)
Есть ли способ заставить DoCmd.OutputTo не перезапускать запрос, который он выгружает?

Конечно нет. Макрос (а вызывается на исполнение макрос) знать не знает что недавно запускался другой макрос, получивший нужные данные. 
Но вот если сделать на самом просматриваемом отчете кнопку выгрузки его в Эксель, и в модуле отчета написАть соотв. код - второго запроса не будет. Впрочем, и в этом случает надо использовать не DoCMD, а работать непосредственно с RowSource запроса.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.1942 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.