This repository has been archived on 2024-11-28. You can view files and clone it, but cannot push or open issues or pull requests.
LuisLeon_FactuGES/Source/Modulos/Informes base/Views/uViewSumarios.pas
2007-07-10 17:33:08 +00:00

326 lines
9.4 KiB
ObjectPascal

unit uViewSumarios;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uViewBase, dxLayoutControl, cxControls, cxContainer, cxListBox,
TBXDkPanels, ActnList, cxCustomData, cxGridDBTableView, cxGridTableView,
cxGraphics, cxStyles, cxTL, cxTextEdit, cxDropDownEdit, ImgList,
PngImageList, ComCtrls, JvExComCtrls, JvComCtrls, cxInplaceContainer,
ExtCtrls, cxEdit, cxVGrid, TBXToolPals, uViewInformeBaseGrid,
uViewInformeBaseParametros;
type
IViewSumarios = interface(IViewInformeBaseParametros)
['{B0C5A7EB-FEFA-49A5-BEF9-E3DD72E97AF4}']
end;
TfrViewSumarios = class(TfrViewInformeBaseParametros, IViewSumarios)
PngImageList1: TPngImageList;
vgSumarios: TcxVerticalGrid;
TBXLabel1: TTBXLabel;
cxStyleRepository1: TcxStyleRepository;
cxStyleNombreColumna: TcxStyle;
cxStyleCategoria: TcxStyle;
cxStyleNombreColumnaInactivo: TcxStyle;
cxStyleCategoriaInactivo: TcxStyle;
cxStyleContentInactivo: TcxStyle;
procedure vgSumariosEditorRowInitPopup(Sender: TObject);
procedure vgSumariosEditorRowEditValueChanged(
Sender: TObject);
protected
procedure RellenarArbolTotales;
function AnadirSumario(const ACaption : String;
const AKind : TcxSummaryKind) : TcxEditorRow;
procedure RellenarTotalesPie;
procedure RellenarTotalesGrupo(const AGroupName : String);
procedure RellenarCategorias;
procedure RellenarCategoria(const APosition : TcxSummaryPosition;
const AGroupName : String = '');
procedure AplicarSumarioVista(const APosition : TcxSummaryPosition;
const AColumnCaption : String; const AKind : TcxSummaryKind);
procedure SetModificable(const Value: Boolean); override;
public
procedure Execute; override;
procedure Refresh; override;
end;
implementation
{$R *.dfm}
uses
DB, cxGridPopupMenuConsts;
var
SumaryKindStrArray : array[skNone..skAverage] of String
= ('', 'Sumar', 'Mínimo', 'Máximo', 'Contar', 'Promedio');
procedure TfrViewSumarios.Refresh;
begin
RellenarCategorias;
end;
procedure TfrViewSumarios.RellenarArbolTotales;
var
i : Integer;
begin
// Recuperar las agrupaciones del grid
for i := 0 to ViewInformeBaseGrid.GroupedColumnCount - 1 do
begin
if i = 3 then
Break; // Sólo meter las 3 primera agrupaciones
RellenarCategoria(spGroup, ViewInformeBaseGrid.GroupedColumns[i].Caption);
end;
end;
function TfrViewSumarios.AnadirSumario(const ACaption : String;
const AKind : TcxSummaryKind) : TcxEditorRow;
begin
Result := vgSumarios.Add(TcxEditorRow) as TcxEditorRow;
with Result do
begin
Properties.Caption := ACaption;
Properties.Value := SumaryKindStrArray[AKind];
Properties.ImageIndex := 2;
Properties.EditPropertiesClass := TcxComboBoxProperties;
with TcxComboBoxProperties(Properties.EditProperties) do
begin
ImmediateDropDown := True;
DropDownListStyle := lsFixedList;
ImmediatePost := True;
ImmediateUpdateText := True;
PostPopupValueOnTab := True;
OnInitPopup := vgSumariosEditorRowInitPopup;
OnEditValueChanged := vgSumariosEditorRowEditValueChanged;
end;
end;
end;
procedure TfrViewSumarios.AplicarSumarioVista (
const APosition: TcxSummaryPosition; const AColumnCaption: String;
const AKind: TcxSummaryKind);
const
MASK_MONEDA = ',0.## €;-,0.## €';
MASK_NUMERO = '#,##0';
var
AColumn : TcxGridDBColumn;
begin
AColumn := ViewInformeBaseGrid.GetColumnByCaption(AColumnCaption);
if APosition = spFooter then
begin
AColumn.Summary.FooterKind := AKind;
if (AKind in [skSum, skAverage]) and (AColumn.PropertiesClassName = 'TcxCurrencyEditProperties') then
AColumn.Summary.FooterFormat := MASK_MONEDA
else
AColumn.Summary.FooterFormat := MASK_NUMERO;
end
else begin
AColumn.Summary.GroupFooterKind := AKind;
if (AKind in [skSum, skAverage]) and (AColumn.PropertiesClassName = 'TcxCurrencyEditProperties') then
AColumn.Summary.GroupFooterFormat := MASK_MONEDA
else
AColumn.Summary.GroupFooterFormat := MASK_NUMERO;
end;
end;
procedure TfrViewSumarios.RellenarTotalesPie;
var
i, j: Integer;
ASummary: TcxDataFooterSummaryItems;
AClase : TcxSummaryKind;
ACaption : String;
ACategory : TcxCategoryRow;
ARow : TcxEditorRow;
begin
vgSumarios.BeginUpdate;
try
ACategory := (vgSumarios.AddChild(nil, TcxCategoryRow) as TcxCategoryRow);
with ACategory.Properties do
begin
ASummary := ViewInformeBaseGrid.FocusedView.DataController.Summary.FooterSummaryItems;
ImageIndex := 0;
Caption := 'Resúmenes totales'
end;
for i := 0 to ViewInformeBaseGrid.FocusedView.VisibleColumnCount - 1 do
begin
ACaption := ViewInformeBaseGrid.FocusedView.VisibleColumns[i].Caption;
AClase := ViewInformeBaseGrid.FocusedView.VisibleColumns[i].Summary.FooterKind;
ARow := AnadirSumario(ACaption, AClase);
ARow.Parent := ACategory;
end;
finally
vgSumarios.EndUpdate;
end;
end;
procedure TfrViewSumarios.RellenarCategoria(
const APosition: TcxSummaryPosition; const AGroupName: String);
begin
if APosition = spFooter then
RellenarTotalesPie
else
RellenarTotalesGrupo(AGroupName);
end;
procedure TfrViewSumarios.RellenarCategorias;
var
i : Integer;
begin
vgSumarios.ClearRows;
RellenarCategoria(spFooter);
// Recuperar las agrupaciones del grid
for i := 0 to ViewInformeBaseGrid.GroupedColumnCount - 1 do
begin
if i = 3 then
Break; // Sólo meter las 3 primera agrupaciones
RellenarCategoria(spGroup, ViewInformeBaseGrid.GroupedColumns[i].Caption);
end;
end;
procedure TfrViewSumarios.vgSumariosEditorRowInitPopup(Sender: TObject);
var
AColumn: TcxGridDBColumn;
ARow : TcxEditorRow;
const
NumberFieldTypes =
[ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftDate, ftTime,
ftDateTime, ftAutoInc];
TimeFieldTypes = [ftDate, ftTime, ftDateTime];
begin
inherited;
ARow := TcxEditorRow(vgSumarios.FocusedRow);
AColumn := TcxGridDBColumn(ViewInformeBaseGrid.FocusedView.VisibleColumns[ARow.Index]);
if Assigned(AColumn.DataBinding.Field) then
with TcxComboBoxProperties(TcxPopupEdit(Sender).Properties) do
begin
Items.Clear;
BeginUpdate;
try
Items.Add(SumaryKindStrArray[skNone]);
Items.Add(SumaryKindStrArray[skCount]);
if AColumn.DataBinding.Field.DataType in NumberFieldTypes then
begin
Items.Add(SumaryKindStrArray[skMax]);
Items.Add(SumaryKindStrArray[skMin]);
if not (AColumn.DataBinding.Field.DataType in TimeFieldTypes) then
begin
Items.Add(SumaryKindStrArray[skSum]);
Items.Add(SumaryKindStrArray[skAverage]);
end;
end;
finally
EndUpdate;
end;
end;
end;
procedure TfrViewSumarios.vgSumariosEditorRowEditValueChanged(
Sender: TObject);
var
AColumn : String;
ARow : TcxEditorRow;
AKind : TcxSummaryKind;
function DarSummaryKind(AKind : String) : TcxSummaryKind;
var
i : TcxSummaryKind;
begin
if Length(AKind) = 0 then
Result := skNone
else
for i := skSum to skAverage do
if SumaryKindStrArray[i] = AKind then
begin
Result := i;
Break;
end;
end;
begin
inherited;
ARow := TcxEditorRow(vgSumarios.FocusedRow);
AColumn := ARow.Properties.Caption;
AKind := DarSummaryKind(VarToStr(ARow.Properties.Value));
if Assigned(ARow.Parent) then
begin
if(ARow.Parent.Index = 0) then
AplicarSumarioVista(spFooter, AColumn, AKind)
else
AplicarSumarioVista(spGroup, AColumn, AKind)
end;
end;
procedure TfrViewSumarios.RellenarTotalesGrupo(const AGroupName: String);
var
i, j: Integer;
ASummary: TcxDataSummaryGroup;
AClase : TcxSummaryKind;
ACaption : String;
ACategory : TcxCategoryRow;
ARow : TcxEditorRow;
begin
ASummary := ViewInformeBaseGrid.FocusedView.DataController.Summary.SummaryGroups.FindByItemLink(ViewInformeBaseGrid.GetColumnByCaption(AGroupName));
vgSumarios.BeginUpdate;
try
ACategory := (vgSumarios.AddChild(nil, TcxCategoryRow) as TcxCategoryRow);
with ACategory.Properties do
begin
ImageIndex := 1;
Caption := 'Totales de ' + AGroupName;
end;
for i := 0 to ViewInformeBaseGrid.FocusedView.VisibleColumnCount - 1 do
begin
ACaption := ViewInformeBaseGrid.FocusedView.VisibleColumns[i].Caption;
AClase := ViewInformeBaseGrid.FocusedView.VisibleColumns[i].Summary.GroupFooterKind;
ARow := AnadirSumario(ACaption, AClase);
ARow.Parent := ACategory;
end;
finally
vgSumarios.EndUpdate;
end;
end;
procedure TfrViewSumarios.Execute;
begin
inherited;
//
end;
procedure TfrViewSumarios.SetModificable(const Value: Boolean);
begin
inherited;
vgSumarios.Enabled := Value;
if Value then
begin
vgSumarios.Styles.Category := cxStyleCategoria;
vgSumarios.Styles.Header := cxStyleNombreColumna;
vgSumarios.Styles.Content := nil;
end
else begin
vgSumarios.Styles.Category := cxStyleCategoriaInactivo;
vgSumarios.Styles.Header := cxStyleNombreColumnaInactivo;
vgSumarios.Styles.Content := cxStyleContentInactivo;
end;
end;
end.