Ворос к знатокам - возможно ли запустить асинхронно?

Алексей К
Дата: 14.03.2002 09:50:47
есть форма на ней ОЧЕНЬ много подчиненных которые желательно обновлять
но если запускать обновление всякий раз когда это нужно - получаются тормоза

возможно ли запустить асинхронно
object.requery
SysOp
Дата: 18.03.2002 08:23:21
DAO - не помню. ADO - программно открывай рекордсет обьявленный with events с опцией AsyncExecute+AsyncFetching, при первом событии Fetchprogress имеем готовый, но не до конца заполненный рекордсет, который уже можно подсунуть форме. Лучше всего создать класс в котором все это варится.
SysOp
Дата: 18.03.2002 10:23:05
Вспомнил. В DAO никак.
Чумак А.
Дата: 18.03.2002 11:48:04
2SysOp
В Access 2000 (VBA), ADO 2.6 SP1 Fetchprogress не работает. Проверял. Много раз. На больших и маленьких наборах записей. С установкой .CursorLocation = adUseClient, .Properties("Initial Fetch Size"), .Properties("Background Fetch Size").
Я думаю - это проблема VBA. В обычном VB проблем нет. SysOp, ты сам это в Access 2000 (VBA) проверял? Или твой совет чисто теоретический?
SysOp
Дата: 18.03.2002 15:08:14
Ответ чисто практический. Не то что проверял, все это крутится почти 2 года. Завтра, если интересно, могу вывалить пример.
Чумак А.
Дата: 19.03.2002 13:02:19
2SysOp
Давай пример.
SysOp
Дата: 20.03.2002 02:39:43
Option Compare Database
Option Explicit
Private WithEvents rs As ADODB.Recordset

Private Sub Form_Open(Cancel As Integer)
Dim rs1 As ADODB.Recordset
Set rs1 = New ADODB.Recordset
rs1.ActiveConnection = CurrentProject.Connection
rs1.CursorLocation = adUseClient
rs1.CursorType = adOpenStatic
rs1.LockType = adLockOptimistic
rs1.Source = "Select * From dbo.Products"
rs1.Open , , , , adAsyncExecute + adAsyncFetch
Set rs = rs1
End Sub

Private Sub rs_FetchProgress(ByVal Progress As Long, ByVal MaxProgress As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
Static sw As Boolean
If Not sw Then
Set Me.Recordset = rs
sw = True
End If
End Sub
Алексей К
Дата: 25.03.2002 08:19:40
дело в том что в качестве источника записей испоьзуется XP с параметрами типа строка - а параметр почему то не хочет ничего воспринимать ничего кроме числового формата.

Но тем не менее удалось избежать тормозов при вводе-
в главную форму - секутндный таймер проверяющий состояние двух общих переменных(нисколько не замедляет) - одна что внесены изменения -вторая показатель активности - что пользователь активно вбивает данные и пока не смотрит на сумму. таймером каждый раз сбрасывается вторая переменная. когда пользователь перестает вдалбливать данные таймер обнаруживает нулевой показатель активности и выполняет необходимые процедуры обновления связанных форм
SysOp
Дата: 25.03.2002 10:07:50
А что, нельзя сумму из под кнопки сделать?
насчет строкового парамтра - если правильно прописал строчку в InputParameters проблем быть не должно.
Вакшуль Сергей
Дата: 05.04.2002 18:29:10
Для SysOp
Чем плох ваш вариант. Как правило, необходимость использовать асинхронный источник данных у формы возникает как следствие желания иметь возможность работать в приложении пока данные выбираются с сервера. То, что предложили вы работает следующим образом. Да, пока не приехала с сервера первая строчка данных асинхронного рекордсета работать в приложении можно. Но как только приезжает первая строчка и тут же рекордсет подсовывается форме, то в этот момент все дальнейшие действия в приложении будут блокированы до конца выборки данных асинхронным рекордсетом. Т.е. конечная цель не достигнута - в приложении по прежнему нельзя работать. Чтобы убедится в этом создайте такой источник данных, чтобы время от момента запроса к серверу до момента начала возврата на клиента первой строки набора исчислялось несколькими секундами, а время от момента начала возврата на клиента первой записи до момента окончания выборки исчислялось десятками секунд, именно так станет все очевидно.
Решение, позволяющее не блокировать действия в приложении я приводил тут:
http://am.rusimport.ru/MsAccess/Samples%5Cfrm000.htm

Повторю его здесь:

Option Compare Database
Option Explicit

Dim WithEvents rst As ADODB.Recordset
Dim blnФлаг As Boolean

Private Sub Form_Open(Cancel As Integer)
Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Таблица", CurrentProject.Connection, adOpenStatic, _
adLockOptimistic, adAsyncExecute
End Sub



Private Sub rst_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
If blnФлаг = False And rst.state = adStateOpen Then
blnФлаг = True
Set Me.Форма2.Form.Recordset = rst
End If
End Sub

Да, в этом случае данные появятся в подчиненной форме только после того, как приедут все записи(собственно как и у вас, несмотря на более раннее подсовывание), но все это время действия пользователя не будут блокироватся Access, как в вашем варианте.