PDA

Ver la Versión Completa : cargar muchos datos en clientdataset


papote654
13-07-2011, 15:04:51
buenos días,

tengo un inconveniente con el clientdataset y es que cuando cargo una gran cantidad de registro por decir un ejemplo 300,000.00 dura una eternidad.

tengo entendido que el clientdataset carga los datos uno a uno y que por tal razón dura todo ese tiempo.

lo que quiero es modificar esos datos y que no se grabe nada hasta no actualizar.

si alguien tiene una sugerencia me seria de gran ayuda.

gracias....

Caro
13-07-2011, 15:53:39
Hola papote654, prueba la propiedad PacketRecords que tiene por defecto -1 (eso significa que te va a cargar todos los registros en tu clientdataset), si le das otro valor digamos 100, se va ir cargando de 100 en 100.

¿Necesitas que todos esos registros esten en tu ClientDataSet? deberías trabajar solo con los registros que necesites.

Saluditos

cecam
13-07-2011, 17:28:58
Hoooola!!

Con un problema similar se me soluciono con
cds.LogChanges:=False;
en el AfterOpen.

Saludos!

Neftali [Germán.Estévez]
13-07-2011, 17:41:48
La pregunta que yo haría sería:
¿En necesario cargar ese número de registros a la vez en un TClientDataset?
¿No puedes reducir ese número?
¿No puedes filtrar?

papote654
13-07-2011, 23:03:46
así es amigos, necesito cargar todos los datos ya que lo que hago es una transferencia de informaciones entre diferente base de datos y diferentes tablas donde valido si el dato existe lo actualizo de lo contrario lo inserto, todo este proceso se hace automático y esta es la razón por la cual cargo todos los datos.

papote654
13-07-2011, 23:11:30
saludo caro, fíjate que ya había probado la propiedad packetsrecords y cuando le pongo la cantidad por ejemplo 3000 carga los 3000 pero no sigue cargando, es como si solo existieran eso. dime si existe una forma de que pueda decirle que continué y me cargue 3000 mas.

también probé lo que me dice cecam, y la verdad no me funciono, no se si es por la gran cantidad de datos.

ContraVeneno
14-07-2011, 00:01:52
Yo creo que no estas atacando el problema como se debería.

Me refiero a que si se supone que es un proceso automático, no deberías usar un ClientDataset cuya funcionalidad principal se utiliza para la interacción con el usuario. Y definitivamente no deberías de trabajar con 300,000 registros a la vez.

Si aún así quieres trabajar con un ClientDataset, debes aceptar que trabajar con esa cantidad de datos a la vez, va a ser un proceso lento ya que se tienen que cargar a memoria. La parte de que te carga solo 3000 y deja de cargar, es porque tienes que recorrer el clientdataset hasta el 3001, para que cargue los siguientes 3000 y así sucesivamente hasta llegar al final.

Edito: Si lo que quieres verificar es si el dato en cuestión ya existe en la base de datos y si no existe lo insertas, entonces lo mejor sería colocar un índice en la base de datos que no te permita duplicar el dato que quieres guardar. Y luego a traves de una consulta SQL puedes insertar todos los datos en una sola instrucción.

papote654
14-07-2011, 00:42:29
gracias contraveneno,

utilizo el client porque no quiero que los datos bajen a la base de datos hasta que no sea definitivo, ya que al utilizar el adoquery cada vez que cambie de registro me lo ira grabando y eso no seria factible ya que se puede realizar una consulta en ese momento y luego cancelada la transferencia y tendríamos un dato que no existe o no es real.

este proceso lo utilizo de esa forma ya que son varias sucursales, cada una con su base de datos local y que a x hora o a fin o principio de día, realizan la transferencia.

puede darse el caso de que modifiquen una información, por ejemplo el nombre de un cliente, este dato debe ser corregido en el servidor principal y esto es lo que me llevo a que también necesite actualizar los registros y no solo insertarlo.

Caro
14-07-2011, 00:48:31
saludo caro, fíjate que ya había probado la propiedad packetsrecords y cuando le pongo la cantidad por ejemplo 3000 carga los 3000 pero no sigue cargando, es como si solo existieran eso. dime si existe una forma de que pueda decirle que continué y me cargue 3000 mas.


Hola de nuevo papote, para moverte en los siguientes paquetes debes utilizar la función GetNextPacket, cuando esta retorna 0 es porque ya se han cargado todos los registros en el clientdataset.


Repeat
While Not ClientDataSet.Eof do
begin
showmessage(ClientDataSet.FieldByName('campo').AsString);
ClientDataSet1.Next;
end;
until ClientDataSet1.GetNextPacket = 0


también puedes probar de poner la propiedad FetchOnDemand a True, creo que si eso estuviera en true ya no tendrías que moverte entre paquetes, una ves que se llegue al final de lo que has puesto en PacketRecord se cargarían el siguiente paquete, pruebalo y nos confirmas si es asi.

Saluditos

Al González
14-07-2011, 00:53:18
¿Qué te parece si empezamos desde el principio? Explica por favor, con todo detalle, qué información es la que se está manejando, cómo se está manejando y lo que pretendes hacer.

En pocas palabras, hablemos del problema a resolver antes de hablar de los problemas que surgieron al intentarlo de una u otra manera.

Saludos.

Al González. :)

newtron
14-07-2011, 08:58:34
¿Y una tabla en memoria no iría mejor?

Casimiro Notevi
14-07-2011, 11:40:43
¿Qué te parece si empezamos desde el principio? Explica por favor, con todo detalle, qué información es la que se está manejando, cómo se está manejando y lo que pretendes hacer.
En pocas palabras, hablemos del problema a resolver antes de hablar de los problemas que surgieron al intentarlo de una u otra manera.
Saludos.
Al González. :)

+1


.

DarKraZY
14-07-2011, 14:29:27
¿Y una tabla en memoria no iría mejor?

Básicamente un TClientDataSet es una tabla en memoria.
Espero que no lo tenga conectado mediante un TDataSource ya que esto, si no hace DisableControls, podría ralentizar mucho el proceso.
300.000 registros son muchos, pero tampoco tantos.

Neftali [Germán.Estévez]
14-07-2011, 15:50:17
¿Y una tabla en memoria no iría mejor?

Básicamente un TClientDataSet es una tabla en memoria.

Yo había pensado lo mismo que newtron, pero "pensando" en tablas en memoria "del servidor" (no se si él se refería a eso); Con el ClientDataset estás trayendo TODOS los datos al cliente, para luego hacer las modificaciones y volcarlos de nuevo al servidor.

En mi caso revisaría tablas en memoria del servidor.

De todas formas, creo que lo que ha dicho Al es muy acertado. A priori, sin saber el problema concreto, la solución de traer 300.000 registros al cliente, no parece correcta ni adecuada.

marcoszorrilla
14-07-2011, 16:55:10
Yo no alcanzo a ver el porqué de procesar tantos registros a la vez, quizás si nos dice el propósito comprendamos mejor.

En cualquier caso yo procesaría cierta cantidad cada vez, eso se vería haciendo unas pruebas con el servidor.

Un Saludo.

Lepe
14-07-2011, 17:15:04
Yo afinaría un poco más: ¿Necesita ver el cliente todos los datos?

Si necesitara verlos, con ver 100 registros seguro se hace una idea de lo que debe modificar.

Obviamente no va a modificar los 300.000 registros a mano, así que hacerlos en el clientdataset o hacerlo mediante una SQL con control de transacciones ya va que chuta.

Saludos

DarKraZY
14-07-2011, 17:28:26
...tengo un inconveniente con el clientdataset y es que cuando cargo una gran cantidad de registro por decir un ejemplo 300,000.00 dura una eternidad.

lo que quiero es modificar esos datos y que no se grabe nada hasta no actualizar.

...lo que hago es una transferencia de informaciones entre diferente base de datos...

...son varias sucursales, cada una con su base de datos local...

Supongo que está replicando datos entre distintas bases de datos, pero que hay una base de datos central.

La verdad es que papote654 debería darnos más información.

DarKraZY
14-07-2011, 17:30:31
Yo había pensado lo mismo que newtron, pero "pensando" en tablas en memoria "del servidor" (no se si él se refería a eso);

Hola Neftali, ¿Cómo serían esas tablas de memoria en el servidor?

¿creando un procedimiento almacenado en el servidor?
¿Una aplicación (tipo DataSnap) corriendo en el servidor?
...


Me he quedado con la curiosidad de saber cómo se haría eso ;)

Saludos!

papote654
14-07-2011, 17:48:25
buenos días y gracias por el apoyo,

la situación es que tengo varias sucursales, cada una de ellas con su base de datos local, cree una aplicación donde el usuario selecciona las tablas o mantenimientos a exportar y yo me encargo de buscar los datos y transferirlo al servidor. En este proceso lo que busco los datos de origen y valido si el campo o los campos clave existen de ser así hago un EDIT y paso el valor de origen al destino de lo contrario INSERT los registro de origen en el destino.

es una transferencia de datos donde verifico si el dato existe lo actualizo de lo contrario lo inserto.

papote654
14-07-2011, 17:52:32
amigo DarKraZY es exactamente como marcaste, una replicación de datos lo único es que el usuario tiene la facilidad de transferir un dato en especifico cuando lo desee.

ejemplo.

el usuario quiere transferir solo al cliente JUAN PEREZ pues en la aplicación que le diseñe el usuario configura todo esos parámetros, no solo se limita a transferir x o y, sino que todo es a su antojo.

Caro
14-07-2011, 21:25:37
Hola Neftali, ¿Cómo serían esas tablas de memoria en el servidor?
..............
Me he quedado con la curiosidad de saber cómo se haría eso ;)


Hola, yo tengo la misma curiosidad Neftali, como se haría y muchas gracias por adelantado.

Saluditos