ERP Asistanı Dal Net
SAP SQL

SAP B1 Stok Raporu SQL: OITW Kritik ve Kullanılabilir Miktar

OITW ile depo bazında stok, kritik seviye ve fazla stok listesi. Kullanılabilir miktarı OnHand - IsCommited + OnOrder ile doğru hesaplayan SQL sorguları.

Erp Asistanı Erp Asistanı Editör ekibi 6 dk okuma
SAP B1 Stok Raporu SQL: OITW Kritik ve Kullanılabilir Miktar

SAP Business One'da stok raporu denince akla ilk gelen ekran stok kartındaki OnHand alanıdır. Oysa depo bazında kritik seviye, rezerve miktar ve yoldaki sipariş birlikte sorulduğunda iş OITW tablosuna düşer. OITM.OnHand tüm depoların toplamını taşır; depo kırılımı, MinStock/MaxStock ve kullanılabilir miktar OITW'de durur. Bu yazıda OITW üzerinden kritik stok, fazla stok ve kullanılabilir miktar sorgularını kuruyoruz. Depo kodu WhsCode metindir: '01' yazın, 1 yazmayın. Pasif stok kartlarını frozenFor = 'N' ile dışlayın, stoklu kalem için InvntItem = 'Y' filtresini unutmayın. Tablo adlarının tamamı öneksizdir; firma öneki eklemeyin.

Kullanılabilir miktar formülü

Kullanılabilir miktar, eldeki stoktan müşteri siparişleriyle ayrılmış miktarı çıkarıp satınalma siparişiyle gelecek miktarı ekleyerek bulunur: OnHand - IsCommited + OnOrder. Serbest stok ise rezervsiz miktardır: OnHand - IsCommited. Kritik seviye için iki eşik kullanabilirsiniz: klasik yaklaşım OnHand < MinStock, sipariş ve rezerv etkisini dahil eden yaklaşım OnHand - IsCommited + OnOrder <= MinStock. Aşağıdaki kritik sorgusu ikinci yaklaşımı kullanır.

Alan Anlam Dikkat
OITW.OnHand Depodaki eldeki miktar Stok birimiyle
OITW.IsCommited Müşteri siparişleriyle ayrılmış miktar Kolon adı tek m ile IsCommited
OITW.OnOrder Satınalma siparişiyle gelecek miktar Kullanılabilire eklenir
OITW.MinStock / MaxStock Depo-kalem minimum ve maksimum seviyesi 0 ise tanımsız kabul edin
OITM.OnHand Tüm depoların toplamı Depo kırılımı için kullanmayın
OWHS.WhsCode Depo kodu Metindir: N'01'

Depo adı, pasif depo ve stoksuz satış deposu bilgisi için OWHS tablosuna join ediyoruz. OWHS.DropShip = 'Y' depolar fiziksel stok tutmaz; OWHS.Nettable = 'N' depolar MRP ve kullanılabilirlik hesabına girmez. Raporu ihtiyacınıza göre bu iki filtreyle daraltabilirsiniz.

1. Depo bazında stok ve kullanılabilir miktar

Bu sorgu stoklu ve aktif kalemlerin depo kırılımını verir. Tüm depoları görmek için depo filtresi yoktur; yalnız hareketi ya da bakiyesi olan satırlar listelenir.

SELECT w.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       b.ItmsGrpNam AS StokGrubu,
       w.WhsCode AS Depo,
       h.WhsName AS DepoAdi,
       w.OnHand AS Eldeki,
       w.IsCommited AS Rezerve,
       w.OnOrder AS Sipariste,
       w.OnHand - w.IsCommited + w.OnOrder AS Kullanilabilir,
       w.MinStock AS MinStok,
       w.MaxStock AS MaxStok
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS h ON h.WhsCode = w.WhsCode
LEFT JOIN OITB b ON b.ItmsGrpCod = i.ItmsGrpCod
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
  AND h.Inactive = 'N'
  AND (w.OnHand <> 0 OR w.IsCommited <> 0 OR w.OnOrder <> 0)
ORDER BY w.ItemCode, w.WhsCode;

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

i.frozenFor = 'N' pasif kartları dışlar. Stok kartı pasifleştirildiğinde frozenFor = 'Y' olur; bu kartların depo bakiyesi kalsa bile yeni raporlarda görünmesini istemiyorsanız filtreyi koruyun.

2. Kritik seviye listesi

Kritik listesi MinStock > 0 olan depo-kalem satırlarında kullanılabilir miktarı eşikle kıyaslar. EksikMiktar pozitifse kullanılabilir miktar minimumun altındadır. Klasik eldeki stok eşiği isterseniz koşulu w.OnHand <= w.MinStock yapın; bu durumda rezerve ve yoldaki sipariş hesaba katılmaz.

SELECT w.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       w.WhsCode AS Depo,
       h.WhsName AS DepoAdi,
       w.OnHand AS Eldeki,
       w.IsCommited AS Rezerve,
       w.OnOrder AS Sipariste,
       w.OnHand - w.IsCommited + w.OnOrder AS Kullanilabilir,
       w.MinStock AS MinStok,
       w.MinStock - (w.OnHand - w.IsCommited + w.OnOrder) AS EksikMiktar
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS h ON h.WhsCode = w.WhsCode
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
  AND h.Inactive = 'N'
  AND w.MinStock > 0
  AND (w.OnHand - w.IsCommited + w.OnOrder) <= w.MinStock
ORDER BY EksikMiktar DESC, w.ItemCode, w.WhsCode;

Bu listeyi her sabah otomatik uyarmak için Kritik Stok Uyarısı yazısındaki kurguya bakabilirsiniz.

3. Fazla stok listesi

MaxStock tanımlıysa eldeki miktar maksimumu aştığında satır fazla stok olur. Burada OnHand kullanıyoruz; rezerve ve sipariş dahil edilmiş kullanılabilir miktar fazla stok kararını değiştirebilir.

SELECT w.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       w.WhsCode AS Depo,
       h.WhsName AS DepoAdi,
       w.OnHand AS Eldeki,
       w.MaxStock AS MaxStok,
       w.OnHand - w.MaxStock AS FazlaMiktar
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS h ON h.WhsCode = w.WhsCode
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
  AND h.Inactive = 'N'
  AND w.MaxStock > 0
  AND w.OnHand > w.MaxStock
ORDER BY FazlaMiktar DESC, w.ItemCode, w.WhsCode;

4. Stok kartı toplamı ile depo toplamı kontrolü

OITM.OnHand tüm depoların toplamıdır; depo kırılımı OITW tablosundadır. Bu iki değer normalde eşittir. Aşağıdaki sorgu fark olan kalemleri bulur; fark varsa önce stok hareketlerini ve depo ayarlarını kontrol edin.

SELECT i.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       i.OnHand AS KartToplami,
       ISNULL(SUM(w.OnHand), 0) AS DepoToplami,
       i.OnHand - ISNULL(SUM(w.OnHand), 0) AS Fark
FROM OITM i
LEFT JOIN OITW w ON w.ItemCode = i.ItemCode
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
GROUP BY i.ItemCode, i.ItemName, i.OnHand
HAVING i.OnHand <> ISNULL(SUM(w.OnHand), 0)
ORDER BY ABS(i.OnHand - ISNULL(SUM(w.OnHand), 0)) DESC;

Tablo ilişkilerini daha geniş görmek için SAP Business One tablo yapısı rehberi iyi bir başlangıçtır.

5. Tek depo için kritik ve kullanılabilir miktar

Depo kodu metindir. '01' deposunu ararken N'01' yazın; WhsCode = 1 yazarsanız öndeki sıfır nedeniyle kayıt bulamazsınız.

SELECT w.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       w.WhsCode AS Depo,
       h.WhsName AS DepoAdi,
       w.OnHand AS Eldeki,
       w.IsCommited AS Rezerve,
       w.OnOrder AS Sipariste,
       w.OnHand - w.IsCommited + w.OnOrder AS Kullanilabilir
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS h ON h.WhsCode = w.WhsCode
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
  AND w.WhsCode = N'01'
ORDER BY Kullanilabilir ASC, w.ItemCode;

6. MRP dışı depoları hariç toplam kullanılabilir

Konsinye veya MRP hesabına girmeyen depoları toplamdan çıkarmak için OWHS.Nettable = 'Y' filtresi kullanın. Tüm depoları istiyorsanız bu satırı kaldırın.

SELECT i.ItemCode AS StokKod,
       i.ItemName AS StokAd,
       SUM(w.OnHand) AS Eldeki,
       SUM(w.IsCommited) AS Rezerve,
       SUM(w.OnOrder) AS Sipariste,
       SUM(w.OnHand - w.IsCommited + w.OnOrder) AS Kullanilabilir
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS h ON h.WhsCode = w.WhsCode
WHERE i.InvntItem = 'Y'
  AND i.validFor = 'Y'
  AND i.frozenFor = 'N'
  AND h.Inactive = 'N'
  AND h.Nettable = 'Y'
GROUP BY i.ItemCode, i.ItemName
ORDER BY Kullanilabilir ASC, i.ItemCode;

Hazır sorguların tamamı için SAP Business One Hazır SQL Sorguları yazısına da göz atabilirsiniz.

Sık yapılan hatalar

  • OITM.OnHand değerini depo kırılımı sanmak. Depo bazında stok daima OITW tablosundan okunur.
  • WhsCode = 1 ya da WhsCode = '1' yazmak. Depo kodu '01' gibi metindir; baştaki sıfır kaybolur.
  • IsCommited kolonunu IsCommitted diye yazmak. SAP'de kolon adı tek m ile IsCommited şeklindedir.
  • Kullanılabilir formülde OnOrder miktarını unutmak ya da IsCommited yerine eklemek.
  • InvntItem = 'Y' filtresini koymamak. Hizmet benzeri kalemler stok raporuna karışır.
  • Pasif stok kartlarını dahil etmek. frozenFor = 'Y' olan kartlar pasiftir; raporda frozenFor = 'N' kullanın.
  • MinStock = 0 olan satırları kritik saymak. 0 çoğu zaman tanımsız seviye demektir; MinStock > 0 filtresi şarttır.
  • OWHS.Nettable = 'N' depoları toplam kullanılabilir miktara katmak. MRP dışı depo toplamı şişirir.

Sık sorulanlar

OITW ile OITM arasındaki fark ne? OITM stok kartıdır ve OnHand alanı tüm depoların toplamını taşır. OITW ise kalem ve depo çifti bazında eldeki, rezerve, sipariş ve minimum-maksimum seviyeyi tutar. Depo raporu için OITW, kart toplamı için OITM kullanılır.

Kullanılabilir miktar negatif çıkabilir mi? Evet. Müşteri siparişleriyle ayrılan miktar eldeki stoğu geçerse OnHand - IsCommited + OnOrder negatif olabilir. Bu bir veri hatası olmak zorunda değildir; rezerve fazlası ya da henüz mal girişi yapılmamış sipariş anlamına gelebilir.

Geçmiş tarihli stok bakiyesi alabilir miyim? OITW anlık bakiyedir; geçmiş tarihli stok için stok hareketlerini o tarihe kadar toplamak gerekir. Bu yazıdaki sorgular bugünkü depo bakiyesi içindir.

WhsCode neden metin olarak tutuluyor? Depo kodları '01', '02' gibi baştaki sıfırı koruyacak şekilde metindir. Sayıya çevirirseniz '01' ile '1' aynı görünür ve yanlış depoyu seçersiniz.


Depo bazında kritik seviye ve kullanılabilir miktarı tek sorguda görmek istiyorsanız önce MinStock > 0 ve InvntItem = 'Y' filtrelerini doğru kurun. Kendi şemanıza uygun sorguyu doğal dille üretmek için Erp Asistanı kullanabilirsiniz; nasıl çalıştığını SQL Üretme rehberinde görebilirsiniz.

Ücretsiz üye olun, SAP stok sorgunuzu doğal dille üretin →

Bu yazıyı paylaş
SAP Business One 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.