2014-10-03 1 views
1

숫자 열에 런타임에 요약 바닥 글을 만드는 코드가 있지만 표시 할 그룹 요약 결과를 얻을 수 없습니다. 나는 How to create group summaries at runtimeHow to set group summary valuesHow can create summary footer on runtime? 검토 한하지만 난 런타임 오류 타격 해요 :런타임시 TcxGrid GroupSummaries를 생성하는 Delphi 코드

EcxInvalidDataControllerOperation with message 'RecordIndex out of range'

그리드 렌더링 할 때.

이 코드는 모든 TcxGridDBTableView를 허용하므로 기존 Delphi 폼에 넣기가 매우 쉽습니다.

procedure SummaryGroup(ASummary: TcxDataSummary; AColumn: TcxGridDBColumn; 
    AKind: TcxSummaryKind; AFormat: string); 
var 
    sumGroup: TcxDataSummaryGroup; 
    link: TcxGridTableSummaryGroupItemLink; //TcxDataSummaryGroupItemLink; 
    item: TcxGridDBTableSummaryItem; 
begin 
    AColumn.Summary.FooterKind := AKind; 
    AColumn.Summary.FooterFormat := AFormat; 
    sumGroup := ASummary.SummaryGroups.Add; 
    link := sumGroup.Links.Add as TcxGridTableSummaryGroupItemLink; 
    link.Column := AColumn; 
    item := sumGroup.SummaryItems.Add as TcxGridDBTableSummaryItem; 
    item.Column := AColumn; 
    item.Kind := AKind; 
    item.Position := spGroup; 
    item.Format := AColumn.Summary.FooterFormat; 
end; 

procedure AutoAwesum(AView: TcxGridDBTableView); 
var 
    summary: TcxDataSummary; 
    summing: Boolean; 
    i: Integer; 
    dc: TcxGridDBDataController; 
    col: TcxGridDBColumn; 

begin 
    dc := AView.DataController; 
    summing := False; 
    summary := dc.Summary; 
    summary.BeginUpdate; 
    try 
    summary.SummaryGroups.Clear; 
    dc.BeginFullUpdate; 
    try 
     dc.GridView.ClearItems; 
     dc.CreateAllItems; 
     for i := 1 to AView.ColumnCount - 1 do 
     begin 
     col := AView.Columns[i]; 
     case col.DataBinding.Field.DataType of 
      ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc, 
      ftLongWord, ftShortint: 
      begin 
       summing := true; 
       SummaryGroup(summary, col, skSum, '#'); 
      end; 
      ftFloat, ftBCD, ftFMTBcd, ftExtended, ftSingle: 
      begin 
       summing := true; 
       SummaryGroup(summary, col, skSum, '#.##'); 
      end; 
      ftCurrency: 
      begin 
       summing := true; 
       SummaryGroup(summary, col, skSum, '$#.##'); 
      end; 
     end; 
     end; 
     dc.DataModeController.GridMode := not summing; 
     AView.OptionsView.Footer := summing; 
     AView.OptionsView.GroupFooterMultiSummaries := summing; 
     AView.OptionsView.GroupFooters := gfVisibleWhenExpanded; 
    finally 
     dc.EndFullUpdate; 
    end; 
    finally 
    summary.EndUpdate; 
    end; 
end; 

무엇이 누락 되었습니까? 감사.

+0

예외를 생성하는 행은 무엇입니까? –

+0

그것은 내 코드에서 발생하지 않습니다. 그것은 cxGrid 런타임에서 TcxCustomDataController.CheckRecordRange에 있습니다. –

+0

그런 다음 스택 추적을보고 예외가 트리거되는 위치를 확인합니다. 예외가 실제로 자신의 코드를 추적 할 수없는 경우 대신 공급 업체에 버그 보고서를 제출해야합니다. –

답변

1

마지막으로이 문제를 다시 해결할 수있는 기회가있었습니다. 예상대로 변경 사항은 거의 없었습니다. 다음은 그리드의 각 숫자 열에 대해 그룹 요약 헤더를 생성하는 코드입니다. 사용하고자하는 코드에 몇 가지 옵션을 주석으로 남겼습니다.

uses 
    cxGridDBDataDefinitions; 

procedure Summarize(ASummary: TcxDataSummary; AColumn: TcxGridDBColumn; 
    AKind: TcxSummaryKind; AFormat: string); 
var 
    sumGroup: TcxDataSummaryGroup; 
    link: TcxGridTableSummaryGroupItemLink; 
    item: TcxGridDBTableSummaryItem; 
begin 
    AColumn.Summary.FooterKind := AKind; 
    AColumn.Summary.FooterFormat := AFormat; 
    AColumn.Summary.GroupKind := AKind; 
    AColumn.Summary.GroupFormat := AFormat; 
    AColumn.GroupIndex := -1; 
    sumGroup := ASummary.SummaryGroups.Add; 
    link := sumGroup.Links.Add as TcxGridTableSummaryGroupItemLink; 
    link.Column := AColumn; 
    item := sumGroup.SummaryItems.Add as TcxGridDBTableSummaryItem; 
    item.Column := AColumn; 
    item.Kind := skSum; 
    item.Position := spGroup; 
    item.Format := AColumn.Summary.FooterFormat; 
end; 

procedure AutoAwesum(AView: TcxGridDBTableView); 
var 
    summary: TcxDataSummary; 
    summing: Boolean; 
    i: Integer; 
    dc: TcxGridDBDataController; 
    col: TcxGridDBColumn; 

begin 
    dc := AView.DataController; 
    summing := False; 
    summary := dc.Summary; 
    summary.BeginUpdate; 
    try 
    summary.SummaryGroups.Clear; 
    dc.BeginFullUpdate; 
    try 
     dc.GridView.ClearItems; 
     dc.CreateAllItems; 
     for i := 1 to AView.ColumnCount - 1 do 
     begin 
     col := AView.Columns[i]; 
     case col.DataBinding.Field.DataType of 
      ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc, 
      ftLongWord, ftShortint: 
      begin 
       summing := true; 
       Summarize(summary, col, skSum, ',0'); 
      end; 
      ftFloat, ftBCD, ftFMTBcd, ftExtended, ftSingle: 
      begin 
       summing := true; 
       Summarize(summary, col, skSum, ',.00'); 
      end; 
      ftCurrency: 
      begin 
       summing := true; 
       Summarize(summary, col, skSum, '$,0.00'); 
      end; 
     end; 
     end; 
//  dc.DataModeController.GridMode := not summing; 
//  AView.OptionsView.Header := summing; 
     AView.OptionsView.Footer := summing; 
//  AView.OptionsView.GroupFooterMultiSummaries := summing; 
//  AView.OptionsView.GroupFooters := gfVisibleWhenExpanded; 
    finally 
     dc.EndFullUpdate; 
    end; 
    finally 
    summary.EndUpdate; 
    end; 
end;