unit uDatosProveedorController; interface uses Classes, uDADataTable, uControllerBase, uProveedoresController, uBizDatosProveedores, uIDataModuleArticulosProveedor; type IDatosProveedoresController = interface(ISujeto) ['{43A5AEDA-9DD2-4520-9AC1-5AB7F37336A7}'] procedure AssignarID(ADatosProveedores: IBizDatosProveedores; IDCabecera: Integer; EsModificacion:Boolean); procedure Anadir(ADatosProveedores : IBizDatosProveedores); procedure Eliminar(ADatosProveedores : IBizDatosProveedores); procedure ElegirProveedor(ADatosProveedores : IBizDatosProveedores); procedure AnadirProveedor(ADatosProveedores : IBizDatosProveedores); procedure VerProveedor(ADatosProveedores : IBizDatosProveedores); end; TDatosProveedoresController = class(TSujeto, IDatosProveedoresController) private FProveedoresController: IProveedoresController; protected FDataModule : IDataModuleArticulosProveedor; public procedure Anadir(ADatosProveedores : IBizDatosProveedores); procedure Eliminar(ADatosProveedores : IBizDatosProveedores); procedure AssignarID(ADatosProveedores: IBizDatosProveedores; IDCabecera: Integer; EsModificacion:Boolean); constructor Create; destructor Destroy; override; procedure ElegirProveedor(ADatosProveedores : IBizDatosProveedores); procedure AnadirProveedor(ADatosProveedores : IBizDatosProveedores); procedure VerProveedor(ADatosProveedores : IBizDatosProveedores); end; implementation uses DB, SysUtils, uDAInterfaces, Variants, uDataModuleArticulosProveedor, uBizContactos, cxControls; { TDatosProveedorController } procedure TDatosProveedoresController.Anadir(ADatosProveedores: IBizDatosProveedores); begin ADatosProveedores.Insert; end; procedure TDatosProveedoresController.AnadirProveedor(ADatosProveedores: IBizDatosProveedores); var AProveedor : IBizContacto; begin inherited; AProveedor := (FProveedoresController.Nuevo as IBizProveedor); FProveedoresController.Ver(AProveedor); if Assigned(AProveedor) then begin if not ADatosProveedores.DataTable.Editing then ADatosProveedores.Edit; ADatosProveedores.ID_PROVEEDOR := AProveedor.ID; ADatosProveedores.NOMBRE := AProveedor.NOMBRE; end; AProveedor := Nil; end; procedure TDatosProveedoresController.AssignarID(ADatosProveedores: IBizDatosProveedores; IDCabecera: Integer; EsModificacion:Boolean); begin with ADatosProveedores do begin DataTable.DisableControls; try if not DataTable.Active then DataTable.Active := True; { ¡¡¡¡ OJO !!!! Para asignar el ID en los Gastos hay que tener en cuenta una cosa: Si se cambia el ID, ese detalle ya no pertenece a esa cabecera porque ya no se cumple la condición de la relacion: Master.ID = Detail.ID_MONTAJE. Por esa razón no sirve hacer un recorrido desde el principio hasta el final porque las Gastos van desapareciendo según asignamos el valor al campo ID y nos mueve aleatoriamente la posición del registro actual. Es mejor hacer un bucle sencillo hasta que "se gasten" todos los Gastos. Cuando el RecordCount llegue a 0 quiere decir que hemos tratado todos los Gastos. El bucle cambia en el caso de ser llamada esta funcion desde modificar un montaje ya que en ese caso sí que hay que hacer un recorrido total de las tuplas de detalle. } if not EsModificacion then begin while RecordCount > 0 do begin DataTable.First; Edit; ID := FDataModule.GetNextID(DataTable.LogicalName); ID_ARTICULO := IDCabecera; Post end end else begin DataTable.First; while not DataTable.EOF do begin if EsNuevo then begin Edit; ID := FDataModule.GetNextID(DataTable.LogicalName); ID_ARTICULO := IDCabecera; Post end; DataTable.Next end; end; finally DataTable.EnableControls; end; end; end; constructor TDatosProveedoresController.Create; begin inherited; FDataModule := TDataModuleArticulosProveedor.Create(Nil); FProveedoresController := TProveedoresController.Create; end; destructor TDatosProveedoresController.Destroy; begin FDataModule := Nil; FProveedoresController := Nil; inherited; end; procedure TDatosProveedoresController.ElegirProveedor(ADatosProveedores: IBizDatosProveedores); var AProveedor : IBizContacto; begin inherited; AProveedor := (FProveedoresController.ElegirContacto(FProveedoresController.BuscarTodos, '', False) as IBizProveedor); if Assigned(AProveedor) then begin if not ADatosProveedores.DataTable.Editing then ADatosProveedores.Edit; ADatosProveedores.ID_PROVEEDOR := AProveedor.ID; ADatosProveedores.NOMBRE := AProveedor.NOMBRE; end; AProveedor := Nil; end; procedure TDatosProveedoresController.Eliminar(ADatosProveedores: IBizDatosProveedores); begin if not Assigned(ADatosProveedores) then raise Exception.Create ('Datos proveedor no asignado'); ShowHourglassCursor; try if (ADatosProveedores.State in dsEditModes) then ADatosProveedores.Cancel; ADatosProveedores.Delete; finally HideHourglassCursor; end; end; procedure TDatosProveedoresController.VerProveedor(ADatosProveedores: IBizDatosProveedores); var AProveedor : IBizContacto; begin AProveedor := FProveedoresController.Buscar(ADatosProveedores.ID_PROVEEDOR); FProveedoresController.Ver(AProveedor); if Assigned(AProveedor) then begin if not ADatosProveedores.DataTable.Editing then ADatosProveedores.Edit; ADatosProveedores.ID_PROVEEDOR := AProveedor.ID; ADatosProveedores.NOMBRE := AProveedor.NOMBRE; end; AProveedor := Nil; end; end.