FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
No hay mas detalles Al, para depurar bien, activé la opcion Use debug dcus y no me lleva muy lejos, al llegar a la llamada cdsLog.ChangeCount me lleva a la unit Datasnap.DBClient(2669):
y ésta llamada me dirije a la unit Datasnap.DSIntf(662);
De ahi ya me pide el archivo ds.cpp que no está en mi sistema y ahi ya sale la ventana de CPU. Por el momento he llegado hasta aqui con el código fuente. Si al CDS le agrego los archivos de un solo golpe el tiempo de consuta a ChangeCount es grande, si lo hago uno por uno, el tiempo se incrementa progresivamente con cada archivo agregado al DS. Espero que alguien tenga más código fuente que yo, sé que las distintas versiones de Delphi vienen o no con fuentes dependiendo de lo caro que costó
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca |
#2
|
||||
|
||||
Hola Ricardo, encontré algo que puede servir, pero antes quisiera resolver una duda que me surge de lo que has comentado:
Cita:
Por otra parte, si quieres manejar "puntos de restauración" (marcar lo ya hecho para luego regresar), seguramente estás usando también la propiedad SavePoint, eso me parece bien. En seguida te comento lo que encontré sobre el funcionamiento de la propiedad ChangeCount. Cita:
En efecto Ricardo, el depurador me lleva también a ese punto del código, y a partir de ahí me veo en la necesidad de examinar el código de MIDAS manualmente. Esta es la parte que hace el cálculo de ChangeCount: Código:
case dspropNOOFCHANGES: if (piPropValue) { UINT32 i, iChanges = 0; if (pDsLog && pDsLog->iLast) { DSLOG *pLogNew = new DSLOG(pDsLog->iLast, NULL); if (pDsLog->CompactLog(pLogNew) == DBIERR_NONE && pLogNew->iLast > 0) { iChanges = pLogNew->iLast; for (i = 0; i < pLogNew->iLast; i++) { LOGENTRY *pLogEntry = &pLogNew->pLogEntries[i]; if (pLogEntry->iAttr == dsRecModified) { if (RecsEqual(pLogEntry->iRecNo2, pLogEntry->iRecNo1, TRUE, NULL)) iChanges--; // Changes were canceled out } } .... Código:
// Compact log, in order to create delta DBIResult DSLOG::CompactLog(DSLOG *pLogNew) { DBIResult rslt = DBIERR_NONE; pBYTE pValid = (pBYTE)DsCalloc(1, iLast +1); UINT32 iRecNo, iRecNoOrg; UINT32 i, j; if (pLogNew == NULL || pValid == NULL) { rslt = DBIERR_NOMEMORY; goto Exit; } for (i = 0; i < iLast; i++) { ... He de decir que encontré una manera de sacarle la vuelta al problema de la lentitud, pero no me gusta casi nada esta "solución", por dos razones: 1.- Porque no necesariamente se obtiene el mismo valor de la propiedad ChangeCount. Ésta hace un trabajo importante al compactar el registro de cambios, descartando ciertas entradas (como cuando agregas un registro y posteriormente lo eliminas). Lo que obtiene mi solución es la cantidad total de "entradas" en el registro de cambios: el valor de ese contador interno llamado iLast. 2.- Porque no es elegante, ya que implica "jaquear" (¿está bien escrito? ) la estructura de un par de clases contenidas en MIDAS.dll. Esto quiere decir que se deberá probar con mucho cuidado al cambiar de una versión de MIDAS a otra (por lo menos en Delphi 7 y XE2 me funcionó sin problemas). De todas formas pongo aquí un ejemplo, por si te sirve a ti o a alguien más: Ojalá hubiera mayor accesibilidad al interior de MIDAS, como para no tener que hacer este tipo de cosas. Pero como te dije al principio, si sólo necesitas saber si hubo o no hubo cambios, pienso que una simple bandera en tu código Delphi bastaría Dos cosas más: Cada vez que haces un Insert/Append/AppendRecord o un Post tradicional, se realizan diversas llamadas a métodos de TDataSet y TClientDataSet. Debes saber que puedes agregar de forma directa los valores a la memoria del ClientDataSet mediante su interfaz DSCursor (es una propiedad protegida, pero perfectamente accesible por derivación de clases), si bien el ahorro de tiempo no va a ser espectacular. El otro asunto que comentabas, sobre el vaciado de la información a la base de datos, quizá sea más rápido si empleas sentencias SQL directas Insert Into usando tu componente conexión. Aunque también depende de qué componente sea éste y los motores y controladores que estén entre la aplicación y la base de datos. No más rollo, se terminó la hora de trabajar en lo que me gusta y llegó la hora de trabajar en lo que me da para comer. Un saludo. Al González. |
#3
|
||||
|
||||
Recórcholis Al, lo que se puede hacer si tienes a la mano los fuentes...
Probaré el código para "hackear", y usaré los eventos para detectar cambios y activar la banderita, habia querido evitarlos para simplicidad de código, ahora me enfrento a la misma lentitud del MergeChangeLog, voy paso a paso resolviendo los problemas... Postearé los resultados.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos? Salva a un nylon, usa prendas de piel de foca |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Lentitud con ClientDataSet.XMLData en Servicio Datasnap | code88 | Varios | 4 | 08-02-2013 18:43:07 |
buscar registros de un ClientDataSet a otro clientDataSet | novato_erick | Conexión con bases de datos | 2 | 02-02-2013 20:48:09 |
Lentitud leer .csv | ErYcK | C++ Builder | 23 | 05-07-2012 22:56:44 |
Lentitud en la red. | Carlos Arevalo | Varios | 2 | 09-07-2007 19:04:08 |
Modificar propiedad Delta de CDS | alucardo | Conexión con bases de datos | 0 | 04-10-2006 19:36:41 |
|