• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

SQL Server trigger ile INSERT işlemini rollback edip kullanıcıya mesaj göstermek (LOGO Tiger ERP crash oluyor)

Katılım
29 Ocak 2026
Mesajlar
1
Excel Vers. ve Dili
Office 365 - English
Merhaba,

LOGO Tiger ERP üzerinde SQL Server trigger kullanarak bir iş kuralı uygulamak istiyorum.

Senaryo şu:
Kullanıcı “Satış Siparişi → Faturala → F2 (Kaydet)” dediğinde, arka planda sırasıyla şu işlemler oluyor:

  1. INVOICE tablosuna INSERT
  2. STFICHE tablosuna INSERT
  3. STLINE tablosuna INSERT (asıl satırlar burada oluşuyor)

Benim amacım:

Fatura kaydedilirken bazı koşullara bakıp, ihlal varsa işlemi rollback edip kullanıcıya uyarı mesajı göstermek.
Bunu tamamen SQL tarafında, yani LOGO Object / SDK / uygulama kodu kullanmadan, sadece trigger ile yapmak istiyorum.
Durum

  • UPDATE trigger içinde RAISERROR / THROW kullandığımda:
    • LOGO ekranda mesajı düzgün gösteriyor
    • İşlem rollback oluyor
    • Program crash olmuyor → OK
  • INSERT trigger içinde aynı şeyi yaptığımda:
    • LOGO crash oluyor
    • OLE DB tarafında E_FAIL / Cursor Engine error geliyor
    • Uygulama kapanıyor

Özellikle:

  • “Satış siparişi → faturala” akışında STLINE üzerinde INSERT trigger tetiklenince crash oluyor.
  • Ama aynı kontrolü INVOICE AFTER UPDATE trigger’ında yaparsam bazen çalışıyor, bazen yine crash.


Örneğin:

SQL:
CREATE TRIGGER trg_test
ON STLINE
AFTER INSERT
AS
BEGIN
    IF EXISTS (SELECT 1 FROM inserted WHERE ...)
    BEGIN
        RAISERROR('Kural ihlali', 11, 1);
        -- veya THROW
    END
END
Bu yapı INSERT sırasında LOGO’yu patlatıyor.
Sorum

SQL Server tarafında:

  • INSERT trigger içinde işlemi durdurup kullanıcıya mesaj göstermek mümkün mü?
  • Bunu LOGO Objects kullanmadan, sadece SQL ile yapmanın bir yolu var mı? (Trigger veya farklı bir yöntem)

Asıl hedefim:

Kullanıcı F2 (Kaydet) dediği anda, ihlal varsa program patlamadan, temiz şekilde rollback + uyarı mesajı göstermek.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
43,558
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Merhaba,

Konu hakkında tecrübem yok.. Ama merak edip yapay zekaya danıştım. Gelen cevabı test etme şansımda yok. Siz denemeler yaparak sonuçları paylaşabilirsiniz.


1. INSTEAD OF INSERT Trigger Kullanımı (Önerilen)

SQL:
CREATE TRIGGER trg_STLINE_CheckRules
ON STLINE
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;
    
    -- Kontrollerinizi yapın
    IF EXISTS (
        SELECT 1
        FROM inserted i
        INNER JOIN STFICHE s ON i.STFICHEREF = s.LOGICALREF
        WHERE ... -- Koşullarınız
    )
    BEGIN
        -- LOGO'ya uygun hata mesajı formatı
        RAISERROR('XXXXX: Kural ihlali! Fatura kaydedilemez.', 16, 1);
        RETURN;
    END
    
    -- Kontrol geçildiyse normal INSERT işlemini gerçekleştir
    INSERT INTO STLINE (
        STOCKREF, STFICHEREF, AMOUNT, PRICE, ...
    )
    SELECT
        STOCKREF, STFICHEREF, AMOUNT, PRICE, ...
    FROM inserted;
END
2. Daha Güvenli Hata Yönetimi (TRY-CATCH ile)

SQL:
CREATE TRIGGER trg_STLINE_SafeCheck
ON STLINE
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    
    BEGIN TRY
        -- Sadece kontrol yap, hata fırlatma
        IF EXISTS (
            SELECT 1
            FROM inserted i
            WHERE ... -- Koşullar
        )
        BEGIN
            -- Transaction'ı rollback et
            IF @@TRANCOUNT > 0
                ROLLBACK TRANSACTION;
            
            -- LOGO'nun anlayabileceği formatta hata
            DECLARE @ErrorMessage NVARCHAR(4000) =
                'XXXXX: Kural ihlali tespit edildi. Kayıt yapılamaz.';
            
            -- LOGO'da daha stabil çalışan eski usül
            RAISERROR(@ErrorMessage, 16, 1) WITH NOWAIT;
            
            -- LOGYONETIM tablosuna hata kaydetme (opsiyonel)
            INSERT INTO LOGYONETIM (HATA, TARIH)
            VALUES (@ErrorMessage, GETDATE());
        END
    END TRY
    BEGIN CATCH
        -- Hata zaten fırlatıldı, ek işlem yapma
    END CATCH
END
3. LOGO'ya Özel Çözüm - Ön Kontrol Tablosu

SQL:
-- 1. Öncelikle bir kontrol tablosu oluşturun
CREATE TABLE FaturaKontrol (
    LOGICALREF INT IDENTITY(1,1),
    STFICHEREF INT,
    HataMesaji NVARCHAR(255),
    Tarih DATETIME DEFAULT GETDATE()
);

-- 2. BEFORE INSERT benzeri tetikleyici (STFICHE üzerinde)
CREATE TRIGGER trg_STFICHE_BeforeInsert
ON STFICHE
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;
    
    -- Fatura başlığı kaydedilirken kontrol et
    DECLARE @HataVar BIT = 0;
    DECLARE @HataMesaji NVARCHAR(255) = '';
    
    -- Burada STLINE henüz oluşmadığı için,
    -- başka bir yöntemle kontrol yapmanız gerekebilir
    
    -- Örnek: Müşteri bazlı kontrol
    IF EXISTS (
        SELECT 1
        FROM inserted i
        INNER JOIN CLCARD c ON i.CLIENTREF = c.LOGICALREF
        WHERE c.KODU = 'YASAKLI_MUSTERI'
    )
    BEGIN
        SET @HataVar = 1;
        SET @HataMesaji = 'Bu müşteri için fatura kesilemez';
    END
    
    -- Hata varsa
    IF @HataVar = 1
    BEGIN
        -- Hata kaydı oluştur
        INSERT INTO FaturaKontrol (STFICHEREF, HataMesaji)
        SELECT LOGICALREF, @HataMesaji FROM inserted;
        
        -- LOGO'nun transaction'ı rollback edeceği bilinen hata kodu
        RAISERROR('BİP0001: %s', 16, 1, @HataMesaji);
    END
END
4. En İyi Pratik - INVOICE Tablosunda Kontrol

SQL:
-- LOGO'nun daha stabil çalıştığı INVOICE tablosunda kontrol
CREATE TRIGGER trg_INVOICE_CheckRules
ON INVOICE
AFTER INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @STFICHEREF INT;
    
    -- Yeni kayıtlardan STFICHE referansını al
    SELECT @STFICHEREF = DATA2
    FROM inserted
    WHERE INVOTYPE = 1; -- Satış faturası tipi
    
    IF @STFICHEREF IS NOT NULL
    BEGIN
        -- STLINE kayıtlarını kontrol et
        IF EXISTS (
            SELECT 1
            FROM STLINE
            WHERE STFICHEREF = @STFICHEREF
            AND ... -- Koşullarınız
        )
        BEGIN
            -- LOGO'ya uyumlu hata formatı
            -- "BİP" veya "LOGO" ile başlayan hata kodları daha stabil
            RAISERROR('LOGO001: Fatura kaydında kural ihlali tespit edildi.
                     Lütfen satır kalemlerini kontrol edin.', 16, 1);
        END
    END
END

Önemli Tavsiyeler:
  1. Hata Mesajı Formatı: LOGO, belirli formatlardaki hata mesajlarını daha iyi işliyor:
    "XXXXX: Mesaj içeriği" veya "BİP0001: Mesaj içeriği"
  2. Transaction Yönetimi: Trigger içinde ROLLBACK yapmaktan kaçının, bunun yerine hata fırlatın ve LOGO'nun transaction'ı yönetmesine izin verin.
  3. Test Sıralaması:
    • Önce INVOICE tablosunda AFTER UPDATE trigger ile test edin
    • Sonra STFICHE tablosunda deneyin
    • STLINE tablosunda INSTEAD OF trigger en son çare olarak kullanın
  4. LOGO Versiyonu: LOGO Tiger'ın versiyonuna göre davranış değişebilir. En güncel versiyonu kullanın.
  5. Alternatif Yöntem: Eğer SQL trigger ile çözüm bulamazsanız, LOGO Object veya SDK kullanmanız gerekebilir, bu durumda:
    • FaturaBeforePost event'ını kullanabilirsiniz
    • Custom business rule yazabilirsiniz
En stabil çözüm genellikle INVOICE tablosunda AFTER UPDATE trigger kullanmak oluyor, çünkü LOGO bu aşamada transaction'ı daha güvenli yönetiyor.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,398
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Delphi tarafında transaction başlatıldığında sıranın başındaki tablo ile, sıranın en sonundaki tabloya insert trigger modifiyesinin farkı yok.

Ancak her üç tablonun insert trigger'ların kaynak kodunu okuyarak transaction'ı etkileyebilecek kod satırlarının olup olmadığını kontrol etmek gerek; ki olduğunu sanmıyorum. Ayrıca, aynı transaction içersinde örneğin bir SP çağrısı yapıyor olabilir. LOGO'nun komutları server objesi değil de, teker teker geleneksel göndermek gibi pis bir huyu var.

Şahsi fikrim; Delphi tarafında try-catch bloğunun her durumu kurtaracak şekilde yazılmadığını düşünüyorum.

.
 
Üst