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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-06-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
¿Como Guardar un "RECORD" en un campo BLOB?

Tengo una aplicación en la que debo guardar un grupo de totales en una base de datos (en realidad no es mas que un arreglo dinamico) y estoy tratando de usar un unico campo blob para almacenar todos los datos. Pero no se como asignar mi variable al contenido del campo memo.

Algo así:

Código:
Type
tRsm = Record
   Exe : Currency;
   Imp : Array [1..3,1..2] of Currency;
   Nac : Array [1..3,1..2] of Currency;
   Ret : Array [1..3] of Currency;
   tDedu : Currency;
   Aju : Currency;
   End;

// Defino una variable

Var
rsm : tRsm;

// Pero como la guardo
Begin
db.edit
// db.Rsm.Assign(rsm); // No Funciono
// db.Rsm.asVariant := rsm; // Menos
db.post;
End;
De hecho he podido leer y escribir campos memo con stream pero no se como convertir una variable en un stream para usar un db.rsm.LoadFromStream
__________________
Sitrico
Responder Con Cita
  #2  
Antiguo 28-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Tratándose de un record de tamaño fijo, primero no utilizaría un campo BLOB ya que esta información cave en 144 bytes, por otro lado, tienes muchas formas de hacerlo, por ejemplo copiando el fragmento de memoria que ocupa el stream en un string, o bien utilizando registros mixtos:
Código Delphi [-]
type
   TRsm = record
    case Integer of
      0: ( Exe: Currency;
           Imp: array[1..3, 1..2] of Currency;
           Nac: array[1..3, 1..2] of Currency;
           Ret: array[1..3] of Currency;
           tDedu: Currency;
           Aju: Currency;
         );
      1: (Data: array[0..143] of char);
   end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 29-06-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Gracias por la sugerencia, pero muy a mi pesar el registro no siempre será el mismo y menos del mismo tamaño por eso opté por complicarme la vida con los campos blob. Pero en cuanto a la segunda opción como copio la memoria ocupada por una variable (o arreglo) a un stream. estoy usando:

Código Delphi [-]
Procedure LeerMontosDeclaracion(Var tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
FillChar(tot,sizeOf(tot),0);  // siempre vaciar anter 
m := TMemoryStream.Create;
try
   cmp.SaveToStream(m);
   m.ReadBuffer(Tot,SizeOf(tot));
Finally;
   m.Free;
   End;
End;

Procedure GuardarMontosDeclaracion(tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
m := TMemoryStream.Create;
try
   m.WriteBuffer(Tot,SizeOf(tot));
   cmp.LoadFromStream(m);
Finally;
   m.Free;
   End;
End;

Pero no funciona la lectura porque se me genera una "EReadError"
__________________
Sitrico

Última edición por sitrico fecha: 29-06-2004 a las 00:20:13.
Responder Con Cita
  #4  
Antiguo 29-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por sitrico
Pero no funciona la lectura porque se me genera una "EReadError"
Quizas haga falta un

m.seek(0, soFromBeginning);

antes de la llamada a ReadBuffer.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 29-06-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por sitrico
...el registro no siempre será el mismo y menos del mismo tamaño...
Recuerda que vas a tener que identificar el tipo de registro antes de leerlo. Por otro lado, recuerda que si el registro tiene datos, por ejemplo Strings, estos son de longitud variable.

¿No prefieres tener tablas para cada tipo de registro, y guardar los datos en campos?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 29-06-2004
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Gracias a ambos, lo del campo con el identificador para el tipo de datos ya lo tenia previsto. En cuanto a la lectura, efectivamente faltaba el "m.seek" la rutina quedo así:

Código Delphi [-]
Procedure LeerMontosDeclaracion(Var tot:tDeclaracion; cmp : TBlobField);
Var
m : TMemoryStream;
Begin
FillChar(tot,sizeOf(tot),0);
m := TMemoryStream.Create;
try
   cmp.SaveToStream(m);
   m.seek(0, soFromBeginning);
   m.SetSize(SizeOf(tot));
   m.ReadBuffer(tot,SizeOf(tot));
Finally;
   m.Free;
   End;
End;

Con estos procedimientos creo que se puede leer y/o guardar cualquier buffer de memoria en un campo blob (ajustando el tipo del parametro del procedimiento).
__________________
Sitrico
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 13:17:26.


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