unit uControllerDetallesDTO; interface uses Classes, Variants, uDACDSDataTable, uDADataTable, uControllerDetallesBase; const CAMPO_DESCUENTO = 'DESCUENTO'; //Además del descuento tambien se añade el Precio de porte por artículo CAMPO_IMPORTE_PORTE = 'IMPORTE_PORTE'; type IControllerDetallesDTO = interface(IControllerDetallesBase) ['{F6C5D9E4-4D3D-404F-9B6A-58D4A24B01C6}'] end; TControllerDetallesDTO = class (TControllerDetallesBase, IControllerDetallesDTO) protected //Si en los hijos existen campos a tener en cuenta se sobreescribira este metodo procedure ValidarCampos(DataTable: TDADataTable); override; //Si sobreescribimos este método podremos tener en cuenta otras columnas para el calculo del importe total de un concepto function CalcularImporteTotalConcepto(DataTable: TDADataTable): Double; override; end; implementation { TControllerDetallesBase } uses SysUtils, uDAInterfaces; function TControllerDetallesDTO.CalcularImporteTotalConcepto(DataTable: TDADataTable): Double; var ImporteTotal : Double; begin with DataTable do begin if (VarIsNull(FieldByName(CAMPO_DESCUENTO).AsVariant)) then ImporteTotal := FieldByName(CAMPO_CANTIDAD).asInteger * FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat else ImporteTotal := FieldByName(CAMPO_CANTIDAD).asInteger * (FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat - (FieldByName(CAMPO_IMPORTE_UNIDAD).AsFloat * (FieldByName(CAMPO_DESCUENTO).AsFloat/100))); if (VarIsNull(FieldByName(CAMPO_IMPORTE_PORTE).AsVariant)) then ImporteTotal := ImporteTotal else ImporteTotal := ImporteTotal + (FieldByName(CAMPO_CANTIDAD).asInteger * FieldByName(CAMPO_IMPORTE_PORTE).AsFloat); end; Result := ImporteTotal; end; procedure TControllerDetallesDTO.validarCampos(DataTable: TDADataTable); var AField: TDAField; begin inherited; //Validamos la existencia de todos los campos necesarios AField := DataTable.FindField(CAMPO_DESCUENTO); if not Assigned(AField) then raise Exception.Create('Campo ' + CAMPO_DESCUENTO + ' no encontrado (validarCampos)'); AField := DataTable.FindField(CAMPO_IMPORTE_PORTE); if not Assigned(AField) then raise Exception.Create('Campo ' + CAMPO_IMPORTE_PORTE + ' no encontrado (validarCampos)'); end; end.