Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
OK entiendo las razones... como te dije en mi primer post delphi usa algo similar en sus componentes o en alguna parte no me acuerdo donde lo lei, asi q solo era adentrarse un poco , te dejo un par de funciones, basicamente no hago nada, todo lo hace delphi a la hora de comparar (la comparacion es de forma binaria)....

comparacion mediante streams:
Código Delphi [-]
function CompareStreams(StreamA, StreamB: TMemoryStream): Boolean;
begin
  Result := (Assigned(StreamA) and Assigned(StreamB))
    and (StreamA.Size = StreamB.Size)
    and CompareMem(StreamA.Memory, StreamB.Memory, StreamB.Size);
end;

solo falta convertir el campo a stream, eso se arregla con esta funcion:
Código Delphi [-]
function BlobToStream(Field: TField): TMemoryStream;
begin
  Result := nil;
  if Field.IsBlob then
  begin
    Result := TMemoryStream.Create;
    try
      TBlobField(Field).SaveToStream(Result);
    except
      FreeAndNil(Result);
    end;
  end;
end;

aca va un ejemplo de uso:
Código Delphi [-]
var
  StreamA: TMemoryStream;
  StreamB: TMemoryStream;
begin
  ...
  StreamA := BlobToStream(TuTabla.Fields[1]);
  StreamB := BlobToStream(TuTabla.Fields[2]);

  if CompareStreams(StreamA, StreamB) then
    ShowMessage('Los campos blob son iguales');

  if Assigned(StreamA) then
      StreamA.Free;
  if Assigned(StreamB) then
    StreamB.Free;
  ...
end;
Responder Con Cita
  #2  
Antiguo 21-07-2007
Leto_Atreides Leto_Atreides is offline
Miembro
 
Registrado: jun 2006
Posts: 19
Poder: 0
Leto_Atreides Va por buen camino
Gracias por las funciones.
La comparación entre dos campos blobs estaba clara.
Quizás debería haberte explicado mejor cual era el objetivo de la función a resolver.
Por ejemplo. Imaginemos que un paciente se somete a una operación. El cirujano va detallando la evolución del paciente en un campo de tipo blob. Pero para cada una de las revisiones se crea un registro diferente. O sea las evoluciones se guardan en campos blob diferentes. Esto debe ser así. Hay que indicar cuando han cambiado esas obsevaciones de una revisión a otra. Hasta aquí no hay problema. Lo resolví con las funciones que tú indicaste. Ahora bien, existe un caso en el cual se produce un problema. Si se pone algo de texto en el richedit del cual recoge los datos el campo blob y seguidamente se elimina el texto, el campo blob aparece como vacío pero en realidad no lo está.
Si se hace una comparación del stream = nill o = '' nos devuelve false porque en realidad tiene datos pero al mostrarlo en un richedit está vacío. En este caso la función me dice que los datos han cambiado con respecto a un campo que está a nil y no lo han hecho. ¿Está claro? El lunes tendré que averiguar como detectar estos streams que no están vacíos pero que no tienen texto
Responder Con Cita
  #3  
Antiguo 21-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
El problema es por guardar una texto vacio, en ese caso no tendrias que guardar nada osea el valor de dicho campo seria nulo.

Basicamente lo que tendrias que hacer, seria:

Antes de confirmar los cambios, antes del Post, verificar si el texto esta vacio en caso afirmativo asignarle null

Un ejemplo a esto seria

Código Delphi [-]
  ...
  { Para evitar caracteres q no den informacion de nada se tendria q hacer
    una limpieza al texto del DBRichEdit, esto porque puede ingresar un
    espacio una coma u otras cosas que afectarian en la comparacion } 
  ...
  if DBRichEdit1.Text = '' then
    DBRichEdit1.Field.Clear;
  ...
  TuTabla.Post
  ...

suponiendo que usas el TDBRichEdit, ya que no indicas q componentes usas.

Edito para resaltar la sintaxis en delphi
Responder Con Cita
  #4  
Antiguo 23-07-2007
Leto_Atreides Leto_Atreides is offline
Miembro
 
Registrado: jun 2006
Posts: 19
Poder: 0
Leto_Atreides Va por buen camino
Muchas gracias!!!
Parece mentira que una cosa tan simple no se me hubiera ocurrido pero es que siempre estaba pensando desde el punto de vista de firebird.
Ahora mismo lo pruebo

Un saludo
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
problemas con blobs con formato lazar PHP 8 15-02-2007 10:19:25
Importando BLOBs con IBEASY+ kurroman Firebird e Interbase 0 22-01-2007 15:38:27
Blobs trabuc SQL 1 06-09-2004 19:33:09
Campos Blobs y recors frankmch Conexión con bases de datos 0 05-09-2003 00:13:51


La franja horaria es GMT +2. Ahora son las 22:04:55.


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