Текущий архив: 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.54 MB
Время: 0.009 c