powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Организация очереди. FireBird.
22 сообщений из 22, страница 1 из 1
Организация очереди. FireBird.
    #32629883
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано:

- набор записей (ну, например, записи о заказах - табличка ORDERS), в записи есть поле - Priority - приоритет. Integer. Nullable.

Требуется:

- при изменении значения Priority последовательность значений должна изменятьс так, чтобы получалась цепочка из значений от 1 до N. То же самое - при удалении, об NULL -ении и при вводе значений <=0 или > Count(*) where Priority is not nill

Например, был набор записей:

Код: plaintext
1.
2.
3.
4.
5.
6.
Id Priority Name

 1    1         Первый
 2    2         Второй
 3   Null     Третий
 4    3         Четвертый
 5   Null     Пятый

Меняем значение Priority 3-й записи с Null на 2. Должно получиться:


Код: plaintext
1.
2.
3.
4.
5.
6.
Id Priority Name

 1    1         Первый
 2    3         Второй
 3    2         Третий
 4    4         Четвертый
 5   Null     Пятый

Как бы лучше реализовать?
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629902
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629908
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnmenПеред изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>


А если изменяемое значение, а не вставляемое?
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629941
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629944
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого
эээ...уууу... в спешке "прогнал"
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629945
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого

А когда коннектов/юзеров много? И когда не вставка - а изменение (т.е. перемещение, по сути)?
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629956
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого

что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
set generator priority_id to :current_priority;
for select id,priority 
     from _table_ 
     order by priority 
     into :id, :priority
do
     update _table_ set priority=gen_id(priority_id, 1 );
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629966
vis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mv JohnmenПеред изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>


А если изменяемое значение, а не вставляемое?

тогда, наверное будет
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority > _изменяяемое_значение_
:)
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32629968
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Генератор опасно. Юзеров много, данных много, выборки на самом деле сложные (и не очень быстрые), а эта собака генератор работает вне контекста транзакций.

2. А что по поводу не встаки, и перемещенияв очереди/изменения?
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32630113
doroshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если что-то типа такого сделать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
create procedure change_priority(id integer, priority integer)
as
declare variable old integer;
declare variable pr integer;
begin
   select priority from table_name where id=:id into :old;
   if old is null then begin
     UPDATE table_name SET Priority=Priority+ 1  
     WHERE Priority>=:priority
     exit;
   end
   if priority is null then begin
     UPDATE table_name SET Priority=Priority- 1  
     WHERE Priority>=:old
     exit;
   end
   if old<priority then begin
     for select priority from table_name 
          where priority between :old+ 1  and :priority+ 1 
          into :pr 
     do begin
       update table_name set priority=priority- 1  where priority=:pr
     end
     exit;
   end
   if old>priority then begin
     for select priority from table_name 
          where priority between :old and :priority
          into :pr 
     do begin
       update table_name set priority=priority+ 1  where priority=:pr
     end
     exit;
   end
end
Это чтоб по-быстрому сделать... Может как-то можно замутить с рекурсией. Но... Жарко, лень думать ;)
В приведенном тексте наверняка куча глюков. Но направление есть, если надо сам добъешь :)
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631428
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не думаю, что с рекурсией нужно.

Думаю, у тебя - примерно то, что нужно.

Спасибо.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631567
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mv
>А если изменяемое значение, а не вставляемое?
>Id Priority Name

1 1 Первый
2 3 Второй
3 2 Третий
4 4 Четвертый

Т.е. м.б. ситуация, когда Priority=2 меняем на Priority=7 или 1 ???
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631853
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, может.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631884
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда нужна полная логика поведения.
(Т.е. что произойдет с 7, если есть, что - с 2 и т.д.)
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631889
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если 2-й станет 7-м, то все, кто были ранее 3-м...7-м, станут 2-м ... 6-м соотвентственно, а все остальные не изменятся.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32631892
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и, естественно, 2-й все-таки станет 7-м.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32632625
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mv

Понятно. Имеем циклический сдвиг вперед или назад в заданном отрезке.
Вобщем
"вперед": N+(i+1-N) mod (M-N+1) здесь M меняем на N,
"назад": N+(i+M-N-N) mod (M-N+1) здесь N меняем на M,
везде M>=N.

Всё это можно реализовать одним запросом, если разрешить использовать CASE.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32632887
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним запросом?
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32633261
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Апдейт. А что такого ?
:)
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32633264
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, уж не знаю, как еще намекнуть, что не понимаю, как это сделать...
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32633437
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>mv

Заставляешь напрягаться старого больного человека ?
:)

Примерно так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
UPDATE Table SET Priority=
  CASE WHEN PriorityNew<PriorityOld 
       THEN PriorityNew+
         CASE WHEN Priority+ 1 -PriorityNew>=PriorityOld-PriorityNew+ 1  
              THEN Priority-PriorityOld
              ELSE Priority+ 1 -PriorityNew 
         END
       ELSE PriorityOld+
         CASE WHEN Priority+PriorityNew-PriorityOld-PriorityOld>=PriorityNew-PriorityOld+ 1 
              THEN Priority-PriorityOld- 1 
              ELSE Priority+PriorityNew-PriorityOld-PriorityOld 
         END
  END
WHERE 
  (Priority>=CASE WHEN PriorityNew<PriorityOld THEN PriorityNew ELSE PriorityOld END) AND 
  (Priority<=CASE WHEN PriorityNew<PriorityOld THEN PriorityOld ELSE PriorityNew END) 

Где PriorityOld заменяемое значение Priority на PriorityNew.
...
Рейтинг: 0 / 0
Организация очереди. FireBird.
    #32633468
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Век живи - век учись. Не приходило в голову, что Case можно напрямую в Update запросе юзать. Спасибо.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Организация очереди. FireBird.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]