unit uDireccionesContactoController; interface uses Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable, uBizContactos, uBizDireccionesContacto, uIDataModuleContactos; type IDireccionesContactoController = interface ['{9B6CB172-F32C-414F-A0E2-99920CAF88FB}'] procedure AsignarID(ADetalles: IBizDireccionesContacto; IDCabecera: Integer; AEsNuevo:Boolean); procedure CopiarDireccionFiscal(AContacto: IBizContacto; ADireccion: IBizDireccionesContacto; AAnadir : Boolean = True); procedure Ver(ADireccion : IBizDireccionesContacto); function Localizar(ADirecciones: IBizDireccionesContacto; const ID : Integer): Boolean; end; TDireccionesContactoController = class(TInterfacedObject, IDireccionesContactoController) private FDataModule : IDataModuleContactos; public procedure CopiarDireccionFiscal(AContacto: IBizContacto; ADireccion: IBizDireccionesContacto; AAnadir : Boolean = True); procedure Ver(ADireccion : IBizDireccionesContacto); procedure AsignarID(ADetalles: IBizDireccionesContacto; IDCabecera: Integer; AEsNuevo:Boolean); function Localizar(ADirecciones: IBizDireccionesContacto; const ID : Integer): Boolean; constructor Create; virtual; destructor Destroy; override; end; implementation { TDireccionesContactoController } uses uDataModuleContactos, schContactosClient_Intf, uIEditorDireccionContacto, uEditorRegistryUtils, cxControls; procedure TDireccionesContactoController.AsignarID( ADetalles: IBizDireccionesContacto; IDCabecera: Integer; AEsNuevo: Boolean); begin with ADetalles do begin DataTable.DisableControls; try if not DataTable.Active then DataTable.Active := True; // AuxPosicion := POSICION; { ¡¡¡¡ OJO !!!! Para asignar el ID en los detalles 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_PRESUPUESTO. Por esa razón no sirve hacer un recorrido desde el principio hasta el final porque las detalles 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 detalles. Cuando el RecordCount llegue a 0 quiere decir que hemos tratado todos los detalles. El bucle cambia en el caso de ser llamada esta funcion desde modificar un presupuesto ya que en ese caso si que hay que hacer un recorrido total de las tuplas de detalle. } if AEsNuevo then begin while RecordCount > 0 do begin DataTable.First; Edit; ID := FDataModule.GetNextID(DataTable.LogicalName); ID_CONTACTO := IDCabecera; Post end end else begin DataTable.First; while not DataTable.EOF do begin if AEsNuevo then begin Edit; ID := FDataModule.GetNextID(DataTable.LogicalName); ID_CONTACTO := IDCabecera; Post end; DataTable.Next end; end; finally DataTable.EnableControls; end; end; end; procedure TDireccionesContactoController.CopiarDireccionFiscal( AContacto: IBizContacto; ADireccion: IBizDireccionesContacto; AAnadir: Boolean); begin if not Assigned(AContacto) then raise Exception.Create ('Contacto no asignado (CopiarDireccionFiscal)'); if not Assigned(ADireccion) then raise Exception.Create ('Dirección no asignada (CopiarDireccionFiscal)'); if AAnadir then ADireccion.DataTable.Insert else ADireccion.DataTable.Edit; try with ADireccion do begin NOMBRE := 'Dirección de entrega'; CALLE := AContacto.CALLE; POBLACION := AContacto.POBLACION; PROVINCIA := AContacto.PROVINCIA; CODIGO_POSTAL := AContacto.CODIGO_POSTAL; TELEFONO := AContacto.TELEFONO_1; EMAIL := AContacto.EMAIL_1; end; finally ADireccion.DataTable.Post; end; end; constructor TDireccionesContactoController.Create; begin inherited; FDataModule := TDataModuleContactos.Create(Nil); end; destructor TDireccionesContactoController.Destroy; begin FDataModule := Nil; inherited; end; function TDireccionesContactoController.Localizar( ADirecciones: IBizDireccionesContacto; const ID: Integer): Boolean; begin Result := True; ShowHourglassCursor; try with ADirecciones.DataTable do begin DisableControls; First; if not Locate(fld_DireccionesContactoID, ID, []) then Result := False; EnableControls; end; finally HideHourglassCursor; end; end; procedure TDireccionesContactoController.Ver( ADireccion: IBizDireccionesContacto); var AEditor : IEditorEditorDireccion; begin AEditor := NIL; ShowHourglassCursor; try CreateEditor('EditorDireccion', IEditorEditorDireccion, AEditor); with AEditor do begin Direccion := ADireccion; Controller := Self; end; finally HideHourglassCursor; end; if Assigned(AEditor) then try AEditor.ShowModal; AEditor.Release; finally AEditor := NIL; end; end; end.