unit uViewProveedorArticulo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewBase, cxGraphics, DB, uDAInterfaces, uDADataTable, cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit, cxDBLookupComboBox, dxLayoutControl, cxContainer, cxEdit, cxTextEdit, cxDBEdit, cxControls, cxSpinEdit, cxCurrencyEdit, uProveedoresController, uBizContactos, cxCheckBox; type TfrViewProveedorArticulo = class(TfrViewBase) dxLayoutControlArticulo: TdxLayoutControl; eReferenciaProv: TcxDBTextEdit; dxLayoutGroup1: TdxLayoutGroup; dxLayoutControlArticuloGroup3: TdxLayoutGroup; dxLayoutGroup2: TdxLayoutGroup; dxLayoutControlArticuloItem3: TdxLayoutItem; dxLayoutControlArticuloItem1: TdxLayoutItem; eProveedor: TcxDBLookupComboBox; dsProveedores: TDADataSource; dxLayoutControlArticuloItem2: TdxLayoutItem; ePrecioCoste: TcxDBCurrencyEdit; dxLayoutControlArticuloItem4: TdxLayoutItem; eDescuento: TcxDBSpinEdit; dxLayoutControlArticuloItem5: TdxLayoutItem; ePrecioNeto: TcxDBCurrencyEdit; dxLayoutControlArticuloItem6: TdxLayoutItem; ePrecioPorte: TcxDBCurrencyEdit; dxLayoutControlArticuloItem7: TdxLayoutItem; cbTiendaWeb: TcxDBCheckBox; procedure CustomViewCreate(Sender: TObject); procedure CustomViewDestroy(Sender: TObject); procedure OnProveedorChange(Sender: TObject); procedure PrecioCosteChanged(Sender: TObject); procedure DescuentoChanged(Sender: TObject); procedure PrecioNetoChanged(Sender: TObject); procedure CustomViewShow(Sender: TObject); protected FProveedoresController : IProveedoresController; FProveedores : IBizProveedor; procedure DesactivarEventos; procedure ActivarEventos; public { Public declarations } end; var frViewProveedorArticulo: TfrViewProveedorArticulo; implementation {$R *.dfm} uses Math; procedure TfrViewProveedorArticulo.ActivarEventos; begin eProveedor.Properties.OnEditValueChanged := OnProveedorChange; ePrecioCoste.Properties.OnEditValueChanged := PrecioCosteChanged; eDescuento.Properties.OnEditValueChanged := DescuentoChanged; ePrecioNeto.Properties.OnEditValueChanged := PrecioNetoChanged; end; procedure TfrViewProveedorArticulo.CustomViewCreate(Sender: TObject); begin inherited; FProveedoresController := TProveedoresController.Create; FProveedores := (FProveedoresController.BuscarTodos as IBizProveedor); if Assigned(FProveedores) then begin dsProveedores.DataTable := FProveedores.DataTable; FProveedores.DataTable.Active := True; end; end; procedure TfrViewProveedorArticulo.CustomViewDestroy(Sender: TObject); begin DesactivarEventos; FProveedoresController := NIL; FProveedores := NIL; inherited; end; procedure TfrViewProveedorArticulo.CustomViewShow(Sender: TObject); begin inherited; ActivarEventos; end; procedure TfrViewProveedorArticulo.DesactivarEventos; begin ePrecioNeto.Properties.OnEditValueChanged := NIL; ePrecioCoste.Properties.OnEditValueChanged := NIL; eDescuento.Properties.OnEditValueChanged := NIL; eProveedor.Properties.OnEditValueChanged := NIL; end; procedure TfrViewProveedorArticulo.DescuentoChanged(Sender: TObject); var APrecioCoste: Double; ADescuento: Double; begin APrecioCoste := 0; ADescuento := 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 ADescuento := eDescuento.DataBinding.Field.AsFloat; DesactivarEventos; try ePrecioNeto.DataBinding.DataSource.Edit; ePrecioNeto.DataBinding.Field.AsFloat := APrecioCoste - ((APrecioCoste * ADescuento)/100) finally ActivarEventos; end; end; end; procedure TfrViewProveedorArticulo.OnProveedorChange(Sender: TObject); begin inherited; FProveedores.first; if FProveedores.Locate('ID', eProveedor.EditValue) then begin eDescuento.DataBinding.Field.AsFloat := FProveedores.DESCUENTO; cbTiendaWeb.DataBinding.Field.AsInteger := FProveedores.TIENDA_WEB; end; end; procedure TfrViewProveedorArticulo.PrecioCosteChanged(Sender: TObject); var APrecioCoste: Double; ADescuento: Double; begin APrecioCoste := 0; ADescuento := 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 ADescuento := eDescuento.DataBinding.Field.AsFloat; DesactivarEventos; try ePrecioNeto.DataBinding.DataSource.Edit; ePrecioNeto.DataBinding.Field.AsFloat := APrecioCoste - ((APrecioCoste * ADescuento)/100); finally ActivarEventos; end; end; end; procedure TfrViewProveedorArticulo.PrecioNetoChanged(Sender: TObject); var APrecioCoste: Double; APrecioNeto: Double; ADescuento : Double; begin APrecioCoste := 0; APrecioNeto := 0; ADescuento := 0; if ePrecioNeto.EditModified then begin if not varIsNull(ePrecioCoste.EditValue) then APrecioCoste := ePrecioCoste.EditValue; if not varIsNull(ePrecioNeto.EditValue) then APrecioNeto := ePrecioNeto.EditValue; if (APrecioCoste <> 0) then ADescuento := ((APrecioCoste - APrecioNeto) * 100) / APrecioCoste; DesactivarEventos; try eDescuento.DataBinding.DataSource.Edit; eDescuento.DataBinding.Field.AsFloat := RoundTo(ADescuento, -2); finally ActivarEventos; end; end; end; end.