AlonsoYSal_FactuGES2/Source/GUIBase/uViewGridBase.pas
roberto d2aa26662f Version 2.2.3:
- a partir de ahora se añade en los asientos de caja y banco la referencia de la factura de proveedor y su nombre, además de la referencia de la factura de proveedor en FactuGES
- se añade columna de procedencia en presupuestos, facturas de cliente.
- se añade la posibilidad de filtrar por dos campos a la vez en clientes, presupuestos y facturas

git-svn-id: https://192.168.0.254/svn/Proyectos.AlonsoYSal_FactuGES2/trunk@28 40301925-124e-1c4e-b97d-170ad7a8785b
2022-03-31 09:03:49 +00:00

596 lines
17 KiB
ObjectPascal

{*******************************************************}
{ }
{ Administración de puntos de venta }
{ }
{ Copyright (C) 2006 Rodax Software S.L. }
{ }
{*******************************************************}
unit uViewGridBase;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uViewBase, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, uDADataTable, cxGridLevel,
cxClasses, cxControls, cxGridCustomView, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxGrid, Menus, ActnList, Grids,
DBGrids, JvComponent, JvFormAutoSize, uGridUtils, uViewFiltroBase, uDAInterfaces;
type
IViewGridBase = interface(IViewBase)
['{D5B9B017-2A2E-44AC-8223-E54664C6BC66}']
procedure ExpandirTodo;
procedure ContraerTodo;
procedure AjustarAncho;
procedure Preview;
procedure Print;
procedure PrintSetup;
function IsEmpty : Boolean;
procedure SaveGridStatus;
procedure RestoreGridStatus;
procedure GotoFirst;
procedure GotoLast;
procedure ExportToExcel(const AFileName: string); overload;
procedure ExportToExcel; overload;
function GetFocusedView : TcxGridDBTableView;
property _FocusedView : TcxGridDBTableView read GetFocusedView;
function GetGrid : TcxGrid;
property _Grid : TcxGrid read GetGrid;
procedure RestoreFromIniFile;
procedure StoreToIniFile;
procedure SetDblClick(const Value: TNotifyEvent);
function GetDblClick: TNotifyEvent;
property OnDblClick: TNotifyEvent read GetDblClick write SetDblClick;
procedure SetPopupMenu(const Value: TPopupMenu);
function GetPopupMenu: TPopupMenu;
property PopupMenu: TPopupMenu read GetPopupMenu write SetPopupMenu;
function GetMultiSelect: Boolean;
procedure SetMultiSelect(const Value: Boolean);
property MultiSelect : Boolean read GetMultiSelect write SetMultiSelect;
procedure SetFilter(const Value: string);
function GetFilter: string;
property Filter: string read GetFilter write SetFilter;
procedure SetFilter2(const Value: string);
function GetFilter2: string;
property Filter2: string read GetFilter2 write SetFilter2;
function GetFiltered: Boolean;
property Filtered : Boolean read GetFiltered;
function GetViewFiltros: IViewFiltroBase;
procedure SetViewFiltros(const Value: IViewFiltroBase);
property ViewFiltros: IViewFiltroBase read GetViewFiltros write SetViewFiltros;
function EsSeleccionCeldaDatos: Boolean;
function GetNumSeleccionados: Integer;
property NumSeleccionados: Integer read getNumSeleccionados;
{function Locate(const AItemIndex: Integer; const AValue: String;
const APartialCompare: Boolean = False) : Boolean;}
end;
TfrViewGridBase = class(TfrViewBase, IViewGridBase)
dsDataSource: TDADataSource;
private
FViewFiltros: IViewFiltroBase;
FFilter: string;
FFilter2: string;
FOnFilterChanged : TNotifyEvent;
FGridStatus : TcxGridStatus;
procedure BestFitAllColumns;
protected
FOnDblClick: TNotifyEvent;
FPopupMenu: TPopupMenu;
function GetMultiSelect: Boolean; virtual;
procedure SetMultiSelect(const Value: Boolean); virtual;
procedure SetPopupMenu(const Value: TPopupMenu); virtual;
function GetPopupMenu: TPopupMenu; virtual;
procedure SetDblClick(const Value: TNotifyEvent); virtual;
function GetDblClick: TNotifyEvent; virtual;
function GetGrid : TcxGrid; virtual; abstract;
function GetFocusedView : TcxGridDBTableView; virtual; abstract;
function EsSeleccionCeldaDatos: Boolean; virtual; abstract;
function getNumSeleccionados: Integer;
procedure SetFilter(const Value: string); virtual;
procedure SetFilter2(const Value: string); virtual;
procedure RefrescarFiltro;
function GetFilter: string; virtual;
function GetFilter2: string; virtual;
function GetFiltered: Boolean; virtual;
function GetViewFiltros: IViewFiltroBase;
procedure SetViewFiltros(const Value: IViewFiltroBase); virtual;
procedure FilterChanged(Sender : TObject); virtual;
procedure FiltrarGrid(TextoFiltro : String); overload; virtual;
procedure FiltrarGrid(TextoFiltro1, TextoFiltro2: String); overload; virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ShowEmbedded(const AParent : TWinControl); override;
procedure ExpandirTodo; virtual;
procedure ContraerTodo; virtual;
procedure AjustarAncho; virtual;
procedure Preview; virtual;
procedure Print; virtual;
procedure PrintSetup; virtual;
function IsEmpty : Boolean; virtual;
procedure SaveGridStatus;
procedure RestoreGridStatus;
procedure GotoFirst;
procedure GotoLast;
procedure ExportToExcel(const AFileName: string); overload;
procedure ExportToExcel; overload;
procedure StoreToRegistry (const Path : String); virtual;
procedure RestoreFromRegistry (const Path : String); virtual;
procedure RestoreFromIniFile;
procedure StoreToIniFile;
{function Locate(const AItemIndex: Integer; const AValue: String;
const APartialCompare: Boolean = False) : Boolean;}
property Filter: string read GetFilter write SetFilter;
property Filter2: string read GetFilter2 write SetFilter2;
property Filtered : Boolean read GetFiltered;
procedure AnadirOtrosFiltros; virtual;
property ViewFiltros: IViewFiltroBase read GetViewFiltros write SetViewFiltros;
property _FocusedView : TcxGridDBTableView read GetFocusedView;
property _Grid : TcxGrid read GetGrid;
property OnDblClick: TNotifyEvent read GetDblClick write SetDblClick;
property PopupMenu: TPopupMenu read GetPopupMenu write SetPopupMenu;
property MultiSelect : Boolean read GetMultiSelect write SetMultiSelect;
property NumSeleccionados: Integer read getNumSeleccionados;
end;
procedure Register;
implementation
uses
uDMBase, uDBSelectionListUtils, uSistemaFunc, SHFolder,
uAppInfoUtils, cxGridExportLink;
{$R *.dfm}
procedure Register;
begin
//RegisterCustomContainer(TfrViewGridBase);
end;
{ TfrViewGrid }
procedure TfrViewGridBase.BestFitAllColumns;
var
i : Integer ;
begin
ShowHourglassCursor;
_FocusedView.BeginUpdate;
try
AsignarAnchosPrefijadosAColumnas(_FocusedView);
for i := 0 to _FocusedView.VisibleColumnCount-1 do
begin
_FocusedView.VisibleColumns[i].ApplyBestFit;
if (_FocusedView.VisibleColumns[i].BestFitMaxWidth > 0) and
(_FocusedView.VisibleColumns[i].Width > _FocusedView.VisibleColumns[i].BestFitMaxWidth) then
_FocusedView.VisibleColumns[i].Width := _FocusedView.VisibleColumns[i].BestFitMaxWidth;
end;
finally
_FocusedView.EndUpdate;
HideHourglassCursor;
end;
end;
procedure TfrViewGridBase.AjustarAncho;
begin
if Assigned(_FocusedView) then
begin
BestFitAllColumns;
_FocusedView.ApplyBestFit;
end;
end;
procedure TfrViewGridBase.AnadirOtrosFiltros;
begin
//
end;
procedure TfrViewGridBase.ContraerTodo;
begin
if Assigned(_FocusedView) then
_FocusedView.ViewData.Collapse(True);
end;
constructor TfrViewGridBase.Create(AOwner: TComponent);
begin
inherited;
FFilter := '';
FFilter2 := '';
FOnFilterChanged := FilterChanged;
FPopupMenu := nil;
FOnDblClick := nil;
FGridStatus := NIL;
end;
procedure TfrViewGridBase.ExpandirTodo;
begin
if Assigned(_FocusedView) then
_FocusedView.ViewData.Expand(True);
end;
procedure TfrViewGridBase.ExportToExcel(const AFileName: string);
begin
if Assigned(_Grid) then
ExportGridToExcel(AFileName, _Grid);
end;
procedure TfrViewGridBase.ExportToExcel;
var
AFileName : String;
begin
if PreguntarFicheroExcelExportar(AFileName) then
ExportToExcel(AFileName);
end;
function TfrViewGridBase.GetDblClick: TNotifyEvent;
begin
Result := FOnDblClick;
end;
function TfrViewGridBase.GetFilter: string;
begin
Result := FFilter;
end;
function TfrViewGridBase.GetFilter2: string;
begin
Result := FFilter2;
end;
function TfrViewGridBase.GetFiltered: Boolean;
begin
//Los niveles de los grid no se consideran filtros
if (_Grid.Levels.Count > 1) then
Result := (_FocusedView.DataController.Filter.Root.Count > 1)
else
Result := (_FocusedView.DataController.Filter.Root.Count > 0);
end;
function TfrViewGridBase.GetMultiSelect: Boolean;
begin
Result := _FocusedView.OptionsSelection.MultiSelect;
end;
function TfrViewGridBase.getNumSeleccionados: Integer;
begin
Result := _FocusedView.DataController.GetSelectedCount;
end;
function TfrViewGridBase.GetPopupMenu: TPopupMenu;
begin
Result := FPopupMenu;
end;
function TfrViewGridBase.GetViewFiltros: IViewFiltroBase;
begin
Result := FViewFiltros;
end;
procedure TfrViewGridBase.GotoFirst;
begin
if Assigned(_FocusedView) then
_FocusedView.DataController.GotoFirst;
end;
procedure TfrViewGridBase.GotoLast;
begin
if Assigned(_FocusedView) then
_FocusedView.DataController.GotoLast;
end;
function TfrViewGridBase.IsEmpty: Boolean;
begin
Result := (_FocusedView.ViewData.RowCount < 1);
end;
{function TfrViewGridBase.Locate(const AItemIndex: Integer; const AValue: String;
const APartialCompare: Boolean): Boolean;
begin
if Assigned(_FocusedView) then
Result := _FocusedView.DataController.FindRecordIndexByText(0, AItemIndex, AValue, APartialCompare, True, True)
end;}
procedure TfrViewGridBase.Preview;
begin
//
end;
procedure TfrViewGridBase.Print;
begin
//
end;
procedure TfrViewGridBase.PrintSetup;
begin
//
end;
procedure TfrViewGridBase.RefrescarFiltro;
begin
//De esta forma obligaremos a que se creen nuevamente todos los filtros, cuando llamemos a este metodo
if Assigned(ViewFiltros) then
begin
Filter := ViewFiltros.Texto;
Filter2 := ViewFiltros.Texto2;
end;
end;
procedure TfrViewGridBase.RestoreFromIniFile;
var
AIniFile : String;
begin
inherited;
if Assigned(_FocusedView) then
begin
// AjustarAncho; <- No activar porque pisa los anchos que ha puesto el usuario.
AIniFile := GetSpecialFolderPath(CSIDL_APPDATA); //[Current Users]\Application Data
AIniFile := AIniFile + PathDelim + 'Rodax Software' + PathDelim + GetAppName + PathDelim;
if not DirectoryExists(AIniFile) then
ForceDirectories(AIniFile);
_FocusedView.RestoreFromIniFile(AIniFile + 'grid.xml', True, False, []);
end;
end;
procedure TfrViewGridBase.RestoreFromRegistry(const Path: String);
begin
if Assigned(_FocusedView) then
begin
_FocusedView.RestoreFromRegistry(Path + '\\GridSettings\\' + Self.Name, False, False, [], Self.Name);
end;
end;
procedure TfrViewGridBase.RestoreGridStatus;
begin
if Assigned(FGridStatus) and (not IsEmpty) then
FGridStatus.Restore(_FocusedView);
end;
procedure TfrViewGridBase.SaveGridStatus;
begin
if Assigned(FGridStatus) then
FreeAndNil(FGridStatus);
if not IsEmpty then
FGridStatus := TcxGridStatus.Create(_FocusedView);
end;
procedure TfrViewGridBase.SetDblClick(const Value: TNotifyEvent);
begin
FOnDblClick := Value;
end;
procedure TfrViewGridBase.SetFilter(const Value: string);
begin
FFilter := Value;
//Así tendremos el mismo valor en el filtro simple que en el filtro en detalle
if Assigned(ViewFiltros) then
ViewFiltros.Texto := FFilter;
FiltrarGrid(FFilter, FFilter2);
//Obliga a generar todos los filtros de las vista hija
AnadirOtrosFiltros;
if Assigned(FOnFilterChanged) then
FOnFilterChanged(Self);
end;
procedure TfrViewGridBase.SetFilter2(const Value: string);
begin
FFilter2 := Value;
//Así tendremos el mismo valor en el filtro simple que en el filtro en detalle
if Assigned(ViewFiltros) then
ViewFiltros.Texto2 := FFilter2;
FiltrarGrid(FFilter, FFilter2);
//Obliga a generar todos los filtros de las vista hija
AnadirOtrosFiltros;
if Assigned(FOnFilterChanged) then
FOnFilterChanged(Self);
end;
procedure TfrViewGridBase.SetMultiSelect(const Value: Boolean);
begin
_FocusedView.OptionsSelection.MultiSelect := Value;
// _FocusedView..OnSelectionChanged := SelectionChanged;
end;
procedure TfrViewGridBase.SetPopupMenu(const Value: TPopupMenu);
begin
FPopupMenu := Value;
end;
procedure TfrViewGridBase.SetViewFiltros(const Value: IViewFiltroBase);
begin
if Assigned(FViewFiltros) then
ViewFiltros.OnFiltrosChange := Nil;
FViewFiltros := Value;
end;
procedure TfrViewGridBase.ShowEmbedded(const AParent: TWinControl);
begin
inherited;
// No activar la tabla ya por si acaso tuviera parámetros
{ if not DADataSource.DataTable.Active then
DADataSource.DataTable.Active := True;}
GotoFirst;
_FocusedView.Focused := True;
if _FocusedView.ViewData.RecordCount > 0 then
begin
_FocusedView.ViewData.Records[0].Selected := True;
_FocusedView.ViewData.Records[0].Focused := True;
end;
end;
procedure TfrViewGridBase.StoreToIniFile;
var
AIniFile : String;
begin
inherited;
if Assigned(_FocusedView) then
begin
AIniFile := GetSpecialFolderPath(CSIDL_APPDATA); //[Current Users]\Application Data
AIniFile := AIniFile + PathDelim + 'Rodax Software' + PathDelim + GetAppName + PathDelim;
if not DirectoryExists(AIniFile) then
ForceDirectories(AIniFile);
_FocusedView.StoreToIniFile(AIniFile + 'grid.xml', False, []);
end;
end;
procedure TfrViewGridBase.StoreToRegistry(const Path: String);
begin
inherited;
if Assigned(_FocusedView) then
begin
_FocusedView.StoreToRegistry(Path + '\\GridSettings\\' + Self.Name, False, [], Self.Name);
end;
end;
procedure TfrViewGridBase.FiltrarGrid(TextoFiltro : String);
var
Columna: TcxGridDBColumn;
i: Integer;
AItemList: TcxFilterCriteriaItemList;
begin
with _FocusedView.DataController.Filter do
begin
BeginUpdate;
try
Options := [fcoCaseInsensitive, fcoSoftCompare];
Root.Clear;
if Length(TextoFiltro) > 0 then
begin
AItemList := Root.AddItemList(fboAnd);
AItemList.BoolOperatorKind := fboOr;
for i:=0 to (_FocusedView as TcxGridDBTableView).ColumnCount - 1 do
begin
Columna := (_FocusedView as TcxGridDBTableView).Columns[i];
if (Length(Columna.Caption) > 0) and (Columna.Caption <> 'RecID') then
AItemList.AddItem(Columna, foLike, '%'+TextoFiltro+'%', IntToStr(i));
end;
Active := True;
end
else
Active := False;
finally
EndUpdate;
end;
end;
end;
procedure TfrViewGridBase.FilterChanged(Sender: TObject);
begin
//
end;
procedure TfrViewGridBase.FiltrarGrid(TextoFiltro1, TextoFiltro2: String);
var
Columna: TcxGridDBColumn;
i: Integer;
AItemList: TcxFilterCriteriaItemList;
begin
with _FocusedView.DataController.Filter do
begin
BeginUpdate;
try
Options := [fcoCaseInsensitive, fcoSoftCompare];
Root.Clear;
if Length(TextoFiltro1) > 0 then
begin
AItemList := Root.AddItemList(fboAnd);
AItemList.BoolOperatorKind := fboOr;
for i:=0 to (_FocusedView as TcxGridDBTableView).ColumnCount - 1 do
begin
Columna := (_FocusedView as TcxGridDBTableView).Columns[i];
if (Length(Columna.Caption) > 0) and (Columna.Caption <> 'RecID') then
AItemList.AddItem(Columna, foLike, '%'+TextoFiltro1+'%', IntToStr(i));
end;
end;
if Length(TextoFiltro2) > 0 then
begin
AItemList := Root.AddItemList(fboAnd);
AItemList.BoolOperatorKind := fboOr;
for i:=0 to (_FocusedView as TcxGridDBTableView).ColumnCount - 1 do
begin
Columna := (_FocusedView as TcxGridDBTableView).Columns[i];
if (Length(Columna.Caption) > 0) and (Columna.Caption <> 'RecID') then
AItemList.AddItem(Columna, foLike, '%'+TextoFiltro2+'%', IntToStr(i));
end;
end;
if ((Length(TextoFiltro1) > 0) or (Length(TextoFiltro2) > 0)) then
Active := True
else
Active := False;
finally
EndUpdate;
end;
end;
end;
destructor TfrViewGridBase.Destroy;
begin
FOnFilterChanged := Nil;
if Assigned(FGridStatus) then
FreeAndNil(FGridStatus);
inherited;
end;
end.