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

Чтобы включить сортировку строк необходимо в 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

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK