Data Report y Data Environment
[Problemas con la actualización de datos] 

Fecha: 18/Mar/2005 (Jueves 17 de Marzo de 2005)
Autor: Bruno Adriano Pestoni - [email protected] 

 


La intención de este artículo consiste en aclarar, la manera en que el objeto Data Report, interactúa con los objetos Command del Data Environment cuando ambos están enlazados en tiempo de diseño. Puntualmente, la apertura y cierre del Recordset. Sucede que he visto consultas relacionadas con esta situación, en reiteradas oportunidades en distintos foros de programación. Es entonces mi inquietud, intentar resolverlas por medio de este artículo.

Muchas veces he visto en foros de programación la siguiente consulta:
 "... cuando cierro el Data Report y lo vuelvo a abrir luego de haber agregado datos, el reporte no los muestra hasta que cierro la aplicación. Luego al ejecutar el programa y mostrar el reporte la información nueva si aparece..."
Lo que sucede aquí, es que al momento de utilizar la instrucción Datareport.Show se abre el Recordset perteneciente al objeto Command enlazado a la propiedad DataMember del reporte. Pero no sucede lo que uno esperaría al cerrar el reporte.
La situación que genera este tipo de problemas de actualización (en rigor no es un problema de actualización de datos, mas bien es una dificultad para visualizarlos cabalmente), tiene que ver con que el programador usualmente asume que el recordset se cerrará automáticamente al descargar el reporte, y esto no es así. Cuando un usuario cierra un reporte, y siempre hablando de un DataReport enlazado en tiempo de diseño al entorno de datos, el Recordset de datos no se cierra junto con él.
Y la solución, en realidad es muy sencilla. Hay que codificar el cierre del Recordset subyacente. 

A continuación se expone código que ejemplifica esta situación:

Private Sub Datareport1_Terminate()
    ' Cerramos el recordset en el evento terminate del reporte
    ' Previa verificación del estado de éste para evitar errores
    ' en tiempo de ejecución
    With Dataenvironment1.rsCommand1
        If .State = adStateOpen Then
        .Close
        End If
    End With
End Sub

Nota: rsCommand1 es el recordset del objeto Command asociado al reporte.


ir al índice