Главная страница
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.5 MB
Время: 0.01 c
2-1327399849
sem
2012-01-24 14:10
2012.05.27
программное изменение регистра символа в RichEdit


9-1191912113
bioSerg
2007-10-09 10:41
2012.05.27
Возникла проблема с Direct3d на новых карточках ATI x2000


15-1326966363
palva
2012-01-19 13:46
2012.05.27
Современный Оруэлл


15-1326981019
asail
2012-01-19 17:50
2012.05.27
Microsoft Team Foundation Server MSSCCI Provider


15-1326734610
KilkennyCat
2012-01-16 21:23
2012.05.27
CSS ненужное смещение <p>, <ul> и т.д.