cxGrid - нижний колонтитул зарегистрированных записей

В cxGrid у меня есть столбец boolean (свойства: checkbox). Как я могу сделать сводку нижнего колонтитула (SUM) такого столбца, т.е. суммировать количество проверок.

Прямо сейчас, если я установил его в SUM, в сводке нижнего колонтитула отображаются отрицательные числа для отмеченных элементов. Как я могу избежать этих отрицательных чисел?

edit: Я нашел, что решение будет на их сайте с:

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;

Однако я получаю сообщение об ошибке: Не удалось преобразовать вариант типа (Null) в тип (Boolean).

Не понимаю этого. Поле является логическим типом (бит).

Edit2:

Проблема заключается в том, что сервер sql по умолчанию устанавливает логический тип в NULL. Вот почему ошибка преобразования.

delphi,tcxgrid,

2

Ответов: 5


2

Вы также можете просто настроить сетку для вычисления этой сводки с использованием другого поля, например, вычисленного поля, где вы назначаете точное значение, которое хотите добавить каждый раз.

  • Добавьте вычисленное поле в ваш набор данных с требуемым значением. MyHiddenField.Value: = -1 * YourCheckingField.AsInteger;

  • Перейдите на вкладку «Суммы» в диалоговом окне CxGrid и добавьте новое резюме:

    1. Задайте свойство Column в столбце Grid, где вы хотите его отобразить.
    2. Установите поле FieldName в вычисленное поле
    3. И, наконец, установите Kind на skSum

1

Лучше отправить такие вопросы в службу поддержки DevExpress. Вы можете настроить нижний колонтитул:

  • присвойте Kind = 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. Используйте typecasting, и ваш cxGrid будет работать с значениями Integer.

SELECT CAS(Bit_Column AS int) AS Int_Column
FROM YourTable

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);

      // N?N‡??N‚?°?µ?? ??N€?????µN€?µ????N‹?µ
      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;
Дельфы, tcxgrid,
Похожие вопросы