![]() |
| ||
|
|
Новости |
Поиск |
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;
Перемещение вниз осуществлено по образу и подобию - поэтому код не привожу.
Anatoly Podgoretsky (2006-11-14 11:45:00) [1]Кто то путает форумы со службами поддержки.
И кто то не желает, обсуждать, ему наверно легче обвинить в этом форумчан, ну так не позволим это делать, иди в службу поддержки.
Juju (2006-11-14 11:41:00) [2]ANB
Спасибо за вариант.
(P.S. TABLE - я указал только для удобочитаемости своего кода... Все проблемы с TABLE, GROUP, POSITION - уже пройдены и учтены:) )
>Вот только сомнения меня берут по поводу посильности взятой задачи - склад - не шутка
Телефонные справочники перестали заказывать :)
StriderMan
Спасибо за понимание и поддержку огнем. :)
>я так понял поля неуникальные?
Все поля уникальны.
Anatoly Podgoretsky
>а здесь между форум и каждые имет право писать, а не только то что хочет автор
Со стороны себя послушай. Для того чтобы писать ВСЁ что в голову взбредет и перемешивая это ВСЁ с грубостью и мальчишичьими плевками - есть отдельный форум, а здесь либо пишешь ответ - либо игнорируешь - а засирать форум можно и без знания Delphi.
С другой стороны форум называется "Начинающим". Поэтому все хамство засовывается за воротник и опять таки - либо спокойно объясняешь - либо игнорируешь. А болтать на тему, которая не интересует автора - в курилку.
>это форум и никто никому ничего не обязан, никто не получает за ответы на форумах деньги, тратит только свое личное время
Нет времени и желания не отвечай. А то как-то не совпадает...: на грубости и всякую муть с синдромом пенсионного учителя время есть - а ответить на проблему времени нет.
Из 29 постов 4-ре по теме - остальные с ярлыком "у нас нет времени говорить о деле - мы поговорим о том, как недосягаемо умны, а ты туп как пробка. И вообще нам денег никто не платит - поэтому обсирать или не обсирать - это наше дело".
ASoft (2006-11-14 04:23:00) [3]>Juju
как вариант, возможно, извращенский...
портировать таблицу в StringGrid, перемещать строки в ней как хочется, по закрытию апдейтить базу..
Anatoly Podgoretsky (2006-11-13 20:00:00) [4]> StriderMan (13.11.2006 19:58:27) [27]
Причем тут моя точка, это форум и никто никому ничего не обязан, никто не получает за ответы на форумах деньги, тратит только свое личное время, но и никакой обязательности тоже.
StriderMan (2006-11-13 19:58:00) [5]
> Anatoly Podgoretsky ©
понял вашу точку зрения. спорить не буду, дело ваше.
Anatoly Podgoretsky (2006-11-13 19:54:00) [6]> StriderMan (13.11.2006 19:35:23) [23]
Да совесть должна быть.
Хочешь обязательности, обращайся в службу поддержки.
Anatoly Podgoretsky (2006-11-13 19:53:00) [7]> StriderMan (13.11.2006 19:23:21) [21]
У тебя требования как службе поддержки, а здесь между форум и каждые имет право писать, а не только то что хочет автор.
Ketmar (2006-11-13 19:42:00) [8]>[23] StriderMan(c) 13-Nov-2006, 19:35
>знать куда тебя ткнут :)
не нужно. понятно, что в справку или документацию. %-)
StriderMan (2006-11-13 19:35:00) [9]
> Ketmar © (13.11.06 19:30) [22]
> телепаты перманентно в отпуске. а недоволен ответами -- не спрашивай.
видать чтоб спрашивать надо быть тоже телепатом, заранее знать куда тебя ткнут :)
Ketmar (2006-11-13 19:30:00) [10]>[21] StriderMan(c) 13-Nov-2006, 19:23
>Не знаете "зачем" - незачем давать советы.
телепаты перманентно в отпуске. а недоволен ответами -- не спрашивай.
StriderMan (2006-11-13 19:23:00) [11]Эх! месяцев несколько назад осаждал форум с точно такой же траблой! И наткнулся на такую же стену непонимания и презрения. А ведь уважаемых мастеров никто не спрашивал "зачем это"? Не знаете "зачем" - незачем давать советы. Сорри если кого обидел.
> Juju
я так понял поля неуникальные?
ANB (2006-11-13 19:09:00) [12]
> Реакция нормальная на тех, кто пытается очевидную и правильно
> заложенную функциональность вывернуть под "цвет своих трусов".
>
> Тебе не понятно, что такое ISAM ?
Чего ты привязался к человеку. В данном случае быстрее написать, как хочет начальник, чем убедить того, что это неправильно. Набъет начальник кривые данные - это его проблемы. Потом за отдельную плату чинить будет.
Вот только сомнения меня берут по поводу посильности взятой задачи - склад - не шутка.
Jeer (2006-11-13 19:06:00) [13]Тут недавно еще один изобретатель велосипеда пытался любую нужную ему запись вытолкнуть в top DBгрида.
Да все можно, есс-но.
Но лучше не бросаться исполнять "волю" ЗАказчика, а работать с ним и убеждать в целесообразности наработанных IT-сообществом интерфейсов.
ANB (2006-11-13 19:06:00) [14]create table Catalog
(
NUM integer, -- Êîä àâòîèíêðèìåíò
NAME varchar2(255), -- Íàçâàíèå
POS integer -- Ïîçèöèÿ (ïî êîòîðîé ñîáñòâåííî è îïðåäåëÿåòñÿ ïîëîæåíèå çàïèñè)
)
select * from Catalog order by Pos
update Catalog
set Pos =
case
when Pos = :Oldpos
then :Newpos
when :Newpos > :Oldpos
then Pos - 1
when :Newpos < :Oldpos
then Pos + 1
else Pos
end
where Pos between :Minpos and :Maxpos
Подробности :
1. Не называй таблицы TABLE - грабли обеспечены
2. В параметры пихаешь старую и новую позиции. В minpos и maxpos пихаешь их же, но в мин - меньшую из них, в макс - большую.
Anatoly Podgoretsky (2006-11-13 19:06:00) [15]> Juju (13.11.2006 18:57:14) [14]
> А если оценивать ее в моральном эквиваленте - лишишься работы.
А противном случае можешь лишиться другого.
Jeer (2006-11-13 19:03:00) [16]
> Какая-то нездоровая реакция в понедельник-то!
Реакция нормальная на тех, кто пытается очевидную и правильно заложенную функциональность вывернуть под "цвет своих трусов".
Тебе не понятно, что такое ISAM ?
Почитай.
Или переходи, как было сказано на не DBAware контролы.
Juju (2006-11-13 19:01:00) [17]Jeer- у каждого разное положение. Для меня это зароботок. Если человек платит деньги - он получает то, за что платит вот и все.
А в целом тема форума совсем не о том. И заметте: Просьбы типа: "Напишите за меня процедурку" - здесь не звучит... чего реакция такая?
Juju (2006-11-13 18:57:00) [18]Anatoly Podgoretsky
>[9]
>А если он пожелает денежки переводить на свой счет, что и тогда будешь удовлетворять это желание?
Смотря как к этому относиться.
Незнаю насколько тебе легко находить клиентов. И насколько адекватно они оплачивают твой труд. Я держусь за каждого.
Есть задача для программиста. Она оценена в денежном эквиваленте. На этом и стоит останавливаться. А если оценивать ее в моральном эквиваленте - лишишься работы.
>[10]
>Так делай, чего нас то спрашиваешь.
Я сделал.Мой вариант работает - но у меня сомнение в рациональности и правилдьности подхода к выполнению задачи! Я не собираюсь выезжать чужими силами. Прежде чем задать вопрос я пробую решить все собственными силами. А если гуру отвечать не желает - он не отвечает - вот и все. Какая-то нездоровая реакция в понедельник-то!
ANB
Все Ок. Больше не загружаю.
mfender
Я недавно делал программу и организовывал передвижение в ListBox-e. Здесь база данных Access и в качестве DataSet использую TQuery.
Jeer (2006-11-13 18:52:00) [19]
> Juju (13.11.06 17:20) [7]
лично я таких начальников и суетящихся рядом с ними "программеров" посылаю в "лесостепь" и "мореокиян" - самое место, пусть побродят.
ANB (2006-11-13 18:41:00) [20]
> Juju (13.11.06 17:31) [8]
Ща, не уходи - сочиню . . .