FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Actualizar varias filas en un ClientDataSet desconectado.
Hola, tengo una duda respecto al manejo de ClientDataSet, quisiera saber si hay alguna manera de actualizar varios registros en un ClientDataset que trabaja en modo desconectado. Lo que hice es obtener los datos de una BD Firebird con componentes IBX en un ClientDataSet y ahi hago mis operaciones para sacar reportes.
Hay un campo que se llama seleccion el cual el usuario hace click y selecciones que mes quiere imprimir el código que asi: El código anterior funciona bien, pero cuando hay varios registros se ejecuta un poco lento. Es ahi donde viene mi duda si hay un comando a lo Visual Foxpro "REPLACE ALL". Aca tengo la versión en Visual Foxpro del codigo Delphi anterior: Código:
IF USED("cur_bol") SELECT cur_bol SET FILTER TO REPLACE ALL seleccion WITH 0 GO TOP SELECT cur_boleta_rep GO TOP SCAN FOR cur_boleta_rep.seleccion = .T. SELECT cur_bol REPLACE ALL cur_bol.seleccion WITH 1 FOR cur_bol.anio + cur_bol.mes + cur_bol.mes_sup + ALLTRIM(cur_bol.dni) + cur_bol.tipo_pla + ALLTRIM(cur_bol.nro_bol) =; cur_boleta_rep.anio + cur_boleta_rep.mes + cur_boleta_rep.mes_sup + ALLTRIM(cur_boleta_rep.dni) + cur_boleta_rep.tipo_pla + ALLTRIM(cur_boleta_rep.nro_bol) ENDSCAN SELECT cur_bol SET FILTER TO seleccion = 1 COUNT TO var_filas GO TOP ENDIF Visual FoxPro tiene un comando que es REPLACE y con parametro ALL me reemplaza varios registros a la vez, en cambio en delphi tengo que hacer 3 bucles para actualizar datos: 1. Para poner 0(cero) al campo seleccion del ClientDataSet temporal 2. para recorrer los periodos seleccionados 3. para poner 1(uno) en el ClientDataSet donde estan las boletas de pago. Por eso la duda es si hay algun comando "REPLACE" en Delphi que me permita ejecutar mas rápido mi rutina. Agradesco de antemano si me pudieran ayudar, ya que aun no he logrado ejecutar mas rápido mi código delphi. PD: Uso Delphi 7. Última edición por ecfisa fecha: 03-08-2018 a las 02:29:09. Razón: ajustar código foxpro |
#2
|
|||
|
|||
Actualizar varias filas en un ClientDataSet desconectado.
Hola compañeros, despues de analizar una recomendacion en este foro que hizo Al Gonzáles en este Hilo "clubdelphi.com/foros/showthread.php?t=85143&page=2" y cambie la propiedad LogChanges a False del ClientDataSet. Tambien cambie el acceso a los campos como indica el compañero Mick en este Hilo "clubdelphi.com/foros/showthread.php?t=21764".
Hice los cambios respectivos y la velocidad de ejecución de la rutina en Delphi bajo de 15 segundos a 3 segundos. El código quedo asi: Aun asi la version de Visual FoxPro con muchos registros se demora 1 seg a lo mucho, si son pocos registros es milisegundos. Hay algo que menciono Al Gonzáles mencionó en el Hilo que comente lineas arriba: Cita:
Gracias de antemano si me pudieran brindar alguna ayuda. PD: No puedo agredar hipervínculos asi que puse las direcciones sin el prefijo. |
#3
|
||||
|
||||
Un par de interrogantes:
1. ¿Porque concatenas de esa manera los valores y luego haces un ciclo buscando si el valor de cada registro concuerda?, podrías usar un Locate en el segundo dataset con los valores del primero
2. ¿Porque realizas el proceso de filtrado de esa manera en lugar de armar el filtro con el valor de los campos del primer dataset?
__________________
Buena caza y buen remar... http://mivaler.blogspot.com Última edición por movorack fecha: 03-08-2018 a las 23:38:29. |
#4
|
|||
|
|||
Actualizar varias filas en un ClientDataSet desconectado.
Me respondo yo mismo XD, estuve revisando el código y aplique filtros al ClientDatSet principal TListado y la ejecución mejoró a 1.09 segundos, que ya me parece aceptable. Muestro el codigo final:
Resumiendo si alguien quiere actualizar varias filas en un ClientDataSet desconectado, debe tener en cuenta lo siguiente: 1.- Aplicar la propiedad LogChanges := False del ClientDataset. 2.- Acceder directamente a los campos y no usar FieldByName("TuCampo"). 3.- Aplicar Filtros en ves de condiciones al ClientDataSet ya que esto acelera mas el proceso en actualizaciones masivas. Sin mas espero que a alguien mas le pueda servir lo que me paso a mi. Aunque, aún me queda la duda de como sería con "rutinas de MIDAS". Saludos y buen fin de semana. |
#5
|
|||
|
|||
Miguel A. Valero, revise mi código en versión Visual FoxPro y si había que aplicar un filtro. Este es el código FoxPro que expuse en el primes post:
Código:
... SCAN FOR cur_boleta_rep.seleccion = .T. SELECT cur_bol REPLACE ALL cur_bol.seleccion WITH 1 FOR cur_bol.anio + cur_bol.mes + cur_bol.mes_sup + ALLTRIM(cur_bol.dni) + cur_bol.tipo_pla + ALLTRIM(cur_bol.nro_bol) =; cur_boleta_rep.anio + cur_boleta_rep.mes + cur_boleta_rep.mes_sup + ALLTRIM(cur_boleta_rep.dni) + cur_boleta_rep.tipo_pla + ALLTRIM(cur_boleta_rep.nro_bol) ENDSCAN ... Última edición por marco3k fecha: 04-08-2018 a las 01:45:20. Razón: Código FoxPro |
#6
|
|||
|
|||
No actualice bien el código final en el post 4 y no puedo editar el mensaje asi que lo coloco aqui:
|
#7
|
||||
|
||||
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Actualizar registros de ClientDataSet | oscarac | OOP | 1 | 31-01-2018 10:01:00 |
Actualizar datos al clientdataset | escorpionrojo43 | Conexión con bases de datos | 1 | 14-08-2013 17:51:02 |
Actualizar ClientDataSet usando TADOQuery y DataSetProvider | Walterio | Providers | 4 | 27-11-2012 20:01:00 |
Problema al actualizar con ClientDataSet con campos calculados | LEVV | Conexión con bases de datos | 5 | 13-01-2012 23:29:24 |
Problemas al actualizar campos numéricos con ClientDataSet e IBX | PINO72 | Conexión con bases de datos | 0 | 17-03-2007 01:37:44 |
|