стандарный контролер - звучит хорошо, но "король-то голый" - переменная идет прямиком в СтейтВью, и "ложит" лимит по его размеру: в зависимости от выкверинных полей от 1000 до 3000 записей предел.
поэтому приходится на фронте писать, что мол не пугайтесь, что указано только 2000 записей, мы не может вывести на пагинцию список более 2000 записей, применяйте фильтры выше.
а можно это как решить по-настоящему? что никаких фильтров и пагинации со списком в 12к записей?
Всем привет!
Решил снова поднять эту тему, так как для меня она до конца не решена.
Народу на форуме прибавилось и так что давайте обсудим это заново.
Итак квери (с пустыми по умолчанию фильтрами) возвращает список в 12к записей.
Это как-то нужно подать на фронт с пагинацией.
Вариант первый: пагинируем с помощью стандарного контролера.
Описано в блоге здесь:
https://salesforce-developer.ru/paginatsiya-na-visualforce-stranitse-pagination-using-standardsetcontroller
стандарный контролер - звучит хорошо, но "король-то голый" - переменная
[quote]public ApexPages.StandardSetController setCon[/quote] идет прямиком в СтейтВью, и "ложит" лимит по его размеру: в зависимости от выкверинных полей от 1000 до 3000 записей предел.
поэтому приходится на фронте писать, что мол не пугайтесь, что указано только 2000 записей, мы не может вывести на пагинцию список более 2000 записей, применяйте фильтры выше.
а можно это как решить по-настоящему? что никаких фильтров и пагинации со списком в 12к записей?
спасибо
мы пытались это все решить жаваскриптом, но на 10к записей валился браузер)
[quote="Den Brown"]Всем привет!
Решил снова поднять эту тему, так как для меня она до конца не решена.
Народу на форуме прибавилось и так что давайте обсудим это заново.
Итак квери (с пустыми по умолчанию фильтрами) возвращает список в 12к записей.
Это как-то нужно подать на фронт с пагинацией.
Вариант первый: пагинируем с помощью стандарного контролера.
Описано в блоге здесь:
https://salesforce-developer.ru/paginatsiya-na-visualforce-stranitse-pagination-using-standardsetcontroller
стандарный контролер - звучит хорошо, но "король-то голый" - переменная
[quote]public ApexPages.StandardSetController setCon[/quote] идет прямиком в СтейтВью, и "ложит" лимит по его размеру: в зависимости от выкверинных полей от 1000 до 3000 записей предел.
поэтому приходится на фронте писать, что мол не пугайтесь, что указано только 2000 записей, мы не может вывести на пагинцию список более 2000 записей, применяйте фильтры выше.
а можно это как решить по-настоящему? что никаких фильтров и пагинации со списком в 12к записей?
спасибо[/quote]
мы пытались это все решить жаваскриптом, но на 10к записей валился браузер)
можно попробовать transient у переменной твоей поставить если под твои условия подойдет, то используй
можно попробовать transient у переменной твоей поставить
если под твои условия подойдет, то используй
Делал както пагинацыю похожую как в сф(использовал Apex & VisualForce), но без сортировки по колонкам(Покачто есть вариант полсе которога юзера кидает на первую страницу). Сейчас работает при 30 000+ рекордах. Только кнопка "Last Page" доступна для нажатия только если записей меньше чем 2000(как в сф). На каждое нажатие "Next", "Previous" - делаю отдельный запрос в базу, чтобы витянуть записи которые нужно отображать на текущей странице, была проблема что в soql нельзя делать OFSET > 2000, пришлось не хорошо сделать, сортировка записей по ID, и запоминаю ID каждого 2000-го рекорда, и потом отфильтрофую не нужные записи по ID, так чтобы не было необходимости делать OFSET > 2000, костильно но работает. При размере страници в 30, переход происходить мгновено. Осталось только придумаю, как сделать сортировку по столбцам, так чтобы не вилететь за лимити.
ИМХО, страница не должна отображать дофигиша рекордов, я даже не могу представить, когда кому то захочеться переходить на все страници. Как по мне, должны быть фильтри, и юзер с их помощу должне находить только те записи, которые ему нужно.
Делал както пагинацыю похожую как в сф(использовал Apex & VisualForce), но без сортировки по колонкам(Покачто есть вариант полсе которога юзера кидает на первую страницу). Сейчас работает при 30 000+ рекордах. Только кнопка "Last Page" доступна для нажатия только если записей меньше чем 2000(как в сф). На каждое нажатие "Next", "Previous" - делаю отдельный запрос в базу, чтобы витянуть записи которые нужно отображать на текущей странице, была проблема что в soql нельзя делать OFSET > 2000, пришлось не хорошо сделать, сортировка записей по ID, и запоминаю ID каждого 2000-го рекорда, и потом отфильтрофую не нужные записи по ID, так чтобы не было необходимости делать OFSET > 2000, костильно но работает. При размере страници в 30, переход происходить мгновено. Осталось только придумаю, как сделать сортировку по столбцам, так чтобы не вилететь за лимити.
ИМХО, страница не должна отображать дофигиша рекордов, я даже не могу представить, когда кому то захочеться переходить на все страници. Как по мне, должны быть фильтри, и юзер с их помощу должне находить только те записи, которые ему нужно.
ИМХО, страница не должна отображать дофигиша рекордов, я даже не могу представить, когда кому то захочеться переходить на все страници. Как по мне, должны быть фильтри, и юзер с их помощу должне находить только те записи, которые ему нужно.
Это все верно.
Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!! так что приходится писать пояснение.
[quote="Alex Tsitsura"]ИМХО, страница не должна отображать дофигиша рекордов, я даже не могу представить, когда кому то захочеться переходить на все страници. Как по мне, должны быть фильтри, и юзер с их помощу должне находить только те записи, которые ему нужно.[/quote]
Это все верно.
Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!!
так что приходится писать пояснение.
ну или сразу надо какой-то фильтр использовать.
такие вещи как пагинацию нужно разруливать в контроллере.
Но!
нашел какой то JS плагин, который подключаешь к таблице - и таблица на 1000 записей превращается в красивую табличку с пагинацией, с сортировкой по полям, с быстрым поиском по содержанию выведенных полей.
Но все равно больше 1000 записей на фронт в эту таблицу не подашь (да и много записей в JS - полюбому не годиться). Но с другой стороны, что лучше - убогая пагинация на 2-3к записей в контроллере, или чудная таблица на 1000 записей спагинированая на фронте? есть над чем подумать...
[quote="Maxim Elets"]на 10к записей валился браузер)[/quote]
такие вещи как пагинацию нужно разруливать в контроллере.
Но!
нашел какой то JS плагин, который подключаешь к таблице - и таблица на 1000 записей превращается в красивую табличку с пагинацией, с сортировкой по полям, с быстрым поиском по содержанию выведенных полей.
Но все равно больше 1000 записей на фронт в эту таблицу не подашь (да и много записей в JS - полюбому не годиться). Но с другой стороны, что лучше - убогая пагинация на 2-3к записей в контроллере, или чудная таблица на 1000 записей спагинированая на фронте? есть над чем подумать...
Можно погуглить по ключевым словам:
[quote]seek method[/quote]
[quote]keyset pagination[/quote]
Но с другой стороны, что лучше - убогая пагинация на 2-3к записей в контроллере, или чудная таблица на 1000 записей спагинированая на фронте? есть над чем подумать...
[quote="Den Brown"]Но с другой стороны, что лучше - убогая пагинация на 2-3к записей в контроллере, или чудная таблица на 1000 записей спагинированая на фронте? есть над чем подумать...[/quote]
почему убогая?
Итак квери (с пустыми по умолчанию фильтрами) возвращает список в 12к записей. Это как-то нужно подать на фронт с пагинацией.
Паджинация и служит для того, чтобы выдавать данные порционно, а, следовательно, и запрашивать их нужно также.
[quote="Den Brown"]Итак квери (с пустыми по умолчанию фильтрами) возвращает список в 12к записей.
Это как-то нужно подать на фронт с пагинацией.[/quote]
Паджинация и служит для того, чтобы выдавать данные порционно, а, следовательно, и запрашивать их нужно также.
Паджинация и служит для того, чтобы выдавать данные порционно, а следовтельно и запрашивать их нужно также.
[quote="Gres"]Паджинация и служит для того, чтобы выдавать данные порционно, а следовтельно и запрашивать их нужно также.[/quote]
Я полностью кстати согласен
а можно это как решить по-настоящему? что никаких фильтров и пагинации со списком в 12к записей?
Конечно, можно используя только сравнение по сортируемому полю + Limit
[quote="Den Brown"]а можно это как решить по-настоящему? что никаких фильтров и пагинации со списком в 12к записей?[/quote]
Конечно, можно используя только сравнение по сортируемому полю + Limit
Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!! так что приходится писать пояснение.
А ты показывай им реальное количество записей, а выводи только первую страницу.
[quote="Den Brown"]Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!!
так что приходится писать пояснение. [/quote]
А ты показывай им реальное количество записей, а выводи только первую страницу.
Давайте напишем свой фреймворк для паджинации в СФ без лимита в 2000?
Давайте напишем свой фреймворк для паджинации в СФ без лимита в 2000?
Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!! так что приходится писать пояснение.
А ты показывай им реальное количество записей, а выводи только первую страницу.
А как вы посчитали что там реально 12 к записей? я просто помню пытался агрегатку сделать, так она не возвращала реальной каритны(
[quote="Gres"][quote="Den Brown"]Но есть лист который изначально подгружается без фильтров, и админы напрягаются, говорят: а почему там только 2000 записей?! у меня же больше было!!
так что приходится писать пояснение. [/quote]
А ты показывай им реальное количество записей, а выводи только первую страницу.[/quote]
А как вы посчитали что там реально 12 к записей? я просто помню пытался агрегатку сделать, так она не возвращала реальной каритны(
А как вы посчитали что там реально 12 к записей? я просто помню пытался агрегатку сделать, так она не возвращала реальной каритны(
Кстати да, count может выбрать не более 50,000 записей
[quote="Maxim Elets"]А как вы посчитали что там реально 12 к записей? я просто помню пытался агрегатку сделать, так она не возвращала реальной каритны([/quote]
Кстати да, count может выбрать не более 50,000 записей
А как вы посчитали что там реально 12 к записей?
да, просто отмигрировали легаси дату. Они точно знают сколько там записей...
[quote="Maxim Elets"]А как вы посчитали что там реально 12 к записей? [/quote]
да, просто отмигрировали легаси дату. Они точно знают сколько там записей...
Кстати да, count может выбрать не более 50,000 записей
Потому что он, на самом деле просто выбирает все данные, а потом считает. Теперь то у нас есть @ReadOnly, так что лимит увеличивается до 1 млн. при отсутствии DML.
[quote="Дима Лисовский"]Кстати да, count может выбрать не более 50,000 записей[/quote]
Потому что он, на самом деле просто выбирает все данные, а потом считает.
Теперь то у нас есть @ReadOnly, так что лимит увеличивается до 1 млн. при отсутствии DML.
Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
Вот и пример http://salesforce.stackexchange.com/questions/9474/can-we-query-the-info-from-data-management-storage-usage-through-soap-api
Ещё есть вариант завести свой счётчик и в триггере обновлять
Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
[quote="Дима Лисовский"]Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
Вот и пример http://salesforce.stackexchange.com/questions/9474/can-we-query-the-info-from-data-management-storage-usage-through-soap-api
[/quote]
Ну и отлично
[quote="Gres"]Вот и пример http://salesforce.stackexchange.com/questions/9474/can-we-query-the-info-from-data-management-storage-usage-through-soap-api[/quote]
ТОже только что читаЛ) странно что через апи у сф нету такой фичи
Млин, народ. Какая пагинация больших списков? Это баг архитектуры. Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000. Дайте ему ПОИСК!
Млин, народ. Какая пагинация больших списков?
Это баг архитектуры.
Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000.
Дайте ему ПОИСК!
Млин, народ. Какая пагинация больших списков? Это баг архитектуры. Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000. Дайте ему ПОИСК!
Серьезно вот тебе пример из жизни, зачем мне нужно больше 2000 записей. Мой пример больше правда относиться не к пагинации, а к dataTable
Так вот ты делаешь initial commit и тебе нужно видеть что ты вообше посылаешь в GIT. Так вот бывают проекты в которых более 2000 файлов и за один раз ты этого сделать не можешь, а очень хочется.
[quote="Dmitry Shnyrev"]Млин, народ. Какая пагинация больших списков?
Это баг архитектуры.
Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000.
Дайте ему ПОИСК![/quote]
Серьезно вот тебе пример из жизни, зачем мне нужно больше 2000 записей. Мой пример больше правда относиться не к пагинации, а к dataTable
Так вот ты делаешь initial commit и тебе нужно видеть что ты вообше посылаешь в GIT. Так вот бывают проекты в которых более 2000 файлов и за один раз ты этого сделать не можешь, а очень хочется.
Млин, народ. Какая пагинация больших списков? Это баг архитектуры. Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000. Дайте ему ПОИСК!
Признай, что пользователь не всегда знает, что хочет.
[quote="Dmitry Shnyrev"]Млин, народ. Какая пагинация больших списков?
Это баг архитектуры.
Повторю еще раз НАХРЕНА пользователю пагинация по 10000 записей? Да даже на 2000.
Дайте ему ПОИСК![/quote]
Признай, что пользователь не всегда знает, что хочет.
Так вот ты делаешь initial commit и тебе нужно видеть что ты вообше посылаешь в GIT. Так вот бывают проекты в которых более 2000 файлов и за один раз ты этого сделать не можешь, а очень хочется.
Ага. Давай, покажи пользователю сразу все >2000 файлов, даже с пагинацией. Тут в bitbucket со списком в 100 файлов не знаешь что делать, а ты про 2000. Ну ну. Или ты реально сидишь и реально просматриваешь полностью список в >2000 файлов и поиском не пользуешься?
[quote="wilder"]Так вот ты делаешь initial commit и тебе нужно видеть что ты вообше посылаешь в GIT. Так вот бывают проекты в которых более 2000 файлов и за один раз ты этого сделать не можешь, а очень хочется.[/quote]
Ага. Давай, покажи пользователю сразу все >2000 файлов, даже с пагинацией.
Тут в bitbucket со списком в 100 файлов не знаешь что делать, а ты про 2000. Ну ну. Или ты реально сидишь и реально просматриваешь полностью список в >2000 файлов и поиском не пользуешься?
Обычно в таком случае используют навигацию в виде дерева (каталоги). Чем тебе не замена пагинации?
[quote="Dmitry Shnyrev"]Обычно в таком случае используют навигацию в виде дерева (каталоги).
Чем тебе не замена пагинации?[/quote]
Когда делаешь первый комит, нужно просматривать то что заливаешь, хотя бы на уровне типов метаданных.
И да дерево ничего не мешает сделать.
Когда делаешь первый комит, нужно просматривать то что заливаешь, хотя бы на уровне типов метаданных.
ооо, это точно. а то иногда приходишь на проект, а там в свне/гите такая жеппппа.
[quote="wilder"]Когда делаешь первый комит, нужно просматривать то что заливаешь, хотя бы на уровне типов метаданных.[/quote]
ооо, это точно. а то иногда приходишь на проект, а там в свне/гите такая жеппппа.
свне/гите такая жеппппа.
Это неизбежная реальность. Идеальный проект - свой проект :))))
[quote="Maxim Elets"]свне/гите такая жеппппа.[/quote]
Это неизбежная реальность.
Идеальный проект - свой проект :))))
Но мы отвлеклись от основной темы.
Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
С такими большими объёмами данных работать не так-то просто, знание того сколько записей, если их там 1M может пригодиться только для того чтобы показать - в этой таблице 1М записей. Потому что работать с такой большой таблицей без фильтрации SF вам не позволит - просто мило скажет что query должна быть selective ещё за долго до миллиона записей, т.е. как правильно заметили выше - фильтруйте. Причём в случае с такими объёмами данных не просто фильтруйте, а фильтруйте по полям которые индексируются (минимум это Name, External IDs, audit fields). А в случае с 12K записей - почему бы не сделать это через связку JS + Ajax Toolkit + Apex - в JS формируете запрос, вытаскиваете только ID'шники (для быстроты), скармливаете эти ID'шники Apex'у, а он уже вытаскивает всё что надо. А для pagination используйте queryMore, который в JS доступен.
[quote="Gres"][quote="Дима Лисовский"]Есть вариант сделать запрос к Storage Usage, распарсить HTML и получить реальное количество записей, даже если их > 1млн.
Вот и пример http://salesforce.stackexchange.com/questions/9474/can-we-query-the-info-from-data-management-storage-usage-through-soap-api
[/quote]
Ну и отлично[/quote]
С такими большими объёмами данных работать не так-то просто, знание того сколько записей, если их там 1M может пригодиться только для того чтобы показать - в этой таблице 1М записей. Потому что работать с такой большой таблицей без фильтрации SF вам не позволит :) - просто мило скажет что query должна быть selective ещё за долго до миллиона записей, т.е. как правильно заметили выше - фильтруйте. Причём в случае с такими объёмами данных не просто фильтруйте, а фильтруйте по полям которые индексируются (минимум это Name, External IDs, audit fields).
А в случае с 12K записей - почему бы не сделать это через связку JS + Ajax Toolkit + Apex - в JS формируете запрос, вытаскиваете только ID'шники (для быстроты), скармливаете эти ID'шники Apex'у, а он уже вытаскивает всё что надо. А для pagination используйте queryMore, который в JS доступен.
Потому что работать с такой большой таблицей без фильтрации SF вам не позволит - просто мило скажет что query должна быть selective ещё за долго до миллиона записей
[quote="ilya leshchuk"]Потому что работать с такой большой таблицей без фильтрации SF вам не позволит - просто мило скажет что query должна быть selective ещё за долго до миллиона записей[/quote]
Да тут объем зависит от типа индексируемых полей
Да, не ожидал я, что все так сложно. казалось что все что нужно, сохранять во стейт вью номер страницы (точнее OFSET) и все...
Да, не ожидал я, что все так сложно. казалось что все что нужно, сохранять во стейт вью номер страницы (точнее OFSET) и все...
что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".
посмотрел как одна контора сделала пагинирующийся список - там на OFFSETе, при этом не вижу никакого стопора на значение более 2000, видимо эта ситуация вообще не обрабатывается.
офсет хорош тем в СтайтВью не нужно грузить стандарный контроллер со всеми его записями. Но максимумальный размер списка меньше, чем можно выжать из пагинации на стандартном контроллере.
Я вот что подумал: есть хорошие JS плагины, который приведут твою <table> в прелестный вид, с пагинацией, быстрым поиском и прочее.
Но мы не может подать на фронт список размером более 1000 записей.
И теперь вопрос знатокам: а можем ли мы подать на фронт несколько Списков каждый размером в 1000 записей?
и если можем - то Репитором просто создаешь одну Таблицу из этих Списков, на которую и вешается Плагин. А переменные со списками не даем сохраняться в СтайтВью.
и все счастливы (кроме браузера - ему конечно тяжеловато будет).
что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".
посмотрел как одна контора сделала пагинирующийся список - там на OFFSETе, при этом не вижу никакого стопора на значение более 2000, видимо эта ситуация вообще не обрабатывается.
офсет хорош тем в СтайтВью не нужно грузить стандарный контроллер со всеми его записями. Но максимумальный размер списка меньше, чем можно выжать из пагинации на стандартном контроллере.
Я вот что подумал: есть хорошие JS плагины, который приведут твою <table> в прелестный вид, с пагинацией, быстрым поиском и прочее.
Но мы не может подать на фронт список размером более 1000 записей.
И теперь вопрос знатокам: а можем ли мы подать на фронт несколько Списков каждый размером в 1000 записей?
и если можем - то Репитором просто создаешь одну Таблицу из этих Списков, на которую и вешается Плагин.
А переменные со списками не даем сохраняться в СтайтВью.
и все счастливы (кроме браузера - ему конечно тяжеловато будет).
что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".
посмотрел как одна контора сделала пагинирующийся список - там на OFFSETе, при этом не вижу никакого стопора на значение более 2000, видимо эта ситуация вообще не обрабатывается.
офсет хорош тем в СтайтВью не нужно грузить стандарный контроллер со всеми его записями. Но максимумальный размер списка меньше, чем можно выжать из пагинации на стандартном контроллере.
Я вот что подумал: есть хорошие JS плагины, который приведут твою <table> в прелестный вид, с пагинацией, быстрым поиском и прочее.
Но мы не может подать на фронт список размером более 1000 записей.
И теперь вопрос знатокам: а можем ли мы подать на фронт несколько Списков каждый размером в 1000 записей?
и если можем - то Репитором просто создаешь одну Таблицу из этих Списков, на которую и вешается Плагин. А переменные со списками не даем сохраняться в СтайтВью.
и все счастливы (кроме браузера - ему конечно тяжеловато будет).
Так может все же подавать подгружать данные ajax?
Но вообще в врп иногда приходилось делать лист внутри которого лист. И получался биглист 1000*1000 к примеру
[quote="Den Brown"]что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".
посмотрел как одна контора сделала пагинирующийся список - там на OFFSETе, при этом не вижу никакого стопора на значение более 2000, видимо эта ситуация вообще не обрабатывается.
офсет хорош тем в СтайтВью не нужно грузить стандарный контроллер со всеми его записями. Но максимумальный размер списка меньше, чем можно выжать из пагинации на стандартном контроллере.
Я вот что подумал: есть хорошие JS плагины, который приведут твою <table> в прелестный вид, с пагинацией, быстрым поиском и прочее.
Но мы не может подать на фронт список размером более 1000 записей.
И теперь вопрос знатокам: а можем ли мы подать на фронт несколько Списков каждый размером в 1000 записей?
и если можем - то Репитором просто создаешь одну Таблицу из этих Списков, на которую и вешается Плагин.
А переменные со списками не даем сохраняться в СтайтВью.
и все счастливы (кроме браузера - ему конечно тяжеловато будет).[/quote]
Так может все же подавать подгружать данные ajax?
Но вообще в врп иногда приходилось делать лист внутри которого лист. И получался биглист
1000*1000 к примеру
Так может все же подавать подгружать данные ajax?
c ajax конечно все аккуратно выглядит. но если изначально мы загрузили список в 1000 записей в наш JS плагин, то быстрый поиск, переход на последнюю страницу или например сортировка по полям будет осуществляться только в пределах этого списка...
сложные варианты со сложенными списками не рассматриваю.
[quote="Maxim Elets"]Так может все же подавать подгружать данные ajax?[/quote]
c ajax конечно все аккуратно выглядит. но если изначально мы загрузили список в 1000 записей в наш JS плагин, то быстрый поиск, переход на последнюю страницу или например сортировка по полям будет осуществляться только в пределах этого списка...
сложные варианты со сложенными списками не рассматриваю.
что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".
А чем вам не нравится связка JS + Ajax Toolkit + Apex? Из JS через Ajax Toolkit вам доступна замечательная штука - queryMore: сформировали query с фильтрами, сортировками, блэкджеком и шлюхами и листайте его через queryMore. Можете прям в JS всё проделывать, а можете получать список Id, отсылать их контроллеру и через Apex и VF всё отрисовывать.
[quote="Den Brown"]что-то эта тема меня "не отпускает", какой-то "незавершенный гештальт".[/quote]
А чем вам не нравится связка JS + Ajax Toolkit + Apex?
Из JS через Ajax Toolkit вам доступна замечательная штука - queryMore: сформировали query с фильтрами, сортировками, блэкджеком и шлюхами и листайте его через queryMore. Можете прям в JS всё проделывать, а можете получать список Id, отсылать их контроллеру и через Apex и VF всё отрисовывать.
А чем вам не нравится связка JS + Ajax Toolkit + Apex?
А теперь представь что у тебя нет идишников, потому что ты работаешь не с записями из базы. Твое решение ?
Я для себя пока решил использовать json и сразу пулять его на страницу. А потом уже строить пагинацию на стороне клиента.
[quote="ilya leshchuk"]А чем вам не нравится связка JS + Ajax Toolkit + Apex? [/quote]
А теперь представь что у тебя нет идишников, потому что ты работаешь не с записями из базы. Твое решение ?
Я для себя пока решил использовать json и сразу пулять его на страницу. А потом уже строить пагинацию на стороне клиента.
А теперь представь что у тебя нет идишников, потому что ты работаешь не с записями из базы. Твое решение ?
Так вроде задача стоит суметь построить page'нацию больших объемов именно данных из базы.
[quote="wilder"]А теперь представь что у тебя нет идишников, потому что ты работаешь не с записями из базы. Твое решение ?[/quote]
Так вроде задача стоит суметь построить page'нацию больших объемов именно данных из базы.
Так вроде задача стоит суметь построить page'нацию больших объемов именно данных из базы.
Я просто сторонник общих решиний. Для базы данных твой вариант почти идеален.
[quote="ilya leshchuk"]Так вроде задача стоит суметь построить page'нацию больших объемов именно данных из базы.[/quote]
Я просто сторонник общих решиний. Для базы данных твой вариант почти идеален.
А чем вам не нравится связка JS + Ajax Toolkit + Apex?
надо будет как-нибудь попробовать.
использовать json и сразу пулять его на страницу. А потом уже строить пагинацию на стороне клиента.
да, совсем забыл про json.
отстается только получить представление на каком объеме записей начнет загибаться браузер, т.к. какой-то лимит кол-ва записей по-любому должен быть. 10 тысяч бы подошло для большинства моих кейсов, так как реальное кол-во записей будет меньше, а если оно больше - то уже все, используйте фильтрацию.
[quote="ilya leshchuk"]А чем вам не нравится связка JS + Ajax Toolkit + Apex? [/quote]
надо будет как-нибудь попробовать.
[quote="wilder"]использовать json и сразу пулять его на страницу. А потом уже строить пагинацию на стороне клиента.[/quote]
да, совсем забыл про json.
отстается только получить представление на каком объеме записей начнет загибаться браузер, т.к. какой-то лимит кол-ва записей по-любому должен быть. 10 тысяч бы подошло для большинства моих кейсов, так как реальное кол-во записей будет меньше, а если оно больше - то уже все, используйте фильтрацию.
Ага, еще дождись пока твои 10000 из базы загрузятся (не сломав heap size) и передадутся по "плохому" каналу на клиент. Народ, да вы что? Где вы видели в реальном мире чтобы приложения по пол базы гоняли на каждый чих пользователя. Да, 100, 200 записей ну 1000 еще куда ни шло. Но больше! Зачем? Понимаю что Salesforce со всем справится и не обидится. Но за такое на других платформах и база данных руки отрубают.
Ага, еще дождись пока твои 10000 из базы загрузятся (не сломав heap size) и передадутся по "плохому" каналу на клиент.
Народ, да вы что? Где вы видели в реальном мире чтобы приложения по пол базы гоняли на каждый чих пользователя.
Да, 100, 200 записей ну 1000 еще куда ни шло. Но больше! Зачем? Понимаю что Salesforce со всем справится и не обидится. Но за такое на других платформах и база данных руки отрубают.
Еще можно смириться если у вас реально полноценное одностраничное приложение на JS написано, когда страница грузится 1 раз в сутки и потом просто работает. Тогда еще можно по частям, асинхронно грузануть N*1000 записей. Но все равно нет таких задач когда это жизненно необходимо и нельзя обойтись lazy loading. Но учитывая что здесь все ярые поклонники Visualforce со стандартной процедурой загрузки страниц по http запросам, то явно ваши 10000 записей не к месту!
Еще можно смириться если у вас реально полноценное одностраничное приложение на JS написано, когда страница грузится 1 раз в сутки и потом просто работает. Тогда еще можно по частям, асинхронно грузануть N*1000 записей. Но все равно нет таких задач когда это жизненно необходимо и нельзя обойтись lazy loading.
Но учитывая что здесь все ярые поклонники Visualforce со стандартной процедурой загрузки страниц по http запросам, то явно ваши 10000 записей не к месту!
Если хотите супер крутую, быструю пагинацию. Просчитайте страницы заранее, сложите ID по страницам и сохраните отдельно в формате json (в базу). Потом подгрузите и пагинируйте сколько угодно. Да будут проблемы с удаление записей, надо будет перестраивать индекс страниц, но как говорится это меньшее зло.
Если хотите супер крутую, быструю пагинацию. Просчитайте страницы заранее, сложите ID по страницам и сохраните отдельно в формате json (в базу). Потом подгрузите и пагинируйте сколько угодно. Да будут проблемы с удаление записей, надо будет перестраивать индекс страниц, но как говорится это меньшее зло.
[quote="Dmitry Shnyrev"](не сломав heap size)[/quote]
Не забывай еще про non selective query
Если хотите супер крутую, быструю пагинацию. Просчитайте страницы заранее, сложите ID по страницам и сохраните отдельно в формате json (в базу).
"Быстрая" - скорее всего, "супер крутая" - вряд ли - такой подход либо полностью исключит, либо сильно усложнит реализацию фильтрации, сортировки и прочих свистелок.
[quote="Dmitry Shnyrev"]Если хотите супер крутую, быструю пагинацию. Просчитайте страницы заранее, сложите ID по страницам и сохраните отдельно в формате json (в базу).[/quote]
"Быстрая" - скорее всего, "супер крутая" - вряд ли - такой подход либо полностью исключит, либо сильно усложнит реализацию фильтрации, сортировки и прочих свистелок.
Полностью согласен. Помню уже после того как написал это пришел к мысли что гибкостью тут и не пахнет.
Полностью согласен. Помню уже после того как написал это пришел к мысли что гибкостью тут и не пахнет.
жизнь заставила, так я живо нашел пример более-менее нормальной пагинации в контроллере, при которой записи (за исключением выводимых на фронт) не сохраняются в СтатьюВью (внутри Стандартного контроллера).
единственно, что в их примере, в "пагинирующем" цикле-селекте они кверят сразу записи со всеми полями. а у меня записи "тяжелые", кверятся с дочерними записями, при лимите в 50000 можно и хип-сайз стукнуть.
так что в "пагинирующем" цикле-селекте можно выбирать\создавать список АйДи требуемых записей и после только их и кверить по-настоящему.
жизнь заставила, так я живо нашел пример более-менее нормальной пагинации в контроллере, при которой записи (за исключением выводимых на фронт) не сохраняются в СтатьюВью (внутри Стандартного контроллера).
http://blog.cloudclickware.com/2013/12/02/list-pagination-of-a-large-record-set-with-record-selection/
единственно, что в их примере, в "пагинирующем" цикле-селекте они кверят сразу записи со всеми полями.
а у меня записи "тяжелые", кверятся с дочерними записями, при лимите в 50000 можно и хип-сайз стукнуть.
так что в "пагинирующем" цикле-селекте можно выбирать\создавать список АйДи требуемых записей и после только их и кверить по-настоящему.
[quote="Den Brown"]http://blog.cloudclickware.com/2013/12/02/list-pagination-of-a-large-record-set-with-record-selection/[/quote]
Если ты используешь OFFSET то у тебя скорее всего будет проблемы.
Если ты используешь OFFSET то у тебя скорее всего будет проблемы.
какой OFFSET? требуемый диапазон записей выбирается прямо в цикле-квери, у которого установлен лимит на 50к
//capture records within the target range if(this.totalRecords>=this.startIdx && this.totalRecords<this.endIdx){
[quote="wilder"]Если ты используешь OFFSET то у тебя скорее всего будет проблемы.[/quote]
какой OFFSET? требуемый диапазон записей выбирается прямо в цикле-квери, у которого установлен лимит на 50к
[code] //capture records within the target range
if(this.totalRecords>=this.startIdx && this.totalRecords<this.endIdx){
this.tRecords.add( new CCWRow(c, false) );
}
[/code]
первая группа решений: пагинация на стороне контроллера:
1) пагинация посредством использования OFFSET в квери. выглядит не плохо, но, как известно, работает только до отметки в 2000.
2) пагинация посредством использования стандартного контроллера, описана как в блоге у Дмитрия, так у Джефа Дагласа (того самого, у которого вся жизнь как хакатрон).
неплохой вариант, но есть но - выкверинные записи сидят внутри стандартного контроллера, который будет переменной уровня контроллера, то есть идет прямехонько во СтайтВью. Если не принять меры, то странница упадет по СтайтВью примерно на 2-4 тыс записей.
а что можно сделать? я не пробовал, но как идея, изначально выбирать только АйДи, а затем заставить "стандартный контроллер" вернуть нужный диапазон АйДи и кверить уже только требуемые записи. Но не уверен, что это возможно сделать.
3) пагинация посредством выборки требуемого диапазона записей в цикле-квери (ссылка в предыдущих сообщениях). Полностью кастомное решение, выглядит оптимально. так как, вроде, все под твоим контролем. Имеет известное ограничение на 50к записей. Как оптимизацию предлагаю в "пагинирующем" цикле-квери выбирать только АйДи, а затем отдельно кверить уже полноразмерные записи только требуемого диапазона.
вторая группа решений: пагинация на стороне клиента:
4) "фейк" пагинация посредством JS плагина. Фактически на клиент подается полноразмерный список, со всеми вытекающими последствиями... Два под-варианта:
4-1) небольшого списка без попыток обойти лимиты на длину списка и СтайтВью. Может применяться только для предсказуемо и неизменно небольших списков, а такие бывают, например, список стран мира. Обычно в приложении всегда есть вспомогательные объекты-таблицы, содержащие относительно фиксированные данные.
4-2) "фейк" пагинация посредством JS плагина списка более 1к записей и размером превышающим СтайтВью: описано в одном из блогов в разделе Сссылки - все записи одномоментно подгружаются с помощью RemoteAction на онЛоад или онРеди событие. Неплохо, но зачем вам столько записей на клиенте?
5) Реальная пагинация на клиенте. Не пробовал, так как не вижу очевидных преимуществ перед пагинацией на контроллере для тех скучных "бухгалтерских" приложения с которыми работаю. Но вероятно, те кто работают с фронт-энд фреймворками скажут, что это уже все хорошо и просто организовано, только подключи к нужному RemoteAction, REST сервису или просто ВФ страницам, возвращающей JSON.
ну ладно, попробую подвести некоторой промежуточный итог по вариантам пагинации списков.
первая группа решений: пагинация на стороне контроллера:
1) пагинация посредством использования OFFSET в квери. выглядит не плохо, но, как известно, работает только до отметки в 2000.
2) пагинация посредством использования стандартного контроллера, описана как в блоге у Дмитрия, так у Джефа Дагласа (того самого, у которого вся жизнь как хакатрон).
неплохой вариант, но есть но - выкверинные записи сидят внутри стандартного контроллера, который будет переменной уровня контроллера, то есть идет прямехонько во СтайтВью. Если не принять меры, то странница упадет по СтайтВью примерно на 2-4 тыс записей.
а что можно сделать? я не пробовал, но как идея, изначально выбирать только АйДи, а затем заставить "стандартный контроллер" вернуть нужный диапазон АйДи и кверить уже только требуемые записи. Но не уверен, что это возможно сделать.
3) пагинация посредством выборки требуемого диапазона записей в цикле-квери (ссылка в предыдущих сообщениях). Полностью кастомное решение, выглядит оптимально. так как, вроде, все под твоим контролем. Имеет известное ограничение на 50к записей. Как оптимизацию предлагаю в "пагинирующем" цикле-квери выбирать только АйДи, а затем отдельно кверить уже полноразмерные записи только требуемого диапазона.
вторая группа решений: пагинация на стороне клиента:
4) "фейк" пагинация посредством JS плагина. Фактически на клиент подается полноразмерный список, со всеми вытекающими последствиями... Два под-варианта:
4-1) небольшого списка без попыток обойти лимиты на длину списка и СтайтВью. Может применяться только для предсказуемо и неизменно небольших списков, а такие бывают, например, список стран мира. Обычно в приложении всегда есть вспомогательные объекты-таблицы, содержащие относительно фиксированные данные.
4-2) "фейк" пагинация посредством JS плагина списка более 1к записей и размером превышающим СтайтВью: описано в одном из блогов в разделе Сссылки - все записи одномоментно подгружаются с помощью RemoteAction на онЛоад или онРеди событие. Неплохо, но зачем вам столько записей на клиенте?
5) Реальная пагинация на клиенте. Не пробовал, так как не вижу очевидных преимуществ перед пагинацией на контроллере для тех скучных "бухгалтерских" приложения с которыми работаю. Но вероятно, те кто работают с фронт-энд фреймворками скажут, что это уже все хорошо и просто организовано, только подключи к нужному RemoteAction, REST сервису или просто ВФ страницам, возвращающей JSON.
Добавляйте, комментируйте.
PS: еще забыл добавить выше: 4-3) если используется фейк-пагинация с помощью JS плагина, то для передачи на фронт списка более 1к не обязательно хитрить с RemoteAction, можно серилизовать список в JSON стринг.
PS: еще забыл добавить выше:
4-3) если используется фейк-пагинация с помощью JS плагина, то для передачи на фронт списка более 1к не обязательно хитрить с RemoteAction, можно серилизовать список в JSON стринг.
можно серилизовать список в JSON стринг.
Кстати да, отличное решение, сам использовал недавно.
[quote="Dmitry Shnyrev"][quote="Den Brown"] можно серилизовать список в JSON стринг.[/quote]
Кстати да, отличное решение, сам использовал недавно.[/quote]
Везде это использую. На страницу всегда передаю 1 серилизованный или не серилизованный DTO.
Везде это использую.
это идею wilder и подсказал, когда я еще бился с календарем, который по-существу явлется вариантом фронтовой пагинции.
мне вот только не понятно, что в таком случае делать со СтейтВью: вроде все переменные, доступные на фронте, прямиком идет в СтейтВью, если не объявляеть их как transient.
[quote="wilder"]Везде это использую. [/quote]
это идею wilder и подсказал, когда я еще бился с календарем, который по-существу явлется вариантом фронтовой пагинции.
мне вот только не понятно, что в таком случае делать со СтейтВью: вроде все переменные, доступные на фронте, прямиком идет в СтейтВью, если не объявляеть их как transient.
[quote="Дима Лисовский"]не использовать форму[/quote]
так, так, что контроллерный state идет в СтейтВью только если на странице есть форма?
но если объявить страницу как ридОнли, это может и повлияет на лимит на СтейтВью, но не уверен
вообще да. Если есть apex:form есть view state. Нет формы - нет view state. На странице ReadOnly вроде нельзя форму добавлять.
[quote="Dmitry Shnyrev"]:) вообще да. Если есть apex:form есть view state. Нет формы - нет view state.
На странице ReadOnly вроде нельзя форму добавлять.[/quote]
Если мне память не изменяет, форму там можно добавлять. В контроллере просто DML оперции запрещены как бы.