Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.17;
Скачать: CL | DM;

Вниз

Стобец - порядковый номер   Найти похожие ветки 

 
Weare ©   (2003-10-24 16:09) [0]

Добрый день.

Ситуация такая: пользователь захотел видеть в своей таблице еще один столбец - порядковый. Причем, чтобы при изменении номера записи (непосредственно в самом столбце)она становилась в нужную позицию а все остальные номера пересчитались. Т.е. если запись была 8 по счету и этот номер поменяли на 4, то она становится четвертой и переписались бы все остальные номера.
Вопрос вот в чем: как можно это сделать с помощью быть может самих св-в таблицы или уже известными методами. А может решение какое-то уже и так существует. Очень не хочется кодировать все эти события: OnEdit, AfterPost, BeforeEdit, OnNewRecord, OnDelete, OnInsert.


 
Reindeer Moss Eater ©   (2003-10-24 16:15) [1]

alter table mytable add orderfield number;

И сортировать всегда по этому полю


 
Weare ©   (2003-10-24 16:56) [2]


> Reindeer Moss Eater © (24.10.03 16:15) [1]
> alter table mytable add orderfield number;

Ты конечно извини, но я ничего не понял из твоего ответа. Если можешь, объясни поподробнее, "на пальцах".


 
Reindeer Moss Eater ©   (2003-10-24 16:59) [3]

Очень не хочется кодировать все эти события

Добавь нумерик поле в эту таблицу.
Покажи его в гриде.
Сортируй датасет всегда по этому полю.
Остальное сделает за тебя юзер, вводящий значения в это поле нужных записей.


 
Sandman25 ©   (2003-10-24 16:59) [4]

[2] Weare © (24.10.03 16:56)

Номер записи должен быть таким же полем БД, как и все остальные.


 
Vlad ©   (2003-10-24 17:06) [5]

Если я правильно понял проблему, то ситуация следующая.
Пользователь меняет номер записи к примеру с 25-й на 8-ю.
При этом запись, которая раньше имела номер 8 должна стать 9-ой, 9-я становится 10-й, и так далее, до конца набора данных.
Если так, то простым способом тут не получится, все равно в цикле НД перебирать надо.


 
Weare ©   (2003-10-24 17:07) [6]


> Reindeer Moss Eater © (24.10.03 16:59) [3]
> Остальное сделает за тебя юзер, вводящий значения в это
> поле нужных записей.

Все это так, но пользователю неудобно будет записывать туда значния. Т.к. если у него, например, 50 записей. Он открывает таблицу, они сортируются в порядке возрастания номера. И допустим 23-ю запись еме нужно сделать 8-ой. Он меняет ее номер, но ведь восьмая уже есть и тогда ее нужно поменять на 9-ю и т.д. - неудобно.
А, кстати, есть ли в гриде или таблице уже какие-то встроенные решения нумерации записей.


 
Sandman25 ©   (2003-10-24 17:08) [7]

[5] Vlad © (24.10.03 17:06)

Можно еще update table set nom = nom + 1 where nom > :nom + Close/Open;


 
Reindeer Moss Eater ©   (2003-10-24 17:09) [8]

Все это так, но пользователю неудобно будет записывать туда значния.

Я у тебя прочитал, что это желание самого пользователя


 
Sandman25 ©   (2003-10-24 17:11) [9]

Точнее,

where nom between :nom1 and :nom2

nom1 = 8
nom2 = 25

Перед этим придется из 25 сделать -25, потом проапдейтить на 8.


 
Weare ©   (2003-10-24 17:20) [10]


> Sandman25 © (24.10.03 17:11) [9]
> Точнее,
>
> where nom between :nom1 and :nom2
>
> nom1 = 8
> nom2 = 25
>
> Перед этим придется из 25 сделать -25, потом проапдейтить
> на 8.

Спасибо, я в принципе так и сделал, но у меня уже, нужные для решения этой проблемы, события были задействованы для других целей и теперь приходится отслеживать каждый шаг пользователя, чтобы эти события корректно отработали.

Так значит никаких готовых решений этому еще нет. :(
Но ведь должны же быть типовые примеры, связанные с порядковым номером и при добавлении или удалении записи номер бы рефрешировался.


 
Sandman25 ©   (2003-10-24 17:26) [11]

>Но ведь должны же быть типовые примеры, связанные с порядковым номером и при добавлении или удалении записи номер бы рефрешировался.

Такое возможно, если для редактирования использовать хранимые процедуры.


 
Weare ©   (2003-10-24 17:40) [12]


> Sandman25 © (24.10.03 17:26) [11]
> Такое возможно, если для редактирования использовать хранимые
> процедуры.

Может знаешь такие?


 
Vlad ©   (2003-10-24 17:44) [13]

Weare © (24.10.03 17:40) [12]
Какие хранимые процедуры ? У тебя Paradox вроде ?


 
Sandman25 ©   (2003-10-24 17:48) [14]

>Может знаешь такие?

Для Paradox их нет.
Транзакцию у TDatabase надо использовать.


 
kaif ©   (2003-10-24 18:22) [15]

Я не понимаю. У меня когда-то все это работало. Делаешь поле, делаешь индекс на него, берешь какой-нибудь TTable, устанавливаешь там свойства TableName, IndexField, и все работает. В событие AfterPost засунь команду DataSet.Refresh. Все должно работать.


 
Митяй ©   (2003-10-24 18:23) [16]

Weare © (24.10.03 16:09)
А ты можешь растолковать , какую цель преследует пользователь данным кандибобером, проще говоря на хрюня ему это надо, честно сказать не пойму?


 
Weare ©   (2003-10-24 18:38) [17]


> Митяй © (24.10.03 18:23) [16]
> А ты можешь растолковать , какую цель преследует пользователь
> данным кандибобером, проще говоря на хрюня ему это надо,
> честно сказать не пойму?

Дело вот в чем. Это что-то вроде бюджета на месяц. Пользователь заносит туда суммы платежей на определенные даты. Таблица сортируется по дате. Но среди этих платежей есть первоочередные. Которые он хотел бы видеть первыми в таблице. Для этого я сделал составной индекс по номеру и затем по дате.
Вот я и спрашиваю, есть ли какие-то готовые решения для правильного рефреширования номера после его изменения.
Вот тут есть св-со у полей таблицы: AutoGenerateValue, одно из значений которого arAutoInc. Может как-то этим воспользоваться? Что-то пока ничего не вяжется.


 
Митяй ©   (2003-10-24 18:48) [18]

А меняет то он его(номер) для чего, чтобы изменить первоочерёдность?
И ещё, я так понял в одну дату может быть несколько запланированных платежей?


 
jack128 ©   (2003-10-24 18:50) [19]


> Дело вот в чем. Это что-то вроде бюджета на месяц. Пользователь
> заносит туда суммы платежей на определенные даты. Таблица
> сортируется по дате. Но среди этих платежей есть первоочередные.
> Которые он хотел бы видеть первыми в таблице.
И причем тут редактирование какого то числа?
А насчет нумерации - нужно в грид добавить столбец с котором отображается RecNo, вот м вся нумерация...


 
Weare ©   (2003-10-24 18:59) [20]


> Митяй © (24.10.03 18:48) [18]
> И ещё, я так понял в одну дату может быть несколько запланированных
> платежей?

Да конечно, тут уже Делфи сортирут по порядку занесения этой записи.


> jack128 © (24.10.03 18:50) [19]
>
> А насчет нумерации - нужно в грид добавить столбец с котором
> отображается RecNo, вот м вся нумерация...

ХОРОШАЯ ИДЕЯ! Сейчас попробую. Чего-то я это до конца не продумал ее, хотя что-то такое в голове проскакивало, а я не мог понять чего я хотел.


 
Weare ©   (2003-10-24 19:09) [21]

to jack128

Кстати, а как грамотно вывести в этом поле RecNo, в каком событии? Вот я добавил вычисляемое поле в таблице и хочется, чтобы таблица как можно быстрее открывалась, ведь если перебирать НД после открытия таблицы AfterOpen, то это будет несколько тормозить.


 
Vlad ©   (2003-10-24 19:21) [22]

Weare © (24.10.03 19:09) [21]
Ты подумай сначала, что ты с этим RecNo делать будешь ?
Насколько я понял, твой пользователь должен руками изменить порядок следования записей в твоем наборе данных, путем изменения некого номера. И причем тут RecNo?


 
jack128 ©   (2003-10-24 21:41) [23]


> 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..Как сохранить нумерацию я показал..


 
kaif ©   (2003-10-24 23:14) [24]

Я кажется придумал, что нужно твоему пользователю. Ему нужен не порядок, а приоритет. Заводишь поле "Приоритет", в которое он заносит 1 - первоочередной платеж
2 - во вторую очередь
3 - в третью очередь и так далее.
Может быть одновременно куча первоочередных и куча "второочередных"
Далее идешь к юзеру и задаешь ему вопросы в лоб:
- Как это все упорядочивать в конце концов?
- Сразу после внесения приоритета или по кнопке "Освежить"
Я думаю вместе вы найдете самое лучшее решение.
Но начинать надо с понятия "приоритет" и покончить с понятием "очередность".


 
Johnmen ©   (2003-10-25 00:20) [25]

Эй, мужики ! Хватит пудрить голову автору !
Вы замыливаете основные базовые принципы построения и функционирования баз данных !!!
Верно обратил на это внимание Митяй © (24.10.03 18:23).
А kaif © совершенно четко объяснил концепцию [24] !!!


 
Weare ©   (2003-10-27 11:20) [26]

День добрый мужики. Вот пропал я на эти выходные, но проблему так и не решил. Не хочу показаться нудным, но честно говоря, читая это я уже и сам почти запутался. Но попробую на примере все растолковать.
Допустим у нас есть платежи:

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

Т.о. сортируется это сначало по порядковому номеру, а затем по дате.
Все, теперь я думаю все вопросы, относительно того, что хочет пользователь, сняты. Так вот, подскажите как мне это устроить.


 
Anatoly Podgoretsky ©   (2003-10-27 11:30) [27]

Тебе уже много дали вариантов, например один из рабочих Sandman25 © (24.10.03 17:11) [9]


 
Sergey13 ©   (2003-10-27 11:46) [28]

2Weare © (27.10.03 11:20) [26]
Подумай, как будет выглядеть твой список платежей завтра (например) когда платежи 1 и 3 пройдут, а остальные останутся + добавятся новые.
ИМХО - самое правильное это приоритеты расставлять. Как кто-то уже советовал. Причем можно не обязательно целыми числами. С дробными будет проще менять иерархию на лету (не пересчитывая остальные).


 
Anatoly Podgoretsky ©   (2003-10-27 11:48) [29]

Да какие приоритеты, просто требуется пользовательская нумерация, типа идентификатор, плюс индексация.


 
Sergey13 ©   (2003-10-27 11:58) [30]

2Anatoly Podgoretsky © (27.10.03 11:48) [29]
>Да какие приоритеты, просто требуется пользовательская нумерация, типа идентификатор, плюс индексация.
Ну дык ими же еще и рулить хочется на лету. Я и предложил. С помощью "приоритетов" расположить записи в "нужном" порядке. А номерок присовокупить будет уже проще.


 
Anatoly Podgoretsky ©   (2003-10-27 12:09) [31]

Ну и чего там рулить, перенумерация, дано несколько вариантов, вклюячая SQL код, задачка для начинающих, решается на бумаге с помощью карандаша.


 
Weare ©   (2003-10-27 13:03) [32]


> Anatoly Podgoretsky © (27.10.03 12:09) [31]
> решается на бумаге с помощью карандаша

Спасибо, учту.

Дело ведь не в карандаше, я же говорил, что у меня уже, нужные для решения этой проблемы, события были задействованы для других целей и теперь приходится отслеживать каждый шаг пользователя, чтобы эти события корректно отработали, приходится расставлять разные флажки, делать очень много различных проверок, чтобы отрабатывала та или инная часть кода. И суть вопроса состояла в том, что может это как-то проще можно было бы сделать, воспользоваться какими-то имеющимися решениями. И я именно на это делал акцент, ну например: Weare © (24.10.03 18:38) [17].
Вот в этом я и нуждаюсь. Если так все просто как у Anatoly Podgoretsky (у него впрочем все на пальцах решается), то дайте мне ответ на эту простую задачку.


 
Anatoly Podgoretsky ©   (2003-10-27 13:21) [33]

Да бежишь в обратном порядке от 24 до 8 и приьавляешь единичку, а затем меняешь -8 на восемь, зря ты не поигрался на бумаге, не было бы вопроса.


 
kaif ©   (2003-10-27 14:44) [34]

Хоть это и неправильно, но раз уж заказчик хочет за твой счет изучать свои грабли, то решение такое:

(если нет уникального индекса только!)
Три 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 своей таблицы.


 
kaif ©   (2003-10-27 14:45) [35]

Не уверен, что вторая команда сработает на Paradox-е. Нужен эксперимент.


 
Weare ©   (2003-10-27 16:49) [36]

to kaif

ОГРОМНОЕ СПАСИБО, сейчас попробую.



Страницы: 1 вся ветка

Текущий архив: 2003.11.17;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.026 c
3-56514
chtr
2003-10-21 14:17
2003.11.17
Ошибка Row cannot be located for updating


6-56789
Novenkij
2003-09-21 14:40
2003.11.17
Как узнать размер Stream


1-56745
TRyaSS
2003-11-06 14:44
2003.11.17
Что такое системная переменная Path?


11-56548
Kladov
2003-02-21 19:54
2003.11.17
Версия 1.69


3-56436
paul_k
2003-10-27 09:26
2003.11.17
Помогите разобратся в структуре