![]() |
|
![]() ![]() ![]() |
|
Akella |
|
||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Есть в базе 2 поля, которые заслуживают внимания в данном вопросе, остальные просто не нужны пока что.
Вот записи в базе могут быть отсортированы так:
вот результат
Теперь в поле ID_Sort требуется записать числовые значения таким образом, чтобы записи шли поочереди
Для наглядности в экселе изобразил так: ![]() Не знаю, понятно ли? ![]() Добавлено @ 17:01 Т.е. как бы выхватывая из каждой группы записи, их нужно выстроить одну за другой. Может проще на Delphi соорудить? Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45 |
||||||
|
|||||||
vladimir74 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 28.11.2006 Репутация: 2 Всего: 3 |
это что один раз надо сохранить? тогда если 10 строк - то проще руками, если больше то быстее ИМХО на дельфях --------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
пока что в базе всего около 65 тыщ объявлений
Добавлено через 2 минуты и 1 секунду юзеры молятся ![]() ![]() Добавлено через 9 минут и 2 секунды Пока делаю на дельфи Тестирую, не знаю, что получиться Принцип такой. Создаю нужное количество массивов. Потом цикл по массивам
|
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Akella, что-то не совсем понятно, а можешь объяснить как-нибудь по другому?
Если есть 3 значения поля (квартал, аверс, жидн), которые идут друг за другом, причем тут группы? И почему так много записей? И по какому признаку это группируется? Может все-таки еще какие-то поля будут учавствовать в алгоритме? -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
группы - это образно говоря, т.к. группы объявлений, группа объявлений от квартала, группа объявлений от ЖиДH`а, группа объявлений от Аверса, ну типа объявления могут сгруппированы/отсортированны по ID рекламодателя. Добавлено @ 10:32 Прога написана для редакции газеты, газета выпускает приличное количество объяв, прогу можешь глянуть у мну на сайте. Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45 |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Разбиваем на массивы одинаковых слов, каждому элементу в пределах массива прописываем его порядковый номер, заносим в БД и запросом сортируем.
квартал 1 квартал 2 квартал 3 аверс 1 аверс 2 жидн 1
получаем аверс 1 жидн 1 квартал 1 аверс 2 квартал 2 квартал 3 -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
vladimir74 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 28.11.2006 Репутация: 2 Всего: 3 |
Akella, у тебя получилось?
в принципе я думал создать три квери, сделать цикл по размеру наибольшего, внутри апдейтить общим счетчиком ID проверяя на конец каждого квери последовательно ... Добавлено через 3 минуты и 12 секунд Vas, я так понял ID станет ключем. --------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
ну я перед обработкой запихиваю группы объявлений в массив датасетов, выше на дельфи код:
т.е. получается массив датасетов, в каждом датасете набор/группа объявлений от конкретного рекламодателя, т.е. 10 рекламодателей, и 10 датасетов в массиве получается в q[0] объявления от Квартала в q[1] объявления от Аверса в q[2] объявления от ЖиДH в q[3] объявления от ещё от кого-то там Что нужно сделать? Первой записи (в поле ID_SORT) датасета q[0] присваимваем 1 Первой записи (в поле ID_SORT) датасета q[1] присваимваем 2 Первой записи (в поле ID_SORT) датасета q[2] присваимваем 3 прошли все записи массива и опять Второй записи (в поле ID_SORT) датасета q[0] присваимваем 4 Второй записи (в поле ID_SORT) датасета q[1] присваимваем 5 Второй записи (в поле ID_SORT) датасета q[0] присваимваем 6 и т.к. Теперь когда мы отсортируем записи по полю ID_SORT, то получим такую чехарду, как показано на рисунке ![]() Это сообщение отредактировал(а) Akella - 1.6.2012, 12:46 |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
А смысл его делать ключом? Если и делать то составной (Name, ID_Sort). А если не три разных наименования, а n-ое количество, причем заранее не известное ![]() -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
нет, намудрил я здесь
что-то не так, что-то забыл, логика у мну хромает, моск тоже хромает ![]() |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
А в пределах группы сортировка по наименованию не нужна? -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
vladimir74 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 28.11.2006 Репутация: 2 Всего: 3 |
перечитал свое, кажется с утра у меня плохл с формулировкой мыслей
ну вообщето эти три ифа должеы быть одной функцией, но это уже не принципиально, если речь идет о тулсе которую просто надо быстро запустить.... ИМХО конечно... Это сообщение отредактировал(а) vladimir74 - 2.12.2008, 10:59 --------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
по идее никаких имён там нет, имя это я привёл для наглядности ![]() и там вообще такая сортировка ![]() ![]() Это сообщение отредактировал(а) Akella - 2.12.2008, 11:00 |
|||
|
||||
Vas |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Akella, а почему на сервере не хочешь сделать, насколько я замечал ты с БД дружишь.
1. Выбираем строго наименования не повторяющиеся и делаем курсор по этому запросу
2. Цикл по выбранному курсору, внутри цикла выбираем все записи соответсвующие этой группе
3. Тоже объявляем курсор и внутри курсора апдейтим записи по порядку. 4. Затем сортируем как я уже писал. Добавлено через 1 минуту и 34 секунды Дык не имя, а какой-то признак для разбивки по группам есть же? -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
||||
|
|||||
Akella |
|
||||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Вот таблица, значение сортировки нужно записать в поле ID2, раньше в него записывалось рэндомное число и объявления сортировались каждый выход газеты тоже рэндомно, все были довольны, теперь хотят по-другому.
![]()
Добавлено через 1 минуту и 46 секунд
Не могу сообразить как это средствами хранимки (Firebird) сделать. Я и на дельфи-то до конца не могу сообразить. Осталось совсем чуть чуть, довести до ума этот участок, который выдёргивает записи из массива датасетов и записывает в них значения.
Добавлено через 2 минуты и 44 секунды
в PSQL Firebird`а нет возможности объявлять массив курсоров Добавлено через 3 минуты и 37 секунд Кофе закончился. ![]() /*ушёл просить кофе у бухгалтеров Добавлено через 5 минут и 20 секунд Наверное забыл про q[i].next ![]() |
||||||||
|
|||||||||
vladimir74 |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 28.11.2006 Репутация: 2 Всего: 3 |
так у тебя в таблице много рекламодателей?
а новый ID должен быть сквозным или отдельным для каждого?
ты тут присваеваешь id2 значение верхнего цикла т.е. для всех трех записей у тебя будет одно и тоже значение..., лучше ввести отдельную переменную .... Добавлено через 4 минуты и 42 секунды
ну тогда надо сразу делать масив квери... кажется Akella именно это и сделал. Я просто в начале прочитал массив и решил что хотят работать с простыми массивами... Добавлено через 8 минут и 53 секунды
ИМХО нужно просто счетчик сделать отдельной переменной... Добавлено через 9 минут и 42 секунды и это тоже.... --------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ. |
||||||||
|
|||||||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
да, в таблице рекламодателей на данный момент пока что 124 записи, а это значит, что в таблице объявлений живут объявления от 124 разных рекламодателей Добавлено @ 11:36 точно... ты прав, надо подумать ещё Добавлено @ 11:41 Переделал на
тестирую, о результатах отпишусь Это сообщение отредактировал(а) Akella - 2.12.2008, 11:42 |
|||
|
||||
Deniz |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Akella, есть одна мысль, сейчас попробую объяснить.
Допустим есть запрос:
СчетчикСтарт:=0; Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt ) Далее цикл типа такого:
Аналогично со вторым, третьим и т.д. Когда прошли всех РД в запросе, делаем переоткрытие запроса, и продолжаем с начала. Значение СчетчикСтарт := max(Sort_ID) + 1; Делаем пока основной запрос возвращает данные. Надеюсь понятно объяснил. Это сообщение отредактировал(а) Deniz - 2.12.2008, 14:37 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
будет всегда 0 записей, т.к. в базе не бывает записей, где id_sort может быть пустым, это регулируется триггерами ![]() Добавлено через 1 минуту и 23 секунды treklama - это таблица, где хранятся сами объявления, а рекламодатели хранятся в tagency или я недопонял ход твоих мыслей |
|||
|
||||
Deniz |
|
||||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Можно поменять запрос на where id_sort = тот признак, при котором надо делать обновление, предполагаю что 0
Как я понял нужно выбрать всех рекламодателей и напечатать по 1 объяве из каждого, потом еще по одной и т.д. Так вот мысль была такая: Запросом отбираем, именно из treklama, всех РД и кол-во их объявлений. Кол-во записей в этом наборе есть шаг приращения Sort_ID, а М это минимальное кол-во объявлений, которое есть у всех. т.е. если взять первый пост с примером, то
Мин = 1 Cnt = 3 Идем по циклу от 0 до М-1, пока 1 раз, получаем по всем РД, Счетчик дорос до 3 (3 записи) и увеличиваем его на 1.
Cnt = 2, опять тоже самое, как в первый раз не совсем удачный пример получился. результат:
На след итерации останется только
Cnt = 1 Сейчас нет времени писать код на Delphi, но если не поймешь, может завтра попробую соорудить что-то. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||||||||||
|
|||||||||||||||
Akella |
|
||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
правильно
ну да дальше не до конца понял, туплю, разбираюсь в твоём алгоритме Добавлено через 6 минут и 16 секунд Всё, вроде получилось ![]()
Всем большое спасибо!! ![]() ![]() Отдам юзерам, пусть теперь они мучаются ![]() Добавлено через 7 минут и 52 секунды Но я пока что не ставлю вопрос, как решённый. ![]() "От этих пчёл всего можно ожидать". (с) ![]() |
||||||
|
|||||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
мда
![]() ![]() /*ушёл думать дальше |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Akella, мой вариант попробуй, может получится
![]() -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
Akella |
|
||||||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
ну я же так и делаю
Вот получился у меня массив из трёх НД (наборов данных). В одном 10 записей, во - втором 116 и в третьем - 350.
M = 10 для всех, так? Приращение для каждого своё: 10, 116 и 350. Так? вместо моего?
|
||||||||
|
|||||||||
Deniz |
|
||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
нет
Для всех приращение = кол-во записей в наборе (в моем select) т.е., по моему select получается:
переоткрываем запрос и получаем:
Будет желание напишу код на Delphi -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||||||
|
|||||||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
попробую
![]() |
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: нет Всего: 1 |
Заинтересовался))))
*ушел кодить* -------------------- I want a perfect soul |
|||
|
||||
uranpro |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: нет Всего: 1 |
такс)...
создал таблицу w_test: FName varchar(50) ID_Sort int добавил записи только в fname a a a a b b b c c d Delphi>>
Добавлено @ 12:49 работает на mssql2005 будет работать на др серверах, если реализовать функцию в UPDATE -> TOP 1 Это сообщение отредактировал(а) uranpro - 10.12.2008, 12:53 -------------------- I want a perfect soul |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Попью кофе - попробую.
![]() В любом случае всем большое спасибо за помощь!! |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Видители в чём дело... вывод объявлений немного сложнее. По идее мой алгоритм работает идеально, если сортировать только по одному полю ID2. Но... сортировка при окончательном выводе немного другая, т.е. вначале онисортируются по другим полям:
sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid а вот полная сортировка order by sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid, id2 в процедуре вывода объявлений возможно косяк у меня ![]() |
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: нет Всего: 1 |
))) завел 60тыс записей...
программа обрабатывает 1000 за 45сек))) -------------------- I want a perfect soul |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
я запутался в твои сообщениях ![]() Добавлено через 30 секунд uranpro, время ничто (с) 5ый элемент Добавлено через 1 минуту и 38 секунд я жговорю, что у меня не 2 поля для сортировки, а фактически 7. И вот в окончательное 7ое с именем ID2 нужно записать правильные цифры Добавлено через 2 минуты и 46 секунд
Firebird 60 тысяч записей обрабатывает за 45 секунд, но это уже никакого отношения к делу не имеет |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Сделал тестовую процедуру, которая показывает порядок сортировки:
вот результаты: вначале всё идёт идеально, объявления разных РД выводятся поочереди ![]() красным обвёл те, которые выстроились подряд.... хотя такого быть не должно, ведь чуть ниже опять вывод нормализовался ![]() как всегда в коде какая-нибудь мелочь ![]() |
|||
|
||||
Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Начинает доходить, в моём алгоритме у кого меньше всего объявлений, тот в итоге (в дальнейшем) и начинает вылазить первым...
Добавлено @ 16:17 Deniz,
Переделал на
Результат SORT_BY_AGENCY COUNT SORT_BY_AGENCY COUNT 1 161 2 305 3 29 я правильно иду? Не доходит, зачем у тебя where id_sort is null и order by в нужном порядке Это сообщение отредактировал(а) Akella - 10.12.2008, 16:27 |
||||
|
|||||
Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
переделав запрос на
узнаём, что первая запись в поле count содержит M, минимальное количество объяв. А количество записей в запросе Cnt = 3 |
||||
|
|||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: нет Всего: 1 |
показывает тебе не отсортированные записи -------------------- I want a perfect soul |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
В поле id_sort (у меня оно называется ID2) нет пустых значений.
Принцип такой. Пользователь в таблице каким-либо способом указывает, какие объявления нужно публиковать. Эти объявления помечаются специальном поле. |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Akella, что-бы нормально алгоритм дорисовать, нужно знать все условия и ограничения.
Например, пользователь определяет список объявлений, в поле id_sort или другое ставится определенный код. Далее порядок сортировки ... и т.д. Опиши, может алгоритм вообще другой нужен. Добавлено через 3 минуты и 19 секунд
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |