unit uViewDetalleReservas; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxPreview, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, ActnList, uDADataTable, cxGridLevel, cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, StdCtrls, ExtCtrls, cxLabel, dxPSGlbl, dxPSUtl, dxPSEngn, dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider, dxPSFillPatterns, dxPSEdgePatterns, cxIntlPrintSys3, dxPSCore, dxPScxCommon, dxPScxGrid6Lnk, cxImage, cxImageComboBox, ImgList, PngImageList, cxTextEdit, Grids, DBGrids, cxDBLookupComboBox, cxButtonEdit, cxGridCustomPopupMenu, cxGridPopupMenu, uViewGrid, uBizInventario, uBizAlmacenes, cxSpinEdit, uViewFiltroBase, TB2Item, TBX, TB2Toolbar, TBXDkPanels, TB2Dock, dxPgsDlg, cxCurrencyEdit, uAlmacenesController, uDAInterfaces, cxContainer, cxMaskEdit, cxDropDownEdit, uCustomView, uViewBase; type IViewDetalleReservas = interface(IViewGrid) ['{4417F53A-5BB1-4B99-8760-4C0E1D449582}'] function GetDetalleReservas: IBizDetalleReservas; procedure SetDetalleReservas(const Value: IBizDetalleReservas); property DetalleReservas: IBizDetalleReservas read GetDetalleReservas write SetDetalleReservas; function GetAlmacenes: TStringList; procedure SetAlmacenes(const Value: TStringList); property Almacenes: TStringList read GetAlmacenes write SetAlmacenes; function GetObras: TStringList; procedure SetObras(const Value: TStringList); property Obras: TStringList read GetObras write SetObras; function DarIDAlmacenObraSeleccionada: Variant; function ListaAlmacenesObrasVacia: Boolean; function GetIdAlmacenObra: Integer; procedure SetAlmacenObra(const Value: Integer); property IdAlmacenObra: Integer read GetIdAlmacenObra write SetAlmacenObra; end; TfrViewDetalleReservas = class(TfrViewGrid, IViewDetalleReservas) cxGridDBTableView1: TcxGridDBTableView; PngImageList: TPngImageList; cxStyleArticuloSinStock: TcxStyle; cxGridViewRecID: TcxGridDBColumn; cxGridViewFECHA_RESERVA: TcxGridDBColumn; cxGridViewCAUSA_RESERVA: TcxGridDBColumn; cxGridViewID_ALMACEN: TcxGridDBColumn; cxGridViewALMACEN: TcxGridDBColumn; cxGridViewID_ARTICULO: TcxGridDBColumn; cxGridViewFAMILIA: TcxGridDBColumn; cxGridViewREFERENCIA: TcxGridDBColumn; cxGridViewDESCRIPCION: TcxGridDBColumn; cxGridViewCANTIDAD: TcxGridDBColumn; cxGridViewUNIDAD_MEDIDA: TcxGridDBColumn; cxGridViewFABRICANTE: TcxGridDBColumn; cxGridViewREFERENCIA_FABR: TcxGridDBColumn; cxGridViewID_ALMACEN_RESERVA: TcxGridDBColumn; cxGridViewALMACEN_RESERVA: TcxGridDBColumn; pnlAlmacenes: TPanel; eAlmacen: TLabel; cxListaAlmacenesObras: TcxComboBox; procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); procedure cxListaAlmacenesObrasPropertiesEditValueChanged(Sender: TObject); procedure CustomViewShow(Sender: TObject); private //Filtros relativos a la vista procedure AnadirFiltroAlmacenesObras; protected FIdAlmacenObra: Integer; FAlmacenes: TStringList; FObras: TStringList; FDetalleReservas: IBizDetalleReservas; function GetIdAlmacenObra: Integer; procedure SetAlmacenObra(const Value: Integer); function GetAlmacenes: TStringList; procedure SetAlmacenes(const Value: TStringList); function GetObras: TStringList; procedure SetObras(const Value: TStringList); function GetDetalleReservas: IBizDetalleReservas; procedure SetDetalleReservas(const Value: IBizDetalleReservas); // FAlmacenesController: IAlmacenesController; // function GetAlmacenes: IBizAlmacen; // procedure SetAlmacenes(const Value: IBizAlmacen); public property IdAlmacenObra: Integer read GetIdAlmacenObra write SetAlmacenObra; property DetalleReservas: IBizDetalleReservas read GetDetalleReservas write SetDetalleReservas; procedure AnadirOtrosFiltros; override; // property Almacenes: IBizAlmacen read GetAlmacenes write SetAlmacenes; destructor Destroy; override; function DarIDAlmacenObraSeleccionada: Variant; function ListaAlmacenesObrasVacia: Boolean; end; implementation {$R *.dfm} uses uDataModuleInventario, schInventarioClient_Intf; procedure TfrViewDetalleReservas.AnadirFiltroAlmacenesObras; var FFiltro : TcxFilterCriteriaItemList; CodigoAlmacen: Variant; begin FFiltro := AddFilterGrid(fboAnd); CodigoAlmacen := DarIDAlmacenObraSeleccionada; if not VarIsNull(CodigoAlmacen) then begin FFiltro.AddItem(cxGridViewID_ALMACEN, foEqual, CodigoAlmacen, CodigoAlmacen); cxGridViewALMACEN.Visible := False; end else cxGridViewALMACEN.Visible := True; end; procedure TfrViewDetalleReservas.AnadirOtrosFiltros; begin inherited; AnadirFiltroAlmacenesObras; //Finalmente activamos el filtro si tenemos algo if cxGridView.DataController.Filter.IsEmpty then cxGridView.DataController.Filter.Active := False else cxGridView.DataController.Filter.Active := True; cxGrid.ActiveLevel.GridView := cxGridView; end; procedure TfrViewDetalleReservas.CustomViewShow(Sender: TObject); var i: Integer; begin inherited; //INV_ALMACENES if Assigned(FAlmacenes) then begin i := 0; while (i < FAlmacenes.Count) and (FAlmacenes.ValueFromIndex[i] <> IntToStr(IdAlmacenObra)) do Inc(i); if (FAlmacenes.ValueFromIndex[i] = IntToStr(IdAlmacenObra)) then cxListaAlmacenesObras.ItemIndex := i end //INV_OBRAS else if Assigned(FObras) then begin i := 0; while (i < FObras.Count) and (FObras.ValueFromIndex[i] <> IntToStr(IdAlmacenObra)) do Inc(i); if (FObras.ValueFromIndex[i] = IntToStr(IdAlmacenObra)) then cxListaAlmacenesObras.ItemIndex := i end else //En el caso de ser la vista para la selección de articulos de un determinado almacén pnlAlmacenes.Visible:= False; end; procedure TfrViewDetalleReservas.cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); {var IndiceCol: Integer; AStock: Variant;} begin inherited; { if Assigned(ARecord) then begin IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName(fld_DetalleReservasSTOCK).Index; AStock := ARecord.DisplayTexts[IndiceCol]; if (AStock < 0) then AStyle := cxStyleArticuloSinStock; end; } end; procedure TfrViewDetalleReservas.cxListaAlmacenesObrasPropertiesEditValueChanged(Sender: TObject); begin inherited; RefrescarFiltro; end; function TfrViewDetalleReservas.DarIDAlmacenObraSeleccionada: Variant; begin Result := Null; if VarIsNull(cxListaAlmacenesObras.EditValue) then Exit; //INV_ALMACENES if Assigned(FAlmacenes) then Result := FAlmacenes.Values[cxListaAlmacenesObras.EditValue] //INV_OBRAS else if Assigned(FObras) then Result := FObras.Values[cxListaAlmacenesObras.EditValue] else Raise Exception.Create('No se ha asignado ninguna lista de ALMACENES'); end; destructor TfrViewDetalleReservas.Destroy; begin FAlmacenes := Nil; FObras := Nil; FDetalleReservas := Nil; inherited; end; function TfrViewDetalleReservas.GetAlmacenes: TStringList; begin Result := FAlmacenes; end; function TfrViewDetalleReservas.GetDetalleReservas: IBizDetalleReservas; begin Result := FDetalleReservas; end; function TfrViewDetalleReservas.GetIdAlmacenObra: Integer; begin Result := FIDAlmacenObra; end; function TfrViewDetalleReservas.GetObras: TStringList; begin Result := FObras; end; function TfrViewDetalleReservas.ListaAlmacenesObrasVacia: Boolean; begin Result := (cxListaAlmacenesObras.Properties.Items.Count = 0); end; procedure TfrViewDetalleReservas.SetAlmacenes(const Value: TStringList); var Nivel: TcxGridLevel; i: integer; begin FAlmacenes := Value; eAlmacen.Caption := 'Almacén'; if Assigned(FAlmacenes) then begin cxGrid.BeginUpdate; try with cxListaAlmacenesObras.Properties.Items do begin BeginUpdate; try Clear; for i := 0 to FAlmacenes.Count - 1 do Add(FAlmacenes.Names[i]); finally EndUpdate; end; end; finally cxGrid.EndUpdate; end; end; end; procedure TfrViewDetalleReservas.SetAlmacenObra(const Value: Integer); begin FIDAlmacenObra := Value; end; procedure TfrViewDetalleReservas.SetDetalleReservas(const Value: IBizDetalleReservas); begin FDetalleReservas := Value; if Assigned(FDetalleReservas) then dsDataSource.DataTable := FDetalleReservas.DataTable else dsDataSource.DataTable := Nil; end; procedure TfrViewDetalleReservas.SetObras(const Value: TStringList); var Nivel: TcxGridLevel; i: integer; begin FObras := Value; eAlmacen.Caption := 'Obra'; if Assigned(FObras) then begin cxGrid.BeginUpdate; try with cxListaAlmacenesObras.Properties.Items do begin BeginUpdate; try Clear; for i := 0 to FObras.Count - 1 do Add(FObras.Names[i]); finally EndUpdate; end; end; finally cxGrid.EndUpdate; end; end; end; end.