Genel Bilgiler

SQL Server
Stored Procedure
✅ Etkilenmez
23.12.2025 07:15
23.12.2025 16:10

Notlar

Düzenle

Henüz not eklenmemiş.

+ Not ekle

İstatistikler

0
Kod Analizi
158
Satır
4
Kullandığı
0
Kullanan

Kullandığı Nesneler (4)

CALLS_SP
👁️ BARKOD
REFERENCES
REFERENCES
REFERENCES

Kullanan Nesneler (0)

Bu nesneyi kullanan yok

Bağımlılık Ağacı

Etki Ağacı

Bu nesneyi kullanan yok

Tam SQL Kodu

Düzenle

CREATE PROCEDURE [dbo].[sp_UpsertMalzemeBarkod]
    @pUrunKodu             NVARCHAR(50),
    @pFirmaAdi             VARCHAR(100) = NULL,
    @pWriteSonYuklenenler  BIT          = 1,
    @pCallLogo             BIT          = 1,
    @oUrunAnahtari         INT          OUTPUT,
    @oMalzemeBarkodu       NVARCHAR(50) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
        BEGIN TRAN;

        ------------------------------------------------------------
        -- 0) Uygulama kilidi (UNI üretimde yarislari engelle)
        ------------------------------------------------------------
        DECLARE @lockResult INT;
        EXEC @lockResult = sp_getapplock
            @Resource = N'sp_UpsertMalzemeBarkod_UNI_Gen',
            @LockMode = N'Exclusive',
            @LockOwner = N'Transaction';

        IF (@lockResult < 0)
        BEGIN
            RAISERROR(N'Uygulama kilidi alinamadi: sp_UpsertMalzemeBarkod_UNI_Gen', 16, 1);
            ROLLBACK TRAN;
            RETURN;
        END

        ------------------------------------------------------------
        -- 1) LOGO'da ürün durumu ve barkodunu oku
        ------------------------------------------------------------
        DECLARE @itemsBarcode NVARCHAR(50) = NULL,
                @itemExists   BIT         = 0;

        SELECT 
            @itemsBarcode = li.EXPCTGNO,
            @itemExists   = 1
        FROM dbo.LG_011_ITEMS AS li
        WHERE li.CODE = @pUrunKodu;

        ------------------------------------------------------------
        -- 2) Nihai barkodu belirle (@oMalzemeBarkodu)
        --    a) LOGO'dan barkod varsa onu kullan
        --    b) Yoksa UNI-xxxxx üret (MAX+1)
        ------------------------------------------------------------
        IF (@itemsBarcode IS NOT NULL AND LTRIM(RTRIM(@itemsBarcode)) <> '')
        BEGIN
            SET @oMalzemeBarkodu = @itemsBarcode;
        END
        ELSE
        BEGIN
            DECLARE @nextNo INT;
            SELECT @nextNo =
                ISNULL(MAX(CAST(SUBSTRING(mb.MalzemeBarkodu, 5, 5) AS INT)), 90000) + 1
            FROM dbo.MalzemeBarkodlari AS mb WITH (UPDLOCK, HOLDLOCK)
            WHERE mb.MalzemeBarkodu LIKE 'UNI-[0-9][0-9][0-9][0-9][0-9]';

            SET @oMalzemeBarkodu = 'UNI-' + RIGHT('00000' + CAST(@nextNo AS VARCHAR(5)), 5);
        END

        ------------------------------------------------------------
        -- 3) LOGO kaydini önce aç (istenirse) ? sonra MalzemeBarkodlari
        ------------------------------------------------------------
        IF (@pCallLogo = 1)
        BEGIN
            IF (@itemExists = 0)
            BEGIN
                -- Ürün yok: önce LOGO'da ürün + birim aç (EXPCTGNO = @oMalzemeBarkodu)
                EXEC dbo.sp_AddNewItemAndUnit
                     @pCode    = @pUrunKodu,
                     @pBarcode = @oMalzemeBarkodu;

                -- Yeniden oku (opsiyonel)
                SELECT @itemsBarcode = li.EXPCTGNO
                FROM dbo.LG_011_ITEMS AS li
                WHERE li.CODE = @pUrunKodu;
            END
            ELSE
            BEGIN
                -- Ürün var ama LOGO barkodu bossa EXPCTGNO'yu ayni barkodla doldur
                IF (@itemsBarcode IS NULL OR LTRIM(RTRIM(@itemsBarcode)) = '')
                BEGIN
                    UPDATE dbo.LG_011_ITEMS
                       SET EXPCTGNO = @oMalzemeBarkodu
                     WHERE CODE = @pUrunKodu
                       AND (EXPCTGNO IS NULL OR LTRIM(RTRIM(EXPCTGNO)) = '');
                END
            END
        END

        ------------------------------------------------------------
        -- 4) MalzemeBarkodlari upsert (LOGO islemlerinden SONRA)
        ------------------------------------------------------------
        DECLARE @exists INT = 0;
        SELECT @exists = 1
        FROM dbo.MalzemeBarkodlari WITH (UPDLOCK, HOLDLOCK)
        WHERE UrunKodu = @pUrunKodu;

        IF (@exists = 1)
        BEGIN
            -- Mevcut satiri oku
            SELECT @oUrunAnahtari = UrunAnahtari,
                   @oMalzemeBarkodu = COALESCE(MalzemeBarkodu, @oMalzemeBarkodu)
            FROM dbo.MalzemeBarkodlari
            WHERE UrunKodu = @pUrunKodu;

            -- Barkod bossa koy, doluysa sadece FirmaAdi güncelle
            IF (@oMalzemeBarkodu IS NULL OR LTRIM(RTRIM(@oMalzemeBarkodu)) = '')
            BEGIN
                UPDATE dbo.MalzemeBarkodlari
                   SET MalzemeBarkodu = @oMalzemeBarkodu,
                       FirmaAdi       = COALESCE(@pFirmaAdi, FirmaAdi)
                 WHERE UrunKodu = @pUrunKodu;
            END
            ELSE IF (@pFirmaAdi IS NOT NULL)
            BEGIN
                UPDATE dbo.MalzemeBarkodlari
                   SET FirmaAdi = @pFirmaAdi
                 WHERE UrunKodu = @pUrunKodu;
            END
        END
        ELSE
        BEGIN
            INSERT INTO dbo.MalzemeBarkodlari (UrunKodu, MalzemeBarkodu, Durum, FirmaAdi)
            VALUES (@pUrunKodu, @oMalzemeBarkodu, 1, @pFirmaAdi);

            SET @oUrunAnahtari = SCOPE_IDENTITY();
        END

        ------------------------------------------------------------
        -- 5) SON_YUKLENENLER (opsiyonel)
        ------------------------------------------------------------
        IF (@pWriteSonYuklenenler = 1)
        BEGIN
            INSERT INTO dbo.SON_YUKLENENLER (UrunKodu, FirmaAdi, MalzemeBarkodu)
            VALUES (@pUrunKodu,
                    CONVERT(NVARCHAR(100), @pFirmaAdi),    -- tablo NVARCHAR(100)
                    CONVERT(NVARCHAR(100), @oMalzemeBarkodu));
        END

        COMMIT TRAN;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN;

        DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE(),
                @ErrSeverity INT = ERROR_SEVERITY();

        IF (@ErrSeverity < 11) SET @ErrSeverity = 16;
        RAISERROR(@ErrMsg, @ErrSeverity, 1);
        RETURN;
    END CATCH
END

Kodun Çalışma Mantığı (Adım Adım)

Analiz Ekle/Düzenle

Henüz bu nesne için bir analiz girilmemiş.

İlk Analizi Ekle