Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.068 c
15-1163658844
Andy BitOff
2006-11-16 09:34
2006.12.03
Физики объясните.


2-1163451529
HRust
2006-11-13 23:58
2006.12.03
Веб приложение


15-1163042679
Optim
2006-11-09 06:24
2006.12.03
Существуют ли программы оптимизации исходного паскалевского кода?


15-1163348628
Михель
2006-11-12 19:23
2006.12.03
Не могу починить DMClient, заглючил и не лечится...


2-1163766009
Grant
2006-11-17 15:20
2006.12.03
ODBC