Текущий архив: 2006.12.03;
Скачать: CL | DM;
Вниз
Передвижение записей "вверх" и "вниз". Способ реализации... Найти похожие ветки
← →
Juju (2006-11-13 15:18) [0]Задача:
Нужно передвигать запись в таблице "вверх", "вниз". Собственно ничего сложного... суть вопроса в способе реализации. Мне показалось что мой не совсем рационален.
Если есть время - гляньте пожалуйста...
Знаю, что нет ничего ужаснее разбираться в чужом коде, облегчил задачу вставив коментарии.
Побовал решить:
Используемые компоненты:
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;
Перемещение вниз осуществлено по образу и подобию - поэтому код не привожу.
← →
Jeer © (2006-11-13 15:26) [1]
> Juju (13.11.06 15:18)
Вы занимаетесь ерундой, как и большинство тех, кто не вдаваясь в подробности теории реляционных баз, основанных на принципе ISAM (индексно-последовательный метод доступа) пытается при их использовании изобрести собственный велосипед с треугольными колесами.
← →
Sergey13 © (2006-11-13 15:28) [2]1. А зачем менять 2 записи? Достаточно у 1. Причем за 1 раз можно поставить сразу на нужное место, а не дергаться шажками, лопаятя БД на каждом шаге.
2. А зачем все это?
← →
Juju (2006-11-13 16:03) [3]Jeer - сорри, я ошибся форумом! Он же называется "Опытом деляться профессионалы"!
Sergey13
1) Накидай пару строк
2) Это программа по складскому учету, а товарищ начальник склада хочет так рейтинговать группы товаров. Двигать их вверх и вниз и все время наблюдать нужный порядок...
← →
Sergey13 © (2006-11-13 16:12) [4]> 1) Накидай пару строк
Ну щас. Словами - пожалста, я это делал так. Спрашивал юзера после какой записи он желает видеть перемещаемую запись. Смотрел рейтинг нужной записи и следующей и присваивал рейтингу перемещаемой серединное значение. Делать это надо в датасете, а не прямыми запросами в к БД, что бы не перечитывать набор данных после каждого чиха.
ЗЫ: А начальник склада - дурак. Потом сам запутается и введет 10 раз одно и тоже на том лишь основании, что не нашел каких нибудь тапочек в начале списка.
← →
Jeer © (2006-11-13 16:20) [5]
> А начальник склада - дурак.
А если программист спешит выполнить требования такого начальник, то кто программист ?
Juju догадался ?
Правильно.
← →
ANB © (2006-11-13 16:27) [6]
> Juju (13.11.06 15:18)
Варианты :
1. Сделать поле "Приоритет", вывести его в грид и разрешить редактировать (можно на отдельной форме). И пусть начальник с ним делает что угодно. Заодно нужно добавить это поле в варианты сортировки
2. Можно одним апдейтом обновить таблицу, сдвинув нумерацию. Потом перечитать набор данных. ИМХО - будет шустрее.
← →
Juju (2006-11-13 17:20) [7]Jeer
>> А начальник склада - дурак.
>А если программист спешит выполнить требования такого начальник, то кто >программист ?
>Juju догадался ?
>Правильно.
1) Я думаю, что для обмена подростковыми колкостями есть отдельный форум. Нет конструктивного ответа - просьба не отвечать вообще.
2) Считаешь вопросы в форуме «Начинающим» - глупыми - не заходи сюда.
3) Начальник склада - лицо, которое платит программисту за складскую программу "под ключ". И я считаю, что в этом случае, если он захочет чтобы записи переворачивались при просмотре - задача программиста постараться удовлетворить это желание. А детские "дурак-сам дурак" вероятно уместны где-то в вашем обществе...
← →
Juju (2006-11-13 17:31) [8]ANB
1-й вариант - исключено - последствия будут самые ужаные.
Задача стоит четко - либо по "Ctrl"+"стрелка вверх/вниз", либо по отдельным кнопкам на форме двигать запись.
2-й вариант не понятен на словах... Как
> Можно одним апдейтом обновить таблицу, сдвинув нумерацию?
← →
Anatoly Podgoretsky © (2006-11-13 18:23) [9]> Juju (13.11.2006 17:20:07) [7]
> задача программиста постараться удовлетворить это желание
А если он пожелает денежки переводить на свой счет, что и тогда будешь удовлетворять это желание?
← →
Anatoly Podgoretsky © (2006-11-13 18:24) [10]> Juju (13.11.2006 17:31:08) [8]
Так делай, чего нас то спрашиваешь.
← →
mfender © (2006-11-13 18:29) [11]
> 2-й вариант не понятен на словах... Как
> > Можно одним апдейтом обновить таблицу, сдвинув нумерацию?
>
Я делал это в отдельном ListBox"е. По приоритету раскидывал их, перетаскиваешь DragAndDrop"ом как надо и, при закрытии формы UPDATE поля "приоритет" в соответствии с положением в ListBox"е.
← →
ANB © (2006-11-13 18:41) [12]
> Juju (13.11.06 17:31) [8]
Ща, не уходи - сочиню . . .
← →
Jeer © (2006-11-13 18:52) [13]
> Juju (13.11.06 17:20) [7]
лично я таких начальников и суетящихся рядом с ними "программеров" посылаю в "лесостепь" и "мореокиян" - самое место, пусть побродят.
← →
Juju (2006-11-13 18:57) [14]Anatoly Podgoretsky
>[9]
>А если он пожелает денежки переводить на свой счет, что и тогда будешь удовлетворять это желание?
Смотря как к этому относиться.
Незнаю насколько тебе легко находить клиентов. И насколько адекватно они оплачивают твой труд. Я держусь за каждого.
Есть задача для программиста. Она оценена в денежном эквиваленте. На этом и стоит останавливаться. А если оценивать ее в моральном эквиваленте - лишишься работы.
>[10]
>Так делай, чего нас то спрашиваешь.
Я сделал. Мой вариант работает - но у меня сомнение в рациональности и правилдьности подхода к выполнению задачи! Я не собираюсь выезжать чужими силами. Прежде чем задать вопрос я пробую решить все собственными силами. А если гуру отвечать не желает - он не отвечает - вот и все. Какая-то нездоровая реакция в понедельник-то!
ANB
Все Ок. Больше не загружаю.
mfender
Я недавно делал программу и организовывал передвижение в ListBox-e. Здесь база данных Access и в качестве DataSet использую TQuery.
← →
Juju (2006-11-13 19:01) [15]Jeer - у каждого разное положение. Для меня это зароботок. Если человек платит деньги - он получает то, за что платит вот и все.
А в целом тема форума совсем не о том. И заметте: Просьбы типа: "Напишите за меня процедурку" - здесь не звучит... чего реакция такая?
← →
Jeer © (2006-11-13 19:03) [16]
> Какая-то нездоровая реакция в понедельник-то!
Реакция нормальная на тех, кто пытается очевидную и правильно заложенную функциональность вывернуть под "цвет своих трусов".
Тебе не понятно, что такое ISAM ?
Почитай.
Или переходи, как было сказано на не DBAware контролы.
← →
Anatoly Podgoretsky © (2006-11-13 19:06) [17]> Juju (13.11.2006 18:57:14) [14]
> А если оценивать ее в моральном эквиваленте - лишишься работы.
А противном случае можешь лишиться другого.
← →
ANB © (2006-11-13 19:06) [18]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 пихаешь их же, но в мин - меньшую из них, в макс - большую.
← →
Jeer © (2006-11-13 19:06) [19]Тут недавно еще один изобретатель велосипеда пытался любую нужную ему запись вытолкнуть в top DBгрида.
Да все можно, есс-но.
Но лучше не бросаться исполнять "волю" ЗАказчика, а работать с ним и убеждать в целесообразности наработанных IT-сообществом интерфейсов.
← →
ANB © (2006-11-13 19:09) [20]
> Реакция нормальная на тех, кто пытается очевидную и правильно
> заложенную функциональность вывернуть под "цвет своих трусов".
>
> Тебе не понятно, что такое ISAM ?
Чего ты привязался к человеку. В данном случае быстрее написать, как хочет начальник, чем убедить того, что это неправильно. Набъет начальник кривые данные - это его проблемы. Потом за отдельную плату чинить будет.
Вот только сомнения меня берут по поводу посильности взятой задачи - склад - не шутка.
← →
StriderMan © (2006-11-13 19:23) [21]Эх! месяцев несколько назад осаждал форум с точно такой же траблой! И наткнулся на такую же стену непонимания и презрения. А ведь уважаемых мастеров никто не спрашивал "зачем это"? Не знаете "зачем" - незачем давать советы. Сорри если кого обидел.
> Juju
я так понял поля неуникальные?
← →
Ketmar © (2006-11-13 19:30) [22]>[21] StriderMan(c) 13-Nov-2006, 19:23
>Не знаете "зачем" - незачем давать советы.
телепаты перманентно в отпуске. а недоволен ответами -- не спрашивай.
← →
StriderMan © (2006-11-13 19:35) [23]
> Ketmar © (13.11.06 19:30) [22]
> телепаты перманентно в отпуске. а недоволен ответами -- не спрашивай.
видать чтоб спрашивать надо быть тоже телепатом, заранее знать куда тебя ткнут :)
← →
Ketmar © (2006-11-13 19:42) [24]>[23] StriderMan(c) 13-Nov-2006, 19:35
>знать куда тебя ткнут :)
не нужно. понятно, что в справку или документацию. %-)
← →
Anatoly Podgoretsky © (2006-11-13 19:53) [25]> StriderMan (13.11.2006 19:23:21) [21]
У тебя требования как службе поддержки, а здесь между форум и каждые имет право писать, а не только то что хочет автор.
← →
Anatoly Podgoretsky © (2006-11-13 19:54) [26]> StriderMan (13.11.2006 19:35:23) [23]
Да совесть должна быть.
Хочешь обязательности, обращайся в службу поддержки.
← →
StriderMan © (2006-11-13 19:58) [27]
> Anatoly Podgoretsky ©
понял вашу точку зрения. спорить не буду, дело ваше.
← →
Anatoly Podgoretsky © (2006-11-13 20:00) [28]> StriderMan (13.11.2006 19:58:27) [27]
Причем тут моя точка, это форум и никто никому ничего не обязан, никто не получает за ответы на форумах деньги, тратит только свое личное время, но и никакой обязательности тоже.
← →
ASoft (2006-11-14 04:23) [29]>Juju
как вариант, возможно, извращенский...
портировать таблицу в StringGrid, перемещать строки в ней как хочется, по закрытию апдейтить базу..
← →
Juju (2006-11-14 11:41) [30]ANB
Спасибо за вариант.
(P.S. TABLE - я указал только для удобочитаемости своего кода... Все проблемы с TABLE, GROUP, POSITION - уже пройдены и учтены:) )
>Вот только сомнения меня берут по поводу посильности взятой задачи - склад - не шутка
Телефонные справочники перестали заказывать :)
StriderMan
Спасибо за понимание и поддержку огнем. :)
>я так понял поля неуникальные?
Все поля уникальны.
Anatoly Podgoretsky
>а здесь между форум и каждые имет право писать, а не только то что хочет автор
Со стороны себя послушай. Для того чтобы писать ВСЁ что в голову взбредет и перемешивая это ВСЁ с грубостью и мальчишичьими плевками - есть отдельный форум, а здесь либо пишешь ответ - либо игнорируешь - а засирать форум можно и без знания Delphi.
С другой стороны форум называется "Начинающим". Поэтому все хамство засовывается за воротник и опять таки - либо спокойно объясняешь - либо игнорируешь. А болтать на тему, которая не интересует автора - в курилку.
>это форум и никто никому ничего не обязан, никто не получает за ответы на форумах деньги, тратит только свое личное время
Нет времени и желания не отвечай. А то как-то не совпадает...: на грубости и всякую муть с синдромом пенсионного учителя время есть - а ответить на проблему времени нет.
Из 29 постов 4-ре по теме - остальные с ярлыком "у нас нет времени говорить о деле - мы поговорим о том, как недосягаемо умны, а ты туп как пробка. И вообще нам денег никто не платит - поэтому обсирать или не обсирать - это наше дело".
← →
Anatoly Podgoretsky © (2006-11-14 11:45) [31]Кто то путает форумы со службами поддержки.
И кто то не желает, обсуждать, ему наверно легче обвинить в этом форумчан, ну так не позволим это делать, иди в службу поддержки.
Страницы: 1 вся ветка
Текущий архив: 2006.12.03;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.038 c