unit ArticuloModelo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, DB, Dialogs, RdxFrameArticulos, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxEdit, cxDBData, Menus, am2000menuitem, am2000popupmenu, am2000, cxButtonEdit, cxDBEdit, cxMaskEdit, cxDropDownEdit, cxContainer, cxTextEdit, cxMemo, StdCtrls, cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView, cxGridCardView, cxGridDBCardView, cxGrid, AdvPanel, ExtCtrls, RdxBotones, RdxPaneles, RdxBarras, RdxTitulos, RxMemDS, Configuracion, IBCustomDataSet, IBQuery, cxDBLookupComboBox, cxLookupEdit, cxDBLookupEdit, ActnList, cxDataStorage; type TfrArticuloModelo = class(TRdxFrameArticulos) Titulo: TRdxPanelTituloOperacion; pnlCuerpo: TPanel; pnlPropiedades: TAdvPanel; pnlGridPropiedades: TPanel; gridPropiedades: TcxGrid; gridPropiedadesDBCardView: TcxGridDBCardView; gridPropiedadesLevel: TcxGridLevel; pnlBarraGrid: TPanel; bAnadir: TRdxBoton; bEliminar: TRdxBoton; bEliminarTodo: TRdxBoton; pnlDatos: TAdvPanel; eCodigoArticulo: TLabel; eDescripcion: TLabel; eFamilia: TLabel; Descripcion: TcxDBMemo; Codigo: TcxDBButtonEdit; brSimple: TRdxBarraInferior; bSalir: TRdxBoton; brDoble: TRdxBarraInferior; bAceptar: TRdxBoton; bCancelar: TRdxBoton; dsArticulo: TDataSource; dsPropiedades: TDataSource; dsPropiedadesAux: TDataSource; dsValoresAux: TDataSource; dsFamilias: TDataSource; cbxFamilia: TcxDBLookupComboBox; procedure bAceptarClick(Sender: TObject); procedure bCancelarClick(Sender: TObject); procedure bSalirClick(Sender: TObject); procedure gridPropiedadesResize(Sender: TObject); procedure CodigoPropertiesButtonClick(Sender: TObject;AButtonIndex: Integer); virtual; procedure CodigoExit(Sender: TObject); procedure actAnadirUpdate(Sender: TObject); procedure actEliminarTodoUpdate(Sender: TObject); procedure actEliminarUpdate(Sender: TObject); procedure bAnadirClick(Sender: TObject); procedure bEliminarClick(Sender: TObject); procedure bEliminarTodoClick(Sender: TObject); private FTablaPropiedadesMem : TRxMemoryData; procedure VALORGetProperties( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties); protected FTablaFamilias : TIBDataSet; FTablaPropiedadesAux : TIBDataSet; FTablaValoresAux : TIBDataSet; // Metodos de detalle procedure EliminarTodo; procedure CargarDatosPropiedades; procedure BorrarDatosPropiedadesIB; procedure SalvarDatosPropiedades; procedure PropiedadesMemNewRecord(DataSet: TDataSet); procedure ActualizarBotones; procedure dsDetallesStateChange(Sender: TObject); 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 BuscarArticulo; override; procedure FreeContenido; override; procedure InicializarTablas; virtual; public constructor Create (AOwner : TComponent); override; destructor Destroy; override; published property TablaArticulos; property TablaPropiedades; property TablaPropiedadesMem : TRxMemoryData read FTablaPropiedadesMem write FTablaPropiedadesMem; property CodigoArticulo; end; var frArticuloModelo: TfrArticuloModelo; implementation uses TablaArticulos, BaseDatos, TablaPropiedadesArticulo, TablaPropiedades, IBErrorCodes, IB, Excepciones, Mensajes, Literales, StrFunc, RdxFrame, TablaFamilias, Entidades, ArticulosModelo, TablaValores; {$R *.dfm} { TfrArticuloModelo } procedure TfrArticuloModelo.ActivarModoAnadir; var CodNuevo : Variant; begin dsArticulo.AutoEdit := True; dsPropiedades.AutoEdit := True; pnlBarraGrid.Visible := True; ActivarEdicionGridDetalles(gridPropiedades); Codigo.Properties.Buttons[0].Visible := False; Codigo.Properties.ReadOnly := False; try CodNuevo := dmTablaArticulos.DarNuevoCodigo; with TablaArticulos do begin Close; Prepare; Open; Insert; FieldByName('CODIGO').AsString := CodNuevo; FieldByName('FECHAALTA').AsDateTime := dmBaseDatos.DarFecha; FieldByName('USUARIO').AsString := dmBaseDatos.Usuario; end; with TablaPropiedades do begin Close; Prepare; Params.ByName('CODIGOARTICULO').AsString := CodNuevo; Open; end; with TablaPropiedadesMem do begin Close; OnNewRecord := PropiedadesMemNewRecord; Open; end; Visible := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.ActivarModoConsultar; begin dsArticulo.AutoEdit := False; dsPropiedades.AutoEdit := False; pnlBarraGrid.Visible := False; DesactivarEdicionGridDetalles(gridPropiedades); Codigo.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; try with TablaArticulos do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgDatosNoExisteArt, [CodigoArticulo]); CloseFrame; Exit; end; Cancel; end; with TablaPropiedades do begin Close; Params.ByName('CODIGOARTICULO').AsString := Codigo.DataBinding.Field.asString; Prepare; Open; end; with TablaPropiedadesMem do begin Close; Open; CargarDatosPropiedades; end; Visible := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.ActivarModoEliminar; begin dsArticulo.AutoEdit := False; dsPropiedades.AutoEdit := False; pnlBarraGrid.Visible := False; DesactivarEdicionGridDetalles(gridPropiedades); Codigo.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; try with TablaArticulos do begin Prepare; Open; if RecordCount = 0 then begin VerMensajeFmt(msgDatosNoExisteArt, [CodigoArticulo]); CancelarEliminar; CloseFrame; Exit; end; Cancel; end; with TablaPropiedades do begin Close; Params.ByName('CODIGOARTICULO').AsString := Codigo.DataBinding.Field.asString; Prepare; Open; end; with TablaPropiedadesMem do begin Close; Open; CargarDatosPropiedades; end; Visible := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.ActivarModoModificar; begin dsArticulo.AutoEdit := True; dsPropiedades.AutoEdit := True; pnlBarraGrid.Visible := True; ActivarEdicionGridDetalles(gridPropiedades); Codigo.Properties.Buttons[0].Visible := True; Codigo.Properties.ReadOnly := True; try with TablaArticulos do begin Open; if RecordCount = 0 then begin VerMensajeFmt(msgDatosNoExisteArt, [CodigoArticulo]); CancelarModificar; CloseFrame; Exit; end; Edit; Post; Edit; end; with TablaPropiedades do begin Close; Params.ByName('CODIGOARTICULO').AsString := Codigo.DataBinding.Field.asString; Prepare; Open; end; with TablaPropiedadesMem do begin Close; Open; CargarDatosPropiedades; OnNewRecord := PropiedadesMemNewRecord; if not IsEmpty then Edit; end; // Bloquear las propiedades del artículo {with TablaPropiedades do begin if RecordCount > 0 then begin Edit; Post; Edit; end; end;} Visible := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : begin VerMensajeFmt(msgDatosArtBloqueado, [CodigoArticulo]); CancelarModificar; CloseFrame; Exit; end else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; function TfrArticuloModelo.AnadirDatos: Boolean; begin Result := False; try TablaArticulos.Post; //Tratamos detalle BorrarDatosPropiedadesIB; SalvarDatosPropiedades; dmTablaArticulos.IncrementarCodigo; CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString; Commit; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do begin if E.IBErrorCode = isc_unique_key_violation then begin VerMensajeFmt(msgDatosCodArtRepetido, [Codigo.DataBinding.Field.AsString]); TablaArticulos.Edit; TablaPropiedadesMem.Edit; end else begin TratarExcepcion(E); TablaArticulos.Edit; end; end; on E : Exception do begin TratarExcepcion(E); TablaArticulos.Edit; end; end; end; procedure TfrArticuloModelo.BuscarArticulo; begin if Transaccion = NIL then Exit; try TablaArticulos.DisableControls; TablaArticulos.Close; // Buscar la fila a tratar si es necesario if not EsCadenaVacia(CodigoArticulo) then begin TablaArticulos.Params.ByName('CODIGO').AsString := CodigoArticulo; //Asignamos el codigo de articulo TablaPropiedades.Params.ByName('CODIGOARTICULO').AsString := CodigoArticulo; end; TablaArticulos.Prepare; TablaPropiedades.Prepare; TablaArticulos.Open; TablaPropiedades.Open; TablaArticulos.EnableControls; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrArticuloModelo.CancelarAnadir: Boolean; begin Result := False; try RollBack; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrArticuloModelo.CancelarEliminar: Boolean; begin Result := False; try RollBack; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrArticuloModelo.CancelarModificar: Boolean; begin Result := False; try RollBack; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; function TfrArticuloModelo.ComprobarDatos: Boolean; var ListaPropiedades : TStringList; Indice : Integer; CurBookmark: string; begin Result := True; if EsCadenaVacia(Descripcion.Text) then begin VerMensaje(msgDatosFaltaDescripcionArt); Descripcion.SetFocus; Result := False; Exit; end; if EsCadenaVacia(cbxFamilia.Text) then begin VerMensaje(msgDatosFaltaFamilia); cbxFamilia.SetFocus; Result := False; Exit; end; ListaPropiedades := TStringList.Create; try with TablaPropiedadesMem, ListaPropiedades do begin DisableControls; CurBookmark := Bookmark; Last; while not BOF do begin if not ListaPropiedades.Find(FieldByName('CODIGOPROPIEDAD').AsString, Indice) then begin ListaPropiedades.Add(FieldByName('CODIGOPROPIEDAD').AsString); Sort; end else begin VerMensaje(msgDatosPropRepetida); Result := False; break; end; Prior; end end; finally ListaPropiedades.Free; TablaPropiedadesMem.Bookmark := CurBookmark; TablaPropiedadesMem.EnableControls; end; end; constructor TfrArticuloModelo.Create(AOwner: TComponent); begin inherited Create(AOwner); BaseDatos := dmBaseDatos.BD; Transaccion := dmBaseDatos.Transaccion; TablaArticulos := TIBDataSet.Create(Self); TablaPropiedades := TIBDataSet.Create(Self); TablaPropiedadesMem := TRxMemoryData.Create(Self); dsArticulo.DataSet := TablaArticulos; dsPropiedades.DataSet := TablaPropiedadesMem; InicializarTablas; TablaPropiedadesMem.CopyStructure(TablaPropiedades); FTablaFamilias := TIBDataSet.Create(Self); dsFamilias.DataSet := FTablaFamilias; with FTablaFamilias do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaFamilias.sqlConsultar); prepare; open; end; FTablaPropiedadesAux := TIBDataSet.Create(Self); dsPropiedadesAux.DataSet := FTablaPropiedadesAux; with FTablaPropiedadesAux do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SelectSQL.Assign(dmTablaPropiedades.sqlListaPropiedades); Open; end; FTablaValoresAux := TIBDataSet.Create(Self); dsValoresAux.DataSet := FTablaValoresAux; with FTablaValoresAux do begin Database := dmBaseDatos.BD; Transaction := dmBaseDatos.Transaccion; SelectSQL.Assign(dmTablaValores.sqlListaValores); end; dmTablaPropiedadesArticulo.InicializarGridPropiedadesArticulo(gridPropiedadesDBCardView); with TcxLookupComboBoxProperties(gridPropiedadesDBCardView.GetRowByFieldName('CODIGOPROPIEDAD').Properties) do ListSource := dsPropiedadesAux; gridPropiedadesDBCardView.GetRowByFieldName('VALOR').OnGetProperties := VALORGetProperties; bCancelar.Cancel := True; bSalir.Cancel := True; end; procedure TfrArticuloModelo.dsDetallesStateChange(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then Exit; ActualizarBotones; end; function TfrArticuloModelo.EliminarDatos: Boolean; begin Result := False; try TablaArticulos.Delete; Commit; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do begin case E.IBErrorCode of isc_lock_conflict : VerMensajeFmt(msgDatosArtBloqueado, [Codigo.DataBinding.Field.AsString]); else TratarExcepcion(E); end; end; on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.FreeContenido; begin if (ContenidoModal is TRdxFrameArticulos) then begin CodigoArticulo := (ContenidoModal as TRdxFrameArticulos).CodigoArticulo; ActivarModo; end; inherited FreeContenido; end; function TfrArticuloModelo.ModificarDatos: Boolean; begin Result := False; try BorrarDatosPropiedadesIB; SalvarDatosPropiedades; TablaArticulos.Post; Commit; TablaArticulos.Close; TablaPropiedades.Close; TablaPropiedadesMem.Close; Result := True; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.SalvarDatosPropiedades; var NumeroCampo : Integer; Valor : Variant; NumProp : Integer; begin try with TablaPropiedadesMem do begin if IsEmpty then Exit; DisableControls; First; TablaPropiedades.First; NumProp := 0; while not EOF do begin TablaPropiedades.Insert; for NumeroCampo := 0 to FieldCount-1 do begin Valor := Fields[NumeroCampo].AsVariant; if (Fields[NumeroCampo].FieldName = 'PROPIEDAD') and (EsCadenaVacia(Valor)) then raise Exception.Create(msgDatosFaltaDescripcionPro); if TablaPropiedades.Fields[NumeroCampo].FieldName = 'CODIGOARTICULO' then Valor := Codigo.DataBinding.Field.AsString; if TablaPropiedades.Fields[NumeroCampo].FieldName = 'NUMPROPIEDAD' then Valor := IntToStr(NumProp); TablaPropiedades.Fields[NumeroCampo].AsVariant := Valor; end; TablaPropiedades.Post; Inc(NumProp); Next; end; EnableControls; end; except on E : EIBError do begin TablaPropiedadesMem.EnableControls; raise; end; on E : Exception do begin TablaPropiedadesMem.EnableControls; raise; end; end; end; procedure TfrArticuloModelo.bSalirClick(Sender: TObject); begin try Rollback; CloseFrame; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.bCancelarClick(Sender: TObject); begin if (TratarCambios = IDOK) then CloseFrame; end; procedure TfrArticuloModelo.CodigoExit(Sender: TObject); begin if (Modo <> Anadir) or (Visible = false) then exit; if not esCadenaVacia(Codigo.Text) then begin if (dmTablaArticulos.validarCodigo(Codigo.Text)) then begin Codigo.DataBinding.Field.asString := dmTablaArticulos.formatearCodigo(Codigo.Text); if (dmTablaArticulos.ExisteCodigo(Codigo.Text)) then begin VerMensajeFmt(msgDatosCodArtRepetido, [Codigo.Text]); Codigo.SetFocus; end; end else begin VerMensajeFmt(msgDatosCodArtIncorrecto, [Codigo.Text]); Codigo.SetFocus; end; end else Codigo.DataBinding.Field.AsString := dmTablaArticulos.darNuevoCodigo; end; procedure TfrArticuloModelo.bAceptarClick(Sender: TObject); begin if (RealizarOperacion) then CloseFrame; end; procedure TfrArticuloModelo.gridPropiedadesResize(Sender: TObject); begin gridPropiedadesDBCardView.OptionsView.CardWidth := (gridPropiedades.Width - 50) div 2; end; procedure TfrArticuloModelo.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, FCodigoArticulo es NULL y da error al activar modo porque no se inicializa los parámetros de la sql. Lo hace BuscarInstalador. } if not TablaArticulos.Active then BuscarArticulo; ContenidoModal := TfrArticulosModelo.Create(Self); end; procedure TfrArticuloModelo.EliminarTodo; begin try with TablaPropiedadesMem 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 TfrArticuloModelo.BorrarDatosPropiedadesIB; begin with TablaPropiedades do begin if (RecordCount = 0) then Exit; Last; while not BOF do begin Delete; Prior; end; if not IsEmpty then Delete; end; end; procedure TfrArticuloModelo.CargarDatosPropiedades; var iContador : Integer; begin with TablaPropiedadesMem do begin if TablaPropiedades.IsEmpty then exit; DisableControls; TablaPropiedades.First; while not TablaPropiedades.EOF do begin Append; for iContador := 0 to TablaPropiedades.FieldCount-1 do Fields[iContador].Value := TablaPropiedades.Fields[iContador].Value; Post; TablaPropiedades.Next; end; First; EnableControls; end; end; destructor TfrArticuloModelo.Destroy; begin TablaArticulos.Close; TablaArticulos.UnPrepare; TablaArticulos.Free; TablaPropiedades.Close; TablaPropiedades.UnPrepare; TablaPropiedades.Free; TablaPropiedadesMem.Close; TablaPropiedadesMem.Free; FTablaFamilias.Close; FTablaFamilias.UnPrepare; FTablaFamilias.Free; FTablaPropiedadesAux.Close; FTablaPropiedadesAux.UnPrepare; FTablaPropiedadesAux.Free; FTablaValoresAux.Close; FTablaValoresAux.UnPrepare; FTablaValoresAux.Free; inherited; end; procedure TfrArticuloModelo.InicializarTablas; begin Entidad := entArticuloModelo; dmTablaArticulos.ArtModelo := entArticuloModelo; with TablaArticulos do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaArticulos.sqlConsultarArtModelo); InsertSQL.Assign(dmTablaArticulos.sqlInsertarArtModelo); ModifySQL.Assign(dmTablaArticulos.sqlModificarArtModelo); DeleteSQL.Assign(dmTablaArticulos.sqlEliminarArtModelo); RefreshSQL.Assign(dmTablaArticulos.sqlConsultarArtModelo); end; with TablaPropiedades do begin Database := BaseDatos; Transaction := Transaccion; SelectSQL.Assign(dmTablaPropiedadesArticulo.sqlGridProArtModelo); InsertSQL.Assign(dmTablaPropiedadesArticulo.sqlInsertarProArtModelo); ModifySQL.Assign(dmTablaPropiedadesArticulo.sqlModificarProArtModelo); DeleteSQL.Assign(dmTablaPropiedadesArticulo.sqlEliminarProArtModelo); RefreshSQL.Assign(dmTablaPropiedadesArticulo.sqlConsultarProArtModelo); end; end; procedure TfrArticuloModelo.ActualizarBotones; begin bEliminar.Enabled := not (TablaPropiedadesMem.RecordCount = 0); bEliminarTodo.Enabled := not (TablaPropiedadesMem.RecordCount = 0); end; procedure TfrArticuloModelo.VALORGetProperties( Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AProperties: TcxCustomEditProperties); begin if not Sender.Focused then begin AProperties := TcxTextEditProperties.Create(Self); //dmConfiguracion.ItemEdit.Properties; end else begin with FTablaValoresAux do begin try DisableControls; Close; // ¿Tiene 'copia'? if FTablaPropiedadesAux.FieldByName('COPIA').AsVariant <> NULL then ParamByName('CODIGOPROPIEDAD').AsInteger := FTablaPropiedadesAux.FieldByName('COPIA').AsInteger else // No tiene 'copia' ParamByName('CODIGOPROPIEDAD').AsInteger := TablaPropiedadesMem.FieldByName('CODIGOPROPIEDAD').AsInteger; Prepare; Open; if RecordCount = 0 then begin AProperties := TcxTextEditProperties.Create(Self);//dmConfiguracion.ItemEdit.Properties; EnableControls; Exit; end; AProperties := TcxLookupComboBoxProperties.Create(Self); with TcxLookupComboBoxProperties(AProperties) do begin DropDownListStyle := lsEditList; ImmediatePost := True; KeyFieldNames := 'DESCRIPCION'; ListColumns.Clear; ListColumns.Add.FieldName := 'DESCRIPCION'; ListOptions.AnsiSort := True; ListOptions.GridLines := glNone; ListOptions.ShowHeader := False; ListSource := dsValoresAux; end; finally EnableControls; end; end; end; end; procedure TfrArticuloModelo.PropiedadesMemNewRecord(DataSet: TDataSet); begin with DataSet do begin FieldByName('CODIGOARTICULO').AsString := Codigo.DataBinding.Field.AsString; end; end; procedure TfrArticuloModelo.actAnadirUpdate(Sender: TObject); begin (Sender as TAction).Enabled := not BaseDatos.IsReadOnly; end; procedure TfrArticuloModelo.actEliminarTodoUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaPropiedadesMem.RecordCount = 0); end; procedure TfrArticuloModelo.actEliminarUpdate(Sender: TObject); begin if not (Modo in [Anadir, Modificar]) then (Sender as TAction).Enabled := False else (Sender as TAction).Enabled := not (TablaPropiedadesMem.RecordCount = 0); end; procedure TfrArticuloModelo.bAnadirClick(Sender: TObject); begin try gridPropiedades.SetFocus; with TablaPropiedadesMem do begin Append; FieldByName('CODIGOPROPIEDAD').FocusControl; end; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.bEliminarClick(Sender: TObject); begin if TablaPropiedadesMem.RecordCount = 0 then begin { Hacemos un cancel de la tabla por si el registro actual estuviera recien creado } TablaPropiedadesMem.Cancel; Exit; end; try if (VerMensajePregunta(msgDatosBorrarPropiedad) <> IDYES) then Exit; TablaPropiedadesMem.Delete; except on E : EIBError do TratarExcepcion(E); on E : Exception do TratarExcepcion(E); end; end; procedure TfrArticuloModelo.bEliminarTodoClick(Sender: TObject); begin if (VerMensajePregunta(msgDatosBorrarPropiedades) = IDYES) then EliminarTodo; end; end.