Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.27;
Скачать: CL | DM;

Вниз

Указать позицию для записи таблицы БД   Найти похожие ветки 

 
Chuck Bass   (2012-01-20 11:17) [0]

Есть таблица Documents(ID[AutoInc], Name[FixedChar], .., Order[Integer]).
Поле Order определяет позицию записи при отображении. Нужно написать функцию которая бы позволяла менять позицию записи. Как это лучше реализовать?


 
Anatoly Podgoretsky ©   (2012-01-20 13:15) [1]

> Chuck Bass  (20.01.2012 11:17:00)  [0]

А что значит менять позицию?


 
Ega23 ©   (2012-01-20 13:31) [2]

Есть запись A, есть запись B. Надо поменять их местами.
Update table set Order = A.Order where ID=B.ID;
Update table set Order = B.Order where ID=A.ID;
RefreshData;


 
Chuck Bass   (2012-01-20 13:33) [3]


> Ega23 ©


Спасибо


 
Самуилыч   (2012-01-20 16:53) [4]

Как быть, если на поле Order наложено требование уникальности?


 
Ega23 ©   (2012-01-20 18:05) [5]


> Как быть, если на поле Order наложено требование уникальности?


Зависит от СУБД. Например, завести сиквенс и при добавлении новой записи вставлять очередное значение.


 
Самуилыч   (2012-01-20 18:23) [6]


> Ega23 ©   (20.01.12 18:05) [5]

При insert все очевидно, а как поменять местами order в 2-х записях?

Решение "в лоб" тоже очевидно:

Запоминаем order в записях 1 и 2
В записи 1 ставим новый order
В записи 2 ставим запомненный order записи 1
В записи 1 ставим запомненный order записи 2

Но как-то это некрасиво. Неужели нет более элегантного способа?


 
Ega23 ©   (2012-01-20 21:10) [7]


> При insert все очевидно, а как поменять местами order в
> 2-х записях?


2 команды Update, это очевидно.


> Неужели нет более элегантного способа?


ИМХО, это наиболее элегантный.


 
sniknik ©   (2012-01-20 22:16) [8]

> наложено требование уникальности?
MSSQL
UPDATE table
SET Order=t2.Order
FROM table t1 INNER JOIN (SELECT Order FROM table WHERE Order IN (2, 3)) t2 ON (t1.Order<>t2.Order)
WHERE t1.Order IN (2, 3)


 
sniknik ©   (2012-01-21 00:08) [9]

или проще, на том же MSSQL  
UPDATE table
SET Order=CASE WHEN Order=2 THEN 3 ELSE 2 END
WHERE Order IN (2,3)


 
Самуилыч   (2012-01-21 13:07) [10]


> Ega23 ©   (20.01.12 21:10) [7]

Если order уникально, то первая update даст ошибку.

> sniknik ©   (21.01.12 00:08) [9]

Это если order заранее известен. А если нет?

Вот есть 2 записи:

ID ORDER
3  6
4  7  

ID - ключ. ORDER - уникально. Как поменять местами ORDER, если заранее его значения неизвестны?


 
sniknik ©   (2012-01-21 13:24) [11]

что то обязательно известно, либо ORDER либо ID, иначе, что менять? не известно одно, строй условие по другому, принцип не меняется.


 
sniknik ©   (2012-01-21 13:31) [12]

например, вариант 3
UPDATE table
SET Order=(SELECT Order FROM table t1 WHERE ID IN (2, 3) AND t1.ID<>table.ID)
WHERE ID IN (2, 3)


 
Самуилыч   (2012-01-21 14:39) [13]


> sniknik ©   (21.01.12 13:31) [12]

Спасибо. Это надо запомнить.


 
Ega23 ©   (2012-01-22 23:40) [14]

Блин. Ведь раньше делал эту фигню.
Действительно просто
update ttt
  set OrderFld = case Order Fld when N then M when M then N end
  where OrderFld in (N, M)



Страницы: 1 вся ветка

Текущий архив: 2012.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
2-1322651304
i2e
2011-11-30 15:08
2012.05.27
Поток и общие флаги


15-1326918603
Юрий
2012-01-19 00:30
2012.05.27
С днем рождения ! 19 января 2012 четверг


15-1326069104
Кто б сомневался
2012-01-09 04:31
2012.05.27
Google голосовой движок


1-1292333775
jiny007
2010-12-14 16:36
2012.05.27
Проблема с запуском TFrxPreview из FastReport


2-1327425569
sem
2012-01-24 21:19
2012.05.27
Вызов процедуры