Это классическая проблема, и ответ прост: если вы хотите переместить элемент 3 в позицию 2, вы должны сначала изменить столбец сортировки 2 на временное число (например, 99). Так это выглядит так:
Move 2 to 99
Move 3 to 2
Move 99 to 3
Вы должны быть осторожны, однако, что ваше временное значение никогда не используется в обычной обработке и что вы уважаете несколько потоков, если это применимо.
Обновление : Кстати - один из способов справиться с проблемой «несколько пользователей могут менять порядок» - это сделать то, что я делаю: дать каждому пользователю цифровой идентификатор, а затем добавить его к временному номеру (мой идентификатор персонала на самом деле является идентификатором поля «Уникальный идентификатор» из таблицы персонала, используемой для входа в систему). Так, например, если ваши позиции никогда не будут отрицательными, вы можете использовать -1000 - UserID в качестве временного значения. Но поверь мне в одном: ты не хочешь просто предположить, что у тебя никогда не будет столкновения. Если вы думаете, что один действительно произойдет, отладку будет крайне сложно!
Обновление : GUZ указывает, что его пользователи, возможно, переупорядочили весь набор позиций и представили их в виде пакета - это не просто переключение двух записей. Тогда вы можете подойти к этому одним из двух способов.
Во-первых, вы можете изменить существующие поля сортировки всего набора на новый набор не сталкивающихся значений (например, -100 - (staffID * maxSetSize) +istingOrderVal), а затем перейти к записи по записи и изменить каждую запись. на новую стоимость заказа.
Или вы можете по существу рассматривать его как пузырьковую сортировку в массиве, где значение orderVal является эквивалентом индекса вашего массива. Либо это имеет смысл для вас (и очевидно), либо вам следует придерживаться решения 1 (которое легче в любом случае).