İçeriğe geç
ERP Asistanı Dal Net
Mikro SQL

Mikro Depolar Arası Transfer Raporu SQL (sth_tip = 2)

Mikro'da depolar arası transferleri sth_tip = 2 ile listeleme, depo çifti bazında hacim ve depo bazlı net stokta transferin iki bacağını doğru sayma SQL sorguları.

Erp Asistanı Erp Asistanı Editör ekibi 7 dk okuma
Mikro Depolar Arası Transfer Raporu SQL (sth_tip = 2)

Mikro'da bir depodan diğerine yapılan mal aktarımı ayrı bir tabloda tutulmaz; tüm stok hareketlerinin yaşadığı STOK_HAREKETLERI tablosunda bir satırdır ve sth_tip = 2 ile işaretlenir. Yani "depolar arası transfer raporu" istediğinizde aslında tek bir filtre sorusu soruyorsunuz: sth_iptal = 0 AND sth_tip = 2.

Kolay görünür ama iki tuzağı var. Birincisi, transfer satırı iki depoya birden dokunur: mal sth_cikis_depo_no deposundan çıkar, sth_giris_depo_no deposuna girer. İkincisi, şirket geneli düşünüldüğünde transfer stoğu değiştirmez, sadece yerini değiştirir. Bu iki noktayı karıştırırsanız depo bazlı stok ya iki katına çıkar ya da yarıya iner. Tablo ilişkilerine hâkim değilseniz önce Mikro tablo yapısı rehberine göz atın.

Transfer satırında hangi kolonlar işe yarar

Kolon Tip Transferdeki anlamı
sth_tip tinyint 2 = Depo Transfer
sth_cikis_depo_no int Malın çıktığı depo (transferin çıkış bacağı)
sth_giris_depo_no int Malın girdiği depo (transferin varış bacağı)
sth_stok_kod nvarchar(25) Transfer edilen stok kodu
sth_miktar float Transfer edilen miktar
sth_tarih datetime Transfer tarihi
sth_evrakno_seri / sth_evrakno_sira str / int Transfer evrakının seri ve sıra numarası
sth_iptal bit 0 olmalı; iptal transfer rapora girmemeli

En kritik nokta şu: Mikro'da tek bir depo kolonu yoktur. Hangi bacaktan bahsediyorsanız o kolonu kullanın. Çıkış tarafı sth_cikis_depo_no, giriş tarafı sth_giris_depo_no. Ayrıca sth_tip ile sth_evraktip farklı alanlardır; transfer raporunda evrak tipine göre filtre yazmak sizi yanlış yere götürür.

1. Dönem içi transfer listesi

Raporun temel hali. Tarih filtresini unutursanız tüm yılların transferleri tek listede gelir.

SELECT sth_tarih,
       sth_evrakno_seri, sth_evrakno_sira, sth_satirno,
       sth_cikis_depo_no AS CikisDepo,
       sth_giris_depo_no AS GirisDepo,
       sth_stok_kod, sth_miktar
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0
  AND sth_tip = 2
  AND sth_tarih >= '20260101' AND sth_tarih < '20260201'
ORDER BY sth_tarih, sth_evrakno_seri, sth_evrakno_sira, sth_satirno;

2. Hangi depodan hangi depoya ne kadar taşındı

Depo çifti bazında bir matris: hangi depo en çok sevk ediyor, hangi depo en çok besleniyor.

SELECT sth_cikis_depo_no AS CikisDepo,
       sth_giris_depo_no AS GirisDepo,
       COUNT(*)          AS SatirSayisi,
       SUM(sth_miktar)   AS ToplamMiktar
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0
  AND sth_tip = 2
  AND sth_tarih >= '20260101' AND sth_tarih < '20270101'
GROUP BY sth_cikis_depo_no, sth_giris_depo_no
ORDER BY ToplamMiktar DESC;

CikisDepo ve GirisDepo alanları int'tir; burada tarih fonksiyonu veya tarih metni kullanmayın. Tarih filtresi yalnız sth_tarih (datetime) kolonunda olur.

3. En çok transfer edilen stoklar

Stok kartı adı için STOKLAR tablosuna bağlanıyoruz.

SELECT sh.sth_stok_kod, s.sto_isim, s.sto_birim1_ad,
       COUNT(*)            AS TransferSayisi,
       SUM(sh.sth_miktar)  AS ToplamMiktar
FROM STOK_HAREKETLERI sh
LEFT JOIN STOKLAR s ON s.sto_kod = sh.sth_stok_kod
WHERE sh.sth_iptal = 0 AND sh.sth_tip = 2
GROUP BY sh.sth_stok_kod, s.sto_isim, s.sto_birim1_ad
ORDER BY ToplamMiktar DESC;

4. Depo bazlı net stok: transferin iki bacağı

Asıl tuzak burada. sth_tip = 2 satırı, depo bazlı stok hesabında GİRİŞ tarafına artı, ÇIKIŞ tarafına eksi yazılmalıdır. Aşağıdaki sorgu transferi hem varış deposuna ekler hem kaynak deposundan düşer; normal giriş (sth_tip = 0) ve çıkış (sth_tip = 1) hareketleri de aynı mantıkla sayılır.

SELECT t.depo_no, t.stok_kod, SUM(t.miktar) AS DepodakiMiktar
FROM (
    SELECT sth_giris_depo_no AS depo_no, sth_stok_kod AS stok_kod, sth_miktar AS miktar
    FROM STOK_HAREKETLERI
    WHERE sth_iptal = 0 AND sth_tip IN (0, 2)
    UNION ALL
    SELECT sth_cikis_depo_no, sth_stok_kod, -sth_miktar
    FROM STOK_HAREKETLERI
    WHERE sth_iptal = 0 AND sth_tip IN (1, 2)
) t
GROUP BY t.depo_no, t.stok_kod
HAVING SUM(t.miktar) <> 0
ORDER BY t.depo_no, t.stok_kod;

Bu kalıbın detaylı anlatımı Mikro hazır SQL sorguları yazısındaki depo bazlı stok örneğinde de var; iki sorgu aynı mantığı paylaşır. Depo kırılımlı raporlama alışkanlığınızı Mikro stok ve depo raporları yazısıyla da pekiştirebilirsiniz.

5. Tek deponun transfer bilançosu (giren / çıkan)

"1 numaralı depoya neler geldi, neler gitti" sorusunun cevabı. Depo numarasını kendi kurulumunuza göre değiştirin.

SELECT sth_stok_kod,
       SUM(CASE WHEN sth_giris_depo_no = 1 THEN sth_miktar ELSE 0 END) AS GirenMiktar,
       SUM(CASE WHEN sth_cikis_depo_no = 1 THEN sth_miktar ELSE 0 END) AS CikanMiktar,
       SUM(CASE WHEN sth_giris_depo_no = 1 THEN sth_miktar ELSE 0 END)
     - SUM(CASE WHEN sth_cikis_depo_no = 1 THEN sth_miktar ELSE 0 END) AS NetTransfer
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0
  AND sth_tip = 2
GROUP BY sth_stok_kod
ORDER BY sth_stok_kod;

6. Şirket genelinde transfer neden sıfırdır

Aynı stok şirket çapında hesaplanırken transfer hiç sayılmamalıdır; mal bir depodan çıkıp diğerine girdiği için toplam değişmez. Aşağıdaki sorgu bilinçli olarak transfer satırlarını dışarıda bırakır.

SELECT sth_stok_kod,
       SUM(CASE WHEN sth_tip = 0 THEN sth_miktar
                WHEN sth_tip = 1 THEN -sth_miktar
                ELSE 0 END) AS NetStok
FROM STOK_HAREKETLERI
WHERE sth_iptal = 0
GROUP BY sth_stok_kod
ORDER BY sth_stok_kod;

Kesin eldeki miktar için hareket toplamı yerine Mikro'nun kendi fonksiyonunu esas almak daha güvenlidir; fark çıkarsa resmi sonuç fonksiyonunkidir. Detay: Mikro fonksiyonları ve şifreli kolonlar.

Sık yapılan hatalar

  • sth_iptal = 0 filtresini yazmamak: iptal edilmiş transferler listeye girer, miktarlar şişer.
  • Transfer satırını tek depo kolonu varmış gibi okumak: çıkış ve giriş deposu ayrı kolonlardadır.
  • Depo bazlı stokta transferi sadece bir bacaktan saymak: bir deponun stoğu artarken diğerininki düşmez, rapor tutarsız çıkar.
  • Şirket geneli net stokta transferi çıkış gibi düşmek: sth_tip = 2 satırını eksi yazmak stoğunuzu olduğundan az gösterir.
  • sth_tip = 2 ile sth_evraktip filtrelerini karıştırmak: transfer bir hareket tipidir, evrak tipi değildir.
  • Tarih filtresi koymamak ya da int olan depo kolonunu tarihle karşılaştırmak.
  • İade ve normal hareket ayrımını depo taşımalarında da kopyalamak: transferde sth_normal_iade mantığı işin yönünü çevirmez, burada kriter sth_tip ve depo kolonlarıdır.

Sık sorulanlar

Transferin tutarını raporlayabilir miyim? Transfer bir yer değiştirme hareketidir; anlamlı rapor miktar üzerinden kurulur. Tutar odaklı kurgularda depo maliyetleri karıştığı için sayılar yanıltıcı olur.

Depo adlarını görebilir miyim? Transfer satırında depo numarası tutulur. Depo numarası ile depo adını eşleştirmek için depo tanım tablonuz üzerinden ayrı bir join kurmanız gerekir; STOK_HAREKETLERI tek başına depo adı taşımaz.

Neden depo bazlı stok toplamı, tüm depoların toplamından farklı çıkıyor? Genelde iki bacağı aynı sorguda doğru saymamaktan olur. Transfer satırını varış deposuna ekleyip çıkış deposundan düşen kalıbı kullanın.

Bu sorgular v16'da da çalışır mı? Çekirdek kolonlar (sth_tip, sth_giris_depo_no, sth_cikis_depo_no, sth_miktar, sth_tarih) her iki sürümde de aynıdır. Kurulumunuza özel alan farkları için v16/v17 farkları yazısına bakın.


Depo transfer raporu tek bir filtreden ibaret görünür, ama iki bacaklı yapısı yüzünden en çok yanlış sonuç üreten raporlardan biridir. Kurulumunuzun depo numaralarını ve tarih aralıklarını kendiniz yazmak istemiyorsanız, sorunuzu Türkçe anlatın; Erp Asistanı şemanıza uygun çalışan SQL'i üretir.

Kendi depo transfer ve stok sorgularınızı doğal dille alın →

Bu yazıyı paylaş
Konuşarak raporlayın

Mikro'da 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.