![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передвижение записей "вверх" и "вниз". Способ реализации... [D7, XP]
Juju © (2006-11-13 15:18:00)Задача:
Нужно передвигать запись в таблице "вверх", "вниз". Собственно ничего сложного... суть вопроса в способе реализации. Мне показалось что мой не совсем рационален.
Если есть время - гляньте пожалуйста...
Знаю, что нет ничего ужаснее разбираться в чужом коде, облегчил задачу вставив коментарии.
Побовал решить:
Используемые компоненты:
qQUERY:TQuery
Структура TABLE:
NUM- Код автоинкримент
NAME- Название
POS- Позиция (по которой собственно и определяется положение записи)
Используемые переменные:
PR- POS предыдущей записи
CR- POS текущей записи
PN- NUM предыдущей записи
CN- NUM текущей записи
BM- Закладка для определения где должен вставать курсор после реализации
Привожу на примере экшена кнопки (хотя у меня оформлено в отдельной процедуре)
procedure TForm1.bbUpClick(Sender: TObject);
var PR,CR,PN,CN:Integer;
BM:TBookmark;
begin
//Проверяю или запись не первая
if qQUERY.RecNo = 1 then Exit;
//Определяю значения переменных
//Текущая запись
CN := qQUERY['NUM'];
CR := qQUERY['POS'];
qQUERY.Prior;
//Запоминаем положение курсора
BM := qQUERY.GetBookmark;
//Предыдущая запись
PN := qQUERY['NUM'];
PR := qQUERY['POS'];
//Обновляю новое значение для текущей и предыдущей записи
qQUERY.Close;
qQUERY.SQL.Text :='UPDATE TABLE SET POS = '+IntToStr(CR)+' WHERE NUM = '+IntToStr(PN);
qQUERY.ExecSQL;
qQUERY.Close;
qQUERY.SQL.Text :='UPDATE TABLE SET POS = '+IntToStr(PR)+' WHERE NUM = '+IntToStr(CN);
qQUERY.ExecSQL;
//Показываю данные отсортированные для отображения
qQUERY.Close;
qQUERY.SQL.Text := 'SELECT * FROM TABLE ORDER BY POS';
qQUERY.Open;
//Ставлю курсор на нужную запись
qQUERY.GotoBookmark(BM);
qQUERY.FreeBookmark(BM);
end;
Перемещение вниз осуществлено по образу и подобию - поэтому код не привожу.
mfender (2006-11-13 18:29:00) [21]
> 2-й вариант не понятен на словах... Как
> > Можно одним апдейтом обновить таблицу, сдвинув нумерацию?
>
Я делал это в отдельном ListBox'е. По приоритету раскидывал их, перетаскиваешь DragAndDrop'ом как надо и, при закрытии формы UPDATE поля "приоритет" в соответствии с положением в ListBox'е.
Anatoly Podgoretsky (2006-11-13 18:24:00) [22]> Juju (13.11.2006 17:31:08) [8]
Так делай, чего нас то спрашиваешь.
Anatoly Podgoretsky (2006-11-13 18:23:00) [23]> Juju (13.11.2006 17:20:07) [7]
> задача программиста постараться удовлетворить это желание
А если он пожелает денежки переводить на свой счет, что и тогда будешь удовлетворять это желание?
Juju (2006-11-13 17:31:00) [24]ANB
1-й вариант - исключено - последствия будут самые ужаные.
Задача стоит четко - либо по "Ctrl"+"стрелка вверх/вниз", либо по отдельным кнопкам на форме двигать запись.
2-й вариант не понятен на словах... Как
> Можно одним апдейтом обновить таблицу, сдвинув нумерацию?
Juju (2006-11-13 17:20:00) [25]Jeer
>> А начальник склада - дурак.
>А если программист спешит выполнить требования такого начальник, то кто >программист ?
>Juju догадался ?
>Правильно.
1) Я думаю, что для обмена подростковыми колкостями есть отдельный форум. Нет конструктивного ответа - просьба не отвечать вообще.
2) Считаешь вопросы в форуме «Начинающим» - глупыми - не заходи сюда.
3) Начальник склада - лицо, которое платит программисту за складскую программу "под ключ". И я считаю, что в этом случае, если он захочет чтобы записи переворачивались при просмотре - задача программиста постараться удовлетворить это желание. А детские "дурак-сам дурак" вероятно уместны где-то в вашем обществе...
ANB (2006-11-13 16:27:00) [26]
> Juju (13.11.06 15:18)
Варианты :
1. Сделать поле "Приоритет", вывести его в грид и разрешить редактировать (можно на отдельной форме). И пусть начальник с ним делает что угодно. Заодно нужно добавить это поле в варианты сортировки
2. Можно одним апдейтом обновить таблицу, сдвинув нумерацию. Потом перечитать набор данных. ИМХО - будет шустрее.
Jeer (2006-11-13 16:20:00) [27]
> А начальник склада - дурак.
А если программист спешит выполнить требования такого начальник, то кто программист ?
Juju догадался ?
Правильно.
Sergey13 (2006-11-13 16:12:00) [28]> 1) Накидай пару строк
Ну щас. Словами - пожалста, я это делал так. Спрашивал юзера после какой записи он желает видеть перемещаемую запись. Смотрел рейтинг нужной записи и следующей и присваивал рейтингу перемещаемой серединное значение. Делать это надо в датасете, а не прямыми запросами в к БД, что бы не перечитывать набор данных после каждого чиха.
ЗЫ: А начальник склада - дурак. Потом сам запутается и введет 10 раз одно и тоже на том лишь основании, что не нашел каких нибудь тапочек в начале списка.
Juju (2006-11-13 16:03:00) [29]Jeer- сорри, я ошибся форумом! Он же называется "Опытом деляться профессионалы"!
Sergey13
1) Накидай пару строк
2) Это программа по складскому учету, а товарищ начальник склада хочет так рейтинговать группы товаров. Двигать их вверх и вниз и все время наблюдать нужный порядок...
Sergey13 (2006-11-13 15:28:00) [30]1. А зачем менять 2 записи? Достаточно у 1. Причем за 1 раз можно поставить сразу на нужное место, а не дергаться шажками, лопаятя БД на каждом шаге.
2. А зачем все это?
Jeer (2006-11-13 15:26:00) [31]
> Juju (13.11.06 15:18)
Вы занимаетесь ерундой, как и большинство тех, кто не вдаваясь в подробности теории реляционных баз, основанных на принципе ISAM (индексно-последовательный метод доступа) пытается при их использовании изобрести собственный велосипед с треугольными колесами.