Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-05-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
"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.
Responder Con Cita
  #2  
Antiguo 19-05-2005
Dimanu Dimanu is offline
Miembro
 
Registrado: abr 2005
Posts: 10
Poder: 0
Dimanu Va por buen camino
Talking 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
Responder Con Cita
  #3  
Antiguo 20-05-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
Gracias por tu respuesta Diego. Ya había tenido en cuenta los eventos, y quedan totalmente descartados.
Responder Con Cita
  #4  
Antiguo 20-05-2005
Jose_Pérez Jose_Pérez is offline
Miembro
 
Registrado: may 2003
Posts: 156
Poder: 22
Jose_Pérez Va por buen camino
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.


Código Delphi [-]
// Ejemplo:

MemoryData.First;
MemoryData.SortOnFields('NombreDelCampo');

Saludos.

Última edición por Jose_Pérez fecha: 22-05-2005 a las 23:23:27.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:06:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi