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