Хранимая процедура upDBTreeMoveNode   

   Процедура помещает заданный узел перед указанным,если @AsChild=0.
   Если @AsChild<>0, то узел добавляется в список дочерних узлов к указанному последним.
   Перед перемещением производится проверка на наличие заданных узлов.А также проверка на то, что перемещаемый узел не является родителем для целевого узла.

CREATE PROCEDURE [upDBTreeMoveNode]
   @idDBTree INT,
   @idDNode INT,
   @idSNode INT,
   @AsChild INT=0
AS
   IF @idDNode=@idSNode
       RETURN 0
   
   DECLARE @ErMsg VARCHAR(255)
   DECLARE @Error INT
   SET @Error=0

   IF NOT Exists(SELECT * FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idDNode) BEGIN
         SET @ErMsg='Нет перемещаемого узла '+convert(varchar(10),@idDNode)
         RAISERROR (@ErMsg,16,1)
         RETURN 1
   END
   IF @@ERROR<>0 SET @Error=@@ERROR
   IF NOT Exists(SELECT * FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idSNode) BEGIN
        SET @ErMsg='Нет конечного узла '+convert(varchar(10),@idSNode)
        RAISERROR (@ErMsg,16,1)
        RETURN 2
   END
   IF @@ERROR<>0 SET @Error=@@ERROR

   DECLARE @idDPrior int,@idDNext int,@idDParent int,@idDFirstChild int
   DECLARE @idSPrior int,@idSNext int,@idSParent int

   SELECT @idDPrior=idPrior,@idDNext=idNext,@idDParent=idParent,@idDFirstChild=idFirstChild  FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idDNode
   IF @@ERROR<>0 SET @Error=@@ERROR
   SELECT @idSPrior=idPrior,@idSNext=idNext,@idSParent=idParent FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idSNode
   IF @@ERROR<>0 SET @Error=@@ERROR

   IF @AsChild<>0 OR @idSNext IS NULL OR @idSNext<>@idDNode BEGIN --если надо что-то делать
          -- проверка,что перемещаемый узел не является родителем для целевого узла
          DECLARE @idParent INT
          SET @idParent=@idDParent
          WHILE @idParent IS NOT NULL AND @idParent<>@idSNode BEGIN
                SELECT @idParent=idParent FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idParent
                IF @@ERROR<>0 SET @Error=@@ERROR
          END
          IF @idParent IS NOT NULL BEGIN
                RAISERROR ('Исходный узел является предком целевого узла',16,1)
                RETURN 3  
          END
          --перемещение узла
          BEGIN TRAN
          --убираем со старого места
          DECLARE @CanMove INT
          EXEC @CanMove=upDBTreeRemoveNode @idDBTree,@idSNode
          IF @@ERROR<>0 SET @Error=@@ERROR
          IF @CanMove=0 BEGIN -- ставим на новое место
                IF @AsChild=0 -- Перед целевым узлом
                 BEGIN
                       IF @idDPrior IS NULL 
                         BEGIN 
                              UPDATE DBTree SET idFirstChild=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDParent
                              IF @@ERROR<>0 SET @Error=@@ERROR
                         END
                       ELSE BEGIN
                            UPDATE DBTree SET idNext=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDPrior
                            IF @@ERROR<>0 SET @Error=@@ERROR
                       END 
                       UPDATE DBTree SET idPrior=@idDPrior,idNext=@idDNode,idParent=@idDParent WHERE idDBTree=@idDBTree AND idNode=@idSNode
                       IF @@ERROR<>0 SET @Error=@@ERROR
                       UPDATE DBTree  SET idPrior=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDNode          
                       IF @@ERROR<>0 SET @Error=@@ERROR
                 END
               ELSE BEGIN -- Последним в списке вложенных в целевой
                     IF @idDFirstChild IS NOT NULL
                       BEGIN
                            -- Поиск последнего
                            DECLARE @idNode INT,@idNext INT
                            SET @idNode=@idDFirstChild
                            SELECT @idNext=idNext FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idNode
                            IF @@ERROR<>0 SET @Error=@@ERROR
                            WHILE @idNext IS NOT NULL BEGIN
                                  SET @idNode=@idNext 
                                  SELECT @idNext=idNext FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idNode
                                  IF @@ERROR<>0 SET @Error=@@ERROR
                            END
                            -- Добавление 
                            UPDATE DBTree SET idNext=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idNode
                            IF @@ERROR<>0 SET @Error=@@ERROR
                            UPDATE DBTree SET idPrior=@idNode,idNext=NULL,idParent=@idDNode WHERE idDBTree=@idDBTree AND idNode=@idSNode
                            IF @@ERROR<>0 SET @Error=@@ERROR
                       END
                     ELSE BEGIN
                           UPDATE DBTree SET idFirstChild=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDNode
                           IF @@ERROR<>0 SET @Error=@@ERROR
                           UPDATE DBTree SET idPrior=NULL,idNext=NULL,idParent=@idDNode WHERE idDBTree=@idDBTree AND idNode=@idSNode
                           IF @@ERROR<>0 SET @Error=@@ERROR
                     END 
               END 
               IF @Error=0
                      COMMIT TRAN
               ELSE BEGIN
                    ROLLBACK TRAN
                    RETURN 1
               END 
          END ELSE BEGIN
                ROLLBACK TRAN
                RETURN 2
          END
   END


Сайт управляется системой uCoz