Как сделать сортировку дерева с Drag-and-Drop

Пример дерева с возможностью сортировки

Вы можете использовать для этого специальное поле формы вида treeOrder (Сортировка дерева).

В процедуре dict для данного столбца прописываем элементы дерева: 

CREATE PROCEDURE [dbo].[fm_tst-form-order_f2_dict]
   @username nvarchar(256), 
   @itemID nvarchar(128) 
AS
BEGIN
	select c.id Value,     -- id
		c.name as Text,    
		isnull(c.parentID, 0) Value2  -- parentID
    from tst_categories c	
    order by ord, id
END

Прописываем процедуру saveField

CREATE PROCEDURE [dbo].[fm_tst-form-order_saveEditableField]
    @pk nvarchar(128),	    -- id for item
	@fieldCode nvarchar(64),    -- form field
	@value nvarchar(max),	  -- field value
	@username nvarchar(256)  -- current user
AS
BEGIN

if(@fieldCode='f2') begin
	declare @formItemID  nvarchar(128) = '', @elementID int = 0, @parentId  int = 0, @ord int =0, @temp nvarchar(256)='', @index int
	
    set @elementID = try_cast(dbo.str_splitPart(@value, ',',1) as int)
    set @temp = dbo.str_splitPart(@value,',',2)
    
    set @parentId = try_cast(dbo.str_splitPart(@temp, ',',1) as int)
    set @ord = try_cast(dbo.str_splitPart(@temp, ',',2) as int)
    
	set @temp = cast(@parentId + @ord + @elementID as nvarchar)
	exec as_print @str  = @temp
    
	update tst_categories 
    set parentID = nullif(@parentId, 0), ord = @ord
    where id = @elementID	
    
    
    declare @t table(id int,  ord int) 
    insert into @t
    select id, ord from tst_categories 
    where  isnull(parentID, 0) = @parentId  and id <>@elementID
    order by ord,id
    
    set @index = 0
    -- обновляем порядок у предыдущих (всех у кого номер меньше)
    while (@index <@ord-1) begin 
    	update tst_categories 
    	set  ord = @index+1
    	where id in (select id from @t 
                order by ord,id
                OFFSET @index ROWS
				FETCH NEXT 1 ROWS ONLY
                )
    	set @index = @index + 1    
    end
   

    set @index = @ord
	declare @count int = (select count(id) from tst_categories 
                 where isnull(parentID, 0) = @parentId ) 
    -- элементы после текущего 
    while (@index <@count) begin 
    	update tst_categories 
    	set  ord = @index+1+10000
    	where id in (select id from @t
                 order by ord,id
                OFFSET @index-1 ROWS
				FETCH NEXT 1 ROWS ONLY
                ) and id <>@elementID
    	set @index = @index + 1    
    end
    
	
    select 1 Result, '' Msg 
	return
end 

select 0 Result, 'Не найден код сущности' Msg 

END

--admin 04.11.2020 10:52:48

Примечание: 

  • лучше придерживаться такого порядка обработки в сохранении сортировки (а также сортировать по 2 полям - ord, id). 

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

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

Falcon Space

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

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

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

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

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

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

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