FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
"Registro fantasma" en TRxMemoryData.
Hola a tod@s:
¡Que título tan misterioso para el asunto de este hilo! Ahora me pongo serio y lo explico... Tengo dos TRxMemoryData (para entendernos mejor MemoryDataOrigen y MemoryDataDestino) asociados a sus respectivos DBGrid, a los que paso información de uno a otro utilizando las técnicas de arrastrar y soltar. La copia de registros de un TRxMemoryData a otro funciona a la perfección. Después de haber finalizado el procedimiento de copia del registro, doy la posiblidad al usuario de cancelar la operación. Si el usuario decide cancelar, borro el registro del siguiente modo: TRXMemoryData.Delete . Hasta aquí todo es correcto. Supongamos que MemoryDataDestino está vacío, y tras una operación de arrastrar y soltar (con éxito), el usuario decidió cancelar la operación, y en ese momento el MemoryDataDestino queda de nuevo con 0 registros. Si el usuario vuelve a realizar una segunda operación (de nuevo con éxito) lo lógico sería que ahora hubiese 1 registro. Mi sorpresa, y por eso lo de "registro fantasma" es que aparecen 2 registros. Dicho de otra manera, si se copia un registro y a continuación se elimina, al añadir un nuevo registro por segunda vez, aparece el "fantasma" del eliminado (con el valor de los campos vacíos) más el añadido (2 registros). Y lo sorprendente es que después de eliminar el registro, el RecordCount me devuelve 0, y la propiedad IsEmpty me devuelve True. Todo esto no sucede si hay más de un registro. Es como si TRXMemoryData "no entendiese" el concepto de tabla vacía. He probado a vaciar el TRXMemoryData con el método EmptyTable, pero sigue igual. Espero haberme explicado correctamente. ¿Alguna sugerencia? Saudos y gracias. Última edición por Jose_Pérez fecha: 19-05-2005 a las 14:39:47. |
#2
|
|||
|
|||
Registro fantasma..
Hola capo delphiniano, en primera instancia no se los eventos asociados que teneis para dichas tablas como asi tampo el codigo de modo que lo que opine es relativo, si.., supongo que cuando haces delete estás posteando los cambios porque sino el registro es eliminado de la cache y sigue en mem. ram.., es por eso que cuando se cancela funca bien ya que la cancelacion deshace todo inclusive las modificaciones (append, delete, etc)...
debes tener asignado los siguiente: table2.delete; //cuidado con eventos onBeforeDelete / onAfterDelete table2.post; //cuidado con eventos onBeforePost / onAfterPost si tenes codigo en estos eventos que mencioné verificá sobre todo los del delete que puede ser que ahi el error.. Bueno espero haberte ayudado un poco.. Saludos
__________________
Diego |
#3
|
|||
|
|||
Gracias por tu respuesta Diego. Ya había tenido en cuenta los eventos, y quedan totalmente descartados.
|
#4
|
|||
|
|||
He visto muchas cosas raras en programación y esta es una de ellas.
Tras darle una y otra vez la vuelta a lo mismo he eliminado los componentes y los he vuelto a crear. Ahora funciona a la perfección. Lo cierto es que corté y pegué varias veces los componentes TRxMemoryData y sus correspondientes TDataSouce entre varios TForms, e incluso desde otras aplicaciones. He descubierto otro problema del TRxMemoryData, al cual he encontrado una solución rápida. Se trata del método SortOnFields. Cuando ordenaba por cualquier campo lo que hacía era llenarme los campos con datos "basura". Esto se evita situando el puntero en el primer registro, previamente a ordenar el campo.
Saludos. Última edición por Jose_Pérez fecha: 22-05-2005 a las 23:23:27. |
|
|
|