Stok miktarların hesaplanması için SQL scripti

  1. Öncelikle triggerları kapatıp satış durdurulur.
    ALTER TRIGGER STOKMIKTAR_ANA_STOK_GUNCELLE INACTIVE
    ALTER TRIGGER STOKMIKTAR_UST_KONUM_GUNCELLE INACTIVE
    ALTER TRIGGER STOKMIKTAR_MIKTAR_GUNCELLE INACTIVE
  1. Script çalıştırılır
EXECUTE BLOCK
AS
DECLARE VARIABLE XSTOK_K INTEGER;
DECLARE VARIABLE XKONUM_K INTEGER;
DECLARE VARIABLE XUST_KONUM_K INTEGER;
DECLARE VARIABLE XGIRIS NUMERIC(15,4);
DECLARE VARIABLE XCIKIS NUMERIC(15,4);
DECLARE VARIABLE XBEKLEYENGIRIS NUMERIC(15,4);
DECLARE VARIABLE XBEKLEYENCIKIS NUMERIC(15,4);
BEGIN

    UPDATE STOKMIKTAR SET 
        GIRIS = 0, 
        CIKIS = 0, 
        BEKLEYENGIRIS = 0, 
        BEKLEYENCIKIS = 0, 
        MIKTAR = 0,
        BEKLEYENMIKTAR = 0,
        TOPLAMGIRIS = 0,
        TOPLAMCIKIS = 0,
        TOPLAMMIKTAR = 0;

    FOR 
        SELECT 
            VSBB.STOK_K,
            B.KONUM_K,
            SUM(CASE WHEN BT.STOKGIRIS = 1 AND B.BELGEDURUM_K = 2 THEN BD.BIRIMMIKTAR ELSE 0 END) AS GIRIS,
            SUM(CASE WHEN BT.STOKCIKIS = 1 AND B.BELGEDURUM_K = 2 THEN BD.BIRIMMIKTAR ELSE 0 END) AS CIKIS,
            SUM(CASE WHEN BT.STOKGIRIS = 1 AND B.BELGEDURUM_K = 4 THEN BD.BIRIMMIKTAR ELSE 0 END) AS BEK_GIRIS,
            SUM(CASE WHEN BT.STOKCIKIS = 1 AND B.BELGEDURUM_K = 4 THEN BD.BIRIMMIKTAR ELSE 0 END) AS BEK_CIKIS
        FROM BELGEDETAY BD
        JOIN BELGE B ON B.K = BD.BELGE_K
        JOIN BELGETUR BT ON BT.K = B.BELGETUR_K
        JOIN VSTOKBIRIMBARKOD VSBB ON VSBB.BARKOD=BD.BARKOD
        WHERE 
            COALESCE(B.ETKISIZ, 0) = 0 
            AND BD.IPTAL = 0 
            AND COALESCE(B.IRSALIYEDENHAZIRLANMIS, 0) = 0
            AND B.BELGEDURUM_K IN (2, 4)
            AND (BT.STOKGIRIS = 1 OR BT.STOKCIKIS = 1)
        GROUP BY VSBB.STOK_K, B.KONUM_K
        INTO :XSTOK_K, :XKONUM_K, :XGIRIS, :XCIKIS, :XBEKLEYENGIRIS, :XBEKLEYENCIKIS
    DO
    BEGIN
        -- Mevcut Konumu Güncelle
        IF (EXISTS(SELECT K FROM STOKMIKTAR WHERE STOK_K = :XSTOK_K AND KONUM_K = :XKONUM_K)) THEN
        BEGIN
            UPDATE STOKMIKTAR SET 
                GIRIS = :XGIRIS,
                CIKIS = :XCIKIS,
                MIKTAR = :XGIRIS - :XCIKIS,
                TOPLAMGIRIS = :XGIRIS,
                TOPLAMCIKIS = :XCIKIS,
                TOPLAMMIKTAR = :XGIRIS - :XCIKIS,
                BEKLEYENGIRIS = :XBEKLEYENGIRIS,
                BEKLEYENCIKIS = :XBEKLEYENCIKIS
            WHERE STOK_K = :XSTOK_K AND KONUM_K = :XKONUM_K;
        END
        ELSE
        BEGIN
             INSERT INTO STOKMIKTAR (
                 STOK_K, KONUM_K, 
                 GIRIS, CIKIS, MIKTAR, 
                 TOPLAMGIRIS, TOPLAMCIKIS, TOPLAMMIKTAR,
                 BEKLEYENGIRIS, BEKLEYENCIKIS, BEKLEYENMIKTAR,
                 ASGARIMIKTAR, AZAMIMIKTAR, ASGARININALTINDA
             )
             VALUES (
                 :XSTOK_K, :XKONUM_K, 
                 :XGIRIS, :XCIKIS, (:XGIRIS - :XCIKIS),
                 :XGIRIS, :XCIKIS, (:XGIRIS - :XCIKIS),
                 :XBEKLEYENGIRIS, :XBEKLEYENCIKIS, (:XBEKLEYENGIRIS - :XBEKLEYENCIKIS),
                 0, 0, 0
             );
        END

        -- Üst Konumları (Firma Dahil) Güncelle
        -- Şu anki konumun üstünü bul
        SELECT USTK FROM KONUM WHERE K = :XKONUM_K INTO :XUST_KONUM_K;

        WHILE (XUST_KONUM_K IS NOT NULL) DO
        BEGIN
             -- Üst konum (veya Firma) için kayıt var mı?
             IF (EXISTS(SELECT K FROM STOKMIKTAR WHERE STOK_K = :XSTOK_K AND KONUM_K = :XUST_KONUM_K)) THEN
             BEGIN
                 -- Varsa üzerine EKLE
                 UPDATE STOKMIKTAR SET
                     GIRIS = GIRIS + :XGIRIS,
                     CIKIS = CIKIS + :XCIKIS,
                     MIKTAR = MIKTAR + (:XGIRIS - :XCIKIS),
                     TOPLAMGIRIS = TOPLAMGIRIS + :XGIRIS,
                     TOPLAMCIKIS = TOPLAMCIKIS + :XCIKIS,
                     TOPLAMMIKTAR = TOPLAMMIKTAR + (:XGIRIS - :XCIKIS),
                     BEKLEYENGIRIS = BEKLEYENGIRIS + :XBEKLEYENGIRIS,
                     BEKLEYENCIKIS = BEKLEYENCIKIS + :XBEKLEYENCIKIS
                 WHERE STOK_K = :XSTOK_K AND KONUM_K = :XUST_KONUM_K;
             END
             ELSE
             BEGIN
                 -- Yoksa oluştur
                 INSERT INTO STOKMIKTAR (
                     STOK_K, KONUM_K, 
                     GIRIS, CIKIS, MIKTAR, 
                     TOPLAMGIRIS, TOPLAMCIKIS, TOPLAMMIKTAR,
                     BEKLEYENGIRIS, BEKLEYENCIKIS, BEKLEYENMIKTAR,
                     ASGARIMIKTAR, AZAMIMIKTAR, ASGARININALTINDA
                 )
                 VALUES (
                     :XSTOK_K, :XUST_KONUM_K, 
                     :XGIRIS, :XCIKIS, (:XGIRIS - :XCIKIS),
                     :XGIRIS, :XCIKIS, (:XGIRIS - :XCIKIS),
                     :XBEKLEYENGIRIS, :XBEKLEYENCIKIS, (:XBEKLEYENGIRIS - :XBEKLEYENCIKIS),
                     0, 0, 0
                 );
             END

             IF (XUST_KONUM_K = 1) THEN LEAVE;

             -- Bir üstteki konuma geç
             SELECT USTK FROM KONUM WHERE K = :XUST_KONUM_K INTO :XUST_KONUM_K;
        END
    END
END
  1. Triggerlar aktifleştirilir
    ALTER TRIGGER STOKMIKTAR_ANA_STOK_GUNCELLE ACTIVE
    ALTER TRIGGER STOKMIKTAR_UST_KONUM_GUNCELLE ACTIVE
    ALTER TRIGGER STOKMIKTAR_MIKTAR_GUNCELLE ACTIVE