sozsoft-platform/configs/seeds/sql/object/Adm_P_SequenceNext.sql
2026-10-11 22:57:23 +03:00

47 lines
3.1 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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