Netsis Tarih Filtreleri SQL: STHAR_TARIH ile Dönemsel Raporlar
Netsis veritabanında STHAR_TARIH ve TBLCAHAR.TARIH ile bu ay, geçen ay, YTD dönemsel rapor sorguları. Doğru >= ve < tarih filtreleme kalıpları.
Erp Asistanı
Editör ekibi
6 dk okuma
İçindekiler
Netsis veritabanında SQL ile dönemsel rapor hazırlarken en sık karşılaşılan sorunlar, saat bilgisi içeren kayıtların filtreden kaçması veya fonksiyon kullanımı yüzünden sorguların yavaşlamasıdır. TBLSTHAR tablosundaki STHAR_TARIH ve TBLCAHAR tablosundaki TARIH alanları datetime tipinde tutulur. Bu rehberde, Netsis raporlarında veri kaybını önleyen >= ve < filtreleme desenini, "bu ay", "geçen ay", "yılbaşından bugüne (YTD)" gibi hazır SQL kalıplarını ve VADE_TARIHI üzerindeki NULL kontrolü mantığını inceliyoruz. Netsis veri mimarisi hakkında genel bir bakış için Netsis tablo yapısı rehberi yazımıza göz atabilirsiniz.
1. Neden BETWEEN Değil de >= ve < Deseni?
T-SQL'de datetime kolonları hem tarih hem de saat/dakika/saniye verisi saklar. Netsis standart fatura girişlerinde saati 00:00:00.000 olarak kaydetse de entegrasyonlar, kasa hareketleri veya özel modül kayıtları gün içi saat bilgisi barındırabilir.
STHAR_TARIH BETWEEN '20260501' AND '20260531' filtresi kullandığınızda, SQL Server bitiş değerini örtük olarak '2026-05-31 00:00:00.000' kabul eder. Dolayısıyla 31 Mayıs günü saat 15:30'da işlenen bir satış faturası bu aralığın dışında kalır.
En sağlıklı yöntem, dönemin başlangıcını >= ile dahil edip, bir sonraki dönemin ilk gününü < ile dışarıda bırakmaktır:
-- 2026 Mayıs ayı satış hareketleri (Kayıp kayıt olmadan)
SELECT
STOK_KODU,
SUM(STHAR_GCMIK) AS ToplamMiktar,
SUM(STHAR_GCMIK * STHAR_NF) AS ToplamNetTutar
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
AND STHAR_FTIRSIP IN ('1', '3')
AND SUBE_KODU = 0
AND STHAR_TARIH >= '20260501'
AND STHAR_TARIH < '20260601'
GROUP BY STOK_KODU;
2. Netsis'te Temel Tarih Kolonları
Netsis hareket tablolarında tarih kolonlarının adlandırılması ve taşıdığı veri tipleri farklılık gösterebilir:
| Tablo | Tarih Kolonu | Veri Tipi | Modül / Anlamı | Dikkat Edilecek Nokta |
|---|---|---|---|---|
TBLSTHAR |
STHAR_TARIH |
datetime |
Stok Hareketi / Fatura Kalemi | Hareket yönü STHAR_GCKOD ile birlikte filtrelenmelidir. |
TBLFATUIRS |
TARIH |
datetime |
Fatura ve İrsaliye Başlığı | Kalem-başlık tarihleri entegrasyon durumuna göre farklılık gösterebilir. |
TBLCAHAR |
TARIH |
datetime |
Cari Hesap Hareketi | Evrak işlem tarihidir. |
TBLCAHAR |
VADE_TARIHI |
datetime |
Cari Vade Tarihi | Nakit/açılış kayıtlarında NULL kalabilir. |
TBLSIPAMAS |
TARIH |
datetime |
Sipariş Başlığı | Sipariş onay ve giriş tarihi. |
TBLSIPATRA |
STHAR_TARIH |
datetime |
Sipariş Kalemi | Kalem teslim tarihi. |
3. Dinamik Tarih Kalıpları (Bu Ay, Geçen Ay, YTD)
Raporlarınızı her ay manuel tarih yazmadan otomatikleştirmek için SQL Server tarih fonksiyonlarını (DATEFROMPARTS, DATEADD, DATEDIFF) kullanabilirsiniz. Stok hareketlerinin detayları için Netsis stok hareketleri SQL rehberi yazımızı inceleyebilirsiniz.
Bu Ayın Net Satış Raporu
İçinde bulunulan ayın ilk gününden sonraki ayın ilk gününe kadar olan hareketleri listeler:
SELECT
STOK_KODU,
SUM(STHAR_GCMIK) AS SatisMiktari,
SUM(STHAR_GCMIK * STHAR_NF) AS NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
AND STHAR_FTIRSIP IN ('1', '3')
AND SUBE_KODU = 0
AND STHAR_TARIH >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
AND STHAR_TARIH < DATEADD(month, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1))
GROUP BY STOK_KODU
ORDER BY NetCiro DESC;
Geçen Ayın Satış Raporu
Geçmiş ayın başlangıç ve bitişini DATEDIFF kullanarak dinamik olarak hesaplar:
SELECT
STOK_KODU,
SUM(STHAR_GCMIK) AS SatisMiktari,
SUM(STHAR_GCMIK * STHAR_NF) AS NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
AND STHAR_FTIRSIP IN ('1', '3')
AND SUBE_KODU = 0
AND STHAR_TARIH >= DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 1, 0)
AND STHAR_TARIH < DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
GROUP BY STOK_KODU
ORDER BY NetCiro DESC;
Yılbaşından Bugüne (YTD) Satış Özeti
Mevcut yılın 1 Ocak tarihinden bugünün sonuna kadar olan verileri çeker:
SELECT
STOK_KODU,
SUM(STHAR_GCMIK) AS YTD_Miktar,
SUM(STHAR_GCMIK * STHAR_NF) AS YTD_NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
AND STHAR_FTIRSIP IN ('1', '3')
AND SUBE_KODU = 0
AND STHAR_TARIH >= DATEFROMPARTS(YEAR(GETDATE()), 1, 1)
AND STHAR_TARIH < DATEADD(day, 1, CAST(GETDATE() AS DATE))
GROUP BY STOK_KODU
ORDER BY YTD_NetCiro DESC;
4. TBLCAHAR ve VADE_TARIHI'nde NULL Kontrolü
Cari yaşlandırma ve vadesi geçen bakiye analizlerinde TBLCAHAR.VADE_TARIHI kolonu kullanılır. Ancak devir fişleri (HAREKET_TURU = 'A') veya doğrudan kasadan girilen hareketlerde VADE_TARIHI alanı NULL gelebilir. Filtrelerinizde ISNULL(VADE_TARIHI, TARIH) kontrolü yapmazsanız bu kayıtlar analiz dışı kalır.
Cari borç ve alacak takibi ile ilgili ayrıntılı sorgular için Netsis cari ekstre ve bakiye SQL içeriğimizden faydalanabilirsiniz.
-- Vadesi geçmiş açık bakiye analizi (NULL vade kontrolüyle)
SELECT
CARI_KOD,
SUM(BORC) AS ToplamBorc,
SUM(ALACAK) AS ToplamAlacak,
SUM(BORC - ALACAK) AS Bakiye,
SUM(CASE
WHEN ISNULL(VADE_TARIHI, TARIH) < CAST(GETDATE() AS DATE)
THEN (BORC - ALACAK)
ELSE 0
END) AS VadesiGecenBakiye
FROM TBLCAHAR
WHERE SUBE_KODU = 0
GROUP BY CARI_KOD
HAVING SUM(BORC - ALACAK) <> 0
ORDER BY VadesiGecenBakiye DESC;
5. Son 30 Gün Günlük Satış Trendi
Belirli bir hareket trendini gün bazında özetlemek için tarih kolonunu DATE tipine dönüştürerek gruplayabilirsiniz:
SELECT
CAST(STHAR_TARIH AS DATE) AS IslemTarihi,
COUNT(DISTINCT FISNO) AS FaturaSayisi,
SUM(STHAR_GCMIK) AS ToplamMiktar,
SUM(STHAR_GCMIK * STHAR_NF) AS ToplamCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
AND STHAR_FTIRSIP IN ('1', '3')
AND SUBE_KODU = 0
AND STHAR_TARIH >= DATEADD(day, -30, CAST(GETDATE() AS DATE))
AND STHAR_TARIH < DATEADD(day, 1, CAST(GETDATE() AS DATE))
GROUP BY CAST(STHAR_TARIH AS DATE)
ORDER BY IslemTarihi DESC;
Sık yapılan hatalar
- BETWEEN Kullanımı:
BETWEENkullanıldığında bitiş günündeki saat/dakika içeren kayıtların rapora dahil edilmemesi. - Kolon Üzerinde Fonksiyon Çalıştırma:
WHERE YEAR(STHAR_TARIH) = 2026şeklinde yazılan filtrelerin indeksi devre dışı bırakması (Index Scan / Table Scan) ve sorguyu yavaşlatması. - VADE_TARIHI NULL Kontrolünün Atlanması: Cari yaşlandırma raporlarında
ISNULL(VADE_TARIHI, TARIH)kontrolü yapılmadığı için devir ve kasa fişlerinin vadesiz kabul edilip dışlanması. - Belge Tipi Filtresinin Unutulması:
TBLSTHARtablosundaSTHAR_FTIRSIPveyaSTHAR_GCKODfiltresi verilmeden tarih filtresi yazıldığında alışların, iadelerin ve transferlerin ciroya karışması. - SUBE_KODU Ayrımının Yapılmaması: Tek şubeli veritabanlarında dahi
SUBE_KODUfiltresinin sorguya eklenmemesi nedeniyle indeks performansının düşmesi.
Sık sorulanlar
STHAR_TARIH yerine TBLFATUIRS.TARIH kullanmak fark yaratır mı? Kalem bazında ürün, miktar ve net tutar analizleri TBLSTHAR tablosunda tutulduğu için STHAR_TARIH kullanmak sorguyu ek bir JOIN işleminden kurtarır ve performansı artırır.
Tarih fonksiyonları (DATEFROMPARTS vb.) sorguyu yavaşlatır mı? Hayır. Bu fonksiyonlar WHERE koşulunun sağ tarafında yer aldığı sürece sorgu derlenirken bir kez hesaplanır ve STHAR_TARIH indekslerinin doğrudan kullanılmasına olanak tanır.
TBLCAHAR tablosundaki BAKIYE kolonu dönemsel filtrede kullanılabilir mi? Hayır. TBLCAHAR.BAKIYE o satır anındaki yürüyen bakiyeyi gösterir. Dönemsel net değişim veya bakiye için daima SUM(BORC) - SUM(ALACAK) formülü hesaplanmalıdır.
Dönemsel satış, stok devir hızı ve cari vade raporlarınızı hazırlarken SQL sözdizimiyle ve tarih kaçırma problemleriyle vakit kaybetmek zorunda değilsiniz. Erp Asistanı'na firmanızın veritabanını güvenle bağlayabilir, dilediğiniz raporu Türkçe konuşarak anında alabilirsiniz.
Netsis'te SQL ve raporu konuşarak 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. Kredi kartı gerekmez.