sozsoft-platform/configs/seeds/sql/object/Adm_P_SequenceNext.sql

48 lines
3.1 KiB
MySQL
Raw Permalink Normal View History

2026-10-11 19:57:23 +00:00
-- 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