madorin / fibplus

FibPlus Library for Delphi and C++Builder. Data access components for Firebird & Interbase.
168 stars 58 forks source link

FIBDataset - при включении фильтра выдает ошибку #5

Open Dedrasta opened 7 years ago

Dedrasta commented 7 years ago

Написал фильтр для датасета: filter := 'ID in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)'; При включении фильтра получаю ошибку: Variant or safearray index out of bounds

в модуле FIBDataset

procedure TFIBCustomDataSet.RefreshClientFields(ForceCalc:boolean=True); ... b:=Bookmark; try Bookmark:=b; //здесь выдает ошибку

Но если в скобках оставить только 16 чисел:

filter := 'ID in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)';

Delphi 10.1 Berlin

FibPlus 7.6 http://www.sql.ru/forum/955845-12/a-chto-proekt-devrace-fibplus-uzhe-umer

madorin commented 7 years ago

Ошибка подтверждена в парсере фильтра. Займусь когда будет время.

SanekPro commented 7 years ago

Еще один баг в парсере DBParsers.pas при UTF-8 кодировке и использовании не русских самволов по ним не работает фильтр, например вот такая фамилия "Шуғай Мейрам" не может быть отображена с помощью фильтра как не вводи, проблема в строке 540 Result:=VarAsType(Result[0], varString); заменить на Result:=VarAsType(Result[0], {$IFDEF D2009+}varUString{$ELSE}varString{$IFEND});

shavluk commented 4 years ago

Проблема с фильтром обходится динамическим расширением массива Result Почему он так быстро растет не могу понять, но костыль такой:

523:                  while not VarIsEmpty(Arg1[Z]) do
524:                  begin
+++                     if VarArrayHighBound(Result, 1) < i then
+++                       VarArrayRedim(Result, i + i div 4);
525:                    Result[I] := Arg1[Z];
526:                    Inc(I); Inc(Z);
527:                  end;