2017-05-16 52 views
2

在cxGrid中,我有一個布爾(屬性:複選框)列。 我該如何做一個這樣的列的頁腳摘要(SUM),即總結檢查了多少記錄。cxGrid - 檢查記錄的頁腳彙總

現在,如果將其設置爲SUM,我的頁腳摘要會顯示檢查項目的負數。如何避免這些負數?

編輯: 我已經發現在其網站上就解決方案:

procedure TForm1.cxGrid1DBTableView1DataControllerSummaryFooterSummaryItemsSummary(
    ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments; 
    var OutArguments: TcxSummaryEventOutArguments); 
var 
    si: TcxGridDBTableSummaryItem; 
begin 
    si := Arguments.SummaryItem as TcxGridDBTableSummaryItem; 
    if si.Column = cxGrid1DBTableView1Sonda then 
    OutArguments.Done := not OutArguments.Value; 
end; 

但是我得到的錯誤: 無法轉換型(空)的變體進入式(布爾)。

不明白這一點。字段是布爾類型(位)。

EDIT2:

的問題是,默認設置布爾類型的SQL Server爲NULL。 這就是爲什麼轉換錯誤。

+0

我問[這裏](https://www.devexpress.com/Support/Center/Question/List/1)。 –

+0

不幸的是沒有答案:https://www.devexpress.com/Support/Center/Question/Details/S136683 – user763539

+3

DevExpress總是廣泛地更新他們的產品,他們的支持已經大大改善。你連接的這個問題是7歲,並從他們以前的支持系統遷移過來。你應該再問一遍。 –

回答

1

最好將這些問題發送給DevExpress支持團隊。 您可以自定義頁腳:

  • 分配類= skNone到頁腳彙總項目
  • 使用OnGetText活動以顯示你想要什麼

簡單的例子(顯示在所有記錄作爲頁腳值字符數):

procedure TForm54.cxGrid1DBTableView1TcxGridDBDataControllerTcxDataSummaryFooterSummaryItems0GetText(
    Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean; 
    var AText: string); 
var i,j: integer; 
begin 
    j := 0; 
    for i := 0 to cxGrid1DBTableView1.DataController.RecordCount-1 do 
    j := j + Length(String(cxGrid1DBTableView1.DataController.Values[i, cxGrid1DBTableView1c.Index])); 
    AText := IntToStr(j); 
end; 
0

我認爲你可以在SQL組件中解決這個問題。使用類型轉換,你的cxGrid將使用Integer值。

SELECT CAS(Bit_Column AS int) AS Int_Column 
FROM YourTable 
2

你也可以設置網格來計算使用不同的字段彙總,例如,當你指定你想每次增加的精確值計算的字段。

  • 向您的數據集中添加一個帶有所需值的計算的字段。 MyHiddenField.Value:= -1 * YourCheckingField.AsInteger;

  • 轉到上CxGrid對話框摘要選項卡,並添加了新的內容:

    1. 設置列屬性要將網格列它出現
    2. 設置字段名到您的計算現場
    3. 最後類設置爲skSum
+0

非常優雅的解決方案,+1 – MartynA

0

你可以試試這個:

procedure TForm1.cxGrid1DBTableView1DataControllerSummaryAfterSummary(
    ASender: TcxDataSummary); 
var i, j, Imp:integer; 
    Item: TcxGridDBTableSummaryItem; 
begin 
    DBTableView1.DataController.BeginLocate; 
    for j:=0 to ASender.FooterSummaryItems.Count-1 do ASender.FooterSummaryValues[j]:=0; 
    try 
    for i:=0 to DBTableView1.DataController.RowCount-1 do 
    begin 
     if (DBTableView1.DataController.Values[i,cxGrid1DBTableView1Sonda.Index]<>null) then 
     for j:=0 to ASender.FooterSummaryItems.Count-1 do 
     begin 
      Item:=TcxGridDBTableSummaryItem(ASender.FooterSummaryItems[j]); 
      Imp:= DBTableView1.DataController.Values[i, cxGrid1DBTableView1Sonda.Index]; 
      if (Imp= 1) or ((Imp= 2) 
      then ASender.FooterSummaryValues[j]:= ASender.FooterSummaryValues[j]+1; 
     end; 
    end; 
    finally 
    DBTableView1.DataController.EndLocate; 
    end; 
end; 
0
procedure cxGrid1DBTableView1DataControllerSummaryFooterSummaryItemsSummary(
    ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments; 
    var OutArguments: TcxSummaryEventOutArguments); 

    var 
     AValue: Variant; 
     AItem: TcxGridTableSummaryItem; 
    begin 
     AItem := TcxGridTableSummaryItem(Arguments.SummaryItem); 

     // считаем проверенные 
     if (AItem.Column = tvCompareisCorrect) and (AItem.Kind = skCount) and (AItem.Position = spFooter) then begin 
     AValue := tvCompare.DataController.Values[ Arguments.RecordIndex, tvCompareisCorrect.Index]; 
     if not VarIsNull(AValue) then 
      if not VarAsType(AValue, varBoolean) then Dec(OutArguments.CountValue); 
     end; 
+1

這個答案需要一些解釋,你已經改變了什麼,以及如何解決這個問題 –