Continuando con el tema, codifique la misma interfaz y la implemente para la clase detalle, que agrega un objeto producto.
TDetalle = class private Fproducto: Tproducto; Fcantidad: Double; FbaseImp: Double; Fsubtotal: Double; Ftotal: Double; procedure Setcantidad(const Value: Double); procedure SetbaseImp(const Value: Double); procedure Setsubtotal(const Value: Double); procedure Settotal(const Value: Double); procedure Setproducto(const Value: Tproducto); public property producto:Tproducto read Fproducto write Setproducto; property baseImp:Double read FbaseImp write SetbaseImp; property subtotal:Double read Fsubtotal write Setsubtotal; property total:Double read Ftotal write Settotal; property cantidad:Double read Fcantidad write Setcantidad; constructor NuevoDetalle(producto:Tproducto;cantidad:Double); procedure calcularBaseImp(precio:Double;alic:Double); destructor destroy; end;
El caso es que al agregar un producto tengo:
if (Ecantidad.Text <> EmptyStr) then begin cant:=StrToFloat(Ecantidad.Text); pr:=TProductoRepository.Create(ClientModule1.cdsprod,true); p1:=pr.getproducto(); d:=TDetalle.NuevoDetalle(p1,cant); d.calcularBaseImp(p1.precio,cant); dr:=TDetalleRepository.Create(ClientModule1.cdsdetallefactura,True); dr.Save(d); end else ShowMessage('ingrese cantidad'); end;
creo el detalle y cuando lo quiero guardar en el dataset con save tengo el problema de acceder por ejemplo al nombre del producto que esta dentro del detalle:
osea en la descripcion iria el valor del atributo nombre del objeto producto que es un atributo del objeto detalle:
procedure TDetalleRepository.Save(const detalle:TDetalle); var RecIndex: Integer; begin if FindDetalle(Detalle, RecIndex) then begin DataSet.RecNo := RecIndex; DataSet.Edit; end else DataSet.Append; DataSet.FieldByName('cantidad').AsFloat := Detalle.Fcantidad; ShowMessage(detalle.Fproducto.Fnombre); DataSet.FieldByName('idproducto').AsInteger := Detalle.producto.Fidproducto; DataSet.FieldByName('descripcion').AsString:=Detalle.producto.nombre; DataSet.Post; end;
lo mismo con el id y otros atributos. Pero esas lineas me tiran error, no se cual es la forma sintactica de acceder sino.
Me da un read of adress, error de lectura de memoria seria en las lineas:
DataSet.FieldByName('idproducto').AsInteger := Detalle.producto.Fidproducto; DataSet.FieldByName('descripcion').AsString:=Detalle.producto.nombre;
Agradezco su ayuda