![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Стобец - порядковый номер [D5, D6, Paradox]
Weare © (2003-10-24 16:09:00)
Добрый день.
Ситуация такая: пользователь захотел видеть в своей таблице еще один столбец - порядковый. Причем, чтобы при изменении номера записи (непосредственно в самом столбце)она становилась в нужную позицию а все остальные номера пересчитались. Т.е. если запись была 8 по счету и этот номер поменяли на 4, то она становится четвертой и переписались бы все остальные номера.
Вопрос вот в чем: как можно это сделать с помощью быть может самих св-в таблицы или уже известными методами. А может решение какое-то уже и так существует. Очень не хочется кодировать все эти события: OnEdit, AfterPost, BeforeEdit, OnNewRecord, OnDelete, OnInsert.
Weare (2003-10-27 16:49:00) [1]
to kaif
ОГРОМНОЕ СПАСИБО, сейчас попробую.
kaif (2003-10-27 14:45:00) [2]
Не уверен, что вторая команда сработает на Paradox-е. Нужен эксперимент.
kaif (2003-10-27 14:44:00) [3]
Хоть это и неправильно, но раз уж заказчик хочет за твой счет изучать свои грабли, то решение такое:
(если нет уникальногоиндекса только!)
Три SQL-команды (отдельный компонент Query):
update <таблица> set n = - n
where n = :n1 /*меняем знак номера текущей*/
update <таблица> set n = n + 1
where n >= :n2 /*сдвигаем все записи по номеру*/
update <таблица> set n = :n2
where n = -:n1 /*втавляем запись в нужное место*/
Перед вызовом метода ExecSQL:
ParamByName("n1").AsInteger := n1;
ParamByName("n2").AsInteger := n2;
n1 - номер текущей записи
n2 - номер, который хочешь ей присвоить
Потом делаешь Refresh своей таблицы.
Anatoly Podgoretsky (2003-10-27 13:21:00) [4]
Да бежишь в обратном порядке от 24 до 8 и приьавляешь единичку, а затем меняешь -8 на восемь, зря ты не поигрался на бумаге, не было бы вопроса.
Weare (2003-10-27 13:03:00) [5]
> Anatoly Podgoretsky © (27.10.03 12:09) [31]
> решается на бумаге с помощью карандаша
Спасибо, учту.
Дело ведь не в карандаше, я же говорил, что у меня уже, нужные для решения этой проблемы, события были задействованы для других целей и теперь приходится отслеживать каждый шаг пользователя, чтобы эти события корректно отработали, приходится расставлять разные флажки, делать очень много различных проверок, чтобы отрабатывала та или инная часть кода. И суть вопроса состояла в том, что может это как-то проще можно было бы сделать, воспользоваться какими-то имеющимися решениями. И я именно на это делал акцент, ну например: Weare © (24.10.03 18:38) [17].
Вот в этом я и нуждаюсь. Если так все просто как у Anatoly Podgoretsky (у него впрочем все на пальцах решается), то дайте мне ответ на эту простую задачку.
Anatoly Podgoretsky (2003-10-27 12:09:00) [6]
Ну и чего там рулить, перенумерация, дано несколько вариантов, вклюячая SQL код, задачка для начинающих, решается на бумаге с помощью карандаша.
Sergey13 (2003-10-27 11:58:00) [7]
2Anatoly Podgoretsky © (27.10.03 11:48) [29]
>Да какие приоритеты, просто требуется пользовательская нумерация, типа идентификатор, плюс индексация.
Ну дык ими же еще и рулить хочется на лету. Я и предложил. С помощью "приоритетов" расположить записи в "нужном" порядке. А номерок присовокупить будет уже проще.
Anatoly Podgoretsky (2003-10-27 11:48:00) [8]
Да какие приоритеты, просто требуется пользовательская нумерация, типа идентификатор, плюс индексация.
Sergey13 (2003-10-27 11:46:00) [9]
2Weare © (27.10.03 11:20) [26]
Подумай, как будет выглядеть твой список платежей завтра (например) когда платежи 1 и 3 пройдут, а остальные останутся + добавятся новые.
ИМХО - самое правильное это приоритеты расставлять. Как кто-то уже советовал. Причем можно не обязательно целыми числами. С дробными будет проще менять иерархию на лету (не пересчитывая остальные).
Anatoly Podgoretsky (2003-10-27 11:30:00) [10]
Тебе уже много дали вариантов, например один из рабочих Sandman25 © (24.10.03 17:11) [9]
Weare (2003-10-27 11:20:00) [11]
День добрый мужики. Вот пропал я на эти выходные, но проблему так и не решил. Не хочу показаться нудным, но честно говоря, читая это я уже и сам почти запутался. Но попробую на примере все растолковать.
Допустим у нас есть платежи:
1 28.10 345
2 28.10 647
3 28.10 489
4 30.10 7692
5 01.11 34
...
Здесь идет сортировка по дате. Так вот. Т.к. пользователь у меня специфический, то он хочет, например, чтобы четвертую запись видел в этом списке второй, причем изменяя в первой колонке ее порядковый номер, т.е.
1 28.10 345
2 30.10 7692
3 28.10 647
4 28.10 489
5 01.11 34
Т.о. сортируется это сначало по порядковому номеру, а затем по дате.
Все, теперь я думаю все вопросы, относительно того, что хочет пользователь, сняты. Так вот, подскажите как мне это устроить.
Johnmen (2003-10-25 00:20:00) [12]
Эй, мужики ! Хватит пудрить голову автору !
Вы замыливаете основные базовые принципы построения и функционирования баз данных !!!
Верно обратил на это внимание Митяй © (24.10.03 18:23).
А kaif © совершенно четко объяснил концепцию [24] !!!
kaif (2003-10-24 23:14:00) [13]
Я кажется придумал, что нужно твоему пользователю. Ему нужен не порядок, а приоритет. Заводишь поле "Приоритет", в которое он заносит 1 - первоочередной платеж
2 - во вторую очередь
3 - в третью очередь и так далее.
Может быть одновременно куча первоочередных и куча "второочередных"
Далее идешь к юзеру и задаешь ему вопросы в лоб:
- Как это все упорядочивать в конце концов?
- Сразу после внесения приоритета или по кнопке "Освежить"
Я думаю вместе вы найдете самое лучшее решение.
Но начинать надо с понятия "приоритет" и покончить с понятием "очередность".
jack128 (2003-10-24 21:41:00) [14]
> Weare © (24.10.03 19:09) [21]
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if DataCol = ... then
TDbGrid(Sender).Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
TDbGrid(Sender).DataSource.DataSet.RecNo);
end;
> Vlad © (24.10.03 19:21) [22]
Я понял так, что этот номер нужен для отчета.
А то, как его хочет использовать Weare(c) лично мне не нравиться. Хотя тут мы e[jlbv от программирования в строну телепатии :-)
to Weare
Пусть пользователь выставляешь флаг первоочередных платежек - заноси его в базу и рефрешь dataset..Как сохранить нумерацию я показал..
Vlad (2003-10-24 19:21:00) [15]
Weare © (24.10.03 19:09) [21]
Ты подумай сначала, что ты с этим RecNo делать будешь ?
Насколько я понял, твой пользователь должен руками изменить порядок следования записей в твоем наборе данных, путем изменения некого номера. И причем тут RecNo?
Weare (2003-10-24 19:09:00) [16]
to jack128
Кстати, а как грамотно вывести в этом поле RecNo, в каком событии? Вот я добавил вычисляемое поле в таблице и хочется, чтобы таблица как можно быстрее открывалась, ведь если перебирать НД после открытия таблицы AfterOpen, то это будет несколько тормозить.
Weare (2003-10-24 18:59:00) [17]
> Митяй © (24.10.03 18:48) [18]
> И ещё, я так понял в одну дату может быть несколько запланированных
> платежей?
Да конечно, тут уже Делфи сортирут по порядку занесения этой записи.
> jack128 © (24.10.03 18:50) [19]
>
> А насчет нумерации - нужно в грид добавить столбец с котором
> отображается RecNo, вот м вся нумерация...
ХОРОШАЯ ИДЕЯ! Сейчас попробую. Чего-то я это до конца не продумал ее, хотя что-то такое в голове проскакивало, а я не мог понять чего я хотел.
jack128 (2003-10-24 18:50:00) [18]
> Дело вот в чем. Это что-то вроде бюджета на месяц. Пользователь
> заносит туда суммы платежей на определенные даты. Таблица
> сортируется по дате. Но среди этих платежей есть первоочередные.
> Которые он хотел бы видеть первыми в таблице.
И причем тут редактирование какого то числа?
А насчет нумерации - нужно в грид добавить столбец с котором отображается RecNo, вот м вся нумерация...
Митяй (2003-10-24 18:48:00) [19]
А меняет то он его(номер) для чего, чтобы изменить первоочерёдность?
И ещё, я так понял в одну дату может быть несколько запланированных платежей?
Weare (2003-10-24 18:38:00) [20]
> Митяй © (24.10.03 18:23) [16]
> А ты можешь растолковать , какую цель преследует пользователь
> данным кандибобером, проще говоря на хрюня ему это надо,
> честно сказать не пойму?
Дело вот в чем. Это что-то вроде бюджета на месяц. Пользователь заносит туда суммы платежей на определенные даты. Таблица сортируется по дате. Но среди этих платежей есть первоочередные. Которые он хотел бы видеть первыми в таблице. Для этого я сделал составной индекс по номеру и затем по дате.
Вот я и спрашиваю, есть ли какие-то готовые решения для правильного рефреширования номера после его изменения.
Вот тут есть св-со у полей таблицы: AutoGenerateValue, одно из значений которого arAutoInc. Может как-то этим воспользоваться? Что-то пока ничего не вяжется.