Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

Передвижение записей "вверх" и "вниз". Способ реализации...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.127 c
15-1163590192
Click
2006-11-15 14:29
2006.12.03
Снова вопрос "организации алгоритма"


15-1163071039
SpellCaster
2006-11-09 14:17
2006.12.03
Посоветуйте DVD-RW


6-1152688945
Elen
2006-07-12 11:22
2006.12.03
Пинг компа


1-1161243455
pyJIoH
2006-10-19 11:37
2006.12.03
Выгрузка данных в XML. Создание файла TFileStream ом.


15-1163203226
Германн
2006-11-11 03:00
2006.12.03
Общество защиты от животных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский