Страница 1 из 1

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

Добавлено: Пт 26 июн 2020 06:59
antarey
Есть компоненты для вебразработки.
И есть таблица с 500к записей.
В UniDBGrid пагинатор встроенный. Передавать на клиента 500к записей скажем так глупо.

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

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

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

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

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

Добавлено: Чт 02 июл 2020 12:50
Stellar
Для получения данных из больших таблиц компоненты 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

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

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

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

Добавлено: Ср 08 июл 2020 15:42
Stellar
Был рад помочь, если у Вас возникнут какие-либо дополнительные вопросы о наших продуктах, пожалуйста свяжитесь с нами.

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

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

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

Добавлено: Чт 11 мар 2021 16:42
Stellar
Имелось ввиду, что документация содержит описание для параметров SmartFetch.

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

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

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

Добавлено: Чт 18 мар 2021 09:36
Stellar
Если для 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 записей будут удалены с набора данных.

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

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

или нет?

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

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