ERP Asistanı Dal Net
Netsis SQL

Netsis Faturalaşmamış İrsaliye SQL: Açık Sevkiyat Mutabakatı

Netsis'te faturalaşmamış irsaliyeleri TBLSTHAR ve TBLFATUIRS üzerinden FTIRSIP filtresiyle bulun. Açık sevkiyat mutabakatı için çalışan T-SQL sorguları.

Erp Asistanı Erp Asistanı Editör ekibi 7 dk okuma
Netsis Faturalaşmamış İrsaliye SQL: Açık Sevkiyat Mutabakatı

Netsis'te sevk irsaliyesi kesildiği anda stok çıkar, ama fatura henüz kesilmediyse iş açık sevkiyat olarak bekler. Bu bekleme; depo sayımını, cari mutabakatını ve KDV dönemini doğrudan etkiler. Bu yazıda faturalanmamış irsaliyeleri TBLFATUIRS (başlık) ve TBLSTHAR (kalem) üzerinden bulan, cari ve stok bazında özetleyen T-SQL sorgularını veriyoruz. Belge mimarisine hâkim değilseniz önce Netsis tablo yapısı rehberine göz atın; kalem tarafının detayı için Netsis stok hareketleri SQL yazısı tamamlayıcıdır.

Tüm örneklerde SUBE_KODU = 0 filtresi vardır. Tek şubeli kurulumda değer genelde 0, çok şubeli kurulumda her şube kendi kodunu yazmalıdır.

Faturalanmamış irsaliyeyi ne belirler?

En sık yapılan yanlış, irsaliye satırında boş bir fatura numarası arayan kolon varsaymaktır. Netsis'te faturalanma durumu ayrı bir bağlantı kolonu değil, belge tipinde kodlanır. Hem başlıkta (TBLFATUIRS.FTIRSIP) hem kalemde (TBLSTHAR.STHAR_FTIRSIP) aynı bilgi tutulur ve ikisi tutarlı olmalıdır.

FTIRSIP / STHAR_FTIRSIP Belge Durum
'3' Satış irsaliyesi Faturalanmamış (açık sevkiyat)
'4' Alış irsaliyesi Faturalanmamış
'A' Satış irsaliyesi Faturalanmış
'B' Alış irsaliyesi Faturalanmış
'1' Satış faturası Fatura
'2' Alış faturası Fatura

Yani faturalaşmamış irsaliye sorgusunun çekirdeği FTIRSIP = '3' (satış) ve FTIRSIP = '4' (alış) filtresidir. Evrak faturalandığı anda irsaliye başlığı A veya B değerine geçer; böylece aynı sevkiyatı iki kez saymazsınız.

1. Açık satış irsaliyeleri (başlık listesi)

Başlık tablosu tek başına evrak listesi verir: hangi cariye, hangi tarihte, ne kadar tutarla sevk yapılmış?

SELECT f.FATIRS_NO, f.TARIH, f.CARI_KODU, c.CARI_ISIM, f.GENELTOPLAM
FROM TBLFATUIRS f
LEFT JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP = '3'
  AND f.SUBE_KODU = 0
ORDER BY f.TARIH, f.FATIRS_NO;

Bu raporu SQL yazmadan, Türkçe sorarak alın: Netsis raporlama

GENELTOPLAM başlıktaki net ödenecek tutardır. Kalem bazlı doğrulama için bir sonraki sorguya geçin.

2. İrsaliye kalemleri ve satır tutarı

Netsis satır tutarını saklamaz, hesaplarsınız: STHAR_GCMIK * STHAR_NF. Başlık-kalem bağlantısı FISNO = FATIRS_NO iledir; ancak FATIRS_NO şubeler arasında tekrar edebileceği için join'e SUBE_KODU ve STHAR_FTIRSIP şartını da ekleyin.

SELECT f.FATIRS_NO, f.TARIH, f.CARI_KODU,
       h.STOK_KODU, h.DEPO_KODU,
       h.STHAR_GCMIK, h.STHAR_NF,
       h.STHAR_GCMIK * h.STHAR_NF AS SatirTutari
FROM TBLFATUIRS f
JOIN TBLSTHAR h
  ON h.FISNO = f.FATIRS_NO
 AND h.SUBE_KODU = f.SUBE_KODU
 AND h.STHAR_FTIRSIP = f.FTIRSIP
WHERE f.FTIRSIP = '3'
  AND f.SUBE_KODU = 0
  AND h.STHAR_GCKOD = 'C'
ORDER BY f.TARIH, f.FATIRS_NO, h.STOK_KODU;

STHAR_GCKOD = 'C' şartı çıkış satırlarını alır; iade veya düzeltme girişleri toplamı bozmasın diye bu şartı kaldırmayın.

3. Cari bazında açık sevkiyat mutabakatı

Müşteriye şu kadar sevk var, faturası kesilmedi demek için cari kırılımında hem tutarı hem bekleyen günü çıkarın.

SELECT f.CARI_KODU, c.CARI_ISIM,
       COUNT(DISTINCT f.FATIRS_NO) AS IrsaliyeAdedi,
       SUM(h.STHAR_GCMIK * h.STHAR_NF) AS AcikTutar,
       MIN(f.TARIH) AS EnEskiTarih,
       DATEDIFF(DAY, MIN(f.TARIH), GETDATE()) AS EnEskiGun
FROM TBLFATUIRS f
JOIN TBLSTHAR h
  ON h.FISNO = f.FATIRS_NO
 AND h.SUBE_KODU = f.SUBE_KODU
 AND h.STHAR_FTIRSIP = f.FTIRSIP
LEFT JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP = '3'
  AND f.SUBE_KODU = 0
  AND h.STHAR_GCKOD = 'C'
GROUP BY f.CARI_KODU, c.CARI_ISIM
ORDER BY AcikTutar DESC;

TARIH bir datetime kolonudur; DATEDIFF ve GETDATE() ile güvenle kullanılır. SUBE_KODU gibi sayısal kolonları tarih fonksiyonuna sokmayın, örtük dönüşüm 8115 taşması üretir.

4. Yaş kovaları: açık sevkiyat ne kadardır?

Yönetim raporu için açık sevkiyatı yaşa bölmek en pratik özettir.

SELECT
  SUM(CASE WHEN DATEDIFF(DAY, f.TARIH, GETDATE()) <= 7
           THEN h.STHAR_GCMIK * h.STHAR_NF ELSE 0 END) AS [0-7 Gün],
  SUM(CASE WHEN DATEDIFF(DAY, f.TARIH, GETDATE()) BETWEEN 8 AND 30
           THEN h.STHAR_GCMIK * h.STHAR_NF ELSE 0 END) AS [8-30 Gün],
  SUM(CASE WHEN DATEDIFF(DAY, f.TARIH, GETDATE()) > 30
           THEN h.STHAR_GCMIK * h.STHAR_NF ELSE 0 END) AS [31+ Gün]
FROM TBLFATUIRS f
JOIN TBLSTHAR h
  ON h.FISNO = f.FATIRS_NO
 AND h.SUBE_KODU = f.SUBE_KODU
 AND h.STHAR_FTIRSIP = f.FTIRSIP
WHERE f.FTIRSIP = '3'
  AND f.SUBE_KODU = 0
  AND h.STHAR_GCKOD = 'C';

5. Alış tarafı: faturalanmamış alış irsaliyeleri

Tedarikçiden mal geldi, irsaliye işlendi, fatura henüz girmedi. Bu taraf FTIRSIP = '4' ile bulunur.

SELECT f.FATIRS_NO, f.TARIH, f.CARI_KODU, c.CARI_ISIM,
       f.GENELTOPLAM,
       DATEDIFF(DAY, f.TARIH, GETDATE()) AS BekleyenGun
FROM TBLFATUIRS f
LEFT JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP = '4'
  AND f.SUBE_KODU = 0
ORDER BY BekleyenGun DESC;

6. Faturalanma durumu dağılımı (kontrol sorgusu)

Mutabakata başlamadan önce belge tipi dağılımına bakmak, filtrenin doğru çalıştığını gösterir.

SELECT FTIRSIP,
       CASE FTIRSIP
         WHEN '3' THEN 'Faturalanmamış Satış İrsaliyesi'
         WHEN '4' THEN 'Faturalanmamış Alış İrsaliyesi'
         WHEN 'A' THEN 'Faturalanmış Satış İrsaliyesi'
         WHEN 'B' THEN 'Faturalanmış Alış İrsaliyesi'
       END AS Durum,
       COUNT(*) AS Adet,
       SUM(GENELTOPLAM) AS ToplamTutar
FROM TBLFATUIRS
WHERE FTIRSIP IN ('3','4','A','B')
  AND SUBE_KODU = 0
GROUP BY FTIRSIP
ORDER BY FTIRSIP;

7. Stok bazında açık sevkiyat

Hangi ürün sevk edildi de faturası kesilmedi sorusu, depo sayımı öncesi kritiktir.

SELECT h.STOK_KODU, st.STOK_ADI,
       SUM(h.STHAR_GCMIK) AS AcikMiktar,
       SUM(h.STHAR_GCMIK * h.STHAR_NF) AS AcikTutar
FROM TBLSTHAR h
JOIN TBLFATUIRS f
  ON f.FATIRS_NO = h.FISNO
 AND f.SUBE_KODU = h.SUBE_KODU
 AND f.FTIRSIP = h.STHAR_FTIRSIP
JOIN TBLSTSABIT st ON st.STOK_KODU = h.STOK_KODU
WHERE h.STHAR_FTIRSIP = '3'
  AND h.STHAR_GCKOD = 'C'
  AND h.SUBE_KODU = 0
GROUP BY h.STOK_KODU, st.STOK_ADI
ORDER BY AcikTutar DESC;

Sık yapılan hatalar

  • FTIRSIP filtresini hiç koymamak: satış, alış, transfer ve faturalanmış irsaliyeler tek listede karışır.
  • Kalem tarafında STHAR_FTIRSIP ile başlıktaki FTIRSIP değerini teyit etmemek: A ve B (faturalanmış irsaliye) satırları açık sevkiyat sanılır.
  • Başlık-kalem join'ini yalnız FISNO = FATIRS_NO üzerinden kurmak: SUBE_KODU ve belge tipi şartı eklenmezse yanlış evrakla eşleşme olur.
  • Satırda hazır bir tutar kolonu aramak: tutar STHAR_GCMIK * STHAR_NF ile hesaplanır, ayrı bir tutar kolonu yoktur.
  • STHAR_GCKOD filtresini unutmak: iade ve giriş satırları toplamı şişirir.
  • SUBE_KODU filtresini atlamak: çok şubeli kurulumda tüm şubelerin sevkiyatı tek rakama düşer.
  • Sipariş kalemlerini TBLSTHAR'da aramak: sipariş kalemleri TBLSIPATRA'dadır.
  • SUBE_KODU gibi sayısal bir kolonu tarih fonksiyonuna sokmak: örtük dönüşüm hatası (8115) alırsınız.
  • YEDEK kolonlarını rapora katmak: bu alanlar rezervedir, anlam taşımaz.

Sık sorulanlar

Faturalanmamış irsaliyeyi kalem tablosundan mı, başlıktan mı bulmalıyım? Evrak listesi ve tutar için başlık (TBLFATUIRS), stok ve depo kırılımı için kalem (TBLSTHAR) doğru adrestir. İkisini FISNO = FATIRS_NO + SUBE_KODU + belge tipi ile bağlayın.

Faturalanmış irsaliyeleri neden ayrı filtreliyorum? Çünkü faturalanan irsaliyenin belge tipi A veya B olur. FTIRSIP IN ('3','4') dediğinizde yalnız gerçekten açık olan sevkiyatlar kalır, çift sayım olmaz.

Sorgu çok yavaş çalışıyor, ne yapabilirim? Tarih aralığı ekleyin (f.TARIH >= '20260101'), SUBE_KODU filtresini koruyun ve GROUP BY içinde yalnız gerekli kolonları tutun.

Türkçe karakterli cari kodu aramasında kayıt kaçırıyorum, çözümü ne? Doğrudan eşitlik yerine dbo.TRK(CARI_KOD) COLLATE Latin1_General_CI_AI = dbo.TRK(@kod) kalıbını kullanın.


Faturalaşmamış irsaliye raporu, ay sonu mutabakatının en hızlı aracıdır; ama her kurulumun şube, depo ve belge tipi alışkanlığı farklıdır. Aynı mantığı kendi şemanıza uyarlamak için sorguyu doğal dille yazmanız yeterli.

Ücretsiz üye olun, kendi Netsis şemanıza uygun SQL'i saniyeler içinde alın →

Bu yazıyı paylaş
Netsis raporlama

Bu raporu SQL yazmadan, Türkçe sorarak alın

Türkçe sorunuzu yazın, şemanıza uygun çalışan SQL'i ya da hazır uygulamanızı saniyeler içinde alın.