Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Leer Campo Blob desde Delphi (https://www.clubdelphi.com/foros/showthread.php?t=81040)

webmasterplc 04-10-2012 16:06:33

Leer Campo Blob desde Delphi
 
Buenas, alguien puede ayudarme necesito leer una forma de pago en un sistema pero esta almacenada en campos blob, aca tengo la estructura pero nunca habia trabajado con ese tipo de registros. La idea es leerlo y modificarlo

Código:

Código Delphi [-]
RegFormadePago    = Record 
                          TipoPago      : integer; { Efectivo - Cheque - Tarjeta Debito - T Credito       - Retencion  - Giros       - Adelantos - Apartados} 
                         //En  Cuentas por Cobrar es Efectivo - Cheque - Tarjeta Debito - Tarjeta Credito - Giros      - PAdelantado - Retencion 
                          BancoTarjeta  : string[40]; 
                          Detalle       : string[90]; 
                          RetencionIVA  : Boolean; 
                          MontoBsViejos : Double; //Para guardar el detalle de los Bs. Viejos que se usaron en la transaccion 
                          MontoPago     : currency; 
                          NoEsEfectivo  : Boolean; //Los montos que se forzan para redondeo no son efectivo 
                         End; 

   AFormadePago      = Array[0..9] of RegFormadePago; 

//la estructura de el campo Formas de pago es el mismo para soperacioninv y Scuentasxcobrar lo que varia es la asignacion del campo tipos de pago, que se asigna 
//un valor entero segun la forma de pago, por ejemplo en ambos casos (soperacioninv y scuentasxpagar) 0 es efectivo, 1 cheque, etc.

ecfisa 04-10-2012 17:23:47

Hola webmasterplc.

Código Delphi [-]
// Pasar el contenido del record al campo BLOB
procedure RecordToBlob(Rec: RegFormaDePago; Blob: TBlobField);
var
  Stream: TMemoryStream;
begin
  Stream:= TMemoryStream.Create;
  try
    Stream.WriteBuffer(Rec, SizeOf(Rec));
    Stream.Seek(0, soFromBeginning);
    Blob.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

// Pasar el contenido del campo BLOB al record
procedure BlobToRecord(var Rec: RegFormaDePago; Blob: TBlobField);
var
  Stream: TMemoryStream;
begin
  ZeroMemory(@Rec, SizeOf(Rec));
  Stream:= TMemoryStream.Create;
  try
    Stream.SetSize(SizeOf(Rec));
    Blob.SaveToStream(Stream);
    Stream.Seek(0, soFromBeginning);
    Stream.ReadBuffer(Rec, SizeOf(Rec));
  finally
    Stream.Free;
  end;
end;

Ejemplos de llamada:
Código Delphi [-]
// Pasar record a campo BLOB
procedure TForm1.aBlobClick(Sender: TObject);
var
  R: RegFormaDePago;
begin
   ...
   RecordToBlob(R, TBlobField(DataSet.FieldByName('CPBLOB')));
   ...
end;   

// Pasar campo BLOB a record
procedure TForm1.ARecordClick(Sender: TObject);
var
  R: RegFormaDePago;
begin
  ...
  BlobToRecord(R, TBlobField(DataSet.FieldByName('CPBLOB')));
  ... 
end;

Saludos.

webmasterplc 04-10-2012 19:19:15

Discula cuando antes de estos procedimiento tengo que hacer una consulta y al hacerla me da el siguiente error
Código Delphi [-]
DBISAM Error 8963, "BLOB block buffers corrupt in the table '
estoy trabajando con dbisam 4.3

y me dice undeclarer indifier formadepago

ecfisa 04-10-2012 21:11:42

Hola.

Cita:

y me dice undeclarer indifier formadepago
Con respecto a ese error revisa que el nombre del tipo del parámetro correspondiente al record coincida con el nombre del tipo record.

Cita:

DBISAM Error 8963, "BLOB block buffers corrupt in the table '
Perdón, pero no conozco que es dbisam 4.3 :o, supongo que es una bd de escritorio y es probable que el nombre del tipo de los campos blob no sea TBlobField.

Para averiguar el nombre del tipo del campo, podes crear los campos persistentes y mirar en el código el nombre del tipo que tiene asignado ese campo.

Saludos.

ecfisa 04-10-2012 22:25:50

Hola.

Aquí está el manual de DBISAM Version 4

A partir de la página 135, explica como realizar el moldeo a de TDBISAMDataSet a TBlobField incluye un ejemplo pero está en C++, te traduzco la línea relevante:
Código:

  dynamic_cast<TBlobField&>(*MyDBISAMDataSet->
    FieldByName("Notes")->LoadFromFile("c:\\temp\\test.txt");

Sería:
Código Delphi [-]
  (MyDBISAMDataSet as TBlobField).FieldByName('Notes').LoadFromFile('C:\temp\test.txt');
Además, dispone de la clase TDBISAMBlobStream que permite trabajar diréctamente con Streams, tambíen está explicado con un ejemplo seguidamente.

Espero te sirva la información.

Saludos. :)

webmasterplc 04-10-2012 22:44:16

Cita:

Empezado por ecfisa (Mensaje 446362)
Hola.


Con respecto a ese error revisa que el nombre del tipo del parámetro correspondiente al record coincida con el nombre del tipo record.
Saludos.

Disculpe he buscado pero no doy pie no soy tan experto en esto de delphi

ecfisa 04-10-2012 23:08:11

Cita:

Empezado por webmasterplc (Mensaje 446381)
Disculpe he buscado pero no doy pie no soy tan experto en esto de delphi

Hola.

Aunque la traducción del error es clara: "formadepago: identificador no declarado", por haber efectuado cambios, me refería que revisaras que si por ejemplo el record está declarado:
Código Delphi [-]
type
  TMiRegistro = record
    ...
  end;
En la cabecera de los procedimientos figure:
Código Delphi [-]
procedure RecordToBlob(Rec: TMiRegistro; Blob: TBlobField);
...
También deberías revisar si "formadepago" está declarado con anterioridad.

Por lo que leí del manual de DBISAM 4, tal vez sería mejor declarar el segundo parámetro de tipo TDBISAMBlobStream, pero deberás realizar las pruebas correspondientes.

Lamentablemente, al no poseer esos componentes, no me es posible hacerlo.

Saludos.

webmasterplc 18-10-2012 17:29:36

Buenas voy encaminado pero me tranco este error [DCC Error] UnitFPago.pas(43): E2003 Undeclared identifier: 'TBlobField' stoy trabajando en delphi xe2
aca esta el troso de codigo

Código Delphi [-]
procedure TformFPago.btn1Click(Sender: TObject);
 type
RegFormadePago       =Record
  TipoPago  :  integer;
  BancoTarjeta  : string[40];
  Detalle          : string[90];
  RetencionIVA  : Boolean;
  MontoBsViejos : Double;
  MontoPago        : currency;
  NoEsEfectivo  : Boolean;
  end;
var
  fcccodigo:string;
  datospago:RegFormadePago;
  campoblob:TBlobField;
  bs:Tstream;
  codigo:string;

begin


end;

end.

webmasterplc 29-10-2012 19:22:51

Lectura y Escritura de registros en Campos Blob
 
Hola estoy tratando de leer y excribir campos blob, la cual tengo la estructura, hago todo pero ahora no se como traer los camos a los edit y como actualizar los registros desde los edit, aca coloco el codigo a ver si alguien me puede ayudar uso bases de datos dbisam 4.

Código Delphi [-]
procedure TformFPago.btn1Click(Sender: TObject);
 type
RegFormadePago       =Record
  TipoPago  :  integer;
  BancoTarjeta  : string[40];
  Detalle          : string[90];
  RetencionIVA  : Boolean;
  MontoBsViejos : Double;
  MontoPago        : currency;
  NoEsEfectivo  : Boolean;
  end;

AFormadePago      = Array[0..9] of RegFormadePago;
var
  fcccodigo:string;
  datospago:RegFormadePago;
  campoblob:TBlobField;
  bs:Tstream;
  codigo:string;
  SQLSelect1,cfactura:String;

begin
SQLSelect1:= 'Select * from Scuentasxcobrar where FCC_NUMERO= :fccnumero';
cfactura:=edtfactura.Text;
  sqcxc.SQL.Text := SQLSelect1;
  sqcxc.ParamByName('fccnumero').AsString:=cfactura;
    sqcxc.ExecSQL;
  sqcxc.Open;
  while not sqcxc.Eof do
  Begin
    codigo:=sqcxc.FieldByName('FCC_NUMERO').AsString;
    campoblob:=sqcxc.FieldByName('FCC_FORMAPAGO') as tblobfield;
    bs := sqcxc.CreateBlobStream(campoblob, bmRead) ;
    bs.Seek(0,sofrombeginning);
    try
       bs.read(datospago,SizeOf(RegFormadePago));
    finally
       bs.Free;
    end;
    edt1.Text:=codigo;
    edt2.Text:=currtostrf(datospago.montopago,ffCurrency,2);
    sqcxc.Next;
  End;


end;

Casimiro Notevi 29-10-2012 19:56:39

Por favor, no abras nuevos hilos para tratar el mismo tema, continua en este hasta que lo resuelvas, gracias.
No olvides nuestra guía de estilo. Punto 6.
Cita:

Si no me contestais ¿Vuelvo a abrir otro tema?
Nadie me contesta

Si te encuentras en esta situación, te aconsejaría que en vez de abrir otro tema, con lo que podría perderse información previa sobre el tema que expusiste en un principio, siguieses el tema que tu mismo iniciaste en su día, escribiendo una nueva contestación. De esta manera el tema se actualizará y pasará a la cabecera del foro, y se marcará como no leido para el resto de usuarios. Así evitamos duplicar información innecesariamente.
Otro motivo por el que es posible que no te hayan contestado es porque puedes haberte explicado mal. Sería conveniente en este caso que trataras de ampliar la información que has escrito en el primer mensaje de tu tema. Así podrías ayudar al resto de usuarios a que respondan más claramente.


webmasterplc 30-10-2012 00:06:13

Cita:

Empezado por webmasterplc (Mensaje 448258)
Hola estoy tratando de leer y excribir campos blob, la cual tengo la estructura, hago todo pero ahora no se como traer los camos a los edit y como actualizar los registros desde los edit, aca coloco el codigo a ver si alguien me puede ayudar uso bases de datos dbisam 4.

Código Delphi [-]
procedure TformFPago.btn1Click(Sender: TObject);
 type
RegFormadePago       =Record
  TipoPago  :  integer;
  BancoTarjeta  : string[40];
  Detalle          : string[90];
  RetencionIVA  : Boolean;
  MontoBsViejos : Double;
  MontoPago        : currency;
  NoEsEfectivo  : Boolean;
  end;

AFormadePago      = Array[0..9] of RegFormadePago;
var
  fcccodigo:string;
  datospago:RegFormadePago;
  campoblob:TBlobField;
  bs:Tstream;
  codigo:string;
  SQLSelect1,cfactura:String;

begin
SQLSelect1:= 'Select * from Scuentasxcobrar where FCC_NUMERO= :fccnumero';
cfactura:=edtfactura.Text;
  sqcxc.SQL.Text := SQLSelect1;
  sqcxc.ParamByName('fccnumero').AsString:=cfactura;
    sqcxc.ExecSQL;
  sqcxc.Open;
  while not sqcxc.Eof do
  Begin
    codigo:=sqcxc.FieldByName('FCC_NUMERO').AsString;
    campoblob:=sqcxc.FieldByName('FCC_FORMAPAGO') as tblobfield;
    bs := sqcxc.CreateBlobStream(campoblob, bmRead) ;
    bs.Seek(0,sofrombeginning);
    try
       bs.read(datospago,SizeOf(RegFormadePago));
    finally
       bs.Free;
    end;
    edt1.Text:=codigo;
    edt2.Text:=currtostrf(datospago.montopago,ffCurrency,2);
    sqcxc.Next;
  End;


end;

Ok Luego de la Ayuda de muchos he podido llegar hasta aqui, aqui tengo los datos del campo blob solo me falta visuaizarlo para modificarlos y pasarlos nuevamente al campo blob.

solo que en cada registro se guardan varias formas de pago identificadas por un intenger y no se como buscar un registro en particular en un record

por ejemplo las formas de pago en la variable la variable TipoPago son :
0= Efectivo
1= Cheque
2= Tarjeta Debito
3= Tarjeta Credito
4= Giros
5= PAdelantado
6= Retencion


La franja horaria es GMT +2. Ahora son las 22:40:14.

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