|
Karamba
|
|
Как красиво разбить данные на страницы?12.07.2007, 01:47. Показов 5526. Ответов 44
Метки нет (Все метки)
ситуация: я делаю поиск по базе. мне возвращаются данные (любое количество). но всем понятно что на одну страницу 9000 записей пихать некрасиво.
кто может предложить красивое решение для такой динамической системы координат, чтобы разбить по страницам, а потом чтобы по этим страницам еще и ходить можно было? причем данные могут добавляться дочстаточно часто (много операторов сидят и забивают базу). сами по себе данные отсортированы только в алфавитном порядке. |
|
| 12.07.2007, 01:47 | |
|
Ответы с готовыми решениями:
44
Как красиво разбить данные на страницы? - не видно Как средствами SQL разбить полученнный результат на страницы?
|
|
Sergik
|
|
| 12.07.2007, 11:02 | |
|
при первом поиске выводить только, допустим, 15 записей, затем вычислять общее количество найденных записей и на основании этого выводить ссылки на другие страницы 1 2 3 и т.д. По ссылкам передаешь параметр - номер страницы, поиск происходит в любом случае, но если передан номер страницы, то выводятся только записи соответствующие текущей странице, можно также разделять страницы по алфавиту и в запрос по поиску вешать дополнительное условие, тогда будет возвращаться не весь набор, а только нужные записи, но опять же, если записей много, то будет огромные страницы получаться
|
|
|
prosto
|
|
| 12.07.2007, 11:32 | |
|
Листание страниц
http://prosto.pp.ru/Docum/DocumShow.asp?DocumID=46 Чередование цветов в строках таблицы результатов выборки из БД http://prosto.pp.ru/Docum/DocumShow.asp?DocumID=87 |
|
|
Karamba
|
|
| 12.07.2007, 13:24 | |
|
Sergik,
да, ты примерно подтвердил мои мысли, я также собирался делать (с параметром страниц). prosto, спасибо и за этот пример, но есть пара вещей которые мне там не очень понравились, а именно - грамоздкость (ну очень много кода для такой достаточно простой вещи), и второе - там все строистя на основе DAO, а мне надо с ADO работать. хотя это и не существенно. в любом случае - я подсмотрю пару идей из примера когда буду делать свою разбивку. спасибо за советы!
|
|
|
0 / 1 / 3
Регистрация: 27.03.2012
|
|
| 12.07.2007, 14:03 | |
|
Используй перед открытием рекордсета
rs1.PageSize = 20 ' кол-во строк на странице rs1.CacheSize = 20 ' потом открываешь рекордсет x = rs1.PageCount ' кол-во полученных страниц rs1.AbsolutePage = 2 ' показать вторую страницу ------------------ http://www.relib.com/topic.asp?id=704983&tp=4
0
|
|
|
0 / 0 / 0
Регистрация: 16.06.2007
Сообщений: 165
|
|
| 12.07.2007, 14:18 | |
|
А давайте раз и навсегда напишем полный рабочий пример разбивания на страницы? Чтобы показовалось полное количество записей в базе (например, 500) и затем внизу были ссылки на страницы вроде НАчало
| 1,2,3,4,5,6,7 итд до конца до первых записей. Может тогда будет проще отвечать на данные вопросы.
0
|
|
|
Sergik
|
|
| 12.07.2007, 14:37 | |
|
Для этого всякие FAQ есть, тем более, что разбивку каждый разную предпочитает.
|
|
|
Karamba
|
|
| 12.07.2007, 17:39 | |
|
smalig,
да, правда твоя. похоже это хорошее решение. попробую воплтить. |
|
|
0 / 1 / 3
Регистрация: 27.03.2012
|
|
| 12.07.2007, 17:42 | |
|
Оно не только хорошее, но и работающее
например, так реализован подсчет страниц на данном форуме.
0
|
|
|
Karamba
|
|
| 12.07.2007, 17:48 | |
|
ну тогда все должно пойти как по маслу! осталось только закодировать.
|
|
|
prosto
|
|
| 12.07.2007, 21:47 | |
|
Надеюсь про DAO это шутка. Вся работа на ADO.
Кода много - это универсальная вещь. Думать при применении практически не надо - код делает все сам. Повнимательней посмотри описание, примеры. |
|
|
prosto
|
|
| 12.07.2007, 22:02 | |
|
Дополню.
А что вы будете делать, когда понадобится еще при листании передавать и параметры, определяющие критерии отбора записей? Или выводить страницами массивы? Новые коды писать? Приведенный код работает и в этих случаях без каких-либо модификаций - он сам определит все параметры и передаст их, при этом учтет каким методом они передаются GET или POST. Это код применен уже не на одном сайте. Выбор за вами. |
|
|
Bear
|
|
| 12.07.2007, 22:34 | |
|
Еще одна интересная мысль по поводу разбиения на страницы, которая мне в свое время пришла в голову - у ссылок делать подсказки, с каких строк начинается данная страница. Тогда очень удобно ориентироваться, если страниц много. См., например, http://infolio.asf.ru/cgi-bin/result.cgi?section=10&id=3&s=1
|
|
|
Karamba
|
|
| 12.07.2007, 22:35 | |
|
как я говорил - в том примере есть интересные мысли, которые я тоже хочу запользовать. Однако, решение с PageCount - тоже, согласись, красивое. вот теперь задача минимум - собрать все знания в железный кулак и выдать красивое решение
|
|
|
0 / 0 / 0
Регистрация: 03.03.2007
Сообщений: 140
|
|
| 14.07.2007, 20:49 | |
|
Меня тоже давно мучает эта проблема. Вариант, который указан (сам такой использую) мне не нравится
RS.AbsolutePage RS.PageSize Объясняю почему: 1) В некотороых случаях он просто не работает (когда рекордсет не поддерживает bookmarkes) 2) В этом варианте всегда создается полный рекордсет, а потом просто пользователю выдается одна из его страниц. Понимаете? ПОЛНЫЙ РЕКОРДСЕТ! А если в нем миллион записей? Это очень сильно грузит память сервера. Правильнее бы было сделать хранимую процедуру, на вход которой подается номер и размер страницы, а на выходе получается только рекордсет указанной страницы. Но как это сделать? В голову приходят решения со временными таблицами, но мне все это кажется громозким и ресурсоемким....
0
|
|
|
Karamba
|
|
| 15.07.2007, 02:56 | |
|
да, кстати, по поводу Stored Procedure... это тоже мысль, и я подозреваю что работать это всё будет быстрее (не надо будет гонять толпу данных по сети).
решение могло бы быть таким (в MSSQL 7.0): CREATE PROCEDURE GetPage_sp @criteria varchar(200), @page_nr int, @page_size int AS set nocount on -- sozdaem vremennuju tablicu -- prichem pervuju kolonku sdelaem s autoincrement'om create table #tmp ( nr int IDENTITY(1,1), f_name varchar(40), l_name varchar(40) ) -- zapolnim tablicu po vybrannomu kriteriju insert into #tmp (f_name, l_name) select FirstName, LastName from DebtorInfo where FirstName like @criteria -- nu a teper' prosto vyberem nuzhnuju nam stranicu select nr, f_name, l_name from #tmp where nr between (((@page_nr - 1) * @page_size) + 1) and ((@page_nr) * @page_size) -- udalim vremennuju tablicu chtoby ne boltalas' v pamjati drop table #tmp колочество страниц считается еще проще: select count(*)/20 from DebtorInfo у меня было в таблице только 1500 записей, если у кого есть что-то побольше под рукой - поделитесь инфой как быстро это работает. |
|
|
Karamba
|
|
| 15.07.2007, 03:02 | |
|
да, забыл сказать что получать нужную страницу надо так:
GetPage_sp '%a%', 1, 10 и еще нашел лажу у себя же - страницы надо всё же подсчитывать тоже с критерием выборки, а именно: select count(*)/20 from DebtorInfo where FirstName like '%a%' |
|
|
Sergik
|
|
| 15.07.2007, 10:45 | |
|
Пример хранимой процедуры на SQL Server. Есть таблица news, там есть три поля id_news (счетчик), ndate (дата новости), lrus - логическое значение (для русской версии эта новость или для английской). В качестве параметров передаются: номер записи, с которой начинать выборку; сколько записей выбрать; флаг версии (русская/английская). Если параметр количества записей=-1, то выбирается все записи. Временные таблицы не используются, данные сортируются сначало по дате, внутри даты по ID (последня новость выбирается первой)
CREATE PROCEDURE get_news @first_record int, @num_record int, @rus bit AS declare @first_date datetime; declare @first_id int; declare n_cursor SCROLL CURSOR FOR select id_news,ndate from news where lrus=@rus order by ndate desc, id_news desc; open n_cursor; fetch absolute @first_record from n_cursor into @first_id, @first_date; if @num_record<>-1 set rowcount @num_record; select lrus, id_news, ndate, source, title, body from news where lrus=@rus and (ndate<@first_date or (ndate=@first_date and id_news<=@first_id)) order by ndate desc, id_news desc; set rowcount 0 CLOSE n_cursor; DEALLOCATE n_cursor; Пример использования (получить 15 записей для русской версии, начиная с 10 записи): set rs=connection.execute('get_news 10,15,1') |
|
|
0 / 0 / 0
Регистрация: 03.03.2007
Сообщений: 140
|
|
| 15.07.2007, 10:45 | |
|
Да, типа этого решения приходило и мне в голову, только вот у нас админ, например, вообще запретил создавать временные таблицы (у меня нет привелегий на создание временных таблиц).
Можно обойтись без них (без временных)?
0
|
|
|
Sergik
|
|
| 15.07.2007, 12:52 | |
|
В моем примере (см. выше) не используются временные таблицы, вообще, как люди говорят, в ASP лучше не использовать временные таблицы. Алгоритм такой (в таблице есть поле ID - счетчик, сортируются записи тоже по id):
создаем курсор (select id from table order by id); переходим на нужную запись и запоминаем ее ID в переменную (fetch absolute @first_record from cursor into @first_id); устанавливаем количество возвращаемых строк после select (set rowcount=число); делаем запрос select id from table where id<@first_id order by id; восстанавливаем значение rowcount и очищаем память |
|
| 15.07.2007, 12:52 | |
|
Помогаю со студенческими работами здесь
20
Как разбить на страницы Как разбить html на страницы? Как материал разбить на страницы Красиво получать данные Как разбить сплошной текст RTF на страницы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|