Erp Asistanı Erp Asistanı
SAP SQL

SAP Business One Tablo Yapısı: OINV, OCRD, OITM ve Temel Tablolar Rehberi

SAP Business One veritabanında hangi veri hangi tabloda? O ile başlayan başlık ve rakamla biten satır tabloları, DocEntry ile DocNum farkı, ObjType kodları, belge zinciri, depo stoku ve SAP B1'e özgü tuzaklar. Sorgular gerçek SAP B1 10.0 veritabanında test edildi.

Erp Asistanı Erp Asistanı Editör ekibi 10 dk okuma
SAP Business One Tablo Yapısı: OINV, OCRD, OITM ve Temel Tablolar Rehberi

SAP Business One veritabanını SQL Server Management Studio'da ilk kez açan herkes aynı duvara çarpar: iki bin yedi yüzü aşkın tablo var ve adları OINV, INV1, OCRD, JDT1 gibi dört harfli kısaltmalar. Fatura hangi tabloda, satırları nerede, müşteri kartı hangisi, stok miktarı hangi kolonda? Bu rehber SAP Business One'ın tablo adlandırma mantığını, belge mimarisini ve raporlarda en çok kullanılan tabloları anlatır. Buradaki bütün sorgular SAP'nin resmi Türkiye demo şirketinde (SAP Business One 10.0, SQL Server sürümü) çalıştırılarak test edildi.

SAP Business One tablo adları nasıl okunur?

SAP Business One'da tablo adı tahmin edilebilir bir kalıpla kurulur. Kalıbı bir kez öğrendiğinizde yeni bir belge türünün tablosunu bulmak dakikalar sürer:

  • Ana (başlık) tablo O ile başlar ve 4 harftir: OINV satış faturası, ORDR satış siparişi, OCRD cari kart, OITM stok kartı. Buradaki O "object" (nesne) anlamındadır.
  • Satır tablosu aynı kökün sonuna rakam ekler: INV1 fatura satırları, RDR1 sipariş satırları, DLN1 irsaliye satırları. INV6 (taksitler), RCT2 (tahsilatın kapattığı faturalar) gibi başka rakamlar da alt tablolardır.
  • A ile başlayan kopyalar arşivdir: ADOC, ACRD, AITM geçmiş/sürüm kayıtlarıdır. Raporda kullanmayın; yoksa aynı kaydı birden çok kez sayarsınız.
  • Önek yoktur: Logo'daki LG_323_01_ gibi firma/dönem öneki SAP'de bulunmaz. Her şirket ayrı bir veritabanıdır; dönem ayrımı tarih kolonlarıyla yapılır. (Logo tarafını merak ediyorsanız: Logo tablo yapısı rehberi.)
  • Müşteriye özel alanlar U_ ile başlar (U_PlasiyerNotu gibi), müşteriye özel tablolar ise [@TABLOADI] biçiminde köşeli parantezle yazılır. Bunlar kurulumdan kuruluma değişir.

En çok kullanılan SAP Business One tabloları

Tablo Ne tutar Öne çıkan kolonlar
OCRD Cari kartlar (müşteri, tedarikçi, aday) CardCode, CardName, CardType, GroupCode, LicTradNum, SlpCode, frozenFor
OITM Stok (kalem) kartları ItemCode, ItemName, ItmsGrpCod, InvntItem, SellItem, OnHand, frozenFor
OITW Kalem x depo stok miktarları ItemCode, WhsCode, OnHand, IsCommited, OnOrder, MinStock
OWHS Depolar WhsCode, WhsName
OINV / INV1 Satış faturası başlık / satır DocEntry, DocNum, DocDate, DocDueDate, CardCode, DocTotal, VatSum, PaidToDate
ORIN / RIN1 Alacak dekontu (satış iadesi faturası) OINV ile aynı kolon düzeni
ORDR / RDR1 Satış siparişi OpenQty, LineStatus, ShipDate (satırda)
ODLN / DLN1 Satış irsaliyesi (teslimat) BaseType, BaseEntry, BaseLine (satırda)
OPCH / PCH1 Alış faturası OINV ile aynı kolon düzeni
ORCT / RCT2 Tahsilat / tahsilatın kapattığı faturalar DocDate, CardCode, Canceled, SumApplied
OJDT / JDT1 Yevmiye başlık / satır TransId, Account, ShortName, Debit, Credit, BalDueDeb, BalDueCred
OINM Stok hareketleri (stok föyü) ItemCode, Warehouse, TransType, DocDate
OSLP / OCRG / OITB Satış temsilcisi / cari grubu / stok grubu SlpName, GroupName, ItmsGrpNam

Bütün satış ve satınalma belgelerinin başlık tabloları aynı kolon düzenini, satır tabloları da aynı satır düzenini taşır. OINV için yazdığınız bir sorgu, tablo adını ORDR, ODLN ya da OPCH yaparak çoğu zaman olduğu gibi çalışır.

Belge mimarisi: başlık, satır ve DocEntry

Her ticari belge iki tabloya yazılır: başlıkta belge başına bir satır, satır tablosunda kalem başına bir satır. İkisi DocEntry ile bağlanır.

-- Satış faturası başlıkları: son 20 fatura, KDV hariç ve dahil tutarlarıyla
SELECT TOP 20
       f.DocEntry,
       f.DocNum              AS FaturaNo,
       f.DocDate             AS Tarih,
       f.DocDueDate          AS Vade,
       f.CardCode            AS CariKod,
       c.CardName            AS CariAd,
       f.DocTotal - f.VatSum AS KdvHaricTutar,
       f.VatSum              AS Kdv,
       f.DocTotal            AS KdvDahilTutar
FROM OINV f
JOIN OCRD c ON c.CardCode = f.CardCode
WHERE f.CANCELED = 'N'
ORDER BY f.DocDate DESC, f.DocEntry DESC;
-- Bu yılın fatura satırları: hangi faturada hangi kalem, kaç adet, hangi depodan
SELECT TOP 100
       f.DocNum       AS FaturaNo,
       f.DocDate      AS Tarih,
       l.LineNum      AS SatirNo,
       l.ItemCode     AS StokKod,
       l.Dscription   AS Aciklama,
       l.Quantity     AS Miktar,
       l.Price        AS BirimFiyat,
       l.LineTotal    AS SatirTutari,
       l.VatPrcnt     AS KdvOrani,
       l.WhsCode      AS Depo
FROM OINV f
JOIN INV1 l ON l.DocEntry = f.DocEntry
WHERE f.CANCELED = 'N'
  AND f.DocDate >= DATEFROMPARTS(YEAR(GETDATE()), 1, 1)
ORDER BY f.DocEntry DESC, l.LineNum;

Üç kimliği karıştırmayın:

  • DocEntry iç anahtardır, belge türü içinde benzersizdir. JOIN'i daima bununla kurun.
  • DocNum kullanıcının ekranda gördüğü belge numarasıdır. Numara serisine göre tekrar edebilir; raporda gösterin ama eşleme için kullanmayın.
  • ObjType belge türü kodudur ('13' satış faturası). Yevmiyede TransType, stok hareketinde de aynı kodlar geçer.
ObjType Belge Başlık / satır
23 Satış teklifi OQUT / QUT1
17 Satış siparişi ORDR / RDR1
15 Satış irsaliyesi (teslimat) ODLN / DLN1
13 Satış faturası OINV / INV1
14 Alacak dekontu (satış iadesi faturası) ORIN / RIN1
22 / 20 / 18 Satınalma siparişi / mal girişi / alış faturası OPOR / OPDN / OPCH
24 / 46 Tahsilat / tediye ORCT / OVPM
30 Yevmiye kaydı OJDT / JDT1
-- Hangi belge türünden kaç adet var? (iptaller hariç)
SELECT N'Satış teklifi (OQUT)'   AS Belge, COUNT(*) AS Adet FROM OQUT WHERE CANCELED = 'N'
UNION ALL SELECT N'Satış siparişi (ORDR)',   COUNT(*) FROM ORDR WHERE CANCELED = 'N'
UNION ALL SELECT N'Satış irsaliyesi (ODLN)', COUNT(*) FROM ODLN WHERE CANCELED = 'N'
UNION ALL SELECT N'Satış faturası (OINV)',   COUNT(*) FROM OINV WHERE CANCELED = 'N'
UNION ALL SELECT N'Alacak dekontu (ORIN)',   COUNT(*) FROM ORIN WHERE CANCELED = 'N'
UNION ALL SELECT N'Alış faturası (OPCH)',    COUNT(*) FROM OPCH WHERE CANCELED = 'N';

Durum ve iptal kolonları

  • CANCELED: N normal belge, Y iptal edilmiş belge, C iptali yapan ters belge. Satış raporunda iki iptal türü de dışlanmalıdır, bu yüzden her sorguya CANCELED = 'N' koyun. Tahsilat ve tediye tablolarında kolonun adı Canceled olarak yazılır.
  • DocStatus: O açık, C kapalı. Faturada "açık" tamamen ödenmemiş demektir; siparişte tamamen teslim edilmemiş.
  • Satırda LineStatus ve OpenQty: siparişte kalan miktar RDR1.OpenQty'dir. Fatura satırındaki LineStatus ödeme durumunu göstermez, açık fatura için başlıktaki DocStatus'a bakın.

Belge zinciri: sipariş, irsaliye ve fatura nasıl bağlanır?

SAP Business One'da belgeler birbirinden kopyalanarak oluşur (teklif, sipariş, irsaliye, fatura). Satır, kaynağını üç kolonla tutar: BaseType (kaynak belge türü), BaseEntry (kaynak DocEntry) ve BaseLine (kaynak satır no). Kaynaksız satırda BaseType = -1 olur.

-- Bir siparişin satır bazında irsaliye ve fatura karşılıkları
DECLARE @SiparisEntry int = 2382;   -- kendi siparişinizin DocEntry değerini yazın

SELECT o.DocNum     AS SiparisNo,
       d.DocNum     AS IrsaliyeNo,
       f.DocNum     AS FaturaNo,
       ol.ItemCode  AS StokKod,
       ol.Quantity  AS SiparisMiktari,
       dl.Quantity  AS SevkMiktari,
       fl.Quantity  AS FaturaMiktari
FROM RDR1 ol
JOIN ORDR o ON o.DocEntry = ol.DocEntry
LEFT JOIN DLN1 dl ON dl.BaseType = 17 AND dl.BaseEntry = ol.DocEntry AND dl.BaseLine = ol.LineNum
LEFT JOIN ODLN d  ON d.DocEntry = dl.DocEntry
LEFT JOIN INV1 fl ON fl.BaseType = 15 AND fl.BaseEntry = dl.DocEntry AND fl.BaseLine = dl.LineNum
LEFT JOIN OINV f  ON f.DocEntry = fl.DocEntry
WHERE o.DocEntry = @SiparisEntry
ORDER BY ol.LineNum;

IrsaliyeNo ya da FaturaNo boş gelen satır henüz sevk edilmemiş ya da faturalanmamış demektir. Kısmi sevkte aynı sipariş satırı birden çok irsaliye satırına bölünebilir; o zaman sonuçta aynı sipariş satırı birden çok kez görünür.

Stok: OITM toplamı, OITW depo kırılımı

Stok kartındaki OITM.OnHand bütün depoların toplamıdır. Depo bazında miktar OITW tablosundadır ve üç kolonla okunur: eldeki (OnHand), müşteri siparişlerine ayrılmış (IsCommited) ve satınalma siparişiyle beklenen (OnOrder). SAP'nin "kullanılabilir" dediği miktar OnHand - IsCommited + OnOrder formülüdür.

-- Depo bazında stok ve kullanılabilir miktar (yalnız stoklu kalemler)
SELECT w.ItemCode                         AS StokKod,
       i.ItemName                         AS StokAd,
       w.WhsCode                          AS Depo,
       d.WhsName                          AS DepoAd,
       w.OnHand                           AS Eldeki,
       w.IsCommited                       AS SipariseAyrilan,
       w.OnOrder                          AS Beklenen,
       w.OnHand - w.IsCommited + w.OnOrder AS Kullanilabilir
FROM OITW w
JOIN OITM i ON i.ItemCode = w.ItemCode
JOIN OWHS d ON d.WhsCode = w.WhsCode
WHERE i.InvntItem = 'Y'
  AND w.OnHand <> 0
ORDER BY w.ItemCode, w.WhsCode;

Depo kodu metindir ('01', 'MERKEZ'): WhsCode = 1 yazmak yerine WhsCode = '01' yazın. Stok kalemi olmayan hizmet kartlarını (InvntItem = 'N') stok raporuna almayın.

SAP Business One'a özgü tuzaklar

  • Türkçe metinde N'...' zorunlu. SAP'nin resmi Türkiye demo şirketi SQL_Latin1_General_CP850_CI_AS collation'ı ile gelir; bu kod sayfasında ş, ğ ve İ yoktur. CardName LIKE '%Güneş%' hata vermez ama aslında "Gunes" arar. Doğrusu CardName LIKE N'%Güneş%'. Büyük/küçük harf duyarsız Türkçe arama için CardName COLLATE Turkish_CI_AS LIKE N'%TEKNOLOJİ%' kullanın.
  • Satışı iki kez saymayın. Net satış satış faturası eksi alacak dekontudur (OINV - ORIN). İrsaliyeyi (ODLN) toplama eklerseniz, irsaliyeden kopyalanan her fatura iki kez sayılır.
  • Stok hareketi her zaman faturada değildir. Fatura bir irsaliyeden kopyalandıysa stok irsaliyede düşmüştür. Stok föyü için OINM tablosunu, satılan miktar için fatura satırlarını (INV1) kullanın.
  • Tutarlar yerel para birimindedir. DocTotal ve LineTotal TL'dir; dövizli belgenin döviz tutarı DocTotalFC, para birimi DocCur, kuru DocRate kolonundadır. DocTotal KDV dahildir.
  • Pasif kartlar frozenFor = 'Y' taşır. Aktif cari ve stok listelerinde frozenFor = 'N' filtresi kullanın.
  • B1_ ile başlayan görünümler SAP'nin iç görünümleridir ve sürüme göre değişebilir; sorguyu tabloya yazın.

Sık yapılan hatalar

  • DocNum ile JOIN kurmak: numara serisi farklı iki fatura aynı DocNum'u taşıyabilir, sonuç sessizce çoğalır.
  • CANCELED = 'N' filtresini unutmak: iptal edilen belge ve onu ters çeviren belge birlikte toplanır.
  • Cari bakiyeyi kart üzerindeki tek bir kolondan okumak: doğru bakiye yevmiyeden hesaplanır (ayrıntısı: SAP Business One cari bakiye ve yaşlandırma SQL).
  • Şube filtresini her sorguya eklemek: şube yalnız şirket ayarında çoklu şube açıksa (OADM.MltpBrnchs = 'Y') anlamlıdır.

Sık sorulanlar

SAP Business One'da satış faturası hangi tabloda? Fatura başlığı OINV, fatura satırları INV1 tablosundadır. İkisi DocEntry kolonuyla bağlanır. Satış iadesi faturası (alacak dekontu) ise ORIN / RIN1 tablolarındadır.

SAP B1'de müşteri ve tedarikçi kartları aynı tabloda mı? Evet. Hepsi OCRD tablosundadır ve CardType kolonuyla ayrılır: C müşteri, S tedarikçi, L aday (potansiyel müşteri). Vergi numarası ya da TC kimlik numarası Türkiye kurulumlarında LicTradNum kolonundadır.

DocEntry ile DocNum arasındaki fark nedir? DocEntry belgenin değişmeyen iç anahtarıdır ve tablolar arası bağlantı bununla kurulur. DocNum kullanıcının gördüğü belge numarasıdır, farklı numara serilerinde tekrar edebilir.

SAP Business One'da stok miktarı hangi kolonda? Tüm depoların toplamı OITM.OnHand, depo bazında miktar OITW.OnHand kolonundadır. Siparişe ayrılan miktar IsCommited, satınalma siparişiyle beklenen miktar OnOrder kolonlarındadır.


Bu tabloları ezberlemek zorunda değilsiniz. Erp Asistanı ile Türkçe "bu ay en çok satan 10 ürünü getir" yazarsınız, sistem SAP Business One şemanıza uygun, CANCELED, DocEntry ve N'...' kurallarını gözeten SQL'i üretir. Hazır örnekler için SAP Business One hazır SQL sorguları yazısına da göz atın.

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

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

SAP Business One'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.