Постраничное получение записей FetchAll = false

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Постраничное получение записей FetchAll = false

Сообщение Akella » Чт 19 апр 2012 20:06

У UniQuery не нашёл FetchAll
UniQuery.FetchRows установлено в 25

Открываю DataEditor, туда загружаются все 453 записи.
А как сделать "постраничную" загрузку в грид?

Вообще-то я хочу постранично выводить в cxGrid, там есть GridMode для таких случаев.

bork
Devart Team
Сообщения: 16
Зарегистрирован: Вт 06 сен 2011 09:22

Сообщение bork » Пт 20 апр 2012 09:46

Добрый день.

FetchAll - это свойство, спецефическое для MySQL, поэтому вы можете его задать через SpecificOptions. Как это сделать, вы можете посмотреть в хелпе по UniDAC (файл UniDAC.chm).

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 20 апр 2012 10:10

Ели его добавить только к конкретному UniQuery, должно работать или нет?

Код: Выделить всё

qUsersEkr.SpecificOptions.Add('FetchAll = False');
или нужно в UniConnection добавлять?

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 20 апр 2012 10:13

Что-то не получается. И к connection добавил

Код: Выделить всё

connEkr.SpecificOptions.Add('FetchAll = False');
В cxGrid`е установил DataModeController.GridMode := True и тоже 25 записей в GridModeBuffer.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Сообщение Alexp » Пт 20 апр 2012 11:06

Добрый день,

У TUniConnection нет опции FetchAll так как эта опция отвечает за fetch данных и применима только к DataSet. Для того чтобы опция была применима в дизайн-тайме вам необходимо установить ее в редакторе компонента UniQuery на вкладке Options - в этом случае в DataEditor будет отображаться заданное количество записей.
Для "постраничного" отображения данных в cxGrid достаточно установить опцию FetchAll у TuniConnection в False и следующие опции crGrid

Код: Выделить всё

 cxGrid1DBTableView1.DataController.DataModeController.GridMode := true;
 cxGrid1DBTableView1.DataController.DataModeController.GridModeBufferCount := 25;
проверить правильность поведения вы можете создав обработчик события TuniQuery.AfterFetch

Код: Выделить всё

procedure TForm6.UniQuery1AfterFetch(DataSet: TCustomDADataSet);
begin
   ShowMessage(IntToStr(UniQuery1.RecordCount));
end;

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пт 20 апр 2012 11:33

Установил в False

Изображение

Всё равно все записи
Изображение


Но. Если вызвать DataEditor прямо из окна UniQueryEditor, то да, 25 записей:
Изображение

Ну и cxGrid всё равно показывает все записи, хотя свойства грида установлены правильно:
Изображение



и это не могу понять:
У TUniConnection нет опции FetchAll
Для "постраничного" отображения данных в cxGrid достаточно установить опцию FetchAll у TuniConnection в False

добавил:

Код: Выделить всё

procedure TDM.qUsersEkrAfterFetch(DataSet: TCustomDADataSet);
begin
  ShowMessage(qUsersEkr.RecordCount);
end;
Мне было показано это сообщение через каждые 25 записей, начиная с нуля и до 453.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Сообщение Alexp » Пн 23 апр 2012 13:14

Добрый день,

Мы проверили Fetch данных с выключенной опцией FetchAll и установленными опциями GridMode и GridModeBufferCount (cxGrid версии 6.52 delphi 2010) и данные получаются "постранично". Попробуйте проверить это поведение используя стандартный DBGrid. Если проблема возникает только с cxGrid, пожалуйста, обратитесь к разработчика для уточнения опций необходимых для отключения полного вычитывания данных из DataSet

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Сообщение Akella » Пн 23 апр 2012 13:42

Спасибо, проверим.

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Чт 03 май 2012 18:12

Ещё раз проделал опыт в design-time.
Не получается у меня выводить записи постранично.

В таблице всего 18 записей.
Указал 10 в свойстве FetchRows:
Изображение

Подключил стандартный TDBGrid, он показывает все 18 записей, а не 10:
Изображение


Вот ваш встроенный в UniQuery грид тоже показывает 18 (к UniQuery ничего не подключено больше). Правой кнопкой по UniQuery, вызываю DataEditor:
Изображение

А теперь вот что заметил. Если в DataEditor нажать Close, а потом Open, то встроенный грид показывает правильно - 10 записей. Но при этом свойство active всё время в false.

Так как же мне добиться требуемого результата?

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Чт 03 май 2012 18:39

Ещё раз поэкспериментировал, но уже в run-time.
Получилось. TcxGrid показывает порциями по 10 записей.

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Чт 03 май 2012 18:40

Интересно, а если в гриде и в UniQuery указать разное количество записей для буфера...

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Чт 03 май 2012 18:55

Ещё вопрос.
Свойство FetchAll в SpecificOptions уже есть, оно там постоянно:
Изображение

Так вот, как им управлять программно?
Т.е. пользователь дёргает CheckBox, а как мне проще программно менять значение этого свойства?
Искать его, удалять, затем заново добавлять, или как?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Постраничное получение записей FetchAll = false

Сообщение Alexp » Пт 04 май 2012 09:08

hello,

Для изменения SpecificOptions в ран-тайм используеться следующая конструкция

Код: Выделить всё

UniQuery.SpecificOptions.Value['Название опции']:= 'значение';
в Вашем случае

Код: Выделить всё

UniQuery.SpecificOptions.Value['FetchAll']:= 'false'; //True
В приведенном вами DBGrid отображаються все записи так как DBGrid Вычитывает столько записей сколько он может отобразить, т.е. если размер (высота) DBGrid позволяет отобразить 100 записей то в независимости от настроек из базы будут получены 100 записей, это же поведение приводит и к отображению всех записей DataEditor (эти записи уже были получены в гриде)

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Пт 04 май 2012 10:21

Спасибо за пояснения.

Akella
Сообщения: 210
Зарегистрирован: Пн 02 апр 2012 14:41

Re: Постраничное получение записей FetchAll = false

Сообщение Akella » Пт 04 май 2012 11:18

Наверное valueS?

Код: Выделить всё

UniQuery.SpecificOptions.Values['Название опции']:= 'значение';

Ответить