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

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

Стобец - порядковый номер [D5, D6, Paradox]


Страницы:   1 2

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. Может как-то этим воспользоваться? Что-то пока ничего не вяжется.


Страницы:   1 2

Наверх

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