¿Cómo puedo mostrar los registros de mi base de datos por partes?

Mi pregunta es sobre visual basic 6.0 -ado
Tengo una base de datos de 4 millones de registros a más, cargo en el recordset pero para mostrá los registros en una grilla se me hace imposible por el tamaño de registros . Como puedo mostrarlos, por partes (si es así cual es el código), o conoces algún control aparte del datagrid que lo pueda hacer.
1 Logro cargar la base en el recordset
2. Hago la carga del recordset en el FLEXGRID y se cuelga, no responde y eso que la pc es PIV CON 256 RAM, CON EL DBGRID pasa lo mismo .
3. Ha! Casi siempre sale un mensaje ¡Memoria insufuciente!.
Bueno lo que deseo es que si se puede cargar de alguna manera, de una forma rápida, o en algún otro control o por partes me sugieras la forma.
Pero no se como cargar una tabla por partes sin que tenga un id.
... La idea es cargar una parte, descargarla, cargar otra, descargarla, etc
De verdad te rogaría que me ayudes. Gracias y disculpas por el palabreo
omar diaz

4 Respuestas

Respuesta
1
OK. Existen ciertas propiedades del Recordset (que no son muy conocidas) que puedes utilizar. El código es muy simple, y bastante funcional. La razón por la que el recordset se carga sin problemas (aunque supongo que algo se demora) es porque en realidad no baja todos los registros al PC cliente... de hecho, si la conexión con el server se corta, generalmente se pierden los registros que éste contiene. En fin, a lo que te interesa: los recordset ADO tienen 2 propiedades bastante útiles para estos casos. Estas son PageSize y AbsolutePage. PageSize te permite decirle al recordset la cantidad de registro que deseas colocar por página, y AbsolutePage le indica al recordset la página en la que deseas que éste se ubica. Por ejemplo, puedes hacer algo como esto:
CNX. Open StringConexion
RS. Open "Select * from Tabla", CNX, 3, 1
RS.PageSize = 20 'cantidad de registros por página de recordset
RS.AbsolutePage = varPagina 'página que se desea
De esta manera, puedes controlar la página que el recordset está mostrando. Esto no lo he probado nunca con un Recordset enlazado a una grilla, pero debería actuar automáticamente. Para cambiar la página, sólo debes actualizar la propiedad AbsolutePage que corresponde en el evento de algún botón "Siguiente" o "Anterior".
Esto debería indicarte más o menos por dónde seguir investigando, ya que estoy seguro de que si te escribo el código exacto, seguramente lo copiarás y mañana se te va a haber olvidado!
Otra cosa: Tal vez debas reconsiderar traer los 4 millones de registros en un recordset. Aunque a veces parezca tener sentido, generalmente "nadie" va a tener la paciencia para ir página por página revisando 4 millones de registros! Deberías considerar utilizar filtros o consultas específicas para lo que necesites, porque aunque no conozco lo que estás haciendo, creo que traer cuatro millones de registros en una grilla no sería la solución más eficiente... en fin, es sólo mi humilde opinión.
Ojalá te sirva!
Respuesta
1
La forma que he empleado alguna vez para solventar el problema que me planteas se basa en obtener los por primeros registros de la tabla puedes encontrar información y código en esta página:
http://www.macroheavy.com/vb/leccion27/leccion27.htm
Pero existe un problema y es que los registros intermedios nos son imposibles de acceder a no ser que vayamos cargando todo el recordset.
Otra solución, que es la que yo utilicé en su momento, consiste en cargar todos los registros en un recordset y a través de código y los comandos movenext, etc... ir presentando los registros del recordset en el flexgrid.
Saludos. Y espero haberme explicado claramente, si te surge alguna duda ya sabes.
;-)
Respuesta
1
Nunca he trabajado con una base de datos de tan gran tamaño, pero has lo siguiente:
Utiliza un flexgrid, pero en la rutina no cargues todos los registros porque va a ser imposible, como ya lo viste, cargar todos de un solo golpe, pon una rutina que te cargue unos 500 o 1000 registros, depende de la maquina donde lo vayas a instalar, para una p1 te recomiendo 500 para que no sea tan lento. Luego pon botones de siguiente y atrás, en el de atrás mostrarías los 500 registros anteriores siempre que no sea fin de base de datos, en siguiente has la rutina para mostrar los siguientes 500 registros que le siguen a la bd. Al inicio de cada rutina del botón, inicializa en cero el flexgrid o sea:
private sub command1_click()
flexgrid.cols=0
flexgrid.rows=0
flexgrid.refresh
end sub
Con esto inicializarias el flexgrid para que borre los anteriores registros y no se te tupa de registros el flexgrid.
Creo que con esto funcionaria, intentalo y luego valoras la pregunta a ver que tal te fue.
Respuesta
1
Para cargar tal cantidad de registros puedes utilizar el spread de far point pero lo que me queda de duda es lo siguiente:
No existe alguna forma de que los usuarios seleccionen un rango de datos o criterios de búsqueda para poder reducir el número de registros a presentar, porque en la realidad el consultar 4,000,000 de datos me parece excesivo y por eso marca errores de memoria, los controles de microsoft no soportan más de 32,000 registros, la única forma de tener los datos con un control data sería registro por registro, nunca los puedes cargar en un grid, a menos que uses el spread y no recuerdo hasta cuantos millones de registros soporta pero también depende de la memoria y recursos disponibles del equipo.
Si me orientas un poco más con lo que quieres hacer tal vez podamos encontrar una mejor solución.
Saludos
David Enciso
e-mail: [email protected]
Lo que pasa es que en mi trabajo es necesario visualizar esa cantidad de registros de una sola... por cosas que son largas de contar... mi problema es ese... no los logro cargar, tan solo visualizarlos todos o por partes tal vez de 1000 en 1000 ... ... por eso necesito orientación... gracias por tu futura respuesta
Ok, ya te entendí, ahora en que base de datos trabajas, si es sql server puedes utilizar
Cláusula SELECT
Especifica las columnas que va a devolver la consulta.
Sintaxis
SELECT [ ALL | DISTINCT ]
[ TOP n [PERCENT] [ WITH TIES] ]
< select_list >
< select_list > ::=
{ *
| { table_name | view_name | table_alias }.*
| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
[ [ AS ] column_alias ]
| column_alias = expression
} [ ,...n ]
Argumentos
ALL
Especifica que pueden aparecer filas duplicadas en el conjunto de resultados. ALL es el valor predeterminado.
DISTINCT
Especifica que sólo pueden aparecer filas exclusivas en el conjunto de resultados. Los valores NULL se consideran iguales a efectos de la palabra clave DISTINCT.
TOP n [PERCENT]
Especifica que sólo se van a utilizar las primeras n filas del conjunto de resultados de la consulta; n es un valor entero entre 0 y 4294967295. Si también se especifica PERCENT, sólo se va a utilizar el primer n por ciento de filas del conjunto de resultados. Cuando se especifica con PERCENT, n debe ser un entero entre 0 y 100.
Si la consulta contiene una cláusula ORDER BY, se utilizarán las primeras n filas (o el porcentaje n de filas) ordenadas por la cláusula ORDER BY. Cuando la consulta no tiene una cláusula ORDER BY, el número de filas es arbitrario.
WITH TIES
Especifica que las filas adicionales se devolverán del conjunto de resultados base con el mismo valor en las columnas ORDER BY que el que aparece en la última de las filas de TOP n (PERCENT). TOP ... WITH TIES sólo se puede especificar si hay una cláusula ORDER BY especificada.
Si no es así, puedes enviarme la estructura de la tabla para ver que se puede hacer, encontrar algún criterio.
Saludos
David Enciso
e-mail:[email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas