UniQuery-FetchRows и пагинация

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
antarey
Сообщения: 3
Зарегистрирован: Пт 26 июн 2020 06:33

UniQuery-FetchRows и пагинация

Сообщение antarey » Пт 26 июн 2020 06:59

Есть компоненты для вебразработки.
И есть таблица с 500к записей.
В UniDBGrid пагинатор встроенный. Передавать на клиента 500к записей скажем так глупо.

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

UniDBGrid1->WebOptions->PageSize = 20;
UniQuery->..FetchAll = false;
UniQuery->FetchRows = 20;
Все прекрасно, но грид думает что в таблице всего 20 записей и естественно пагинация не работает.
Как сообщить гриду реальное количество записей?

antarey
Сообщения: 3
Зарегистрирован: Пт 26 июн 2020 06:33

Re: UniQuery-FetchRows и пагинация

Сообщение antarey » Пт 26 июн 2020 07:21

Как вообще работает uniQuery при FetchAll = false если задано FetchRows = 20?
Таблица открылась и загрузилось 20 записей, при Next на 20-й подгружаются следующие 20, а что с предыдущими 20?
Они остаются в памяти? Если да - то на таблице с 500к записей клиент может проклацать все записи и в памяти будут все записи и клиент ляжет. Тогда я так понимаю единственный вариант делать свой пагинатор и работать с SELECT LIMIT

Stellar
Devart Team
Сообщения: 20
Зарегистрирован: Чт 07 дек 2017 14:56

Re: UniQuery-FetchRows и пагинация

Сообщение Stellar » Чт 02 июл 2020 12:50

Для получения данных из больших таблиц компоненты UniDac имеет специальный режим SmartFetch, который минимизирует использование памяти приложением. Когда режим SmartFetch включен, а для параметра LiveBlock установлено значение True, объем выделенной памяти соответствует количеству записей, определенных в свойстве FetchRows. Когда новые записи загружены, дополнительная память не будет выделена, и такие записи будут удалены из памяти.

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

UniQuery1->FetchRows = 50;
UniQuery1->SpecificOptions->Values["FetchAll"] = "True";
UniQuery1->SmartFetch->Enabled = true;
UniQuery1->SmartFetch->LiveBlock = true;
UniQuery1->KeyFields = "id";
UniQuery1->Open();
Больше информации о SmartFetch опции Вы можете прочитать в нашей он-лайн документации:
https://www.devart.com/unidac/docs/?dev ... ptions.htm

antarey
Сообщения: 3
Зарегистрирован: Пт 26 июн 2020 06:33

Re: UniQuery-FetchRows и пагинация

Сообщение antarey » Пн 06 июл 2020 08:37

Так
UniQuery1->SpecificOptions->Values["FetchAll"] = "True";
Нужно включать? Я думал что как раз FetchAll надо выключить для ограничения записей.
Спасибо за ответ.

Stellar
Devart Team
Сообщения: 20
Зарегистрирован: Чт 07 дек 2017 14:56

Re: UniQuery-FetchRows и пагинация

Сообщение Stellar » Ср 08 июл 2020 15:42

Был рад помочь, если у Вас возникнут какие-либо дополнительные вопросы о наших продуктах, пожалуйста свяжитесь с нами.

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

Re: UniQuery-FetchRows и пагинация

Сообщение Akella » Пт 07 авг 2020 08:53

Stellar писал(а): Чт 02 июл 2020 12:50 Больше информации о SmartFetch опции Вы можете прочитать в нашей он-лайн документации:
https://www.devart.com/unidac/docs/?dev ... ptions.htm
И где же там "больше информации"?
Наоборот - там той информации, которую написали вы здесь - вообще нет, не то чтобы "больше" :(

Stellar
Devart Team
Сообщения: 20
Зарегистрирован: Чт 07 дек 2017 14:56

Re: UniQuery-FetchRows и пагинация

Сообщение Stellar » Чт 11 мар 2021 16:42

Имелось ввиду, что документация содержит описание для параметров SmartFetch.

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

Re: UniQuery-FetchRows и пагинация

Сообщение Akella » Ср 17 мар 2021 18:53

Я еще раз переспрошу и уточню по этим трем параметрам.
Т.е. если включены SmartFetch и LiveBlock, то нужно включать еще и третий спец. параметр "FetchAll"? Правильно я понимаю?

Stellar
Devart Team
Сообщения: 20
Зарегистрирован: Чт 07 дек 2017 14:56

Re: UniQuery-FetchRows и пагинация

Сообщение Stellar » Чт 18 мар 2021 09:36

Если для TUniQuery/TUniTable активирован режим SmartFetch, тогда не нужно ограничивать загрузку записей в набор данных. Пример использования SmartFetch:

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

UniQuery1.SQL.Text := 'SELECT DEPTNO, DNAME, LOC FROM DEPT';
UniQuery1.FetchRows := 50;
UniQuery1.KeyFields := 'DEPTNO';
UniQuery1.FetchAll := True;
UniQuery1.SmartFetch.LiveBlock := True;
UniQuery1.SmartFetch.Enabled := True;
UniQuery1.Open;
В режиме FetchAll = False, UniDAC отправляет один запрос на сервер, для получения всех записей. Но загружает записи, в набор данных, по мере необходимости(при перемещении курсора). Если переместить курсор в конец набора данных, тогда все записи будут загружены в набор данных.
В режиме SmartFetch на сервер отправляется запрос, для получения ограниченного количества записей. Загружаемое количество записей определяется свойством FetchRows. Запрос получения записей будет иметь приблизительно такой вид:

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

// FetchRows = 50;
SELECT * FROM Dept WHEREE DeptNO > 0 AND DeptNO <= 50
При перемещении курсора, будет отправлен еще один запрос на сервер:

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

SELECT * FROM Dept WHEREE DeptNO > 50 AND DeptNO <= 100
Если для опции SmartFetch.LiveBlock установлено значение True, тогда предыдущие 50 записей будут удалены с набора данных.

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

Re: UniQuery-FetchRows и пагинация

Сообщение Akella » Чт 18 мар 2021 10:07

Как работает технология smartfetch + liveblock - это я понял.
Я не понял, нужно ли включать при этом включать
UniQuery1->SpecificOptions->Values["FetchAll"] = "True";

или нет?

Stellar
Devart Team
Сообщения: 20
Зарегистрирован: Чт 07 дек 2017 14:56

Re: UniQuery-FetchRows и пагинация

Сообщение Stellar » Чт 18 мар 2021 10:23

При исcпользовани SmartFetch установите для опции FetchAll значение True (значение по умолчанию).
UniQuery1->SpecificOptions->Values["FetchAll"] = "True";

Ответить