Как сделать сортировку дерева с 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

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