unit uViewDetallesPresupuesto; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uViewDetallesBase, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, ImgList, PngImageList, uDADataTable, ActnList, ComCtrls, ToolWin, cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, cxImageComboBox, cxTextEdit, cxMaskEdit, cxCheckBox, cxCurrencyEdit, Grids, DBGrids, StdCtrls, ExtCtrls, cxRichEdit, StdActns, ExtActns, JvExStdCtrls, JvCombobox, JvColorCombo, TB2Item, TBX, TB2Dock, TB2Toolbar, cxSpinEdit, Menus; type TfrViewDetallesPresupuesto = class(TfrViewDetallesBase) cxGridViewDESCUENTO: TcxGridDBColumn; actAnadirCapitulo: TAction; TBXItem12: TTBXItem; procedure cxGridViewTIPOPropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); procedure actSubirUpdate(Sender: TObject); procedure actBajarUpdate(Sender: TObject); procedure actAnadirCapituloExecute(Sender: TObject); protected function HayQueRecalcular(AItem: TcxCustomGridTableItem): Boolean; override; function EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean; override; end; implementation {$R *.dfm} uses uControllerDetallesBase, uDetallesPresupuestoController; procedure TfrViewDetallesPresupuesto.actAnadirCapituloExecute(Sender: TObject); begin cxGridView.BeginUpdate; try if cxGridView.Controller.EditingController.IsEditing then cxGridView.Controller.EditingController.Edit.PostEditValue; if Assigned(Controller) and Assigned(Detalles) then (Controller as IDetallesPresupuestoController).addCapitulo(Detalles); finally cxGridView.EndUpdate; end; end; procedure TfrViewDetallesPresupuesto.actBajarUpdate(Sender: TObject); begin inherited; if (Sender as TAction).Enabled then (Sender as TAction).Enabled := ((cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_DTO) and (cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_SUBTOTAL)); end; procedure TfrViewDetallesPresupuesto.actSubirUpdate(Sender: TObject); begin inherited; if (Sender as TAction).Enabled then (Sender as TAction).Enabled := ((cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_DTO) and (cxGridViewTIPO.DataBinding.Field.Value <> TIPO_DETALLE_SUBTOTAL)); end; procedure TfrViewDetallesPresupuesto.cxGridViewTIPOPropertiesValidate( Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); var liPosicion: Integer; begin inherited; //Recogemos la posición del registro que cambia su tipo y //validamos que si es de tipo Descuento el registro inmediatamente //anterior debe ser de tipo subtotal if (DisplayValue = TIPO_DETALLE_DTO) then begin liPosicion := cxGridViewPOSICION.DataBinding.Field.Value; Dec(liPosicion); if (Controller.getTipo(Detalles, liPosicion) <> TIPO_DETALLE_SUBTOTAL) then begin ErrorText := 'Una linea de descuento solo puede ir despues de un final de capítulo'; Error := True end; end; end; function TfrViewDetallesPresupuesto.EsTipoEditable(AItem: TcxCustomGridTableItem): Boolean; var IndiceColTipo : Integer; IndiceColDto : Integer; IndiceColConcepto : Integer; begin Result := inherited EsTipoEditable(AItem); if Result then begin IndiceColTipo := cxGridView.GetColumnByFieldName(CAMPO_TIPO).Index; IndiceColDto := cxGridView.GetColumnByFieldName(CAMPO_DESCUENTO).Index; IndiceColConcepto := cxGridView.GetColumnByFieldName(CAMPO_CONCEPTO).Index; if (AItem.GridView.Items[IndiceColTipo].EditValue = TIPO_DETALLE_DTO) then begin if (AItem.Index > IndiceColConcepto) and (AItem.Index <> IndiceColDto) then Result := False; end else begin if (AItem.Index = IndiceColDto) then Result := False; end; end; end; function TfrViewDetallesPresupuesto.HayQueRecalcular(AItem: TcxCustomGridTableItem): Boolean; begin Result := inherited HayQueRecalcular(AItem); Result := Result or (AItem = cxGridViewDESCUENTO); end; end.