1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| ALTER PROCEDURE PsManageWBS
@_wbs VARCHAR(40)
AS
BEGIN
SET NOCOUNT ON
IF EXISTS
(
SELECT *
FROM dbo.TbWBS
WHERE LEN(WBS) = LEN(@_wbs) + 2
AND WBS LIKE @_wbs + '.%'
)
BEGIN
DECLARE @newWBS VARCHAR(40)
SELECT @newWBS = CAST(MAX(CAST(RIGHT(WBS, CHARINDEX('.', REVERSE(WBS)) - 1) AS TINYINT)) + 1 AS VARCHAR(40))
FROM dbo.TbWBS
WHERE LEN(WBS) >= LEN(@_wbs) + 2
AND WBS LIKE @_wbs + '.%'
SELECT @newWBS
-- Recherche s'il existe des valeurs dans la plage du WBS qui ne sont pas contigües
-- et récupère le plus petit WBS consécutif à la plus petite valeur existante pour ce WBS
DECLARE @jeton VARCHAR(40)
;WITH
CTE_TROU AS
(
SELECT CAST(@_wbs + '.' + @newWBS AS VARCHAR(MAX)) AS wbs,
CAST(@newWBS AS TINYINT) AS indice
UNION ALL
SELECT @_wbs + '.' + CAST(indice - 1 AS VARCHAR(MAX)),
CAST(indice - 1 AS TINYINT)
FROM CTE_TROU
WHERE indice > 1 -- Pas de 1.0 ?
)
SELECT TOP 1 @jeton = CTE_TROU.wbs
FROM CTE_TROU
LEFT JOIN dbo.TbWBS AS WBS
ON WBS.WBS = CTE_TROU.wbs
WHERE WBS.WBS IS NULL
ORDER BY CTE_TROU.indice
IF @jeton IS NULL
BEGIN
INSERT INTO dbo.TbWBS
(
WBS
)
SELECT @_wbs + '.' + @newWBS
END
ELSE
BEGIN
INSERT INTO dbo.TbWBS
(
WBS
)
SELECT @jeton
END
END
ELSE
BEGIN
IF EXISTS
(
SELECT *
FROM dbo.TbWBS
WHERE WBS = @_wbs
)
BEGIN
INSERT INTO dbo.TbWBS
(
WBS
)
SELECT @_wbs + '.1'
END
ELSE
BEGIN
INSERT INTO dbo.TbWBS
(
WBS
)
SELECT @_wbs
END
END
END |