Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.011 c
1-56565
maxi
2003-11-06 13:12
2003.11.17
Как заставить TImageList не резать картинки на части ?


8-56777
DBDev
2003-07-22 14:00
2003.11.17
какой функцией вычленить заданный фрагмент из TPicture?


1-56568
RoLeX
2003-11-07 21:36
2003.11.17
Как узнать местонахождение папки Temp ???


1-56644
denmin
2003-11-04 15:02
2003.11.17
Проблема с For i:=... to ....


7-56922
Khloo!
2003-09-08 13:34
2003.11.17
Com- порты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский