Сортировка строк в таблице

Чтобы включить сортировку строк необходимо в SELECT 3 в GetItems установить Sortable=1, а также прописать процедуру UpdateField. 

При завершении перетаскивания строки в процедуру приходит pk, равный itemID таблицы, field = 'sortable', value содержит id строк через запятую. 

Пример процедуры updateField: 

CREATE PROCEDURE [dbo].[crud_watch_sortableTable_updateField]
	@itemID int,
	@field nvarchar(64),
	@value nvarchar(max),
	@username nvarchar(64)
AS
BEGIN
if(@field = 'sortable') begin
	-- pk - table itemID
    -- value -  comma separated rowIDs

    declare @t table(id int, num int)

    insert into @t
    select  try_cast(Value as int), num
    from dbo.split(@value, ',')
    where isnull(Value, '')<>''
	-- get minimal ord value
    declare @minOrd int
    set @minOrd = isnull((select min(ord) from tst_customers where id in (select id from @t)) , 0)
	-- change ord column
    update tst_customers
    set ord = @minOrd  + isnull( (select top 1 num-1 from @t where id =tst_customers.id ), 0)
    where id in (select id from @t)

    select 'OK' Msg, 1 Result


end else begin
	select 'Невалидный код свойства' Msg, 0 Result
	return
end
select '' Msg, 1 Result

END

Примечание: 

Если вы хотите, чтобы строку можно было перетаскивать только за определенный элемент на строке, то назначьте ему класс as-table-sortHandle. Если такого элемента нет, то строку можно перетаскивать за любой ее участок. 

Лучше поставить pageSize большим - 100, 150. В сортировке участвуют только элементы на текущей странице (только у них обновится поле ord), поэтому сортировка будет некорректно работать в случае если элементов больше чем есть на 1 странице вывода. 

Для указанной реализации сортировки нужна функция dbo.split, возвращающая 2 столбца (num и value): 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[split] ( @stringToSplit NVARCHAR(MAX), @char NVarCHAR)
RETURNS
 @returnList TABLE ([value] [nvarchar] (max), num int)
AS
BEGIN

Declare  @r1 TABLE ([value] [nvarchar] (max), num int)

 DECLARE @name NVARCHAR(max)
 DECLARE @pos INT
 declare  @index int = 1

 WHILE CHARINDEX(@char, @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(@char, @stringToSplit)
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @r1
  SELECT @name, @index

  set @index = @index  + 1

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @r1
 SELECT @stringToSplit, @index


 insert into @returnList
 select [Value], num from  @r1 order by num

 RETURN
END
Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки и узкого стека разработки. Про снижение стоимости владения продуктом

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK