-- SQL tarafında açılan belgenin (yordamın ürettiği teklif, sipariş) numarasını numaratörden alır. -- Biçim ve sıfırlama kuralı Sequence.GetNextSequence ile birebir aynıdır; biri değişirse diğeri de değişir. CREATE OR ALTER PROCEDURE [dbo].[Adm_P_SequenceNext] @Name nvarchar(128), @TenantId uniqueidentifier, @Value nvarchar(128) OUTPUT AS BEGIN SET NOCOUNT ON; DECLARE @Id uniqueidentifier, @Reset int, @Period nvarchar(16), @Number bigint, @Step int, @Padding int, @Prefix nvarchar(64), @Suffix nvarchar(64), @Template nvarchar(256), @NumberText nvarchar(32), @Now datetime = GETDATE(), @Msg nvarchar(256); SELECT TOP 1 @Id = Id, @Reset = ResetPeriod FROM Adm_T_Sequence WITH (UPDLOCK, HOLDLOCK) WHERE Name = @Name AND IsActive = 1 AND IsDeleted = 0 AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)); IF @Id IS NULL BEGIN SET @Msg = CONCAT(N'Numaratör bulunamadı: ', @Name); THROW 50190, @Msg, 1; END SET @Period = CASE @Reset WHEN 1 THEN FORMAT(@Now, 'yyyy') WHEN 2 THEN FORMAT(@Now, 'yyyyMM') WHEN 3 THEN FORMAT(@Now, 'yyyyMMdd') WHEN 4 THEN FORMAT(@Now, 'yyyyMMddHH') WHEN 5 THEN FORMAT(@Now, 'yyyyMMddHHmm') END; SELECT @Number = CASE WHEN @Period IS NOT NULL AND ISNULL(LastPeriodKey, N'') <> @Period THEN StartNumber ELSE NextNumber END, @Step = IncrementStep, @Padding = PaddingSize, @Prefix = ISNULL(Prefix, N''), @Suffix = ISNULL(Suffix, N''), @Template = CASE WHEN LTRIM(ISNULL(FormatTemplate, N'')) = N'' THEN N'{Prefix}{Number}{Suffix}' ELSE FormatTemplate END FROM Adm_T_Sequence WHERE Id = @Id; UPDATE Adm_T_Sequence SET NextNumber = @Number + @Step, LastPeriodKey = ISNULL(@Period, LastPeriodKey) WHERE Id = @Id; SET @NumberText = CAST(@Number AS nvarchar(32)); IF LEN(@NumberText) < @Padding SET @NumberText = RIGHT(REPLICATE(N'0', @Padding) + @NumberText, @Padding); -- Belirteçler büyük/küçük harf duyarlıdır ({MM} ay, {mm} dakika). SET @Value = REPLACE(REPLACE(REPLACE(@Template COLLATE Latin1_General_BIN2, N'{Prefix}', @Prefix), N'{Suffix}', @Suffix), N'{Number}', @NumberText); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{yyyy}', FORMAT(@Now, 'yyyy')), N'{yy}', FORMAT(@Now, 'yy')); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{MM}', FORMAT(@Now, 'MM')), N'{M}', CAST(MONTH(@Now) AS nvarchar(2))); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{dd}', FORMAT(@Now, 'dd')), N'{d}', CAST(DAY(@Now) AS nvarchar(2))); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{HH}', FORMAT(@Now, 'HH')), N'{H}', CAST(DATEPART(hour, @Now) AS nvarchar(2))); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{mm}', FORMAT(@Now, 'mm')), N'{m}', CAST(DATEPART(minute, @Now) AS nvarchar(2))); SET @Value = REPLACE(REPLACE(@Value COLLATE Latin1_General_BIN2, N'{ss}', FORMAT(@Now, 'ss')), N'{s}', CAST(DATEPART(second, @Now) AS nvarchar(2))); END