Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 19:21   #1
wallstreet
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 18
По умолчанию МояПроцедура

Всем Здравствуйте!

Начну с того что есть у меня база, в которую льются данные по ODBC из внешней программы.
Моя процедура вытаскивает определенные данные из базы, калькулирует их, и выводит в соотв-ие текстбоксы формы. Происходит это с помощью рекордсета вот так:

Код:
Public Sub Кнопка40_Click()
Dim db As dao.Database
Dim rs As dao.Recordset
Dim sSQL As String
Dim Last As Long 

Set db = dao.OpenDatabase("Путь к файлу\g.mdb")
sSQL = "SELECT цена FROM AllDeals;"

With rs
   .MoveLast 'Перемещаемся к последней записи
      Last = .Fields(0) ' Переменная с последней сделкой
      Textbox1.value = Last.value
End With
End Sub
Мне нужно что бы процедура запускалась и принтила значение последней записи таблицы AllDeals не по нажатии кнопки, а постоянно или при появлении новых записей (типа в Excel WorksheetChange), или же таймером через определенный интервал времени, что наверное будет более разумно в силу следущего обстоятельства, моя процедура тормозит НЕРЕАЛЬНО !! Для примера происходит так, кликаю на кнопку40, акцес подвисает секунд на 10 и спустя эти 10 сек, выдает необходимые значения. Оговорюсь что в моей базе, за день больше 200 тыс. записей. А в процедуре есть, так же, запросы со стасистическими функциями, что еще сильнее тормозит процесс.

Итак сформулирую вопросы:
1) Каким методом зациклить процесс постоянного вывода данных из базы?
2) Как ускорить выполнение процедуры?

Последний раз редактировалось wallstreet; 18.03.2010 в 19:23.
wallstreet вне форума Ответить с цитированием
Старый 18.03.2010, 19:57   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте wallstreet.
1. ответ однозначный - таймер.
2. этот вопрос однозначного ответа не "достоин":
а) отказаться от применения DAO и создавать подключение с помощью ADO
б) отказаться от перебора записей
в) если не требуется специфических возможностей MS Access выполнять задачу в Excel
примерно так в общих чертах я вижу решение задачи.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 18.03.2010, 20:56   #3
Abrakadabra
Форумчанин
 
Регистрация: 26.04.2008
Сообщений: 487
По умолчанию

Если сначала создать запрос, результатом которого будет последняя запись, а потом открыть рекордсет, ИМХО будет быстро
Abrakadabra вне форума Ответить с цитированием
Старый 19.03.2010, 17:30   #4
wallstreet
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 18
По умолчанию

спасибо за ответы.

Если подскажете как это сделать с помощью ADO буду примного благодарен.
wallstreet вне форума Ответить с цитированием
Старый 19.03.2010, 21:35   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте wallstreet.
возможно пример будет лучше чем "подсказка"
Удачи Вам.
Евгений.
Вложения
Тип файла: rar connect.rar (12.8 Кб, 16 просмотров)
Teslenko_EA вне форума Ответить с цитированием
Старый 19.03.2010, 23:22   #6
wallstreet
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 18
По умолчанию

Супер.. Большое спасибо..
wallstreet вне форума Ответить с цитированием
Старый 21.03.2010, 23:47   #7
wallstreet
Пользователь
 
Регистрация: 22.02.2010
Сообщений: 18
По умолчанию

Еще раз здравствуйте!

Итак работает все как было задумано, однако заторможенность осталась примерно 3-4 сек (против прежних прим. 12-17 сек), что замечу уже огромное достижение!!!!!!!!
Только вот смущает один момент.. Под каждый запрос, пишу отдельную функцию (connDB1, connDB2, connDB3 ....), а соответственно создаю отдельный коннект с базой делаю выборку и закрываю. А не будет-ли более продуктивно, с точки зрения скорости выполнения задачи, создать один коннект и под него сделать сразу все запросы и насколько?
wallstreet вне форума Ответить с цитированием
Старый 22.03.2010, 16:02   #8
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте wallstreet.
В Ваших словах ".. не будет-ли более продуктивно..создать один коннект.." безусловно есть логика. По аналогии с понтонным мостом, строить и разбирать для каждой переправы гораздо затратнее и по времени конечно тоже, чем строительство одного моста для всех желающих переправиться через реку. Если источник один и тот же создавайте и открывайте единственное подключение, и только после выполнения всех запросов можете его закрыть.
"Можете" в случае если для канала связи (при сетевом подключении) данное подключение будет чрезмерной нагрузкой, для БД заданная в строке подключения блокировка, вполне "безобидна", ничего страшного не произойдет если подключение будет закрыто по завершению работы приложения, а не будет создаваться, открываться для получения каждой порции данных и сразу закрываться, как это происходит при работе с WEB сервером.
Евгений.

Последний раз редактировалось Teslenko_EA; 22.03.2010 в 17:53.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц