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

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

Передвижение записей "вверх" и "вниз". Способ реализации... [D7, XP]


Страницы:   1 2

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  (индексно-последовательный метод доступа) пытается при их использовании изобрести собственный велосипед с треугольными колесами.


Страницы:   1 2

Наверх

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