Глюки rxDBGrid

Модераторы: alexs, Модераторы

Re: Глюки rxDBGrid

Сообщение ronin » 01.03.2012 10:16:42

сложновато будет, попробую сам отловить баг
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение ronin » 11.04.2012 11:52:08

пользуюсь сборкой rxfpc-2012-03-31--04-00-01, всё равно вылетает ошибка index out of bounds

вот в этой процедуре приходится добавлять проверку not (F.IsNull)
(это текущий мой вариант)

Код: Выделить всё
function TRxColumnFooter.ErrorTestValue: boolean;
var
  F: TField;
begin
  Result := True;
  if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
  begin
    F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
    if Assigned(F) then
    begin
      if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
      begin
        if (FValueType in [fvtMax, fvtMin]) and not (F.IsNull) then
        begin
          if not (F.IsNull) and (FTestValue = F.AsDateTime) then
            Result := False
          else
          if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
          begin
            case FValueType of
              fvtMax: FTestValue := Max(FTestValue, TDateTime(F.OldValue));
              fvtMin: FTestValue := Min(FTestValue, TDateTime(F.OldValue));
            end;
          end;
        end;
      end
      else
      if (FValueType in [fvtMax, fvtMin]) and not (F.IsNull) and (FTestValue = F.AsFloat) then
        Result := False
      else
      begin
        case FValueType of
          fvtSum:
            if F.DataSet.RecordCount = 0 then
            begin
{              if not F.IsNull then
                FTestValue := FTestValue - F.AsFloat;}
              { TODO -oalexs : need rewrite this code - where difficult! }
            end
            else
            begin
                     if not F.IsNull then
                        if F.OldValue <> null then
                           FTestValue := FTestValue + Float(F.OldValue);
                        if not F.IsNull then
                           FTestValue := FTestValue - F.AsFloat;
            end;
          fvtMax:
            if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
              FTestValue := Max(FTestValue, Float(F.OldValue));
          fvtMin:
            if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
              FTestValue := Min(FTestValue, Float(F.OldValue));
        end;
      end;
    end;
  end;
end;
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение ronin » 20.04.2012 16:29:43

обнаружил ещё одну ошибку в следующей процедуре

Код: Выделить всё
procedure TRxDBGrid.UpdateActive;
begin
  if FInProcessCalc > 0 then
    exit;
  inherited UpdateActive;
  if FInProcessCalc < 0 then
  begin
    FInProcessCalc := 0;
    CalcStatTotals;
  end
  else
  if Assigned(FFooterOptions) and FFooterOptions.Active and (FFooterOptions.RowCount > 0) and
       DatalinkActive and (DataSource.DataSet.State = dsBrowse) then
    CalcStatTotals; //здесь вылетает ошибка
end;


ошибка возникает при попытке обновить пустую таблицу, в моём случае после удаления последней строки, временное решение заключается в добавлении условия на проверку наличия строк в Dataset грида в соответствующей процедуре

Код: Выделить всё
procedure TRxDBGrid.CalcStatTotals;
var
  P: TBookmark;
  DS: TDataSet;
  i: integer;
  APresent: boolean;
begin
  if (not (FFooterOptions.Active and DatalinkActive)) or (Columns.Count = 0) or
       (DataSource.DataSet.RecordCount<=0)  //проверка наличия строк
   then
    Exit;
  //Дополнительно проверим - а стоит ли делать пробег по данным - есть ли агрегатные функции
  APresent := False;
  for i := 0 to Columns.Count - 1 do
  begin
    APresent := TRxColumn(Columns[i]).Footer.FValueType in
      [fvtSum, fvtAvg, fvtMax, fvtMin];
    if APresent then
      break;
  end;   
...


rxfpc-2012-03-31--04-00-01
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 20.04.2012 20:44:43

Добавить код можно. Не противоречит ничему.
Но в последних комитах я убрал из TRxDBGrid.UpdateActive пересчёт итогов. Сейчас этот метод грида изменяется на каждое изменение положения курсора в наборе данных. Получается лишние вызовы и глюки при движению по гриду, содержимое которого превышает размер самого грида.
Ещё не придумал как обойти...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение ronin » 22.04.2012 10:42:13

ещё вопросик возник, есть функция

Код: Выделить всё
function TRxColumnFooter.GetStatTotal: string;
var
  F: TField;
begin
  if (FFieldName <> '') and TRxDBGrid(FOwner.Grid).DatalinkActive and
    (TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecordCount <> 0) then
  begin
    F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
    if Assigned(F) then
    begin
     if F.DataType in [ftSmallint, ftLargeint, ftInteger, ftWord, ftFloat, ftCurrency,
        ftDate, ftTime, ftDateTime, ftTimeStamp] then
      begin
        if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
        begin
          if FValueType in [fvtSum, fvtAvg] then
            Result := ''
          else
          if FTestValue = 0 then
            Result := ''
          else
          if FDisplayFormat = '' then
            Result := DateToStr(FTestValue)
          else
            Result := FormatDateTime(FDisplayFormat, FTestValue);
        end
        else
        if F.DataType in [ftSmallint, ftInteger, ftWord] then
        begin
          if FDisplayFormat = '' then
            Result := IntToStr(Round(FTestValue))
          else
            Result := Format(FDisplayFormat, [Round(FTestValue)]);
        end
        else
        begin
          if FDisplayFormat <> '' then
            Result := FormatFloat(FDisplayFormat, FTestValue)
          else
          if F.DataType = ftCurrency then
            Result := FloatToStrF(FTestValue, ffCurrency, 12, 2)
          else
            Result := FloatToStr(FTestValue);
        end;
      end
      else
        Result := '';
    end
    else
      Result := '';
  end
  else
    Result := '';
end; 


у меня есть поля ftLargeint, соответственно в футере не выводит сумму, в проверке такого типа нет, почему?
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 22.04.2012 20:57:29

Опс...
Проверим...

Добавлено спустя 20 минут 25 секунд:
Внёс исправления по всем 3-м вопросам.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение ronin » 04.05.2012 09:49:20

огромное спасибо, потестирую сегодня
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение ronin » 25.05.2012 15:21:07

млин устал разбираться... каким образом формируется FTestValue?

у меня есть на форме два грида, master-detail, проблема в том что в некоторых формах footer считает итоги нормально, в каком то ставит нули... в процедуре GetStatTotal вручную вбиваю циферку для пресловутого FTestValue, цифра выводится, убираю - 0

взаимосвязи не могу отловить, пытался присвоить FTestValue фиксированное значение во всех процедурах в данном модуле (ResetTestValue, UpdateTestValue, DeleteTestValue, PostTestValue, ErrorTestValue), ни одна из данных процедур не повлияла на значение, всё равно откуда то берётся ноль, независимо integer или float поле :(

единственное отличие данных форм от остальных (где итог считается) - это формы итоговых отчётов, здесь запрос просто выводит таблицу, поля есть кака расчётные (хранимка mysql считает) так и просто поле из таблицы

автор подскажи куда рыть, плиз, иначе я сдохну :)

Добавлено спустя 18 минут 17 секунд:
p.s. замечал баг, если форму/датасет создаю копированием, наблюдаются подобные баги (например типы полей слетают, не соответствуют действительности), здесь же пробовал уже заново поле удалить добавить, стобец в гриде... результата никакого... в master гриде итог считает, в detail нифига

Добавлено спустя 2 минуты 23 секунды:
p.p.s создаётся ощущение что для таких полей не отрабатывает событие расчёта итога, но вот где это присходит, если не в указанных выше процедурах, не понимаю
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 25.05.2012 20:04:21

Тестовый пример в студию.
Не сталкивался с таким глюком.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение ronin » 25.05.2012 21:04:09

я не представляю как я могу собрать и отослать вам проект, он большой и стоит денег :) я понимаю что эту проблему решать мне, у меня вопрос именно практический

каким образом формируется FTestValue?
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение alexs » 26.05.2012 08:06:09

Есть метод TRxDBGrid.CalcStatTotals;
Он вызывается для пересчёта итоговой строки
В нём обычный цикл по всему набору данных.
В начале цикла для каждого столбца грида вызываеся ResetTestValue;
Код: Выделить всё
    for i := 0 to Columns.Count - 1 do
      TRxColumn(Columns[i]).Footer.ResetTestValue;

А дальше идёт цикл по всем строкам набора данных и вызывается для каждой строки UpdateTestValue;
while not DS.EOF do
begin
for i := 0 to Columns.Count - 1 do
TRxColumn(Columns[i]).Footer.UpdateTestValue;
DS.Next;
end;
Соответсвенно ResetTestValue; выставляет начальное значение для FTestValue
А UpdateTestValue; сравнивает его с текущим и, по необходимости, изменяет.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение ronin » 29.05.2012 10:21:30

немного не в тему, но мне кажется нестандартным поведением переход на нижнюю строку при нажатии Enter, не? откуда такое взялось?

Добавлено спустя 27 минут 55 секунд:
я имею ввиду не режим редактирования, а режим просмотра

Добавлено спустя 1 час 14 минут 51 секунду:
Но в последних комитах я убрал из TRxDBGrid.UpdateActive пересчёт итогов. Сейчас этот метод грида изменяется на каждое изменение положения курсора в наборе данных. Получается лишние вызовы и глюки при движению по гриду, содержимое которого превышает размер самого грида.
Ещё не придумал как обойти...


вот где собака порылась :) раскомментировал данную строку, итоги в detail таблицах стал считать (это когда по master гриду ходишь), но гриды действительно глючат в таком режиме... как быть?

Добавлено спустя 1 минуту 8 секунд:
одного не понимаю, в каких то гридах считает при закомментированной строке CalcStatTotals в UpdateActive, в каких то нет о_О

Добавлено спустя 54 минуты 41 секунду:
всё, разобрался

я посмотрел как происходит расчёт итогов сейчас, он производится один раз, при открытии окна с гридом, соответственно при режиме dsBrowse данная процедура не выполняется, а так как данные detail грида зависят от master грида, естественно при переходе по строкам родительского грида пересчёта в дочернем гриде не происходит

в отношении гридов где якобы происходил расчёт так совпало что тестовые данные содержатся только для первой строки родительского грида, соответственно в футере отображались итоги, но дальше данных не было (для других родительских строк) а мне казалось что грид отображает корректные футеры, я попробовал ввёл две строки родительского грида, и привязал по одной строке в дочерних гридах, при перескакивании по строкам родительского грида, в дочернем в футере отображаются данные для той строки которую рассчитали первой
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Глюки rxDBGrid

Сообщение Little_Roo » 29.05.2012 14:20:52

Что случилось с гридом - отказывается редактировать и вставлять записи??? На и переход от записи к записи стал жутко тормозить??? :(
Версия rxnew из svn

Началось с какой-то из последних версий

Firebird 2.5 winxp
Lazarus 1.1 r37447 FPC 2.7.1 i386-win32-win32/win64
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Глюки rxDBGrid

Сообщение alexs » 30.05.2012 07:18:57

Когда началось?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Глюки rxDBGrid

Сообщение Little_Roo » 30.05.2012 11:28:35

alexs писал(а):Когда началось?

Вроде после 2410
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Пред.След.

Вернуться в RxLib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru