FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
PacketRecords i FindKey (ClientDataSet - DBExpress)
Hola a todos,
Estoy con una aplicación que trabaja con tablas muy grandes 30 columnas por 20000 filas, algunas de ellas con campos blob. Utilizo SQLDataSet -> TDataSetProvider -> TClientDataSet para conectarme a dichas tablas i necesito editar campos puntuales de la tabla (sin utilizar una consulta). En teoria se podria hacer directamente con el ClientDataSet pero me carga TODOS los registros cuando abro la tabla para editarla. Esto hace que reserve memoria para unas 300 MB. A priori el tema se soluciona poniendo la propiedad PacketRecords con un valor mayor que zero para que solo se carguen algunos registros y no toda la tabla. Pero entonces me carga todos los campos cuando le hago el FindKey. He probado de poner PacketRecords = 0 y entonces no me encuentra el registro con el FindKey. Estoy desesperado ya no se que probar mas. El BDE no me daba estos problemas de memoria. Aunque se me ha pasado por la cabeza no voy a volver al BDE, pero me extraña que no haya una solucion a mi problema trabajando con los componentes de DBExpress. A ver si alguien me puede hecha una mano, un saludo. Última edición por PatrickM fecha: 25-07-2006 a las 12:01:12. |
#2
|
|||||
|
|||||
Vamos por partes:
Cita:
Cita:
Cita:
Cita:
Cita:
|
#3
|
|||
|
|||
Hola Pepon
Gracias por tus respuestas. Aunque sigo con el problema ya que no quiero usar una consulta, simplemente quiero usar el SQLDataSet/TSQLTable para MODIFICAR registros de la tabla, no para consultarlos. Tengo claro que con una consulta obtengo solo los resultados que yo quiero, hasta ahi llegamos. El problema que tengo es que el TClientDataSet me devuelve todos los registros, y yo solo quiero posicionarme, Edit, Post, y ApplyUpdates. Sobre el tamaño de la tabla ... el numero de registros no es muy grande, pero el el tamaño de cada registro es de 24 KB, eso multiplicado por 20000 hacen 300 MB de buffer en memoria que se crea el CDS, a parte de que es un fichero historico y cada año va creciendo. a ver si alguien me da una solution. gracias. |
#4
|
|||
|
|||
Como te he comentado antes, el problema reside en que haces que se cargen todos los registros de la base de datos. Lo correcto es que se traiga unas pocas decenas de registros. Antes de que el usuario pueda visualizar la información, deberías de solicitarle un rango de registros a mostrar: por id, fechas, un texto, etc... Todo depende de la información que almacenes en tu base de datos.
|
#5
|
|||
|
|||
Hola Pepon,
Para visualizar los resultados uso una consulta, ya que al ser un fichero historico, solo intento muestro los resultados en un rango entrado por el usuario. El problema es al intentar modificar la tabla con un TClientDataSet -> TDataSetProvider -> TSQLTable, ya que aunque pongas el PacketRecord>0, el FindKey se los patea todos, y se los carga en el buffer de memoria del CDS. Estoy modificando la implementación del FINDKEY para que esto no pase. Cuando lo tenga lo cuelgo para quien le pueda interesar. un saludo, |
#6
|
|||
|
|||
¿Por qué no en vez de modificar la implementación del FindKey haces que el ClientDataSet tenga SOLO ese registro? Para hacer la búsqueda con el FindKey, previamente tienes que saber qué es lo que buscas. Pues en vez de hacer un FindKey, modificas la sentencia SQL para que te devuelva el/los registros que estás buscando. ¿Por qué no explicas un poco como es la tabla y como realizas la búsqueda?
|
#7
|
|||
|
|||
Te explico, el problema es que la aplicación usaba BDE i se ha migrado todo a DBExpress. Digamos que seria imposible cambiar ahora todos los TTables por Consultas i UPDATES.
Ya he resuelto el problema modificando el FindKey del ClientDataSet. De todas formas gracias por el interes. Aqui pongo el código para quien le pueda interesar:
El TTableSCS es un tipo que me he creado para modificar el FindKey y otras cosas del ClientDataSet. Su declaración seria algo asi:
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
dbExpress ClientDataSet.Refresh problema | Neia | Conexión con bases de datos | 0 | 18-04-2005 20:14:11 |
RecordCount vs PacketRecords | cesar_picazo | Conexión con bases de datos | 1 | 02-04-2005 21:26:57 |
Problemas con DBExpress - ClientDataset | argami | Conexión con bases de datos | 4 | 26-07-2004 11:21:12 |
Problema con ClientDataSet y DBexpress | JOMABRI | Conexión con bases de datos | 6 | 26-05-2004 18:32:53 |
DbExpress - Transacciones - más de un clientDataSet | carlosmari | Conexión con bases de datos | 7 | 29-09-2003 20:07:54 |
|