Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Leer datos de campo tipo blob (https://www.clubdelphi.com/foros/showthread.php?t=74670)

Dens 03-07-2011 05:08:41

Leer datos de campo tipo blob
 
Muy buenos dias, resulta que estoy haciendo una aplicacion que se conecta con un sistema administrativo cuya base de datos es DBISAM, estoy realizando un modulo que debe leer un campo tipo blob dentro de un datagrid, el departament de soporte de la empresa del software me paso este codigo que posee la estructura de la tabla


Código Delphi [-]
  //Registro para almacenar los costos y precios de inventario
  //en un BlobField;
  RegUnPrecio         = Record
                         PorcUtil     ,
                         PorcUtilEx   : Boolean;
                         Utilidad     ,
                         UtilidadEx   ,
                         SinImpuesto  ,
                         MtoImpuesto1 ,
                         MtoImpuesto2 ,
                         TotalPrecio  ,
                         TotalPrecioEx: Currency;
                         TipoRound    : Byte;
                        end;

  RegDePrecios        = Array[1..6] of RegUnPrecio;

  //Este registro se guarda en un campo Blob llamado FX_COSTOS
  //del Archivo SFixed.Dat
  RegCostos           = Record
                         CodeCompra      : String[50];   //Utilizado en  el modulo de compras y el generador de reportes solo ejecucion
                         VImpuesto1      ,
                         VImpuesto2      : Boolean;  //Impuestos Activados
                         CostoAnteriorBs ,
                         CostoAnteriorEx ,
                         CostoActualBs   ,
                         CostoActualEx   ,
                         CostoPromedioBs ,
                         CostoPromedioEx ,
                         MImpuesto1      ,
                         MImpuesto2      : Currency;
                         PorcentImp1     ,
                         Exento1         ,
                         PorcentImp2     ,
                         Exento2         : Boolean;
                         FechaVencimiento: TDateTime;   //Lo uso en el modulo de compras para incluir el vencimiento
                         NumeroDeLote    : String[42];  //y el numero de lote de los productos con costos por lote
                         CostoReferencia : Double;      //Costo de referencia para aumentar los precios
                         Precios         : RegDePrecios;
                        end;


 //A CONTINUACION UN EJEMPLO DE COMO LEER UN CAMPO BLOB QUE CONTIENE COSTOS Y PRECIOS

 if FX_FIXED.FindKey('B',XXXXX); Codigo del producto
  if OkR then
   begin
    SourceField :=FX_FIXED.FindField('FX_COSTOS');
    Try
     BlobStreamData  :=TDBISAMBlobStream.Create(TBlobField(SourceField),bmRead);
     BlobStreamData.Seek(0,0);
     BlobStreamData.Read(CostosProducto,SizeOf(CostosProducto)); //CostosProducto : RegCostos
    Finally
     BlobStreamData.Free;
    end;
   end;

Aun no he logrado ver los valores de dicho campo blob.

De antemano muchas gracias por el tiempo que dedicaron en leer mi inconveniente.

Casimiro Notevi 03-07-2011 11:34:43

En esas tablas no veo el campo "costoproducto".
Además que guardar precios en un campo blob es de lo más extraño que se le puede ocurrir a un programador. Creo que no entiendo tu pregunta o eres tú el que no has entendido lo que tienes que hacer, me parece extrañísimo.

Dens 03-07-2011 13:51:58

Hola buen dia gracias por tu respuesta. En esa tabla se guardan los costos y precios de los productos lo que necesito es mostrarlos en pantalla eso es todo.

Respondiendo lo referente a la variable costosproduct, segun entiendo ese codigo arriba hay un Record llamado RegUnPrecio
despues hay un array de ese record que se llama Regdeprecios

despues esta otro record llamado regcostos, segun el comentario que tiene esta linea
Código Delphi [-]
BlobStreamData.Read(CostosProducto,SizeOf(CostosProducto)); //CostosProducto : RegCostos

costoProducto es un array de regcostos
[IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/CONFIG%7E1/Temp/moz-screenshot.png[/IMG][IMG]file:///C:/DOCUME%7E1/ADMINI%7E1/CONFIG%7E1/Temp/moz-screenshot-1.png[/IMG]

Dens 03-07-2011 19:28:36

Bien, tratare de expresarme un poco mejor, se trata de una tabla que contiene el informacion de costos, precios, utilidad de los productos de un sistema, pero dentro de un solo campo blob no obstantes en ese mismo campo blob se encuentrar los 6 tipos de precio, 6 margenes de utilidad, (precio1, precio 2, precio3) o (precio mayor, precio oferta) a esome refiero con los tipos de precios.

Todos estos campos estan metidos en un solo campo llamado fx_costos.
la empresa de este software me paso la estructura de la base de datos y gracias a eso he podido traer a pantalla la informacion que necesito siempre y cuando la consulta me traiga un solo registro algo como "select campokey, from tabla where campokey='identificador primario'".

para resumir un poco, lo que yo quisiera es poder llevar a un dbgrid un solo tipo de precio y del campo blob y los demas campos de el registro en cuestion, cosa que no he podido hacer, solo puedo llevar al dbgrid todos los campos menos en blob, y hasta ahora solo he podido traer a pantalla el precio del producto cuando le especifico el codigo del producto.

si alguien logra entenderme y ayudarme se lo agradecere mucho.

saludos.




Código Delphi [-]
 Tcargosm = class(TForm)

    DBGrid1: TDBGrid;
    Database1: TDatabase;
    Query1: TQuery;
    DataSource1: TDataSource;
    detalle: TButton;
    Edit1: TEdit;
    procedure consultaCargos();
   

  private
    { Private declarations }
  public
    { Public declarations }
  end;


 RegUnPrecio = Record
 PorcUtil,
 PorcUtilEx:Boolean;
 Utilidad,
 UtilidadEx,
 SinImpuesto,
 MtoImpuesto1,
 MtoImpuesto2,
 TotalPrecio,
 TotalPrecioEx:Currency;
 TipoRound:Byte;
end;



RegDePrecios        = Array[1..6] of RegUnPrecio; // este array es donde estaran los precios1, precios2,precio3,precio4,precio5,precio6


RegCostos  = Record
CodeCompra      : String[50];   //Utilizado en el modulo de compras y el generador de reportes solo ejecucion
VImpuesto1      ,
VImpuesto2      : Boolean;  //Impuestos Activados
CostoAnteriorBs ,
CostoAnteriorEx ,
CostoActualBs   ,
CostoActualEx   ,
CostoPromedioBs ,
CostoPromedioEx ,
MImpuesto1      ,
MImpuesto2      : Currency;
PorcentImp1     ,
Exento1         ,
PorcentImp2     ,
Exento2         : Boolean;
FechaVencimiento: TDateTime;   //Lo uso en el modulo de compras para incluir el vencimiento
NumeroDeLote    : String[42];  //y el numero de lote de los productos con costos por lote
CostoReferencia : Double;      //Costo de referencia para aumentar los precios
Precios         : RegDePrecios;
                        end;


var
 cargosm: Tcargosm;


 
  bs:tstream;
  tabla:regcostos;
  blobf:tblobfield;
  c:string;
implementation

{$R *.dfm}

procedure Tcargosm.consultaCargos();
begin

query1.Close;
query1.sql.Clear;

//query1.sql.Add('select fx_codigo, fx_costos,fx_tipo from sfixed');// asi no me muestra nada
query1.sql.Add('select fx_codigo, fx_costos,fx_tipo from sfixed where fx_codigo='+quotedstr('B-TC'));  // asi me muestra un registro

query1.Open;


    if(query1.FieldByName('fx_costos').isblob) then begin

        blobf:=query1.FieldByName('fx_costos') as tblobfield;
        bs:= query1.CreateBlobStream(blobf, bmread);

        try
        bs.Seek(0,0);
        bs.Read(tabla,sizeof(regcostos)) ;
        finally
        bs.Free;
        end;
    end;
   edit1.Text:=currtostr(tabla.Precios[1].TotalPrecio);// aca muestro el resultado en un tedit

   

end;





end.

lusinpa 05-07-2011 20:04:43

Consultas para las base de datos de dbisam
 
Saludos Dens

Te quería informar que el campo blob en delfhi no lo puedes leer así por así, yo me encuentro estoy haciendo lo mismo que tu con la diferencia que lo estoy haciendo en otro lenguaje que si me permite ver el campo blob pero hay un detalle.

Al tu guardar en dbisam valores de texto en campo blob estos son comprimidos para hacer liviano ese registro, cuando yo hago la consulta en php me lo muestra como si estuviera comprimido o encriptado creo que en delfhi hay una función que te permite leer campos blob en forma de texto plano investiga si consigues algo informas pana

Dens 05-07-2011 20:15:33

Cita:

Empezado por lusinpa (Mensaje 405584)
Saludos Dens

Te quería informar que el campo blob en delfhi no lo puedes leer así por así, yo me encuentro estoy haciendo lo mismo que tu con la diferencia que lo estoy haciendo en otro lenguaje que si me permite ver el campo blob pero hay un detalle.

Al tu guardar en dbisam valores de texto en campo blob estos son comprimidos para hacer liviano ese registro, cuando yo hago la consulta en php me lo muestra como si estuviera comprimido o encriptado creo que en delfhi hay una función que te permite leer campos blob en forma de texto plano investiga si consigues algo informas pana

Buen dia mi pana yo de tanto darle resolvi el problema fue incluyendo en un bucle while el codigo del blobstrem de esta manera


Código Delphi [-]
blobf:=query2.FieldByName('fx_costos') as tblobfield;
          while not query2.Eof do
          begin

          bs:= query1.CreateBlobStream(blobf, bmread);
          bs.Seek(0,0);
          bs.Read(tabla,sizeof(tabla)) ;
          totaldeuda:=totaldeuda+(strtoint(currtostr(tabla.Precios[1].TotalPrecio))*(query1.FieldByName('fcf_cuotas').Value-query1.FieldByName('fcf_cuotasaplicadas').Value));
          query2.Next;
          end;
        bs.Free;

no se si fue la mejor manera pero logre ver los precios de los registros que queria, intente colocar estos datos en un dbgrid pero no pude, a la final los coloque en un datagrid y esta caminando. realmente nunca he realizado la conexion de dbisam por medio de php pero en lo que pueda ayudarte con mucho gusto lo hare. saludos viejo

lusinpa 05-07-2011 20:23:01

Cita:

Empezado por Dens (Mensaje 405586)
Buen dia mi pana yo de tanto darle resolvi el problema fue incluyendo en un bucle while el codigo del blobstrem de esta manera


Código Delphi [-]blobf:=query2.FieldByName('fx_costos') as tblobfield; while not query2.Eof do begin bs:= query1.CreateBlobStream(blobf, bmread); bs.Seek(0,0); bs.Read(tabla,sizeof(tabla)) ; totaldeuda:=totaldeuda+(strtoint(currtostr(tabla.Precios[1].TotalPrecio))*(query1.FieldByName('fcf_cuotas').Value-query1.FieldByName('fcf_cuotasaplicadas').Value)); query2.Next; end; bs.Free;


no se si fue la mejor manera pero logre ver los precios de los registros que queria, intente colocar estos datos en un dbgrid pero no pude, a la final los coloque en un datagrid y esta caminando. realmente nunca he realizado la conexion de dbisam por medio de php pero en lo que pueda ayudarte con mucho gusto lo hare. saludos viejo




Osea mi pana que dntro de ese campo hay una tabla o algo por estilo por que yo hago la consulta y le digo que me muestre ese campo y me lo muestra comoi si estuviera encriptado me muestras los caracteres epeciales
lo que se de dbisam es por que lo eh estudiado ultimamente y delphi solo se que se llama así

Dens 05-07-2011 22:27:05

Cita:

Empezado por lusinpa (Mensaje 405587)
Osea mi pana que dntro de ese campo hay una tabla o algo por estilo por que yo hago la consulta y le digo que me muestre ese campo y me lo muestra comoi si estuviera encriptado me muestras los caracteres epeciales
lo que se de dbisam es por que lo eh estudiado ultimamente y delphi solo se que se llama así

disculpa la pregunta, estas intentando hacer una aplicacion para a2 softway? osea para poderte responder bien, no se nisiquiera si estamos hablando exactamente de la misma tabla

lusinpa 05-07-2011 22:47:11

Base de datos A2
 
Cita:

Empezado por Dens (Mensaje 405590)
disculpa la pregunta, estas intentando hacer una aplicacion para a2 softway? osea para poderte responder bien, no se nisiquiera si estamos hablando exactamente de la misma tabla

Ok me encuentro haciendo una aplicacion web para realizando pedidos por internet , los productos son almacenados en el sistema A2 que es por donde ellos realizan la ventas y todo tipo tipo de operaciones en dicho sistema pormedio de sus vendedores o via telefonica.

Realice la conexion por medio del conector odbc lo que me parecio algo muy sencillo y estudie todas sus sintasis para poder manejarlas de la aplicacion web, no utilizo el vcl que todo el mundo nombra ya que no tengo problemas para vizualizar las tablas y tengo un manejador de base de datos que permite ver la estructuras y datos de las tablas.

Yo cree la interfaz mostre los departamentos al selecionar un departamento muestra todos los productos de dicho departamento y le agregue la opción al seleccionar el producto se esta cargando n el carrito de compras.

pero para yo poder realizar un pedido satisfactorio debo mostrar cliente que pueda vr cual es el precio y la existencia de ese producto. y bueno eh estado buscando la tabla donde se almacena los precios y la existencia o por lo menos los precio del producto, ya que alli se manejan varios precios.

buscando por internet pude analizar que los precios y la exsitencia se encuetran en la tabla Sfixed y puedo ver que tiene tres campos Blob yo pense que tiene que estar en la el campo FX_COSTOS y viendo tus comentrio pude ver que estaba en lo correcto.

bueno que te parece estoy parado por no poder simplemente leer el los precio y la existencia es mi primera interaccion con esta base de datos.

Si me puedes ayudar en algo te lo agradeceria de pana y lo que necesites de programacion web enviame un correo que yo con gusto te resolvere.

Dens 05-07-2011 23:33:36

Cita:

Empezado por lusinpa (Mensaje 405592)
Ok me encuentro haciendo una aplicacion web para realizando pedidos por internet , los productos son almacenados en el sistema A2 que es por donde ellos realizan la ventas y todo tipo tipo de operaciones en dicho sistema pormedio de sus vendedores o via telefonica.

Realice la conexion por medio del conector odbc lo que me parecio algo muy sencillo y estudie todas sus sintasis para poder manejarlas de la aplicacion web, no utilizo el vcl que todo el mundo nombra ya que no tengo problemas para vizualizar las tablas y tengo un manejador de base de datos que permite ver la estructuras y datos de las tablas.

Yo cree la interfaz mostre los departamentos al selecionar un departamento muestra todos los productos de dicho departamento y le agregue la opción al seleccionar el producto se esta cargando n el carrito de compras.

pero para yo poder realizar un pedido satisfactorio debo mostrar cliente que pueda vr cual es el precio y la existencia de ese producto. y bueno eh estado buscando la tabla donde se almacena los precios y la existencia o por lo menos los precio del producto, ya que alli se manejan varios precios.

buscando por internet pude analizar que los precios y la exsitencia se encuetran en la tabla Sfixed y puedo ver que tiene tres campos Blob yo pense que tiene que estar en la el campo FX_COSTOS y viendo tus comentrio pude ver que estaba en lo correcto.

bueno que te parece estoy parado por no poder simplemente leer el los precio y la existencia es mi primera interaccion con esta base de datos.

Si me puedes ayudar en algo te lo agradeceria de pana y lo que necesites de programacion web enviame un correo que yo con gusto te resolvere.


Hola viejo, bueno parami esto ha sido todo un dolor de cabeza por que tampoco acostumbro a trabajar con este tipo de base de datos, pero en fin.

contestando tus dudas, efectivamente en el campo fx_costos estan los precios, de las existencias no tengo ni idea por que en este proyecto no necesite meterme con existencias ya que estoy trabajando con puro servicios.



//Registro para almacenar los costos y precios de inventario
//en un BlobField;
RegUnPrecio = Record
PorcUtil ,
PorcUtilEx : Boolean;
Utilidad ,
UtilidadEx ,
SinImpuesto ,
MtoImpuesto1 ,
MtoImpuesto2 ,
TotalPrecio ,
TotalPrecioEx: Currency;
TipoRound : Byte;
end;

RegDePrecios = Array[1..6] of RegUnPrecio;

//Este registro se guarda en un campo Blob llamado FX_COSTOS
//del Archivo SFixed.Dat
RegCostos = Record
CodeCompra : String[50]; //Utilizado en el modulo de compras y el generador de reportes solo ejecucion
VImpuesto1 ,
VImpuesto2 : Boolean; //Impuestos Activados
CostoAnteriorBs ,
CostoAnteriorEx ,
CostoActualBs ,
CostoActualEx ,
CostoPromedioBs ,
CostoPromedioEx ,
MImpuesto1 ,
MImpuesto2 : Currency;
PorcentImp1 ,
Exento1 ,
PorcentImp2 ,
Exento2 : Boolean;
FechaVencimiento: TDateTime; //Lo uso en el modulo de compras para incluir el vencimiento
NumeroDeLote : String[42]; //y el numero de lote de los productos con costos por lote
CostoReferencia : Double; //Costo de referencia para aumentar los precios
Precios : RegDePrecios;
end;


//A CONTINUACION UN EJEMPLO DE COMO LEER UN CAMPO BLOB QUE CONTIENE COSTOS Y PRECIOS

if FX_FIXED.FindKey('B',XXXXX); Codigo del producto
if OkR then
begin
SourceField :=FX_FIXED.FindField('FX_COSTOS');
Try
BlobStreamData :=TDBISAMBlobStream.Create(TBlobField(SourceField),bmRead);
BlobStreamData.Seek(0,0);
BlobStreamData.Read(CostosProducto,SizeOf(CostosProducto)); //CostosProducto : RegCostos
Finally
BlobStreamData.Free;
end;
end;


esta es la estructura de la tabla fixed para delphi, pero supongo que para php tendra el mismo principio.
la idea es convertir el campo del registro que llamaste en un stream
para que puedas acceder a los multiples contenidos dentro de este campo, es como un campo matricia, (OJO yo te estoy diciendo lo que yo entendi, hace 15 horas me estaba partiendo el coco mendandole a todo el mundo).

SourceField :=FX_FIXED.FindField('FX_COSTOS'); //este es el campo del registro que llamamos al hacer la consulta

// aqui utilizamos blobstream.create para convertir en stream el campo BlobStreamData:=TDBISAMBlobStream.Create(TBlobField(SourceField),bmRead);
BlobStreamData.Seek(0,0);
BlobStreamData.Read(CostosProducto,SizeOf(CostosProducto));aqui le decimos que lea el record de arriba que se llama regcostors //CostosProducto : RegCostos


costosproducto es una variable tipo regcostos
regcostos es el record donde se van a almacenar los "campos" que estas sacando de esecampo (fx_costos) el cual contiene un campo llamado precios que es el que te interesa,este campo es de tipo regdeprecios que es un array que contiene los 6 precios, 6 costos etc

RegDePrecios = Array[1..6] of RegUnPrecio;

corrijanme si me equivoco por favor.

para sacar el precio debes acceder a la variable costosproducto.precios[1].totalprecio o

PorcUtil ,
PorcUtilEx : Boolean;
Utilidad ,
UtilidadEx ,
SinImpuesto ,
MtoImpuesto1 ,
MtoImpuesto2 ,
TotalPrecio ,
TotalPrecioEx: Currency; cualquiera de estos valores que estaran dentro del array precio

RegDePrecios = Array[1..6] of RegUnPrecio;
Precios : RegDePrecios;


en sintesis hermano esa esla estructura dela tabla que me dio el personal de soporte de a2, a mi me funciono en delphi pero tuve que sentarme a analizarla bien , explora esecodigo y trata de llevarlo a php investigando cual es la funcion para hacer blobstream. y bueno lo de los records no se como sera en php.

un saludo y espero que te sirva de algo, cualquiercosa escribe yo ando conectado hoy todo el dia por que estoy matando este sistemita.

lusinpa 06-07-2011 00:09:05

Bueno pana gracias por la información ahora me toca matarme el casco buscando funciones que hagan el blobstresm y el record te agradesco la informacion y recuerda cualquier cosa que desees resolver de entorno web no dudes en escribirme estoy en deudado contigo.

Dens 06-07-2011 02:04:50

Cita:

Empezado por lusinpa (Mensaje 405599)
Bueno pana gracias por la información ahora me toca matarme el casco buscando funciones que hagan el blobstresm y el record te agradesco la informacion y recuerda cualquier cosa que desees resolver de entorno web no dudes en escribirme estoy en deudado contigo.

tranquilo hermano no hay deuda, ayuda a otro y listo viejo, yo tambien desarrollo web asi que cualquier duda por ese lado pega un grito tambien y bueno igual yo te consulto mis dudas, saludos. oye eso si porfa cuando resuelvas tu duda publica la solucion viejo porfa... saludos

lusinpa 14-09-2011 17:41:00

Que tal dens como te ha ido buenio te cuento que no pude realizar las consultas a los precios de la tablas del sistema A2 desde php tuve que realiarlo desde delphi quisiera saber si me pudes ayudar con respectos a los costos y precios
ok perfecto estabas en todo lo correcto pero tengo el detalle de que no consigo la existencia de los productos sera que se encuentran en una tabla especific o estan en campo blob y si estan en un campo blob si me puedes facilitar la estructuras si colocas un ejemplo no problema ya que soy nuevo en el manejo de delphi

ramon.acevedo 18-09-2011 05:29:21

Buenas noches lusinpa, la existencia se guardan en la tabla llamada sinvdep.dat en el campo ft_existencia, en este campo cada vez que se hace una operacion que afecte existencias (Compras, Ventas, Cargos, Descargos y otros) este campo se actualiza, si lo que quieres es mostar la existencia actual de un producto, este es el campo que necesitas, espero que te sirva la informacion....

Enseñar es aprender dos veces....

Dens 22-03-2013 07:43:56

Luis lograste hacer algo con los precios de a2 en php? quiero ver los precios desde c sharp y no he podido. Saludos

QAZWSX2K 30-03-2013 17:18:58

precisamente ando en ese mismo problema, estoy haciendo una aplicacion para a2, que lea precisamente transferencias entre depositos pero necesito mostrar los precios, los precios es lo unico que me falta peor no logro leerlos, es via odbc en lenguaje fivewin, realmente que ganas de joder con meter esos precios de esa manera

Casimiro Notevi 30-03-2013 17:55:10

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Casimiro Notevi 15-06-2017 20:15:30

Cita:

Empezado por carlosw1978 (Mensaje 518266)
Muy buena aportación

Por favor, crea un nuevo hilo con tu problema, gracias.
Y no olvides poner las "tags" al código fuente ^\||/


La franja horaria es GMT +2. Ahora son las 11:27:31.

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