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ı
Editör ekibi
10 dk okuma
İçindekiler
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
TBLFATUIRSiçindeGCKODaramak; başlıkta yönFTIRSIPile belirlenir,GCKODyalnızca kalem tablosundaSTHAR_GCKODolarak vardır.FTIRSIPfiltresi koymamak; faturalanmış irsaliyeler (A,B) ikinci kez sayılır ve tutar şişer.- KDV dahil
GENELTOPLAMalanını doğrudan matrah saymak;KDV_DAHILMI = 'E'iseKDVdüşülmelidir. CARI_KODbazı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_KODUfiltresini atlamak; çok şubeli kurulumda tek şubenin rakamı tüm şirket gibi görünür.- Tarih filtresini int kolona uygulamaya çalışmak;
TARIHdatetime'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.
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.




