Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Способ задания порядка записей [D6, AbsoluteDB]


Страницы:   1 2

Валигози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). И что будет в итоге?
Если же условия выборок не пересекаются гарантировано, то доп поле решит ИМХО проблему. Я так делал - работало.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо