Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Amigo Al, yo puedo probarlo en delphi 2007, no sé si te puede servir ya que especificas 2009 y 2010.
Gracias por el ofrecimiento Antonio, ahora mismo lo probé con Delphi 2007 y el problema persiste. También lo he hecho con tres diferentes versiones de Midas.dll obteniendo los mismos resultados.

Andrés, si tienes el archivo MidasLib.pas en tu Delphi 2010, ¿podrías echar una mirada a la clase que implementa los métodos de la interfaz IDSCursor, especialmente a los que intervienen en el change log? (y ya de paso corregir este problema y enviarle la solución a Embarcadero ).

Lo que daría por estar viendo ese código ahora. Tendré que esperar hasta estar frente a una computadora con Delphi 2010.

Última edición por Al González fecha: 15-08-2010 a las 02:32:28.
Responder Con Cita
  #2  
Antiguo 15-08-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Al González Ver Mensaje
[..] Lo que daría por estar viendo ese código ahora. Tendré que esperar hasta estar frente a una computadora con Delphi 2010.
¿No te sirve la versión trial?
Responder Con Cita
  #3  
Antiguo 15-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿No te sirve la versión trial?
Tengo una versión de prueba que bajé e instalé hace varios meses, pero con ella no vienen los fuentes de la VCL, creo que no los incluyen en este tipo de distribuciones.

De todas formas no hay urgencia en esto, Antonio, con los trucos de borrar en lugar de revertir o el de modificar antes de revertir, se le puede sacar la vuelta a ese defecto. Eso sí, para mí sería interesante conocer más sobre el asunto.
Responder Con Cita
  #4  
Antiguo 16-08-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
He probado con Delphi 2010 y el comportamiento es el mismo, dándose esa disfunción en el uso de los filtros.

Por cierto, siento desilusionarte, Al, pero el archivo MidasLib.pas que viene con Delphi 2010 (al menos en el Professional) ocupa apenas 953 bytes, ya que tan solo declara la función externa DllGetDataSnapClassObject para registrarla mediante RegisterMidasLib, pero nada más que rascar. Esta unit hace uso del fichero binario Midas.obj, donde supongo está todo el nucleo de Midas.

Respecto a RevertRecord y la aplicación de un filtro, ahí hay un bug gordo que más bien parece estar relacionado con el uso de los filtros en esta clase de Datasets (TClientDataSet). He hecho la prueba de desmenuzar ese código que pones en cuatro partes, y lanzar cada una desde botones diferentes: en la primera se vacía el Dataset y se añaden los dos registros; en la segunda se aplica el filtro; en la tercera se llama a RevertRecord; y por último, en la cuarta se quita el filtro.

La sorpresa me la he llevado al cambiar el orden de estas llamadas: 1er paso, creo los dos registros, a continuación selecciono desde el grid el primer registro (ID = 10) y me voy al tercer paso, llamando a RevertRecord; todo ello sin haber aplicado el filtro, de ahí que seleccione el nº 10 desde el grid para asegurarme de que RevertRecord se aplica sobre dicho registro. Bien, en teoría esto debería borrar el registro ID=10 y dejar el ID=11 solamente ¿no?. Pues efectivamente, así sucede. Lo SORPRENDENTE es que si luego aplico el filtro resulta que ... ¡magia potagia! el registro nº 10, que ya estaba eliminado, vuelve a aparecer (lo lógico es que el grid se quedara vacío al aplicar este filtro), y cuando finalmente quito el filtro ahí están los dos, el nº 10 y el nº11.

A todo esto quiero añadir que, para hacer ciertas pesquisas, me he servido de una técnica propuesta por Ian Marteens en su libro "La Cara Oculta de Delphi 6", pgs 469 y 470, que consiste en volcar la propiedad Delta (matriz donde se almacenan los datos temporales, caché) de un ClientDataset sobre la propiedad Data (matriz donde se almacenan los datos confirmados) de otro ClientDataset, de forma que podamos ver, tras dicho volcado, qué registros hay presentes en cada momento en la caché del primero. Siguiendo esta técnica, después de cada paso que daba, pulsaba un botón que realizaba dicho volcado y los valores arrojados eran los esperados: es decir, que después de aplicar RevertRecord sobre el registro con ID nº 10, en la caché sólo quedaba el nº 11, por lo que entiendo que el 10 se daba por eliminado correctamente. Lo curioso es que luego, al aplicar el filtro, dicho registro vuelva a aparecer en el Grid, aunque ya no aparece en la Caché, ¿de dónde sale si ya había sido borrado y no estaba ni en la caché ni aparecía en el Grid?

Pongo aquí el código que vuelca el Delta del primer ClieentDataSet sobre el Data del segundo, por si quieres hacer pruebas, basta con que enlaces un Grid a este segundo ClientDataSet para ir viendo los registros pendientes de confirmar en el primero:

Código Delphi [-]
procedure TForm2.BtnVerDeltaClick(Sender: TObject);
begin
  try
    CDS2.Data := CDS1.Delta;
  except
    CDS2.Data := Null;
  end;
end;

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #5  
Antiguo 16-08-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias Andrés.

Es muy interesante lo que describes, y, en efecto, así pasa también en Delphi 7. Ya había echado un vistazo al Delta de la manera que indicas (aunque no lo vi con mucho detalle).

Un amigo me dejó ver unos archivos .cpp, que al parecer son los fuentes del archivo .obj que mencionas (creí haber leído que todo el DataSnap estaba reescrito en Delphi). No los he mirado con dedicación porque no dispongo de mucho tiempo ahora (aunado a que le he perdido algo de práctica a C++), pero estoy seguro que dentro de ellos se encuentra la clave de todo este misterio.

Sabes, finalmente he decidido crear mi propio método RevertRecord con un parámetro Boolean opcional llamado FilterSafe (10 minutos para definir ese nombre ). Si es True, antes de revertir un registro nuevo, haré un par de llamadas de bajo nivel (DSCursor.PutField y DSCursor.ModifyRecord) para poner en blanco el último campo del registro que no lo esté, pues, como comenté arriba, el problema se evita si modificas el registro nuevo antes de revertirlo.

Por cierto, ¿podrías comprobar si eso último es aplicable también a Delphi 2010?

Saludos.

Al.
Responder Con Cita
  #6  
Antiguo 19-08-2010
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Por cierto, ¿podrías comprobar si eso último es aplicable también a Delphi 2010?
Pues sí, lo probé en Delphi 2010 y sucede igual, si realizas una modificación a un registro nuevo (ojo, habiendo sido este confirmado mediante Post), RevertRecord lo elimina realmente y ya no aparece en los filtros.

Saludos
__________________
Guía de Estilo
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Connection fallida el-mono Firebird e Interbase 1 30-12-2008 22:24:14
Migración Fallida Shadowless Windows 2 29-10-2008 10:53:12
Prueba turbo Delphi Net Fallida ASAPLTDA Varios 0 08-05-2007 18:54:39
Conexion fallida con FireBird mvelgar Conexión con bases de datos 3 05-05-2007 02:59:27
Combinación de teclas Jose_Pérez API de Windows 2 17-06-2003 11:57:30


La franja horaria es GMT +2. Ahora son las 12:33:05.


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