unit uViewArticulo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewBase, ExtCtrls, StdCtrls, Buttons, DB, uDADataTable, DBCtrls, Grids, DBGrids, uBizArticulos, Mask, ComCtrls, uCustomView, JvComponent, JvFormAutoSize, cxControls, cxContainer, cxEdit, cxTextEdit, cxDBEdit, dxLayoutControl, cxCheckBox, PngSpeedButton, cxImage, ActnList, ImgList, PngImageList, cxGraphics, cxMaskEdit, cxDropDownEdit, uFamiliasController, uViewDatosYSeleccionProveedor, cxSpinEdit, cxCurrencyEdit, uArticulosController, uDAInterfaces; type IViewArticulo = interface(IViewBase) ['{65206152-786D-47AE-A037-5EF480BC056C}'] function GetArticulo: IBizArticulo; procedure SetArticulo(const Value: IBizArticulo); property Articulo: IBizArticulo read GetArticulo write SetArticulo; function GetController : IArticulosController; procedure SetController (const Value : IArticulosController); property Controller : IArticulosController read GetController write SetController; end; TfrViewArticulo = class(TfrViewBase, IViewArticulo) dsViewArticulo: TDADataSource; dxLayoutControlArticuloGroup_Root: TdxLayoutGroup; dxLayoutControlArticulo: TdxLayoutControl; dxLayoutControlArticuloGroup1: TdxLayoutGroup; dxLayoutControlArticuloItem3: TdxLayoutItem; eReferencia: TcxDBTextEdit; dxLayoutControlArticuloItem8: TdxLayoutItem; eDescripcion: TcxDBTextEdit; dxLayoutControlArticuloGroup2: TdxLayoutGroup; dxLayoutControlArticuloItem1: TdxLayoutItem; eNoComisionable: TcxDBCheckBox; dxLayoutControlArticuloGroup4: TdxLayoutGroup; OpenDialog1: TOpenDialog; SmallImages: TPngImageList; ActionList1: TActionList; actAnadir: TAction; actEliminar: TAction; dxLayoutControlArticuloItem2: TdxLayoutItem; PngSpeedButton2: TPngSpeedButton; dxLayoutControlArticuloItem5: TdxLayoutItem; PngSpeedButton1: TPngSpeedButton; dxLayoutControlArticuloGroup3: TdxLayoutGroup; dxLayoutControlArticuloGroup7: TdxLayoutGroup; eImagen: TcxImage; dxLayoutControlArticuloItem6: TdxLayoutItem; dxLayoutControlArticuloGroup5: TdxLayoutGroup; dxLayoutControlArticuloItem4: TdxLayoutItem; cbFamilia: TcxDBComboBox; dxLayoutControlArticuloGroup6: TdxLayoutGroup; dxLayoutControlArticuloItem14: TdxLayoutItem; frViewDatosYSeleccionProveedor1: TfrViewDatosYSeleccionProveedor; dxLayoutControlArticuloItem15: TdxLayoutItem; eReferenciaProv: TcxDBTextEdit; dxLayoutControlArticuloItem16: TdxLayoutItem; ePrecioCoste: TcxDBCurrencyEdit; dxLayoutControlArticuloItem17: TdxLayoutItem; eDescuento: TcxDBSpinEdit; dxLayoutControlArticuloItem18: TdxLayoutItem; ePrecioNeto: TcxDBCurrencyEdit; dxLayoutControlArticuloItem19: TdxLayoutItem; ePrecioPorte: TcxDBCurrencyEdit; dxLayoutControlArticuloGroup11: TdxLayoutGroup; dxLayoutControlArticuloGroup12: TdxLayoutGroup; dxLayoutControlArticuloItem7: TdxLayoutItem; cbNoInventariable: TcxDBCheckBox; dxLayoutControlArticuloGroup8: TdxLayoutGroup; dxLayoutControlArticuloItem9: TdxLayoutItem; ePrecioPVP: TcxDBCurrencyEdit; procedure actEliminarExecute(Sender: TObject); procedure actAnadirExecute(Sender: TObject); procedure cbFamiliaPropertiesInitPopup(Sender: TObject); procedure CustomViewCreate(Sender: TObject); procedure CustomViewDestroy(Sender: TObject); procedure cbFamiliaPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure CustomViewShow(Sender: TObject); procedure PrecioCosteChanged(Sender: TObject); procedure DescuentoChanged(Sender: TObject); procedure PrecioPVPChanged(Sender: TObject); private procedure CargarImagen; procedure DesactivarEventos; procedure ActivarEventos; protected FFamiliasController: IFamiliasController; FController: IArticulosController; FArticulo: IBizArticulo; FImagenModificada: Boolean; function GetArticulo: IBizArticulo; procedure SetArticulo(const Value: IBizArticulo); virtual; function GetController : IArticulosController; procedure SetController (const Value : IArticulosController); procedure OnProveedorChanged(Sender: TObject); public function GetModified: Boolean; override; procedure SetModified(const Value: Boolean); override; property Articulo: IBizArticulo read GetArticulo write SetArticulo; property Controller : IArticulosController read GetController write SetController; end; implementation uses uDataModuleArticulos, uSistemaFunc, schArticulosClient_Intf, uBizFamilias, uBizContactos; {$R *.dfm} { TfrViewArticulos } { ******************************* TfrViewArticulos ******************************** } procedure TfrViewArticulo.actAnadirExecute(Sender: TObject); var aAux : String; begin eImagen.LoadFromFile; if Assigned(eImagen.Picture) then begin ShowHourglassCursor; try aAux := DarFicheroJPGTemporal; eImagen.Picture.SaveToFile(aAux); FController.PonerImagen(Articulo, aAux); FImagenModificada := True; finally DeleteFile(aAux); HideHourglassCursor; end; end; end; procedure TfrViewArticulo.actEliminarExecute(Sender: TObject); begin inherited; eImagen.Clear; FController.QuitarImagen(Articulo); FImagenModificada := True; end; procedure TfrViewArticulo.ActivarEventos; begin ePrecioCoste.Properties.OnEditValueChanged := PrecioCosteChanged; eDescuento.Properties.OnEditValueChanged := DescuentoChanged; ePrecioPVP.Properties.OnEditValueChanged := PrecioPVPChanged; end; procedure TfrViewArticulo.CargarImagen; var aAux : String; begin if FArticulo.HayImagen then begin ShowHourglassCursor; try aAux := DarFicheroJPGTemporal; Articulo.DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToFile(aAux); try eImagen.Picture.LoadFromFile(aAux); except on EInvalidGraphic do ShowMessage('error de imagen en el articulo'); end; finally DeleteFile(aAux); HideHourglassCursor; end; end; end; procedure TfrViewArticulo.cbFamiliaPropertiesInitPopup(Sender: TObject); begin inherited; with cbFamilia.Properties.Items do begin BeginUpdate; try Clear; AddStrings(FFamiliasController.DarListaFamilias); finally EndUpdate; end; end; end; procedure TfrViewArticulo.cbFamiliaPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); var AFamilias : IBizFamilia; begin inherited; with (Sender as TcxDBComboBox) do begin if (Length(DisplayValue) > 0) and (DisplayValue <> FArticulo.FAMILIA) then if Properties.LookupItems.IndexOf(DisplayValue) < 0 then begin Properties.LookupItems.BeginUpdate; AFamilias := FFamiliasController.BuscarTodos; AFamilias.DataTable.Active := True; try FFamiliasController.Anadir(AFamilias); AFamilias.DESCRIPCION := DisplayValue; FFamiliasController.Guardar(AFamilias); Properties.LookupItems.Add(DisplayValue); finally Properties.LookupItems.EndUpdate; AFamilias := NIL; end; end; end; end; procedure TfrViewArticulo.CustomViewCreate(Sender: TObject); begin inherited; FImagenModificada := False; FFamiliasController := TFamiliasController.Create; end; procedure TfrViewArticulo.CustomViewDestroy(Sender: TObject); begin FFamiliasController := Nil; ePrecioCoste.Properties.OnEditValueChanged := Nil; eDescuento.Properties.OnEditValueChanged := Nil; inherited; end; procedure TfrViewArticulo.CustomViewShow(Sender: TObject); begin inherited; ActivarEventos; end; procedure TfrViewArticulo.DesactivarEventos; begin // eProveedor.Properties.OnEditValueChanged := OnProveedorChange; ePrecioCoste.Properties.OnEditValueChanged := PrecioCosteChanged; eDescuento.Properties.OnEditValueChanged := DescuentoChanged; ePrecioPVP.Properties.OnEditValueChanged := PrecioPVPChanged; end; procedure TfrViewArticulo.DescuentoChanged(Sender: TObject); var APrecioCoste: Double; AAumento: Double; begin APrecioCoste := 0; AAumento := 0; if eDescuento.EditModified then begin if not varIsNull(ePrecioCoste.DataBinding.Field.AsFloat) then APrecioCoste := ePrecioCoste.DataBinding.Field.AsFloat; if not varIsNull(eDescuento.DataBinding.Field.AsFloat) then AAumento := ((100 - eDescuento.DataBinding.Field.AsFloat)/100); DesactivarEventos; try ePrecioPVP.DataBinding.DataSource.Edit; ePrecioPVP.DataBinding.Field.AsFloat := APrecioCoste/AAumento; finally ActivarEventos; end; end; end; function TfrViewArticulo.GetArticulo: IBizArticulo; begin Result := FArticulo; end; function TfrViewArticulo.GetController: IArticulosController; begin Result := FController; end; function TfrViewArticulo.GetModified: Boolean; begin Result := inherited GetModified; //COMPROBAMOS SI EN LA VISTA HA HABIDO CAMBIOS EN LA IMAGEN if not Result then Result := Result or FImagenModificada; end; procedure TfrViewArticulo.OnProveedorChanged(Sender: TObject); begin if Assigned(FArticulo) then begin FArticulo.Edit; FArticulo.ID_PROVEEDOR := frViewDatosYSeleccionProveedor1.Proveedor.ID; FArticulo.DESCUENTO := frViewDatosYSeleccionProveedor1.Proveedor.DESCUENTO; end; end; procedure TfrViewArticulo.PrecioCosteChanged(Sender: TObject); var APrecioCoste: Double; AAumento: Double; begin APrecioCoste := 0; AAumento := 0; if ePrecioCoste.EditModified then begin if not varIsNull(ePrecioCoste.DataBinding.Field.AsFloat) then APrecioCoste := ePrecioCoste.DataBinding.Field.AsFloat; if not varIsNull(eDescuento.DataBinding.Field.AsFloat) then AAumento := ((100 - eDescuento.DataBinding.Field.AsFloat)/100); DesactivarEventos; try ePrecioPVP.DataBinding.DataSource.Edit; ePrecioPVP.DataBinding.Field.AsFloat := APrecioCoste/AAumento; finally ActivarEventos; end; end; end; procedure TfrViewArticulo.PrecioPVPChanged(Sender: TObject); var APrecioCoste: Double; APrecioPVP: Double; AAumento : Double; begin APrecioCoste := 0; APrecioPVP := 0; AAumento := 0; if ePrecioPVP.EditModified then begin if not varIsNull(ePrecioPVP.EditValue) then APrecioPVP := ePrecioPVP.EditValue; if not varIsNull(eDescuento.DataBinding.Field.AsFloat) then AAumento := (100 - eDescuento.DataBinding.Field.AsFloat); DesactivarEventos; try ePrecioCoste.DataBinding.DataSource.Edit; ePrecioCoste.DataBinding.Field.AsFloat := ((APrecioPVP*AAumento) / 100); finally ActivarEventos; end; end; {/* if Assigned(FController) then FController.CalcularPrecioNeto(FArticulo); } end; procedure TfrViewArticulo.SetArticulo(const Value: IBizArticulo); begin FArticulo := Value; frViewDatosYSeleccionProveedor1.OnProveedorChanged := NIL; if Assigned(FArticulo) then begin dsViewArticulo.DataTable := FArticulo.DataTable; frViewDatosYSeleccionProveedor1.Controller := FController.ProveedoresController; frViewDatosYSeleccionProveedor1.Proveedor := (FController.ProveedoresController.Buscar(FArticulo.ID_PROVEEDOR) as IBizProveedor); frViewDatosYSeleccionProveedor1.OnProveedorChanged := OnProveedorChanged; CargarImagen; end else begin dsViewArticulo.DataTable := NIL; FArticulo := NIL; eImagen.Clear; end; end; procedure TfrViewArticulo.SetController(const Value: IArticulosController); begin FController := Value; end; procedure TfrViewArticulo.SetModified(const Value: Boolean); begin inherited; if not Value then FImagenModificada := False; end; end.