ERP Asistanı Dal Net
Netsis SQL

Netsis BA-BS Formu SQL Sorgusu ve Aylık Limit Kontrolü

TBLFATUIRS ve TBLCASABIT ile cari VKN bazında KDV hariç alış ve satış toplamlarını çıkaran, BA-BS haddini aşanları listeleyen hazır T-SQL sorguları.

Erp Asistanı Erp Asistanı Editör ekibi 10 dk okuma
Netsis BA-BS Formu SQL Sorgusu ve Aylık Limit Kontrolü

Netsis kullanan firmalarda BA-BS formu hâlâ çoğu zaman Excel'de hazırlanıyor: muhasebe fatura listesini dışa aktarıyor, cari bazında topluyor, KDV'yi ayıklıyor, haddin altında kalanları siliyor. Oysa bu işin tamamı iki tabloda bitiyor: TBLFATUIRS (fatura/irsaliye başlığı) ve TBLCASABIT (cari kartı). Bu yazıda cari VKN bazında KDV hariç alış ve satış toplamlarını çıkaran, BA-BS haddini aşanları listeleyen hazır T-SQL sorgularını veriyorum. Tablo mantığına hâkim değilseniz önce Netsis tablo yapısı rehberine göz atın.

Had tutarı her yıl tebliğle değişir; aşağıdaki sorgularda 5000 örnek değerdir, kendi döneminizin güncel haddini yazın.

Önce yön: başlıkta GCKOD yok, FTIRSIP var

BA-BS'de iki taraf vardır: alış (A formu) ve satış (B formu). Netsis'te stok yönünü kalem tablosundaki STHAR_GCKOD verir (G giriş, C çıkış). Ama fatura başlığı TBLFATUIRS içinde GCKOD diye bir kolon yoktur; orada yön FTIRSIP ile kodlanır:

  • FTIRSIP = '1' satış faturası (B formu tarafı)
  • FTIRSIP = '2' alış faturası (A formu tarafı)

Sadece bu iki değeri almak da yetmez. TBLFATUIRS aynı zamanda irsaliyeleri taşır: '3' ve '4' faturalanmamış irsaliye, 'A' ve 'B' faturalanmış irsaliye, '8' transfer. FTIRSIP IN ('1','2') filtresi olmadan çalışan bir BA-BS sorgusu, faturalanmış irsaliyeleri ikinci kez sayar ve tutarları yukarı şişirir. Kalem bazında çalışacaksanız TBLSTHAR'a inip STHAR_GCKOD ile teyit edin; başlık toplamı için FTIRSIP yeterlidir.

İhtiyaç Doğru alan Sık yapılan yanlış
Alış/satış yönü TBLFATUIRS.FTIRSIP ('1' / '2') Başlıkta GCKOD aramak
KDV hariç tutar KDV_DAHILMI durumuna göre GENELTOPLAM - KDV Doğrudan GENELTOPLAM toplamak
Cari eşleşmesi f.CARI_KODU = c.CARI_KOD VKN'yi faturadan okumaya çalışmak
Bildirim birimi TBLCASABIT.VERGI_NUMARASI CARI_KOD bazında gruplamak
Dönem f.TARIH (datetime) Yıl/ay int kolonu aramak

Matrah: KDV hariç tutar nasıl bulunur

TBLFATUIRS içinde üç tutar alanı vardır: BRUTTUTAR (iskonto ve KDV öncesi), KDV ve GENELTOPLAM (net ödenecek). KDV_DAHILMI alanı E ise GENELTOPLAM KDV içeriyordur ve matrah GENELTOPLAM - KDV olur. H ise GENELTOPLAM zaten KDV hariçtir. BA-BS haddi bu KDV hariç tutara uygulanır, bu yüzden her sorguda aynı CASE kalıbını kullanacağız.

1. Satış tarafı: B formu adayları

Aşağıdaki sorgu dönem içindeki satış faturalarını cari VKN bazında toplar ve haddi aşanları getirir.

SELECT
    c.VERGI_NUMARASI AS VKN,
    c.CARI_ISIM AS Unvan,
    COUNT(*) AS FaturaAdedi,
    SUM(CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV
             ELSE f.GENELTOPLAM END) AS KdvHaricTutar
FROM TBLFATUIRS f
INNER JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP = '1'
  AND f.TARIH >= '20260101' AND f.TARIH < '20260201'
  AND f.SUBE_KODU = 0
GROUP BY c.VERGI_NUMARASI, c.CARI_ISIM
HAVING SUM(CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV
                ELSE f.GENELTOPLAM END) >= 5000
ORDER BY KdvHaricTutar DESC;

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

SUBE_KODU = 0 satırını kendi kurulumunuza göre değiştirin; çok şubeli yapıda şube kodlarını IN (...) ile verin.

2. Alış ve satışı tek tabloda görmek

A ve B formunu ayrı ayrı çalıştırmak yerine tek geçişte üretmek daha pratiktir. Koşullu toplam ile iki tarafı yan yana getiriyoruz.

SELECT
    c.VERGI_NUMARASI AS VKN,
    MAX(c.CARI_ISIM) AS Unvan,
    SUM(CASE WHEN f.FTIRSIP = '2'
             THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
             ELSE 0 END) AS AlisKdvHaric,
    SUM(CASE WHEN f.FTIRSIP = '1'
             THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
             ELSE 0 END) AS SatisKdvHaric
FROM TBLFATUIRS f
INNER JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP IN ('1','2')
  AND f.TARIH >= '20260101' AND f.TARIH < '20260201'
  AND f.SUBE_KODU = 0
  AND c.VERGI_NUMARASI IS NOT NULL
  AND LTRIM(RTRIM(c.VERGI_NUMARASI)) <> ''
GROUP BY c.VERGI_NUMARASI
HAVING SUM(CASE WHEN f.FTIRSIP = '2'
                THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
                ELSE 0 END) >= 5000
    OR SUM(CASE WHEN f.FTIRSIP = '1'
                THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
                ELSE 0 END) >= 5000
ORDER BY SatisKdvHaric DESC;

GROUP BY cari koda göre değil VKN'ye göredir. Sebebi bir sonraki bölümde.

3. Aynı VKN, birden fazla cari kart

BA-BS bildirimi cari koduna göre değil vergi numarasına göre yapılır. Netsis'te aynı firmanın iki ayrı cari kartı açılmış olabilir (örneğin eski ve yeni kod, ya da şube ayrımı). CARI_KOD bazında gruplayan bir sorgu bu tutarları iki satırda gösterir ve iki satır da haddin altında kalıp gerçekte bildirilmesi gereken tutarı gözden kaçırtır. Bu yüzden GROUP BY c.VERGI_NUMARASI şart. Unvan için MAX(c.CARI_ISIM) yeterlidir; resmî unvanı bildirimde ayrıca teyit edin.

Hangi carilerin aynı VKN'yi paylaştığını görmek için:

SELECT VERGI_NUMARASI, COUNT(*) AS CariAdedi,
       MIN(CARI_KOD) AS IlkCari, MAX(CARI_KOD) AS SonCari
FROM TBLCASABIT
WHERE VERGI_NUMARASI IS NOT NULL
  AND LTRIM(RTRIM(VERGI_NUMARASI)) <> ''
GROUP BY VERGI_NUMARASI
HAVING COUNT(*) > 1
ORDER BY CariAdedi DESC;

4. İade faturaları tutarı ters çevirir

İade faturası TIPI = 4 ile işaretlenir ve BA-BS tarafında bildirilen tutarı azaltır. İadeyi görmezden gelen sorgu, müşteriyi olduğundan büyük gösterir; haddin altında olması gereken bir cari listede kalabilir.

SELECT
    c.VERGI_NUMARASI AS VKN,
    MAX(c.CARI_ISIM) AS Unvan,
    SUM(CASE WHEN f.TIPI = 4 THEN -1 ELSE 1 END *
        CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV
             ELSE f.GENELTOPLAM END) AS NetKdvHaric
FROM TBLFATUIRS f
INNER JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP = '1'
  AND f.TARIH >= '20260101' AND f.TARIH < '20260201'
  AND f.SUBE_KODU = 0
GROUP BY c.VERGI_NUMARASI
HAVING SUM(CASE WHEN f.TIPI = 4 THEN -1 ELSE 1 END *
           CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV
                ELSE f.GENELTOPLAM END) >= 5000
ORDER BY NetKdvHaric DESC;

Aynı mantığı alış tarafı için f.FTIRSIP = '2' yaparak kullanın.

5. VKN'si boş veya hatalı cariler

Bildirimin en can sıkıcı kısmı, vergi numarası eksik cariye kesilmiş faturadır; tutar doğru hesaplanır ama bildirilecek VKN yoktur. Aşağıdaki kontrol listesi bu faturaları ayıklar. Türkiye'de VKN 10, TCKN 11 hanedir; bu ikisinin dışındaki uzunluk şüphelidir.

SELECT f.FTIRSIP, f.FATIRS_NO, f.TARIH, f.CARI_KODU,
       c.CARI_ISIM, c.VERGI_NUMARASI, f.GENELTOPLAM
FROM TBLFATUIRS f
LEFT JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP IN ('1','2')
  AND f.TARIH >= '20260101' AND f.TARIH < '20260201'
  AND f.SUBE_KODU = 0
  AND (c.VERGI_NUMARASI IS NULL
       OR LTRIM(RTRIM(c.VERGI_NUMARASI)) = ''
       OR LEN(LTRIM(RTRIM(c.VERGI_NUMARASI))) NOT IN (10, 11))
ORDER BY f.TARIH DESC;

6. Yıl boyunca aylık limit kontrolü

Ay kapandıktan sonra tek ayı kontrol etmek yetmez; hangi ay hangi cari haddi aştı, önceden görmek gerekir. Aşağıdaki sorgu yılın tamamını ay kırılımında tarar.

SELECT
    c.VERGI_NUMARASI AS VKN,
    YEAR(f.TARIH) AS Yil,
    MONTH(f.TARIH) AS Ay,
    SUM(CASE WHEN f.FTIRSIP = '1'
             THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
             ELSE 0 END) AS SatisKdvHaric,
    SUM(CASE WHEN f.FTIRSIP = '2'
             THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
             ELSE 0 END) AS AlisKdvHaric
FROM TBLFATUIRS f
INNER JOIN TBLCASABIT c ON c.CARI_KOD = f.CARI_KODU
WHERE f.FTIRSIP IN ('1','2')
  AND f.TARIH >= '20260101' AND f.TARIH < '20270101'
  AND f.SUBE_KODU = 0
GROUP BY c.VERGI_NUMARASI, YEAR(f.TARIH), MONTH(f.TARIH)
HAVING SUM(CASE WHEN f.FTIRSIP = '1'
                THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
                ELSE 0 END) >= 5000
    OR SUM(CASE WHEN f.FTIRSIP = '2'
                THEN CASE WHEN f.KDV_DAHILMI = 'E' THEN f.GENELTOPLAM - f.KDV ELSE f.GENELTOPLAM END
                ELSE 0 END) >= 5000
ORDER BY Yil, Ay, SatisKdvHaric DESC;

Ellerinde hazır Netsis sorgusu arayanlar için Netsis hazır SQL sorguları ve cari tarafındaki hareketler için cari ekstre ve bakiye SQL rehberi iyi bir devam noktasıdır.

Sık yapılan hatalar

  • TBLFATUIRS içinde GCKOD aramak; başlıkta yön FTIRSIP ile belirlenir, GCKOD yalnızca kalem tablosunda STHAR_GCKOD olarak vardır.
  • FTIRSIP filtresi koymamak; faturalanmış irsaliyeler (A, B) ikinci kez sayılır ve tutar şişer.
  • KDV dahil GENELTOPLAM alanını doğrudan matrah saymak; KDV_DAHILMI = 'E' ise KDV düşülmelidir.
  • CARI_KOD bazında gruplamak; aynı VKN'ye bağlı iki cari kart tutarı böler ve haddi gizler.
  • İade faturalarını (TIPI = 4) düşmemek; bildirilen tutar olduğundan yüksek çıkar.
  • SUBE_KODU filtresini atlamak; çok şubeli kurulumda tek şubenin rakamı tüm şirket gibi görünür.
  • Tarih filtresini int kolona uygulamaya çalışmak; TARIH datetime'dır, >= '20260101' AND < '20260201' kalıbını kullanın.
  • VKN uzunluğunu kontrol etmemek; 10/11 hane dışındaki değerler bildirimde reddedilir.

Sık sorulanlar

BA-BS haddi KDV hariç tutara mı uygulanır? Evet, bildirim KDV hariç tutar üzerinden yapılır. Bu yüzden GENELTOPLAM yerine KDV_DAHILMI durumuna göre hesaplanan matrahı kullanın.

Aynı müşterinin iki cari kartı varsa ne yapmalıyım? Sorguyu CARI_KOD yerine VERGI_NUMARASI bazında gruplayın. Aksi hâlde iki kart iki ayrı satır olur ve ikisi de haddin altında görünebilir.

Hizmet faturaları bu listeye girer mi? Giren de vardır; ayrım HIZMET_FAT alanıyla yapılır ve hizmette stok kalemi olmayabilir. Kalem bazında kontrol gerekiyorsa TBLSTHAR tarafına inin.

Dövizli fatura nasıl toplanır? DOVIZTIP ve DOVIZTUT döviz tarafını tutar; bildirim TL tutarıyla yapıldığı için fatura başlığındaki yerel tutarları kullanın ve döviz tipinin kuruluma özel olduğunu unutmayın.


Bu sorgular BA-BS hazırlığının büyük kısmını bitirir; geriye dönem seçimi ve had güncellemesi kalır. Erp Asistanı'na ücretsiz üye olun, kendi Netsis şemanıza uygun sorguyu Türkçe tarif ederek saniyeler içinde alın.

Ücretsiz üye olun, BA-BS sorgunuzu doğal dille üretin →

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.