Mensaje enviado por Sergio Daniel Galván <sergioreport@fibertel.com.ar>
Claudio:
De acuerdo a la documentación de Microsoft Press para el caso de Consultas SQL que no devuelvan un RecordSet, por ejemplo si se utiliza adExecuteNoRecords como parámetro al iniciar el RecordSet, el objeto pRecordset queda en Nothing.
Pero inclusive en este caso, para consultas asincrónicas, el objeto Recordset va a quedar en adStateOpen + adStateFetching, mientras esté ejecutando la consulta y cuando termine se dispara el evento FetchComplete.
Para el caso de un RecordSet en que no se devuelva registros la propiedad State queda en adStateClose una vez terminada la Consulta, para el caso de devolución de datos cambia a adStateOpen.
Esto es la teoría, la verdad es que para "Consultas de Acción" ni se me había ocurrido la posibilidad de utilizar ADO en modo asicrónico.
Saludos
Sergio Daniel Galván
Report System
Destinatarios: vb-esp@ccc.uba.ar
CC: (cci: Claudio Bermudez/HUI/UPS/YPF S.A.)
Asunto: RE: vb-esp : Duda
JGA:
Los diseñadores del Motor ADO incluyeron la posibilidad de ejecutar una "Consulta Asincrónica" a una Base de Datos, para tal motivo incluyeron en el Modelo los Eventos FetchComplete y FetchProgress. El Evento FetchComplete dispone de tres Parámetros: pError, adStatus y pRecordset; y el último evento tiene cuatro Parámetros: Progress, MaxProgress, adStatus y pRecordset.
Los Parámetros Progress y MaxProgress está diseñados para inclusive mostrar barras de Evolución, pero, siempre hay un pero, por lo menos hasta ADO 2.5 sólo "devuelven" los valores Cero mientras se está procesando y Uno cuando terminó.
El CursorLocation del RecorddSet debe estar en adUseClient, pero por más que juegues con las propiedades Fetch Size y Background Fetch Size no vas a poder obtener información sobre el progreso de la Consulta como originalmente lo había planeado el equipo de desarrollo de ADO.
De acuerdo a la documentación de Microsoft Press los dos Eventos se disparan cuando la Consulta obtuvo el número de Registros específicado en la propiedad Initial Fetch Size, y no cuando se obtuvieron menos datos.
Mientras ADO tenga más datos para devolver está en adStateOpen + adStateFetching, cuando terminó se dispara el evento FetchComplete.
Si pensas poner un Gif "Actuando" mientras dure la consulta te va a servir. No me he fijado si la gente de ADo modificó estas características con la versión 2.6 de modo que te permitan ir obteniendo un % del progreso de la Consulta SQL como lo tenían planeado originalmente.
Suerte
Sergio Daniel Galván
Report System
Mensaje enviado por "Ignacio Napal" <inapal@equiplus.com>
En primer lugar tenés que declarar el RecordSet con "withevents". De esta manera, mientras la consulta se está ejecutando, se van disparando diferentes eventos sobre el Recordset.
Además, cuando se abre el recordset, se le indica (mediante un parámetro) que debe operar en forma asíncrona.
Supongamos que tenemos un objeto "cn" de tipo ADODB.Connection ya abierto, y que hay que leer una consulta muy larga. Podría quedar algo así:
Dim WithEvents rs As ADODB.Recordset
AborQry = False
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "Select * From Clientes", cn, adOpenKeyset, adLockReadOnly, adAsyncExecute + adAsyncFetch
Do While (rs.State And adStateExecuting) = adStateExecuting Or _
(rs.State And adStateFetching) = adStateFetching
'Verifica si se aborta la consulta
DoEvents
If AbortQry Then
rs.Cancel
End If
Loop
"AbortQry" es una variable booleana global al módulo, que es puesta a "False" al iniciar el ciclo de lectura, y que puede ser puesta a "True" en el evento Click de un boton "Detener". El "DoEvents" dentro del ciclo "Do...Loop" hace funcionar ese botón, y cancela la consulta con el método "rs.Cancel" si se lo presiona.
Además, te van a aparecer varios eventos relacionados con el recordset "rs". (Por ejemplo "rs_FetchProgress"). En ellos podés hacer los controles que necesites sobre el proceso de lectura. Fijate los parámetros disponibles en c/u.
Ignacio Napal
Equiplus S.A.
email: inapal@equiplus.com