QSLite+Lazarus фильтрация Dataset

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

QSLite+Lazarus фильтрация Dataset

Сообщение wofs » 17.04.2011 17:25:34

Подскажите плиз, почему имея в таблице 1000 записей я фильтрую датасет:
Код: Выделить всё
      DbGrid1.DataSource.DataSet.Filtered := False;
      DbGrid1.DataSource.DataSet.Filter := 'Field=''true''';
      DbGrid1.DataSource.DataSet.Filtered := True;

в DbGrid1у меня (после фильтрации) пять строк(записей), а
Код: Выделить всё
DbGrid1.DataSource.DataSet.RecordCount;
имеет значение 1000 ? Разве после фильтрации он не должен принять значение "5" ?

БД: SQLite
Lazarus 0.9.29 win
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: QSLite+Lazarus фильтрация Dataset

Сообщение Padre_Mortius » 17.04.2011 18:50:42

Dataset.RecordCount это количество записей в выборке, а не в фильтре... для правильного отображения используйте выборки через язык запросов SQL
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: QSLite+Lazarus фильтрация Dataset

Сообщение wofs » 17.04.2011 20:58:36

Padre_Mortius писал(а):Dataset.RecordCount это количество записей в выборке, а не в фильтре...

простите.. но разве Dataset.RecordCount это не количество записей в датасете? ведь если я его фильтрую, то и количество записей в нем изменяется, я же не смотрю сколько записей в квери - оно и есть 1 000, мне нужно кол-во записей в датасете...
для правильного отображения используйте выборки через язык запросов SQL

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

Добавлено спустя 46 минут 45 секунд:
в общем задача решена, выкладываю свое решение.
пошел по проверенному пути - проверить работоспособность кода в Delphi дабы не расшибать лоб.
приведенный в первом сообщении код оказался полностью работоспособен и помятуя о разнице между делфи и лазарус, а так же молодости лазарус принял решение найти обходной путь и нашел
Код: Выделить всё
procedure TFmMain.Button1Click(Sender: TObject);
var
  cnt: Integer;
  bmk: TBookmark;
begin
  inherited;
  DbGrid1.DataSource.DataSet.DisableControls; // Это - датасет грида
  cnt := 0;
  bmk := DbGrid1.DataSource.DataSet.GetBookmark; // Запомнили позицию
  try // Считаем
    DbGrid1.DataSource.DataSet.First;
    while not FmMain.ListKvit.DataSource.DataSet.Eof do
    begin
      Inc(cnt);
      DbGrid1.DataSource.DataSet.Next;
    end;
    DbGrid1.DataSource.DataSet.GotoBookmark(bmk); // Вернулись
  finally
    DbGrid1.DataSource.DataSet.FreeBookmark(bmk);
    DbGrid1.DataSource.DataSet.EnableControls;
  end;
  ShowMessage('Всего записей = ' + IntToStr(cnt));
end;                 

приведенное решение нашел на просторах форума сайта http://www.sql.ru
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: QSLite+Lazarus фильтрация Dataset

Сообщение Vadim » 18.04.2011 03:46:02

wofs писал(а):простите.. но разве Dataset.RecordCount это не количество записей в датасете?

Совершенно верно.
wofs писал(а):ведь если я его фильтрую, то и количество записей в нем изменяется

А вот это Ваша логическая ошибка. ;) В Датасете сколько было записей, столько и осталось, никуда они не делись. Прсто видимых записей становится столько, сколько попало под условие фильтра.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: QSLite+Lazarus фильтрация Dataset

Сообщение wofs » 18.04.2011 11:38:55

Vadim писал(а):А вот это Ваша логическая ошибка. ;) В Датасете сколько было записей, столько и осталось, никуда они не делись. Прсто видимых записей становится столько, сколько попало под условие фильтра.

тогда почему компиляция этого кода в Delphi дает логически ожидаемый результат? при условии фильтрации как в посте №1 а не через "Accept".
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: QSLite+Lazarus фильтрация Dataset

Сообщение Vadim » 18.04.2011 11:43:32

wofs писал(а):тогда почему компиляция этого кода в Delphi дает логически ожидаемый результат?

А я Борланд, я знаю? :D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: QSLite+Lazarus фильтрация Dataset

Сообщение wofs » 18.04.2011 14:57:32

Причем на лицо ошибка назначени RecordCount, так как циклом
Код: Выделить всё
while not FmMain.ListKvit.DataSource.DataSet.Eof do
    begin
      Inc(cnt);
      DbGrid1.DataSource.DataSet.Next;
    end;

мы пробегаем именно все фильтрованные записи.
тему же можно считать закрытой, вопрос решенным, остальное уже в багтрекер..
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Базы данных

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

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

Рейтинг@Mail.ru