{ =============================================================================== Copyright (©) 2002. Rodax Software. =============================================================================== Los contenidos de este fichero son propiedad de Rodax Software titular del copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado, en su totalidad o en parte, con el permiso escrito de Rodax Software, o de acuerdo con los términos y condiciones establecidas en el acuerdo/contrato bajo el que se suministra. ----------------------------------------------------------------------------- Web: www.rodax-software.com =============================================================================== Fecha primera versión: 16-11-2002 Versión actual: 1.0.1 Fecha versión actual: 16-04-2003 =============================================================================== Modificaciones: Fecha Comentarios --------------------------------------------------------------------------- 16-04-2003 p6. Añadir gestión de representantes. =============================================================================== } unit Proveedor; interface uses Windows, Db, StdCtrls, RdxMemo, RdxCampos, RdxTitulos, Forms, RdxPaneles, RdxBotones, Controls, ExtCtrls, RdxBarras, Classes, RdxFrameProveedores, RdxFrame, RXDBCtrl, ComCtrls, AdvPanel, cxSpinEdit, cxDBEdit, cxControls, cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxButtonEdit, Configuracion, cxMemo, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDBData, cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView, cxGridCardView, cxGridDBCardView, cxGrid, RdxPageControl, RXMemDS, cxDataStorage; type TfrProveedor = class(TRdxFrameProveedores) brDoble: TRdxBarraInferior; bAceptar: TRdxBoton; bCancelar: TRdxBoton; brSimple: TRdxBarraInferior; bSalir: TRdxBoton; pnlCuerpo: TPanel; dsProveedor: TDataSource; Titulo: TRdxPanelTituloOperacion; pnlProveedor: TAdvPanel; eCodigo: TLabel; eNIFCIF: TLabel; eDescuento: TLabel; eNombre: TLabel; eObservaciones: TLabel; Codigo: TcxDBButtonEdit; NIF: TcxDBTextEdit; Nombre: TcxDBTextEdit; Observaciones: TcxDBMemo; Descuento: TcxDBTextEdit; Label1: TLabel; Distribucion: TcxDBTextEdit; PanelDirecciones: TRdxPanel; Paginas: TRdxPagesControl; pagDireccion: TTabSheet; pagRepresentantes: TTabSheet; pnlGridArticulos: TPanel; pnlBarraGrid: TRdxPanel; bAnadir: TRdxBoton; bEliminar: TRdxBoton; bEliminarTodo: TRdxBoton; gridRepresentantes: TcxGrid; gridRepresentantesDBCardView: TcxGridDBCardView; gridRepresentantesLevel: TcxGridLevel; eDireccion: TLabel; Calle: TcxDBTextEdit; eProvincia: TLabel; Provincia: TcxDBButtonEdit; ePoblacion: TLabel; Poblacion: TcxDBButtonEdit; eNumero: TLabel; Numero: TcxDBTextEdit; ePiso: TLabel; Piso: TcxDBTextEdit; eCodigoPostal: TLabel; CodigoPostal: TcxDBTextEdit; eFax: TLabel; Fax: TcxDBTextEdit; eTelefono2: TLabel; Telefono2: TcxDBTextEdit; eTelefono1: TLabel; Telefono1: TcxDBTextEdit; Label2: TLabel; Movil1: TcxDBTextEdit; Label3: TLabel; Movil2: TcxDBTextEdit; eCorreo: TLabel; PersonaContacto: TcxDBTextEdit; Label4: TLabel; Correo: TcxDBTextEdit; dsRepresentantes: TDataSource; procedure bSalirClick(Sender: TObject); procedure bCancelarClick(Sender: TObject); procedure CodigoExit(Sender: TObject); procedure bAceptarClick(Sender: TObject); procedure DescuentoExit(Sender: TObject); procedure CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); procedure bAnadirClick(Sender: TObject); procedure bEliminarClick(Sender: TObject); procedure bEliminarTodoClick(Sender: TObject); procedure gridRepresentantesResize(Sender: TObject); procedure gridRepresentantesDBCardViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private FCodigoProvincia : Variant; FCodigoPoblacion : Variant; FTablaRepresentantesMem: TRxMemoryData; procedure ProvinciaSetText(Sender: TField; const Text: String); procedure dsRepresentantesStateChange(Sender: TObject); procedure RepresentantesMemAfterInsert(DataSet: TDataSet); procedure CargarDatosRepresentantes; procedure SalvarDatosRepresentantes; procedure BorrarDatosRepresentantesIB; protected procedure ActivarModoAnadir; override; procedure ActivarModoModificar; override; procedure ActivarModoConsultar; override; procedure ActivarModoEliminar; override; function AnadirDatos : Boolean; override; function ModificarDatos : Boolean; override; function EliminarDatos : Boolean; override; function CancelarAnadir : Boolean; override; function CancelarModificar : Boolean; override; function CancelarEliminar : Boolean; override; function ComprobarDatos : Boolean; override; procedure VerModal; override; procedure SetCodigoProvincia (Value : Variant); virtual; procedure SetCodigoPoblacion (Value : Variant); virtual; procedure FreeContenido; override; procedure BuscarProveedor; override; public property CodigoProvincia : Variant read FCodigoProvincia write SetCodigoProvincia; property CodigoPoblacion : Variant read FCodigoPoblacion write SetCodigoPoblacion; constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property TablaProveedores; property CodigoProveedor; property TablaRepresentantesMem : TRxMemoryData read FTablaRepresentantesMem write FTablaRepresentantesMem; end; var frProveedor: TfrProveedor; implementation {$R *.DFM} uses TablaProveedores, Mensajes, IB, Colores, IBDatabase, Proveedores, Provincias, RdxFrameProvincias, Poblaciones, RdxFramePoblaciones, TablaProvincias, BaseDatos, IBCustomDataSet, Sysutils, StrFunc, TablaPoblaciones, Excepciones, IBErrorCodes, Variants, Entidades, NumFunc, Literales, TablaRepresentantesProveedor; constructor TfrProveedor.Create (AOwner : TComponent); begin inherited Create(AOwner); Entidad := entProveedor; FCodigoProvincia := NULL; FCodigoPoblacion := NULL; BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaRepresentantesMem := TRxMemoryData.Create(Self); TablaProveedores := TIBDataSet.Create(Self); TablaRepresentantes := TIBDataSet.Create(Self); dsProveedor.DataSet := TablaProveedores; dsRepresentantes.DataSet := TablaRepresentantesMem; dsRepresentantes.OnStateChange := dsRepresentantesStateChange; with TablaProveedores do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaProveedores.sqlConsultar); InsertSQL.Assign(dmTablaProveedores.sqlInsertar); ModifySQL.Assign(dmTablaProveedores.sqlModificar); DeleteSQL.Assign(dmTablaProveedores.sqlEliminar); RefreshSQL.Assign(dmTablaProveedores.sqlConsultar); end; with TablaRepresentantes do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaRepresentantesProveedor.sqlGrid); InsertSQL.Assign(dmTablaRepresentantesProveedor.sqlInsertar); ModifySQL.Assign(dmTablaRepresentantesProveedor.sqlModificar); DeleteSQL.Assign(dmTablaRepresentantesProveedor.sqlEliminar); RefreshSQL.Assign(dmTablaRepresentantesProveedor.sqlConsultar); end; TablaRepresentantesMem.CopyStructure(TablaRepresentantes); dmTablaRepresentantesProveedor.InicializarGridRepresentantes(gridRepresentantesDBCardView); Paginas.ActivePageIndex := 0; bCancelar.Cancel := True; bSalir.Cancel := True; end; procedure TfrProveedor.SetCodigoProvincia(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoProvincia := Value; Provincia.DataBinding.Field.AsString := dmTablaProvincias.DarNombreProvincia(FCodigoProvincia); end; end; procedure TfrProveedor.SetCodigoPoblacion(Value: Variant); begin if (not EsCadenaVacia(Value)) then begin FCodigoPoblacion := Value; Poblacion.DataBinding.Field.AsString := dmTablaPoblaciones.darNombrePoblacion(FCodigoProvincia, FCodigoPoblacion); end; end; procedure TfrProveedor.bSalirClick(Sender: TObject); begin try Rollback; CloseFrame; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.bCancelarClick(Sender: TObject); begin if (TratarCambios = IDOK) then CloseFrame; end; function TfrProveedor.AnadirDatos : Boolean; begin Result := False; try TablaProveedores.Post; BorrarDatosRepresentantesIB; SalvarDatosRepresentantes; CodigoProveedor := TablaProveedores.FieldByName('CODIGO').AsString; dmTablaProveedores.IncrementarCodigo; Commit; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin VerMensajeFmt(msgProvCodProvRepetido, [Codigo.DataBinding.Field.AsString]); TablaProveedores.Edit; end else TratarExcepcion(E); end; on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.ModificarDatos : Boolean; begin Result := False; try TablaProveedores.Post; BorrarDatosRepresentantesIB; SalvarDatosRepresentantes; Commit; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.EliminarDatos : Boolean; begin Result := False; try TablaProveedores.Delete; Commit; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : VerMensajeFmt(msgProvProvBloqueado, [Codigo.DataBinding.Field.AsString]); isc_foreign_key : VerMensajeFmt(msgProvProvNoElim, [Codigo.DataBinding.Field.AsString]); else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.ActivarModoAnadir; var CodNuevo : Variant; begin dsProveedor.AutoEdit := True; dsRepresentantes.AutoEdit := True; pnlBarraGrid.Visible := True; ActivarEdicionGridDetalles(gridRepresentantes); Codigo.Properties.Buttons[0].Visible := False; Provincia.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := False; try with TablaProveedores do begin Close; Prepare; Open; FieldByName('PROVINCIA').OnSetText := ProvinciaSetText; Insert; FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('USUARIO').AsString := dmBaseDatos.Usuario; end; with TablaRepresentantes do begin Close; Prepare; Params.ByName('CODIGOPROVEEDOR').AsString := CodNuevo; Open; end; with TablaRepresentantesMem do begin Close; AfterInsert := RepresentantesMemAfterInsert; Open; end; CodNuevo := dmTablaProveedores.DarNuevoCodigo; Codigo.DataBinding.Field.asString := CodNuevo; Visible := True; NIF.SetFocus; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.ActivarModoModificar; begin dsProveedor.AutoEdit := True; dsRepresentantes.AutoEdit := True; pnlBarraGrid.Visible := True; Codigo.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := True; Poblacion.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; ActivarEdicionGridDetalles(gridRepresentantes); // Para que no haga dos accesos a la tabla cuando es consulta FCodigoProvincia := dmTablaProvincias.DarCodigoProvincia(Provincia.Text); try with TablaProveedores do begin Open; FieldByName('PROVINCIA').OnSetText := ProvinciaSetText; if RecordCount = 0 then begin VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]); CancelarModificar; CloseFrame; Exit; end; Edit; Post; Edit; end; with TablaRepresentantes do begin Close; Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString; Prepare; Open; end; with TablaRepresentantesMem do begin Close; Open; CargarDatosRepresentantes; AfterInsert := RepresentantesMemAfterInsert; if not IsEmpty then Edit; end; // Bloquear las sucursales with TablaRepresentantes do begin if RecordCount > 0 then begin Edit; Post; Edit; end; end; Visible := True; NIF.SetFocus; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : begin VerMensajeFmt(msgProvProvBloqueado, [CodigoProveedor]); CancelarModificar; CloseFrame; Exit; end else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.ActivarModoConsultar; begin dsProveedor.AutoEdit := False; dsRepresentantes.AutoEdit := False; pnlBarraGrid.Visible := False; Codigo.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; try with TablaProveedores do begin Open; if RecordCount = 0 then begin VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]); CloseFrame; Exit; end; Cancel; end; with TablaRepresentantes do begin Close; Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString; Prepare; Open; end; with TablaRepresentantesMem do begin Close; Open; CargarDatosRepresentantes; end; Visible := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.ActivarModoEliminar; begin dsProveedor.AutoEdit := False; dsRepresentantes.AutoEdit := False; pnlBarraGrid.Visible := False; Codigo.Properties.Buttons[0].Visible := True; Provincia.Properties.Buttons[0].Visible := False; Poblacion.Properties.Buttons[0].Visible := False; try with TablaProveedores do begin Open; if RecordCount = 0 then begin VerMensajeFmt(msgProvNoExisteProv, [CodigoProveedor]); CancelarEliminar; CloseFrame; Exit; end; Cancel; end; with TablaRepresentantes do begin Close; Params.ByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString; Prepare; Open; end; with TablaRepresentantesMem do begin Close; Open; CargarDatosRepresentantes; end; Visible := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.CodigoExit(Sender: TObject); begin if (Modo <> Anadir) or (Visible = false) then exit; if not esCadenaVacia(Codigo.Text) then begin if (dmTablaProveedores.validarCodigo(Codigo.Text)) then begin Codigo.DataBinding.Field.AsString := dmTablaProveedores.formatearCodigo(Codigo.Text); if (dmTablaProveedores.existeCodigo(Codigo.Text)) then begin VerMensajeFmt(msgProvCodProvRepetido, [Codigo.Text]); Codigo.SetFocus; end; end else begin VerMensajeFmt(msgProvCodProvIncorrecto, [Codigo.Text]); Codigo.SetFocus; end; end else Codigo.DataBinding.Field.AsString := dmTablaProveedores.darNuevoCodigo; end; destructor TfrProveedor.Destroy; begin gridRepresentantesDBCardView.DataController.DataSource := NIL; TablaRepresentantesMem.Close; TablaRepresentantesMem.Free; TablaRepresentantes.Close; TablaRepresentantes.UnPrepare; TablaRepresentantes.Free; TablaProveedores.Close; TablaProveedores.UnPrepare; TablaProveedores.Free; inherited; end; procedure TfrProveedor.bAceptarClick(Sender: TObject); begin if (RealizarOperacion) then CloseFrame; end; procedure TfrProveedor.FreeContenido; begin if (ContenidoModal is TRdxFrameProveedores) then begin CodigoProveedor := (ContenidoModal as TRdxFrameProveedores).CodigoProveedor; ActivarModo; end; if (ContenidoModal is TRdxFrameProvincias) then CodigoProvincia := (ContenidoModal as TRdxFrameProvincias).CodigoProvincia; if (ContenidoModal is TRdxFramePoblaciones) then begin CodigoProvincia := (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia; CodigoPoblacion := (ContenidoModal as TRdxFramePoblaciones).CodigoPoblacion; end; inherited FreeContenido; end; procedure TfrProveedor.VerModal; begin if (ContenidoModal is TRdxFramePoblaciones) then (ContenidoModal as TRdxFramePoblaciones).CodigoProvincia := FCodigoProvincia; inherited; end; procedure TfrProveedor.BuscarProveedor; begin if Transaccion = NIL then Exit; try TablaProveedores.Close; // Buscar la fila a tratar si es necesario if not EsCadenaVacia(CodigoProveedor) then begin TablaProveedores.Params.ByName('CODIGO').AsString := CodigoProveedor; TablaRepresentantes.Params.ByName('CODIGOPROVEEDOR').AsString := CodigoProveedor; end; TablaProveedores.Prepare; TablaRepresentantes.Prepare; TablaProveedores.Open; TablaRepresentantes.Open; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.CancelarAnadir: Boolean; begin Result := False; try RollBack; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.CancelarEliminar: Boolean; begin Result := False; try RollBack; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.CancelarModificar: Boolean; begin Result := False; try RollBack; TablaProveedores.Close; TablaRepresentantes.Close; TablaRepresentantesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrProveedor.ComprobarDatos: Boolean; begin Result := False; if EsCadenaVacia(Nombre.Text) then begin VerMensaje(msgProvFaltaNombreProv); Nombre.SetFocus; Exit; end; Result := True; end; procedure TfrProveedor.DescuentoExit(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then Exit; try ValidarDto(Descuento.Text); except on E : Exception do begin Descuento.SetFocus; VerMensaje(E.Message); end; end; end; procedure TfrProveedor.ProvinciaSetText(Sender: TField; const Text: String); begin FCodigoProvincia := dmTablaProvincias.darCodigoProvincia(Text); Sender.AsString := Text; end; procedure TfrProveedor.CodigoPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin if (TratarCambios = IDCANCEL) then exit; { Esto es porque en modo 'Modificar' hacemos un cambio y pulsamos este botón se cierra la tabla y si en el frame hijo (el del grid) damos a cancelar, FCodigoProveedor es NULL y da error al activar modo porque no se inicializa los parámetros de la sql. Lo hace BuscarProveedor. } if not TablaProveedores.Active then BuscarProveedor; ContenidoModal := TfrProveedores.Create(Self); end; procedure TfrProveedor.ProvinciaPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin CaptionModal := msgListaProvincias; WidthModal := 280; HeightModal := 460; ContenidoModal := TfrProvincias.Create(Self); end; procedure TfrProveedor.PoblacionPropertiesButtonClick(Sender: TObject; AButtonIndex: Integer); begin if (EsCadenaVacia(CodigoProvincia)) then begin VerMensaje(msgSinProvincia); Provincia.SetFocus; Exit; end; CaptionModal := Format(msgListaPoblaciones, [dmTablaProvincias.DarNombreProvincia(CodigoProvincia)]); WidthModal := 280; HeightModal := 460; ContenidoModal := TfrPoblaciones.Create(Self); end; procedure TfrProveedor.dsRepresentantesStateChange(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then Exit; bEliminar.Enabled := not (TablaRepresentantesMem.RecordCount = 0); bEliminarTodo.Enabled := not (TablaRepresentantesMem.RecordCount = 0); end; procedure TfrProveedor.RepresentantesMemAfterInsert(DataSet: TDataSet); begin with DataSet do begin FieldByName('CODIGOPROVEEDOR').AsString := Codigo.DataBinding.Field.AsString; FieldByName('CODIGO').AsString := '-'; end; end; procedure TfrProveedor.BorrarDatosRepresentantesIB; begin with TablaRepresentantes do begin if IsEmpty then Exit; Last; while not BOF do begin Delete; Prior; end; if not IsEmpty then Delete; end; end; procedure TfrProveedor.CargarDatosRepresentantes; var iContador : Integer; begin with TablaRepresentantesMem do begin if TablaRepresentantes.IsEmpty then exit; DisableControls; TablaRepresentantes.First; while not TablaRepresentantes.EOF do begin Append; for iContador := 0 to TablaRepresentantes.FieldCount-1 do Fields[iContador].Value := TablaRepresentantes.Fields[iContador].Value; Post; TablaRepresentantes.Next; end; First; EnableControls; end; end; procedure TfrProveedor.SalvarDatosRepresentantes; var NumeroCampo : Integer; NumeroRepresentante : Integer; Valor : Variant; begin NumeroRepresentante := 1; try with TablaRepresentantesMem do begin if IsEmpty then Exit; DisableControls; First; TablaRepresentantes.First; while not EOF do begin TablaRepresentantes.Insert; for NumeroCampo := 0 to FieldCount-1 do begin Valor := Fields[NumeroCampo].AsVariant; if (TablaRepresentantes.Fields[NumeroCampo].FieldName = 'FECHAALTA') and (EsCadenaVacia(Valor)) then Valor := dmBaseDatos.DarFecha; if (TablaRepresentantes.Fields[NumeroCampo].FieldName = 'USUARIO') and (EsCadenaVacia(Valor)) then Valor := dmBaseDatos.Usuario; if TablaRepresentantes.Fields[NumeroCampo].FieldName = 'CODIGOPROVEEDOR' then Valor := TablaProveedores.FieldByName('CODIGO').AsString; if TablaRepresentantes.Fields[NumeroCampo].FieldName = 'CODIGO' then Valor := NumeroRepresentante; TablaRepresentantes.Fields[NumeroCampo].AsVariant := Valor; end; TablaRepresentantes.Post; Inc(NumeroRepresentante); Next; end; EnableControls; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.bAnadirClick(Sender: TObject); begin try Paginas.ActivePageIndex := 1; gridRepresentantes.SetFocus; with TablaRepresentantesMem do begin Append; Post; Edit; FieldByName('NOMBRE').FocusControl; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.bEliminarClick(Sender: TObject); begin if TablaRepresentantesMem.RecordCount = 0 then begin { Hacemos un cancel de la tabla por si el registro actual estuviera recien creado } TablaRepresentantesMem.Cancel; exit; end; try if (VerMensajePregunta(msgProvBorrarRepresentante) <> IDYES) then Exit; TablaRepresentantesMem.Delete; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.bEliminarTodoClick(Sender: TObject); begin if (VerMensajePregunta(msgProvBorrarRepresentantes) <> IDYES) then Exit; try with TablaRepresentantesMem do begin DisableControls; Last; while RecordCount > 0 do begin Delete; Prior; end; EnableControls; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrProveedor.gridRepresentantesResize(Sender: TObject); begin gridRepresentantesDBCardView.OptionsView.CardWidth := (gridRepresentantes.Width - 40) div 2; end; procedure TfrProveedor.gridRepresentantesDBCardViewKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssCtrl in Shift) and (Key = VK_DELETE) and (Modo in [Anadir, Modificar]) then bEliminar.Click; end; end.