unit uMontajesCompletoController; interface uses Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem, // uIDataModuleMontajes, // uMontajesController, uPresupuestosController, uDetallesMontajeController, uBizMontajes, uIDataModuleMontajes, uBizMontajesCompleto, uMontajesDetallesController, uPedidosMontajeController, uCobrosMontajeController, uGastosMontajeController; type IMontajesCompletoController = interface(IMontajesDetallesController) ['{6429BDB3-3685-4A77-89CA-7454C8C96C24}'] function GetGastosController: IGastosMontajeController; procedure SetGastosController(const Value: IGastosMontajeController); property GastosController: IGastosMontajeController read GetGastosController write SetGastosController; function GetPedidosController: IPedidosMontajeController; procedure SetPedidosController(const Value: IPedidosMontajeController); property PedidosController: IPedidosMontajeController read GetPedidosController write SetPedidosController; function GetCobrosController: ICobrosMontajeController; procedure SetCobrosController(const Value: ICobrosMontajeController); property CobrosController: ICobrosMontajeController read GetCobrosController write SetCobrosController; end; TMontajesCompletoController = class(TMontajesDetallesController, IMontajesCompletoController) protected FGastosController : IGastosMontajeController; FPedidosController: IPedidosMontajeController; FCobrosController: ICobrosMontajeController; function GetGastosController: IGastosMontajeController; procedure SetGastosController(const Value: IGastosMontajeController); function GetPedidosController: IPedidosMontajeController; procedure SetPedidosController(const Value: IPedidosMontajeController); procedure RecuperarPedidos(AMontaje : IBizMontajeCompleto); function GetCobrosController: ICobrosMontajeController; procedure SetCobrosController(const Value: ICobrosMontajeController); procedure RecuperarCobros(AMontaje : IBizMontajeCompleto); //Estos son los tres métodos a sobre escribir si se desea heredar toda la logica de //este controller procedure AsignarDataModule; override; procedure RecuperarObjetos(AMontaje: IBizMontaje); override; procedure AsignarEditor(out AEditor: IEditorDBItem); override; function ValidarMontaje(AMontaje: IBizMontaje): Boolean; override; procedure AsignarID(AMontaje: IBizMontaje; NuevoID:Integer); override; public property GastosController: IGastosMontajeController read GetGastosController write SetGastosController; property PedidosController: IPedidosMontajeController read GetPedidosController write SetPedidosController; property CobrosController: ICobrosMontajeController read GetCobrosController write SetCobrosController; constructor Create; destructor Destroy; override; end; implementation uses cxControls, DB, uEditorRegistryUtils, //schMontajesClient_Intf, // uBizContactos, uIEditorMontajes, uIEditorMontaje, , // uIEditorElegirMontajes, uDataModuleUsuarios, uDAInterfaces, uDataTableUtils, // uDateUtils, uROTypes, DateUtils, Controls, // uIDataModuleMontajesDetalle; uIEditorMontajeCompleto, uDataModuleMontajesCompleto, uIDataModuleMontajesCompleto; { TMontajesDetallesController } procedure TMontajesCompletoController.AsignarDataModule; begin FDataModule := TDataModuleMontajesCompleto.Create(Nil); end; procedure TMontajesCompletoController.AsignarEditor(out AEditor: IEditorDBItem); begin CreateEditor('EditorMontajeCompleto', IEditorMontajeCompleto, AEditor); end; procedure TMontajesCompletoController.AsignarID(AMontaje: IBizMontaje; NuevoID: Integer); begin if not Assigned(FGastosController) then raise Exception.Create ('Controller gastos no asignado'); { ¡¡¡ OJO !!! Primero cambiamos el ID de las tablas detalles porque si cambiamos antes el ID de la cabecera deja de funcionar la relacion M/D y no encontraríamos las filas detalle. --> MASTER.ID = DETAIL.ID_MONTAJE <-- } FGastosController.AsignarID((AMontaje as IBizMontajeCompleto).Gastos, NuevoID, AMontaje.EsNuevo); inherited; end; constructor TMontajesCompletoController.Create; begin inherited; FGastosController := TGastosMontajeController.Create; FPedidosController := TPedidosMontajeController.Create; FCobrosController := TCobrosMontajeController.Create; end; destructor TMontajesCompletoController.Destroy; begin FGastosController := Nil; FPedidosController := Nil; FCobrosController := Nil; inherited; end; procedure TMontajesCompletoController.RecuperarCobros(AMontaje: IBizMontajeCompleto); begin AMontaje.Cobros := FCobrosController.BuscarCobrosMontaje(AMontaje.ID); end; procedure TMontajesCompletoController.RecuperarObjetos(AMontaje: IBizMontaje); begin inherited; if not Assigned((AMontaje as IBizMontajeCompleto).Pedidos) then RecuperarPedidos((AMontaje as IBizMontajeCompleto)); if not Assigned((AMontaje as IBizMontajeCompleto).Cobros) then RecuperarCobros((AMontaje as IBizMontajeCompleto)); end; procedure TMontajesCompletoController.RecuperarPedidos(AMontaje: IBizMontajeCompleto); begin AMontaje.Pedidos := FPedidosController.BuscarPedidosMontaje(AMontaje.ID); end; procedure TMontajesCompletoController.SetCobrosController(const Value: ICobrosMontajeController); begin FCobrosController := Value; end; procedure TMontajesCompletoController.SetGastosController(const Value: IGastosMontajeController); begin FGastosController := Value; end; procedure TMontajesCompletoController.SetPedidosController(const Value: IPedidosMontajeController); begin FPedidosController := Value; end; function TMontajesCompletoController.ValidarMontaje(AMontaje: IBizMontaje): Boolean; begin Result := inherited ValidarMontaje(AMontaje); if not Result then exit; Result := False; if not Assigned(FGastosController) then raise Exception.Create ('Controller gastos no asignado'); //Tambien hacemos post de sus tablas hija if ((AMontaje as IBizMontajeCompleto).Gastos.DataTable.State in dsEditModes) then (AMontaje as IBizMontajeCompleto).Gastos.DataTable.Post; Result := True; end; function TMontajesCompletoController.GetCobrosController: ICobrosMontajeController; begin Result := FCobrosController; end; function TMontajesCompletoController.GetGastosController: IGastosMontajeController; begin Result := FGastosController; end; function TMontajesCompletoController.GetPedidosController: IPedidosMontajeController; begin Result := FPedidosController; end; end.