unit uViewDetallesMontaje; 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 TfrViewDetallesMontaje = 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, uDetallesMontajeController; procedure TfrViewDetallesMontaje.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 IDetallesMontajeController).addCapitulo(Detalles); finally cxGridView.EndUpdate; end; end; procedure TfrViewDetallesMontaje.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 TfrViewDetallesMontaje.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 TfrViewDetallesMontaje.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 TfrViewDetallesMontaje.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 TfrViewDetallesMontaje.HayQueRecalcular(AItem: TcxCustomGridTableItem): Boolean; begin Result := inherited HayQueRecalcular(AItem); Result := Result or (AItem = cxGridViewDESCUENTO); end; end.