PDA

Ver la Versión Completa : Grabar datos definodos por el usuario en B.D


frankmch
07-09-2003, 06:45:31
hola a todos, espero alguien me pueda dar una pista con ese pequeño problema que tengo:


estoy haciendo una aplicacion donde tengo definido un tipo de datos de la siguiente manera:

RegCostos = Record
CodeCompra : String[50];
VImpuesto1 ,
VImpuesto2 : Boolean;
CostoActualEx ,
CostoPromedioBs ,
CostoPromedioEx ,
Precios : Array[1..6] of RegUnPrecio;
end;

bien, mi inconveniente es como hago para enviar este tipo de dato definido por usuario a una tabla en una base de datos, al tratar de grabar me encuentro con error de incompatibilidad de datos, creo que se puede hacer con campos tipo blob, pero aun asi no se como convertir este tipo de dato a blob, y por supuesto tambien necesito un metodo para extraerlos de la base de datos.


cualquier ayuda me seria muy buena....


gracias de ante mano.

javiermorales
07-09-2003, 11:38:13
Hola, ¿en las tablas tienes definido un campo para cada uno de los tipos del registro y subregistro?

RegCostos = Record
CodeCompra : String[50];
VImpuesto1,VImpuesto2 : Boolean;
CostoActualEx,CostoPromedioBs,CostoPromedioEx ,Precios : Array[1..6] of RegUnPrecio;
end;


Un saludo.

frankmch
07-09-2003, 17:41:27
Si, en la base de datos en la que estamos trabajando estan definidos estos campos donde se deben guardar y acceder a la informacion. estos campos son de tipo BLOB. y el manejador de base de datos es DBISAM 2.08, establecer la conexion ya no es problema, el inconveniente esta en acceder a la data en estos campos.
y cambiar la estructura de la B.D no es una opcion disponible ya que esta base de datos interactua con otro sistema de informacion.

Gracias por Interesarte...


saludos

Viet
08-09-2003, 19:22:21
Es una lastima que no puedas cambiar el modelo de datos, ya que es relativamente sencillo realizar una estructura que contenga estructuras dinamicas.

Pero se me ocurre que puedes implementar lo siguiente: Trata de generar dos funciones GetCampo(NombreCampo) y SetCampo(nombreCampo; Valor), con esas funciones podes guardar en una estructura propia que vos definas el Record;

Por ultimo este Record lo traduces en un Text y lo guardas y lees directamente, obviamente que para todo tipo de manipulacion sobre un registro deberas usar tus funciones de traduccion de extructuar....

No se si se entiende mi idea....

delphi.com.ar
08-09-2003, 20:11:33
Sinceramente no me gusta para nada la idea de guardar registros dentro de campos long, pero si no hay otra, podrías utilizar un record de este tipo:
TRegCostos = record
CodeCompra : String[50];
VImpuesto1 ,
VImpuesto2 : Boolean;
CostoActualEx ,
CostoPromedioBs ,
CostoPromedioEx ,
Precios : Array[1..6] of Currency;
end;
TDatos = record
case Integer of
0: (RegCostos: TRegCostos);
1: (Data: array[0..247] of char);
end;

y te evitarías mover datos de un record a un string/pchar...

var
MisDatos: TDatos;
begin
MisDatos.RegCostos.CodeCompra := 'delphi.com.ar';
MisDatos.RegCostos.Precios[1] := 1.2;
Field.AsString :=MisDatos.Data;


Saludos!

frankmch
09-09-2003, 04:51:24
muchas gracias a todos por interesarse, pero he aqui una solucion que logre construir, aunque confieso que no me convence mucho, hasta ahora es lo que he logrado.
reconosco debo pulir un poco mas la idea...

procedure TForm1.Button2Click(Sender: TObject);

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

RegCostos = Record
CodeCompra : String[50];
VImpuesto1 ,
VImpuesto2 : Boolean;
CostoAnteriorBs ,
CostoAnteriorEx ,
CostoActualBs ,
CostoActualEx ,
CostoPromedioBs ,
CostoPromedioEx ,
MImpuesto1 ,
MImpuesto2 : Currency;
PorcentImp1 ,
Exento1 ,
PorcentImp2 ,
Exento2 : Boolean;
FechaVencimiento: TDateTime;
NumeroDeLote : String[50];
Precios : Array[1..6] of RegUnPrecio;
end;
var
registro:regcostos;
Stream1 : tStream;
begin
//inicializar el registro...
dbisamtable1.Open;
dbisamtable1.edit;
Stream1 :=DBISAMTable1FX_COSTOS.DataSet.CreateBlobStream(DBISAMTable1FX_COSTOS,bmread); //creo una variable blob para lectura
stream1.read(registro,Sizeof(registro));//leo la variable blob en mi record

label3.Caption:=floattostr(registro.Precios[1].SinImpuesto);//imprimo en valor (opcional)
stream1.Free; //libero el stream, no se por que. lo recomienda borland


Stream1 :=DBISAMTable1FX_COSTOS.DataSet.CreateBlobStream(DBISAMTable1FX_COSTOS,bmwrite); //instancio un nuevo stream en modo de escritura

registro.Precios[1].SinImpuesto:=strtofloat(label3.Caption)+500;
stream1.Write(registro,Sizeof(registro)); //actualizo en registro



dbisamtable1.Post; //grabo en la tabla

end;




si `pueden brindar alguna sugerencia estare argadecido...

Julià T.
09-09-2003, 05:44:29
puedes aprovechar el BeforePost y el AfterScroll para cargar y guardar los datos

procedure TForm1.T1BeforePost(DataSet: TDataSet);
begin
Re.a:=100;
Re.b:=110;
Re.c:=120;
Re.d:=inttostr(t1num.value);
with TDBISAMBlobStream.Create(T1aaa,bmWrite) do
try
Write(Re,SizeOf(TRe));
finally
Free;
end;
end;

procedure TForm1.T1AfterScroll(DataSet: TDataSet);
begin
with TDBISAMBlobStream.Create(T1aaa,bmRead) do
try
Read(Re,SizeOf(TRe));
label1.Caption:=Re.d;
finally
Free;
end;
end;

socom
18-10-2007, 23:51:14
Hola, buscando en la internet sobre como abrir campos blob de la base de datos del sistema administrativo previamente mensionado, encontre por casualidad tus comentarios. Seria posible ponernos en contacto a traves d este foro para comentar mis avances y los tuyos en esta area?

Gracias

arleyb
05-12-2007, 18:46:58
Buenas, hace ya un rato estoy averiguando la forma de hacer operaciones sobre tablas (*.*dat) que trabajan con el manejador de bases de datos DBISAM 2.08 desde Delphi... la verdad es que no he encontrado la forma de hacerlo y realmente te urge que alguien me ayude.... sera que alguno de los foristas o frankmch puede decir como es la forma de lograr conectarse a traves de delphi a este tipo de BD?? muchas gracias por su ayuda!!