|
Пагинатор для запроса: получение результата страницами | ☑ | ||
---|---|---|---|---|
0
Asmody
15.02.18
✎
11:18
|
Есть запрос, который возвращает 100500+ записей. Требуется получать результат порциями по N записей.
Вот как бы сделать такую красоту, не выполняя запрос каждый раз? |
|||
1
Ненавижу 1С
гуру
15.02.18
✎
11:19
|
1. в 1С?
2. зачем? |
|||
2
Волшебник
модератор
15.02.18
✎
11:19
|
Нужно упорядочить по полю и получать ПЕРВЫЕ N записей ГДЕ поле > значение
|
|||
3
vde69
15.02.18
✎
11:20
|
для этого есть "выборка", это динамический обьект и он считывает информацию по мере необходимости
или я не так понял? |
|||
4
Asmody
15.02.18
✎
11:20
|
(1) В 1С. надо.
|
|||
5
Ненавижу 1С
гуру
15.02.18
✎
11:21
|
Тогда (2) и поле должно быть уникальным
|
|||
6
Волшебник
модератор
15.02.18
✎
11:23
|
(5) Не обязательно. Можно сделать условие ГДЕ поле > значение-1
В каждой порции данные будут немного повторяться, но главный результат будет достигнут |
|||
7
drcrasher
15.02.18
✎
11:23
|
и остаётся вопрос: зачем?
|
|||
8
Волшебник
модератор
15.02.18
✎
11:24
|
На мисте так сделано
|
|||
9
Philix
15.02.18
✎
11:24
|
(5) и не меняться в результате обработки выборки первых N записей. Иначе можно погрузиться в вечную выборку одного и того же :)
|
|||
10
Cyberhawk
15.02.18
✎
11:25
|
(3) Откуда считывает?
|
|||
11
arsik
гуру
15.02.18
✎
11:26
|
(0) Динамический список
|
|||
12
vde69
15.02.18
✎
11:27
|
(10) с сервера
|
|||
13
Asmody
15.02.18
✎
11:27
|
Зачем-зачем. Есть внешний сервис, который дергает данные из 1С и делает нужное. Все 100500 записей разом ему не переварить, надо порциями.
|
|||
14
бомболюк
15.02.18
✎
11:28
|
1С так не умеет, она для динамических списков использует метод (2). ADO может что то похожее, называется AsyncFetch.
|
|||
15
Cyberhawk
15.02.18
✎
11:28
|
(12) Что за "сервер"? Судя по (0), ему хочется одним запросом к БД обойтись
|
|||
16
Cyberhawk
15.02.18
✎
11:29
|
(13) Пиши результат запроса в регистр, и пусть сервис потом дергает данные из регистра
|
|||
17
Asmody
15.02.18
✎
11:29
|
(15) Наоборот, я могу обойтись запросом на каждый вызов. Но я не хочу каждый раз тащить все записи.
|
|||
18
Timon1405
15.02.18
✎
11:30
|
а обращаться к БД без 1с можно?
https://technet.microsoft.com/ru-ru/library/gg699618(v=sql.110).aspx |
|||
19
vde69
15.02.18
✎
11:30
|
(12) на сколько я понимаю результат хранится на сервере во временных файлах и по мере обращения к конкретным полям выборки происходит чтение соответствующих областей временных файлов
|
|||
20
Asmody
15.02.18
✎
11:31
|
(16) Из регистра записи тоже будут дергаться запросом. Тоже самое получится.
|
|||
21
Cyberhawk
15.02.18
✎
11:31
|
(20) Так в регистре будет срез всех данных на момент "большого" запроса. А потом уже порционное получение.
|
|||
22
Cyberhawk
15.02.18
✎
11:32
|
"обойтись запросом на каждый вызов. Но я не хочу каждый раз тащить все записи" // Так ты не знаешь как получать за каждый вызов порцию данных запросом, так что ли?
|
|||
23
Asmody
15.02.18
✎
11:33
|
(21) В этом случае еще надо будет мутить обновление данных в регистре, ослежвание считанных-несчитанных… Геморно
|
|||
24
Cyberhawk
15.02.18
✎
11:34
|
(23) Так почему у тебя за один вызов сервиса идет получение данных в большем объеме, чем ты хочешь за этот вызов отдать?
|
|||
25
Asmody
15.02.18
✎
11:35
|
(22) Видишь на главной мисты под списком тем циферки? Тык, получаю 20 записей, тык - следующие 20. При этом из базы тащится ровно те 20 записей, а не миллион. Вот такое мне надо, только в 1С.
|
|||
26
Волшебник
модератор
15.02.18
✎
11:36
|
(25) Попробуй пролистать дальше, поймёшь принцип
|
|||
27
Asmody
15.02.18
✎
11:36
|
Просто в mysql есть LIMIT N, M
|
|||
28
Cyberhawk
15.02.18
✎
11:36
|
(25) Так это зависит от самих данных в таблице же.
Что такое "следующие 20" - это ровно те, что шли бы после предыдущего получения данных или любые 20, отличающиеся от первых? Таблица упорядоченная? |
|||
29
vde69
15.02.18
✎
11:37
|
(23) а так тебе надо гемороится с проверкой, что кто то не записал новую запись в ту часть которую ты уже прошел.
если надо быстро и ты допускаешь, что небольшая часть записей могут потеряться, то самое лучшее (2) а если важно обработать все - то придется писать в базу "обработан" |
|||
30
Волшебник
модератор
15.02.18
✎
11:39
|
(27) Просто он тоже тормозит, поэтому пришлось изобрести решение (2)
|
|||
31
Asmody
15.02.18
✎
12:04
|
Блин, нельзя использовать ВЫБРАТЬ ПЕРВЫЕ &КоличествоЗаписей...
|
|||
32
Cyberhawk
15.02.18
✎
12:08
|
(31) Регистр сведений и свой курсор как душе угодно )
|
|||
33
Asmody
15.02.18
✎
12:09
|
(32) это не stateless…
|
|||
34
Cyberhawk
15.02.18
✎
12:10
|
(33) Так что с (28)? Что будет "следующие N" с соблюдением твоего стейтлеса?
|
|||
35
Остап Сулейманович
15.02.18
✎
12:19
|
(34) А зачем вы вопросом на вопрос отвечаете?
Простейшая задача. Показывать на странице по 100 наименований из 25 000. Юзер ткнул в страничку, которая должна показать товар с 12700 по 12799. Как? Не включая ненужные первые 12699 записей в выборку запроса? ИМХО в 1С - только получив первые 12799. А потом из выборки забрав только последние 100. |
|||
36
Вафель
15.02.18
✎
12:24
|
можно и запросом
выбрать первые 100 (ВЫБРАТЬ ПЕРВЫЕ 1000 ..) Упорядочить по Поле УБЫВ |
|||
37
Asmody
15.02.18
✎
12:31
|
Переосмыслил вариант (2). Теперь сервис будет спрашивать "дай N записей, начиная с ключа K". Только запрос должен быть с "первичным ключом". В моём случае это подходит.
|
|||
38
Волшебник
модератор
15.02.18
✎
12:31
|
(37) Ну слава богу. Я уж подумал, что выпал из реальности.
|
|||
39
Вафель
15.02.18
✎
12:32
|
(37) не ужто ты раньше этого не знал?
|
|||
40
Asmody
15.02.18
✎
12:55
|
(39) Знал. Хотелось меньшей кровью обойтись.
|
|||
41
Cyberhawk
15.02.18
✎
14:35
|
(35) "вопросом на вопрос отвечаете?" // Проспись что ли
|
|||
42
Asmody
16.02.18
✎
08:38
|
Кстати, способ (2) подходит только для прохода в одну сторону. Для прохода в другую сторону надо менять параметры и условия. Для полноценного пагинатора (т.е. доступа к "странице" данных по номеру) этот способ не подходит.
|
|||
43
Mort
16.02.18
✎
09:06
|
Data commander 3 это умеет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |