![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Способ задания порядка записей [D6, AbsoluteDB]
Валигози2 © (2010-03-31 15:41:00)Подскажите пожалуйста какой-нибудь удобный способ задания порядка записей. Т.е. на форме лежит TDBGrid, но данные в нём должны отображаться не в порядке ввода, а в том порядке, в каком укажет пользователь (он может перемещать записи вверх/вниз с помощью соответствующих кнопок).
Единственное, что я смог придумать, это дополнительное поле в таблице типа INTEGER в котором и будет храниться порядково отображаемый номер и выбирать записи нужно с ORDER BY по этому полю. Но допустим поьзователь добавил 1000 записей и хочет сделать тысячную запись первой - тогда получается нужно обновтить все 1000 записей: в первое поле вместо 1 записать 1000, во второе вместо 2 записать 1, в третье вместо 3 записать 2 и т.д. :( Может есть способ получше?
Anatoly Podgoretsky (2010-04-01 14:29:00) [21]> sniknik (01.04.2010 09:09:12) [12]
Это от незнания, формат dbf не поддерживается.
Физический порядок не поддерживается, пишется в любую дырку.
Движок относится к классу необслуживаемых, сам обнаруживает проблемы и сам лечит их.
Хороший движок. И к тому же embeded как движок, так и БД
Sergey13 (2010-04-01 10:16:00) [22]> [3] Валигози2 (31.03.10 16:56)
> Забыл уточнить, что база "single user"
Т.е. он это чисто для себя делает? Что бы не забыть поздравить с днем рожденья богатого партнера?
Тогда я бы перестал оперировать такими масштабами, как "допустим поьзователь добавил 1000". ИМХО он эту тысячу будет несколько лет заводить, если это действительно "таблица производителей продукции".
sniknik (2010-04-01 09:10:00) [23]> и меняем записи физически.
не сами записи конечно, а значения в них, друг с другом. (и инсерт там команда должно работать именно вставкой, а не добавлением...)
sniknik (2010-04-01 09:09:00) [24]вообще, AbsoluteDB вроде как файл сервер? во всяком случае может им быть. использует dBase/+ какой то свой расширенный формат.
если все так, то какие проблемы? открываем таблицей, и меняем записи физически. у dbf таблиц физический порядок есть.
12 (2010-04-01 08:35:00) [25]
> а если доп.поле не integer а double?
>
> то ж самое, что номера не по порядку
не тоже самое
от 0 до 1 бесконечность вещественных чисел
машинных double конечно поменьше, но тоже хватит за глаза
Германн (2010-04-01 02:15:00) [26]
> Во всех остальных случаях универсальный метод-дать возможность
> юзеру сортировать записи как ему нужно и указанный им порядок
> просто сохранять в настройках и использовать при следующей
> загрузке приложения автоматически. Жалоб не бывает.
+1
У меня на выбор 4 варианта. Три стандартных и один пользовательский.
MsGuns (2010-04-01 02:07:00) [27]Из своего скромного опыта единственный случай помню, когда заказчик хотел, чтобы бух.проводки располагались в порядке, который ему удобен, причем он мог этот порядок произвольно менять как ему приятнее (например, по важности операций). Для этого пришлось действительно ввести доп.поле-ключ типа "Номер пп".
Во всех остальных случаях универсальный метод-дать возможность юзеру сортировать записи как ему нужно и указанный им порядок просто сохранять в настройках и использовать при следующей загрузке приложения автоматически. Жалоб не бывает.
Валигози (2010-04-01 01:54:00) [28]
> Правильный$Вася (31.03.10 20:57) [7]
> > а если доп.поле не integer а double?то ж самое, что номера
> не по порядку, а через сотню, напримера перемена места ведет
> к появлению номера посередине интерваланапример0, 100, 200,
> 300 -> 0, 50, 100, 200эта 300 стала 50
Ну это понятно. Помню в старые времена когда писали на бейсике, то нумеровали строки программы через десяток, на случай, чтобы можно было добавить строки внутрь без перенумерации. Правда здесь есть дилема - если сделать слишком маленький шаг, то его может не хватить для вставки внутрь; если сделать слишком большой шаг, то может не хватить размера Int32 для добавления в конец. Впрочем, вместо Int32 можно использовать Int64, тогда можно сделать достаточно большой шаг (например миллион или 10 миллионов) не боясь выйти за рамки, а уж в крайнем случае предусмотреть полную (и долгую, но не частую) перенумерацию всей таблицы. Хотя это можно предусмотреть и в рамках Int32, только насильную перенумерацию прийдётся делать немного чаще (при условии слишком активного перемещения записей)...
Правильный$Вася (2010-03-31 20:57:00) [29]
> а если доп.поле не integer а double?
то ж самое, что номера не по порядку, а через сотню, например
а перемена места ведет к появлению номера посередине интервала
например
0, 100, 200, 300 -> 0, 50, 100, 200
эта 300 стала 50
Валигози2 (2010-03-31 17:29:00) [30]
> Sergey13 © (31.03.10 16:59) [4]
> > [3] Валигози2 (31.03.10 16:56)
> > Некоторые производители более "привилегированные" и поэтому
>
> > их бренды должны отображаться ещё на первой странице.
>
> Ну так и сделай таблицу рейтингов
> 1 - Круче некуда
> 2 - Крутой, но без крыши
> ...
> N - фуфло
>
> присвой их "брендам" и сортируй с учетом рейтинга.
Боюсь чтобы заказчик не забраковал такой вариант, хотя попробую предложить... Спасибо :)
> 12 © (31.03.10 17:20) [5]
>
> > В данном примере такая хитрость сработает, но не в случае
> > когда пользователь захочет поставить "тысячную" запись
> на
> > второе место или третье или вообще в середину... :(
> а если доп.поле не integer а double?
Хм. Интересно... Такое мне в голову даже не приходило... Спасибо за идею - поэкспериментирую... :)
12 (2010-03-31 17:20:00) [31]
> В данном примере такая хитрость сработает, но не в случае
> когда пользователь захочет поставить "тысячную" запись на
> второе место или третье или вообще в середину... :(
а если доп.поле не integer а double?
Sergey13 (2010-03-31 16:59:00) [32]> [3] Валигози2 (31.03.10 16:56)
> Некоторые производители более "привилегированные" и поэтому
> их бренды должны отображаться ещё на первой странице.
Ну так и сделай таблицу рейтингов
1 - Круче некуда
2 - Крутой, но без крыши
...
N - фуфло
присвой их "брендам" и сортируй с учетом рейтинга.
Валигози2 (2010-03-31 16:56:00) [33]
> Sergey13 © (31.03.10 16:10) [1]
> > [0] Валигози2 (31.03.10 15:41)
> > Может есть способ получше?
>
> Можно сказать пользователю что бы он шел далеко и надолго
> с такими задачами. 8-)
> Какой смысл во всем этом? Что за предметная область? Дело
> в том, что выбрав условно записи из таблицы с 1 по 100 один
> юзер играется с их порядком. В это время другой пользователь
> может играться с другой выборкой (записи с 50 по 150). И
> что будет в итоге?
> Если же условия выборок не пересекаются гарантировано, то
> доп поле решит ИМХО проблему. Я так делал - работало.
Это таблица производителей продукции и одно из полей типа BLOB содержит картинку бренда производителя. Некоторые производители более "привилегированные" и поэтому их бренды должны отображаться ещё на первой странице.
p.s. Забыл уточнить, что база "single user" так что "условия выборок не пересекаются гарантировано".
> 12 © (31.03.10 16:15) [2]
> +1
> Sergey13 © (31.03.10 16:10) [1]
>
> Валигози2
> если ничего не хочется особо делать, то можно записать и
> 0
> допустим поьзователь добавил 1000 записей и хочет сделать
> тысячную запись первой - тогда получается нужно обновтить
> все 1000 записей: в первое поле вместо 1 записать 1000,
> во второе вместо 2 записать 1, в третье вместо 3 записать
> 2 и т.д.
>
> или -1
> или -123
В данном примере такая хитрость сработает, но не в случае когда пользователь захочет поставить "тысячную" запись на второе место или третье или вообще в середину... :(
12 (2010-03-31 16:15:00) [34]+1
Sergey13 © (31.03.10 16:10) [1]
Валигози2
если ничего не хочется особо делать, то можно записать и 0
допустим поьзователь добавил 1000 записей и хочет сделать тысячную запись первой - тогда получается нужно обновтить все 1000 записей: в первое поле вместо 1 записать 1000, во второе вместо 2 записать 1, в третье вместо 3 записать 2 и т.д.
или -1
или -123
Sergey13 (2010-03-31 16:10:00) [35]> [0] Валигози2 (31.03.10 15:41)
> Может есть способ получше?
Можно сказать пользователю что бы он шел далеко и надолго с такими задачами. 8-)
Какой смысл во всем этом? Что за предметная область? Дело в том, что выбрав условно записи из таблицы с 1 по 100 один юзер играется с их порядком. В это время другой пользователь может играться с другой выборкой (записи с 50 по 150). И что будет в итоге?
Если же условия выборок не пересекаются гарантировано, то доп поле решит ИМХО проблему. Я так делал - работало.