unit uCalculosUtils; interface uses uDADataTable, uDAInterfaces; const CAMPO_CANTIDAD = 'CANTIDAD'; CAMPO_IMPORTE_UNIDAD = 'IMPORTE_UNIDAD'; CAMPO_IMPORTE_TOTAL = 'IMPORTE_TOTAL'; CAMPO_DESCUENTO = 'DESCUENTO'; CAMPO_IMPORTE_PORTE = 'IMPORTE_PORTE'; function CalcularLineaConcepto (const ADataTable : TDADataTable): Double; procedure ValidarCamposLineaConcepto(DataTable: TDADataTable); implementation uses SysUtils, Variants; function CalcularLineaConcepto (const ADataTable : TDADataTable): Double; var ImporteTotal : Double; begin ImporteTotal := 0; with ADataTable 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 ValidarCamposLineaConcepto(DataTable: TDADataTable); var AField: TDAField; begin //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.