unit uBizFacturasClienteServer; interface uses uDAInterfaces, uDADelta, uDABusinessProcessor, schFacturasClienteServer_Intf; const BIZ_SERVER_FACTURAS_CLIENTE = 'Server.FacturasCliente'; REF_FACTURAS_CLIENTE = 'REF_FACTURAS_CLIENTE'; REF_ABONOS_CLIENTE = 'REF_ABONOS_CLIENTE'; CTE_TIPO_ABONO = 'A'; CTE_TIPO_FACTURA = 'F'; type TBizFacturasClienteServer = class(TFacturasClienteBusinessProcessorRules) protected procedure Insert_Asiento_Factura(aChange: TDADeltaChange); virtual; procedure Update_Asiento_Factura(aChange: TDADeltaChange); virtual; procedure Delete_Asiento_Factura(aChange: TDADeltaChange); virtual; procedure BeforeProcessDelta(Sender: TDABusinessProcessor; const aDelta: IDADelta); override; procedure AfterProcessChange(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: Boolean; var CanRemoveFromDelta: Boolean); override; end; implementation uses Variants, uDAClasses, uReferenciasUtils, uBusinessUtils, uROClasses, uDataModuleServer, schFacturasClienteClient_Intf; { TBizFacturasClienteServer } procedure TBizFacturasClienteServer.AfterProcessChange(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: Boolean; var CanRemoveFromDelta: Boolean); begin case aChange.ChangeType of ctInsert: begin Insert_Asiento_Factura(aChange); end; ctUpdate: begin Update_Asiento_Factura(aChange); end; ctDelete: begin Delete_Asiento_Factura(aChange); end; end; // No hay que quitar los deltas para que los datos del contacto se // mantengan por si alguna tabla detalle lo necesita // (por ejemplo, DireccionesContacto) CanRemoveFromDelta := False; end; procedure TBizFacturasClienteServer.BeforeProcessDelta( Sender: TDABusinessProcessor; const aDelta: IDADelta); var ASchema : TDASchema; ACurrentConn : IDAConnection; dsData: IDADataset; Empresa : Variant; Tipo : Variant; begin inherited; case Sender.CurrentChange.ChangeType of ctInsert, ctUpdate: begin ASchema := BusinessProcessor.Schema; ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor); //Si la referencia no ha sido asignada le asignamos una nosotros if (VarIsNull(Sender.CurrentChange.NewValueByName[fld_FacturasClienteREFERENCIA])) or (VarToStr(Sender.CurrentChange.NewValueByName[fld_FacturasClienteREFERENCIA]) = '') then begin try //Siempre va a estar rellena Empresa := Sender.CurrentChange.NewValueByName[fld_FacturasClienteID_EMPRESA]; Tipo := Sender.CurrentChange.NewValueByName[fld_FacturasClienteTIPO]; if Tipo = CTE_TIPO_FACTURA then dsData := ASchema.NewDataset(ACurrentConn, 'DarReferencia', ['CODIGO', 'EMPRESA'], [REF_FACTURAS_CLIENTE, Empresa]) else dsData := ASchema.NewDataset(ACurrentConn, 'DarReferencia', ['CODIGO', 'EMPRESA'], [REF_ABONOS_CLIENTE, Empresa]); except RaiseError('No existe la tabla REFERENCIAS'); end; dsData.Active := True; if dsData.IsEmpty then RaiseError('NO HAY REFERENCIA ' + REF_FACTURAS_CLIENTE + ' / ' + REF_ABONOS_CLIENTE + ' DECLARADA EN TABLA REFERENCIAS'); REFERENCIA := dsData.FieldByName('VALOR').AsString; try if Tipo = CTE_TIPO_FACTURA then ASchema.NewCommand(ACurrentConn, 'ModificarReferencia', ['CODIGO', 'VALOR', 'EMPRESA'], [REF_FACTURAS_CLIENTE, DarReferenciaSiguiente(REFERENCIA), Empresa]) else ASchema.NewCommand(ACurrentConn, 'ModificarReferencia', ['CODIGO', 'VALOR', 'EMPRESA'], [REF_ABONOS_CLIENTE, DarReferenciaSiguiente(REFERENCIA), Empresa]); except RaiseError('Error al asignar la nueva ' + REFERENCIA + ' referencia en tabla'); end; end; end; end; end; procedure TBizFacturasClienteServer.Delete_Asiento_Factura(aChange: TDADeltaChange); var ASchema : TDASchema; ACurrentConn : IDAConnection; ACommand : IDASQLCommand; begin ASchema := BusinessProcessor.Schema; ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor); ACommand := ASchema.NewCommand(ACurrentConn, 'Delete_AsientoFactura'); try with ACommand do begin ParamByName('IdFactura').Value := aChange.OldValueByName[fld_FacturasClienteID]; Execute; end; finally ACommand := NIL; end; end; procedure TBizFacturasClienteServer.Insert_Asiento_Factura(aChange: TDADeltaChange); var ASchema : TDASchema; ACurrentConn : IDAConnection; ACommand : IDASQLCommand; begin ASchema := BusinessProcessor.Schema; ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor); ACommand := ASchema.NewCommand(ACurrentConn, 'Insert_AsientoFactura'); try with ACommand do begin ParamByName('IdFactura').Value := aChange.NewValueByName[fld_FacturasClienteID]; Execute; end; finally ACommand := NIL; end; end; procedure TBizFacturasClienteServer.Update_Asiento_Factura(aChange: TDADeltaChange); var ASchema : TDASchema; ACurrentConn : IDAConnection; ACommand : IDASQLCommand; begin ASchema := BusinessProcessor.Schema; ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor); ACommand := ASchema.NewCommand(ACurrentConn, 'Insert_AsientoFactura'); try with ACommand do begin ParamByName('IdFactura').Value := aChange.NewValueByName[fld_FacturasClienteID]; Execute; end; finally ACommand := NIL; end; end; initialization RegisterBusinessProcessorRules(BIZ_SERVER_FACTURAS_CLIENTE, TBizFacturasClienteServer); end.