Seleccionar el número de registros a mostrar

 

Fecha: 02/Sep/2005 (14/08/2005)
Autor: David A. Lastra N. - xdrtas@yahoo.es

 


Planteamiento:

Estuve buscando por internet una forma de cargar un número limitado de registros para que no tardara tanto en cargarse el formulario que contiene el control ADO. No encontré nada, evidentemente tampoco busqué mucho debido a que tenía que terminar un programa. En fin, estoy seguro que debe haber algún sitio que les muestre lo que yo voy hacer de una forma más fácil, sin embargo una opción más, nunca hace daño ;-).
Bien, supongamos que tenemos un control ADO conectada a una tabla de 1.000.000 de registros, al ejecutar el programa tardará un cierto tiempo en mostrar el formulario que contiene el control ADO; para evitar esto, hacemos que el control ADO carge 1000 registros y cuando llegue al EOF o al BOF del Recordset añada los otros 1000 y así sucesivamente.

Descripción de la tabla:

La tabla que vamos a usar se llama Usuario, aquí les dejo el código de SQL para que la creen directamente en ACCESS.
CREATE TABLE Usuario(
usr_ID LONG,
usr_Nombre VARCHAR(100),
usr_Apellido VARCHAR(100),
PRIMARY KEY (usr_ID)
)

Una vez creada la tabla, vamos a Visual Basic 6 y agregamos el control ADO, presionando Ctrl + T, aparecerá la ventana siguiente:


Ahora buscamos el componente correspondiente al control ADO como se muestra en la siguiente ventana:


Ahora le damos a aceptar, y si todo a ido bien entonces aparecerá el componente en la caja de herramientas o el "Tool Box"(para el que lo tenga en inglés). Advertencia--> El botón de "Otros" lo he añadido yo, lo normal es que no aparezca ningún botón extra.


El formulario en tiempo de ejecución quedaría así:


Y en tiempo de diseño quedaría así:

"Matrix" de controles:

El control ADO, lo he llamado "adoUsuario" con la propiedad de visible = false para que no se vea en tiempo de ejecución. Establezco la conexión a la tabla de la base de datos por medio de ODBC, (evidentemente la conexión se establece como ustedes prefieran, debería funcionar exactamente igual, si no es así, envíenme un e-mail ;-) ). La movilización entre registros se llevará a cabo con la matriz de controles "cmdControl".
El botón "Agregar" contendrá un bucle que agregará 10000 registros a la tabla y el botón "Borrar" los eliminará. Nota: cada uno meterá la cantidad de registros que deseen.
Ahora se hace"click" con el botón derecho del mouse encima del control ADO y aparece la siguiente ventana:


Ahora hago "click" sobre el botón "build" y aparecerá esta otra ventana:


Selecciono el proveedor Microsoft OLE DB Provider for ODBC Drivers y hago "click" en "Siguiente >> " y aparece esta ventana:


Donde seleccionaremos el nombre de origen de datos que pertenezca a nuestra base de datos, si queremos le damos a probar conexión, si todo ha ido bien aparecerá una ventanita que dice "conexión satisfactoria" y podremos continuar.
Ahora volvemos a las propiedades del control ADO y hacemos "click" sobre la pestaña "RecordSource", seleccionamos en la opción "command type" el número 1 - adCmdText y en la opción "Command Text (SQL) " colocamos la consulta que cargará los primeros 1000 registros como se muestra abajo. (SELECT * FROM Usuario WHERE usr_ID >= 0 AND usr_ID <= 1000 ORDER BY usr_ID):


Ahora hacemos "click" en el botón "aceptar" y listo. Ahora las cajas de texto contendrán los 1000 datos de la base de datos, estas cajas de texto estarán relacionadas con el control ADO mediante las propiedades de DataSource y DataField. La caja de texto_1 estableceremos el DataField al campo usr_ID, a la caja de texto_2 la relacionaremos al campo usr_Nombre y a la caja de texto_3 al campo usr_Apellido.

Ahora vamos con las líneas de código:

'-------------------------------------------------------------------------------------------------------------
'Nota --> Hay gente que prefiere hacer el bucle con DO WHILE NOT .EOF - LOOP, la verdad es que a mí también me
'		 gusta más, pero quería probar otra forma; sin embargo, esto no es importante ;-)
'-------------------------------------------------------------------------------------------------------------
Sub cmdAgregar_click()
    Dim i As Long
adoUsuario.Refresh
For i = 0 To 10000
With adoUsuario.Recordset
.AddNew
.Fields!usr_ID = i
.Fields!usr_Nombre = "UltraMan_" & i
.Fields!usr_Apellido = "MataMonstruos"
.Update
End With
DoEvents
Next
i End Sub Private Sub cmdBorrar_Click()
On Error Resume Next
Dim i As Long, j As Long
adoUsuario.Refresh
adoUsuario.Recordset.MoveLast
j = adoUsuario.Recordset.AbsolutePosition
adoUsuario.Recordset.MoveFirst
For i = 0 To 1000
adoUsuario.Recordset.Delete
adoUsuario.Recordset.MoveNext
DoEvents
Next
i
End Sub
'-----------------------------------------------------------------------------------------------------
'cmdControl --> Matriz de commandButton para manejarse entre los registros de la tabla Usuario.
' 0 --> En caso de que el usuario presione el botón 0 el puntero del recordset se ubicará
' en el primer registro.
' 1 --> En este caso nos moveremos al anterior registro y si es principio del recordset
' entonces nos moveremos al primer registro para guardar el valor del campo usr_ID
' como referencia de la posición y cargamos el procedimiento "CambiarRegistro" (si la ' cantidad de registros es mayor que 1000)O cualquier otro valor que ustedes prefieran ' manejar.
' 2 --> En este caso nos moveremos al siguiente registro y si es final del recordset
' entonces nos moveremos al final del recordset para guardar el valor del campo usr_ID
' como referencia de la posición y cargaremos el procedimiento "CambiarRegistro".
' 3 --> En caso de que el usuario presione el botón 3 el puntero del recorset se ubicará
' en el último registro. 'Nota --> Si prefieren cargar de 5000 en 5000 es importante que cambien ese valor en todas las
' instrucciones selectivas y en las consultas, tanto en la del control ADO como en las
' consultas del procedimiento "CambiarRegistro".
'------------------------------------------------------------------------------------------------------

Private Sub cmdControl_Click(Index As Integer)
On Error Resume Next 'Para controlar el fallo que surgiría al ejecutar el movenext o moveprevious del recordset.
With adoUsuario.Recordset
Select Case Index
Case 0
If Not (.BOF And .EOF) Then
.MoveFirst
End If
Case
1
.MovePrevious
'-----------------------------------------
If .BOF And .EOF Then
MsgBox
"No hay registros en la base de datos", vbExclamation, "BASE DE DATOS VACÍA"
ElseIf .BOF Then
.MoveFirst
If .RecordCount > 1000 Then
CambiarRegistro .Fields!usr_ID, adoUsuario, 1
End If
End If

'-----------------------------------------
Case 2
.MoveNext
'-----------------------------------------
If .BOF And .EOF Then
MsgBox "No hay registros en la base de datos", vbExclamation, "BASE DE DATOS VACÍA"
ElseIf .EOF Then
.MoveLast 'mover al último registro.
'-------------------------------------
'si el número de registros es mayor que 1000 o sólo hay un registro, entonces
'hace el procedimiento "CargarRegistro".
'------------------------------------- 'Aquí el recordcount puede presentar dos casos, el primero es que sea mayor que 1000 'con lo que entrará al procedimiento, el segundo es que sólo haya un registro con lo 'que entrará también al procedimiento, ésto es así porque si sólo tomo en cuenta 1000 'registros entonces cuando la tabla tenga menos, nunca se ejecutará el procedimiento. '-------------------------------------

If .RecordCount > 1000 Or .RecordCount = 1 Then
CambiarRegistro .Fields!usr_ID, adoUsuario, 2
End If
End If

'-----------------------------------------
Case 3
If Not (.BOF And .EOF) Then
.MoveLast
End If
End Select
End With
End Sub
'------------------------------------------------------------------------------------------------------
'Procedimiento que se encarga de cargar los 1000 registros anteriores o posteriores.
'Este procedimiento cuenta con tres parámetros:
'1 --> MaxRegs: Es donde se guarda el valor del campo usr_ID que se toma como referencia para cargar
' los registros.
'2 --> ado: Se pasa el control ado con el que se esté trabajando, (esto es opcional, lo implementé
' porque puede presentarse el caso en que se tenga más de un control ADO en el mismo
' formulario.
'3 --> Tipo: Es la variable que indica si el registro se cargará hacia adelante o hacia atrás.
'------------------------------------------------------------------------------------------------------

Sub CambiarRegistro(MaxRegs As Long, ado As Adodc, Tipo As Byte)
Dim SQL As String 'Variable que contendrá la sentecia SQL con la que vamos a trabajar
'-----------------------------------------------------

If Tipo = 1 Then 'Si tipo igual a uno entonces
'Seleccionar los 1000 registros anteriores a los que tengo ahora.

SQL = "SELECT * FROM Usuario WHERE usr_ID BETWEEN " & MaxRegs - 1000 & " AND " & MaxRegs & " ORDER BY usr_ID"
ado.CommandType = adCmdText
ado.RecordSource = SQL
ado.Refresh
ado.Recordset.Move 999
Else
'Seleccionar los 1000 registros posteriores a los que tengo ahora.
SQL = "SELECT * FROM Usuario WHERE usr_ID BETWEEN " & MaxRegs & " AND " & MaxRegs + 1000 & " ORDER BY usr_ID"
ado.CommandType = adCmdText
ado.RecordSource = SQL
ado.Refresh
ado.Recordset.Move 0
End If
'-----------------------------------------------------
If ado.Recordset.BOF Then
MsgBox
"Ya no puedes moverte más entre los registros.", vbInformation, "No hay más registros"
ado.Recordset.MoveNext
End If
If
ado.Recordset.EOF Then
MsgBox
"Ya no puedes moverte más entre los registros.", vbInformation, "No hay más registros"
ado.Recordset.MovePrevious
End If
'-----------------------------------------------------
End Sub

El On Error Resume Next de "cmdControl", lo uso para controlar el error que surgiría al ejecutar el movenext o moveprevious del recodset si la tabla "Usuario" está vacía, esto lo hago así y no con la condición "if not (.BOF and .EOF) then..." porque me estaba dando problemas a la hora de mostrar los datos en las cajas de texto, si lo desean pueden probar metiendo el ".movenext" o ".moveprevious" dentro de la condición a ver que tal les va.

Seguramente hay por ahí algo mejor, pero por si las moscas o si no lo encuentran, esto puede que les sirva.


Cargar datos progresivamente ADO: David_Lastra_cargardatosprogresivamenteADO.zip - 4,00 Tamaño KB


ir al índice