Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Conexión con bases de datos
Register FAQ Members List Calendar Guía de estilo Today's Posts

Conexión con bases de datos

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 28/06/2004
sitrico's Avatar
[sitrico] sitrico is offline
Miembro Premium
 
Join Date: May 2003
Location: Caracas, Venezuela
Posts: 295
Poder: 24
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í:

Code:
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
Reply With Quote
  #2  
Old 28/06/2004
delphi.com.ar's Avatar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Join Date: May 2003
Location: Buenos Aires, Argentina *
Posts: 5,964
Poder: 29
delphi.com.ar Va camino a la fama
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.
Reply With Quote
  #3  
Old 28/06/2004
sitrico's Avatar
[sitrico] sitrico is offline
Miembro Premium
 
Join Date: May 2003
Location: Caracas, Venezuela
Posts: 295
Poder: 24
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

Last edited by sitrico : 28/06/2004 at 23:20.
Reply With Quote
  #4  
Old 29/06/2004
jachguate's Avatar
jachguate jachguate is offline
Miembro
 
Join Date: May 2003
Location: Guatemala
Posts: 6,254
Poder: 30
jachguate Va por buen camino
Cool

Quote:
Originally Posted by 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
Reply With Quote
  #5  
Old 29/06/2004
delphi.com.ar's Avatar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Join Date: May 2003
Location: Buenos Aires, Argentina *
Posts: 5,964
Poder: 29
delphi.com.ar Va camino a la fama
Quote:
Originally Posted by 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.
Reply With Quote
  #6  
Old 29/06/2004
sitrico's Avatar
[sitrico] sitrico is offline
Miembro Premium
 
Join Date: May 2003
Location: Caracas, Venezuela
Posts: 295
Poder: 24
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
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT +2. The time now is 05:30.


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