unit uBizImportesCabeceraBase; interface uses uDAInterfaces, uDADataTable; type IBizImportesCabecera = interface(IDAStronglyTypedDataTable) ['{566EE7D3-EE6D-4B01-B327-92E288A0C5A0}'] procedure RecalcularImporte; end; TBizIVAFieldRules = class(TDAFieldRules) protected procedure OnChange(Sender: TDACustomField); override; end; TBizDescuentoFieldRules = class(TDAFieldRules) protected procedure OnChange(Sender: TDACustomField); override; end; TBizBaseImponibleFieldRules = class(TDAFieldRules) protected procedure OnChange(Sender: TDACustomField); override; end; procedure RecalcularImportesCabecera(aDataTable : TDADataTable); overload; procedure RecalcularImportesCabecera(aMasterTable, aDetailTable : TDADataTable); overload; implementation uses SysUtils, DB, uBizImportesDetalleBase; const fld_BASEIMPONIBLE = 'BASEIMPONIBLE'; fld_IVA = 'IVA'; fld_IMPORTEIVA = 'IMPORTEIVA'; fld_DESCUENTO = 'DESCUENTO'; fld_IMPORTEDESCUENTO = 'IMPORTEDESCUENTO'; fld_IMPORTETOTAL = 'IMPORTETOTAL'; procedure RecalcularImportesCabecera(aDataTable : TDADataTable); { Recalcula todos los importes de la cabecera a partir de la base imponible } var BIField : TDAField; IDField : TDAField; DTOField : TDAField; IVAField : TDAField; IIField : TDAField; ITField : TDAField; EnEdicion : Boolean; begin BIField := aDataTable.FindField(fld_BASEIMPONIBLE); if not Assigned(BIField) then raise Exception.Create('Campo BASEIMPONIBLE no encontrado (CalcularImportes)'); IDField := aDataTable.FindField(fld_IMPORTEDESCUENTO); if not Assigned(IDField) then raise Exception.Create('Campo IMPORTEDESCUENTO no encontrado (CalcularImportes)'); DTOField := aDataTable.FindField(fld_DESCUENTO); if not Assigned(DTOField) then raise Exception.Create('Campo DESCUENTO no encontrado (CalcularImportes)'); IVAField := aDataTable.FindField(fld_IVA); if not Assigned(IVAField) then raise Exception.Create('Campo IVA no encontrado (CalcularImportes)'); IIField := aDataTable.FindField(fld_IMPORTEIVA); if not Assigned(IIField) then raise Exception.Create('Campo IMPORTEIVA no encontrado (CalcularImportes)'); ITField := aDataTable.FindField(fld_IMPORTETOTAL); if not Assigned(ITField) then raise Exception.Create('Campo IMPORTETOTAL no encontrado (CalcularImportes)'); // ¿Viene en modo edición? EnEdicion := (aDataTable.State in dsEditModes); if not EnEdicion then aDataTable.Edit; IDField.Value := BIField.AsCurrency * (DTOField.AsInteger/100); ITField.Value := BIField.AsCurrency - IDField.AsCurrency; IIField.Value := ITField.AsCurrency * (IVAField.AsInteger/100); ITField.Value := ITField.AsCurrency + IIField.AsCurrency; if EnEdicion then aDataTable.Edit; // Para dejar la tabla como estaba otra vez end; procedure RecalcularImportesCabecera(aMasterTable, aDetailTable : TDADataTable); { Recalcula todos los importes de la cabecera a partir de los detalles } var aDetalle : IBizImportesDetalle; BIField : TDAField; EnEdicion : Boolean; begin BIField := aMasterTable.FindField(fld_BASEIMPONIBLE); if not Assigned(BIField) then raise Exception.Create('Campo BASEIMPONIBLE no encontrado (CalcularImportes)'); // ¿Viene en modo edición? EnEdicion := (aMasterTable.State in dsEditModes); if not EnEdicion then aMasterTable.Edit; BIField.Value := 0; if aDetailTable.RecordCount > 0 then if Supports(aDetailTable, IBizImportesDetalle, aDetalle) then BIField.Value := aDetalle.DarSumaTotalImportes; RecalcularImportesCabecera(aMasterTable); if EnEdicion then aMasterTable.Edit; // Para dejar la tabla como estaba otra vez end; { TBizIVAFieldRules } procedure TBizIVAFieldRules.OnChange(Sender: TDACustomField); var aCabecera : IBizImportesCabecera; begin inherited; if Supports(DataTable, IBizImportesCabecera, aCabecera) then aCabecera.RecalcularImporte; end; { TBizDescuentoFieldRules } procedure TBizDescuentoFieldRules.OnChange(Sender: TDACustomField); var aCabecera : IBizImportesCabecera; begin inherited; if Supports(DataTable, IBizImportesCabecera, aCabecera) then aCabecera.RecalcularImporte; end; { TBizBaseImponibleFieldRules } procedure TBizBaseImponibleFieldRules.OnChange(Sender: TDACustomField); var aCabecera : IBizImportesCabecera; begin inherited; if Supports(DataTable, IBizImportesCabecera, aCabecera) then aCabecera.RecalcularImporte; end; initialization RegisterFieldRules('Client.Field.Descuento', TBizDescuentoFieldRules); RegisterFieldRules('Client.Field.IVA', TBizIVAFieldRules); RegisterFieldRules('Client.Field.BaseImponible', TBizBaseImponibleFieldRules); finalization end.