Глюки rxDBGrid
Модераторы: alexs, Модераторы
сложновато будет, попробую сам отловить баг
пользуюсь сборкой rxfpc-2012-03-31--04-00-01, всё равно вылетает ошибка index out of bounds
вот в этой процедуре приходится добавлять проверку not (F.IsNull)
(это текущий мой вариант)
вот в этой процедуре приходится добавлять проверку 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;обнаружил ещё одну ошибку в следующей процедуре
ошибка возникает при попытке обновить пустую таблицу, в моём случае после удаления последней строки, временное решение заключается в добавлении условия на проверку наличия строк в Dataset грида в соответствующей процедуре
rxfpc-2012-03-31--04-00-01
Код: Выделить всё
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
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Добавить код можно. Не противоречит ничему.
Но в последних комитах я убрал из TRxDBGrid.UpdateActive пересчёт итогов. Сейчас этот метод грида изменяется на каждое изменение положения курсора в наборе данных. Получается лишние вызовы и глюки при движению по гриду, содержимое которого превышает размер самого грида.
Ещё не придумал как обойти...
Но в последних комитах я убрал из TRxDBGrid.UpdateActive пересчёт итогов. Сейчас этот метод грида изменяется на каждое изменение положения курсора в наборе данных. Получается лишние вызовы и глюки при движению по гриду, содержимое которого превышает размер самого грида.
Ещё не придумал как обойти...
ещё вопросик возник, есть функция
у меня есть поля ftLargeint, соответственно в футере не выводит сумму, в проверке такого типа нет, почему?
Код: Выделить всё
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, соответственно в футере не выводит сумму, в проверке такого типа нет, почему?
огромное спасибо, потестирую сегодня
млин устал разбираться... каким образом формируется 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 создаётся ощущение что для таких полей не отрабатывает событие расчёта итога, но вот где это присходит, если не в указанных выше процедурах, не понимаю
у меня есть на форме два грида, 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 создаётся ощущение что для таких полей не отрабатывает событие расчёта итога, но вот где это присходит, если не в указанных выше процедурах, не понимаю
я не представляю как я могу собрать и отослать вам проект, он большой и стоит денег
я понимаю что эту проблему решать мне, у меня вопрос именно практический
каким образом формируется FTestValue?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Есть метод TRxDBGrid.CalcStatTotals;
Он вызывается для пересчёта итоговой строки
В нём обычный цикл по всему набору данных.
В начале цикла для каждого столбца грида вызываеся 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; сравнивает его с текущим и, по необходимости, изменяет.
Он вызывается для пересчёта итоговой строки
В нём обычный цикл по всему набору данных.
В начале цикла для каждого столбца грида вызываеся 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; сравнивает его с текущим и, по необходимости, изменяет.
немного не в тему, но мне кажется нестандартным поведением переход на нижнюю строку при нажатии Enter, не? откуда такое взялось?
Добавлено спустя 27 минут 55 секунд:
я имею ввиду не режим редактирования, а режим просмотра
Добавлено спустя 1 час 14 минут 51 секунду:
вот где собака порылась
раскомментировал данную строку, итоги в detail таблицах стал считать (это когда по master гриду ходишь), но гриды действительно глючат в таком режиме... как быть?
Добавлено спустя 1 минуту 8 секунд:
одного не понимаю, в каких то гридах считает при закомментированной строке CalcStatTotals в UpdateActive, в каких то нет о_О
Добавлено спустя 54 минуты 41 секунду:
всё, разобрался
я посмотрел как происходит расчёт итогов сейчас, он производится один раз, при открытии окна с гридом, соответственно при режиме dsBrowse данная процедура не выполняется, а так как данные detail грида зависят от master грида, естественно при переходе по строкам родительского грида пересчёта в дочернем гриде не происходит
в отношении гридов где якобы происходил расчёт так совпало что тестовые данные содержатся только для первой строки родительского грида, соответственно в футере отображались итоги, но дальше данных не было (для других родительских строк) а мне казалось что грид отображает корректные футеры, я попробовал ввёл две строки родительского грида, и привязал по одной строке в дочерних гридах, при перескакивании по строкам родительского грида, в дочернем в футере отображаются данные для той строки которую рассчитали первой
Добавлено спустя 27 минут 55 секунд:
я имею ввиду не режим редактирования, а режим просмотра
Добавлено спустя 1 час 14 минут 51 секунду:
Но в последних комитах я убрал из TRxDBGrid.UpdateActive пересчёт итогов. Сейчас этот метод грида изменяется на каждое изменение положения курсора в наборе данных. Получается лишние вызовы и глюки при движению по гриду, содержимое которого превышает размер самого грида.
Ещё не придумал как обойти...
вот где собака порылась
Добавлено спустя 1 минуту 8 секунд:
одного не понимаю, в каких то гридах считает при закомментированной строке CalcStatTotals в UpdateActive, в каких то нет о_О
Добавлено спустя 54 минуты 41 секунду:
всё, разобрался
я посмотрел как происходит расчёт итогов сейчас, он производится один раз, при открытии окна с гридом, соответственно при режиме dsBrowse данная процедура не выполняется, а так как данные detail грида зависят от master грида, естественно при переходе по строкам родительского грида пересчёта в дочернем гриде не происходит
в отношении гридов где якобы происходил расчёт так совпало что тестовые данные содержатся только для первой строки родительского грида, соответственно в футере отображались итоги, но дальше данных не было (для других родительских строк) а мне казалось что грид отображает корректные футеры, я попробовал ввёл две строки родительского грида, и привязал по одной строке в дочерних гридах, при перескакивании по строкам родительского грида, в дочернем в футере отображаются данные для той строки которую рассчитали первой
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
Что случилось с гридом - отказывается редактировать и вставлять записи??? На и переход от записи к записи стал жутко тормозить???
Версия rxnew из svn
Началось с какой-то из последних версий
Firebird 2.5 winxp
Lazarus 1.1 r37447 FPC 2.7.1 i386-win32-win32/win64
Версия rxnew из svn
Началось с какой-то из последних версий
Firebird 2.5 winxp
Lazarus 1.1 r37447 FPC 2.7.1 i386-win32-win32/win64
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
alexs писал(а):Когда началось?
Вроде после 2410
