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ı
Editör ekibi
10 dk okuma
İçindekiler
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
Oile başlar ve 4 harftir:OINVsatış faturası,ORDRsatış siparişi,OCRDcari kart,OITMstok kartı. BuradakiO"object" (nesne) anlamındadır. - Satır tablosu aynı kökün sonuna rakam ekler:
INV1fatura satırları,RDR1sipariş satırları,DLN1irsaliye satırları.INV6(taksitler),RCT2(tahsilatın kapattığı faturalar) gibi başka rakamlar da alt tablolardır. Aile başlayan kopyalar arşivdir:ADOC,ACRD,AITMgeç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_PlasiyerNotugibi), 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:
DocEntryiç anahtardır, belge türü içinde benzersizdir. JOIN'i daima bununla kurun.DocNumkullanı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.ObjTypebelge türü kodudur ('13'satış faturası). YevmiyedeTransType, 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:Nnormal belge,Yiptal edilmiş belge,Ciptali yapan ters belge. Satış raporunda iki iptal türü de dışlanmalıdır, bu yüzden her sorguyaCANCELED = 'N'koyun. Tahsilat ve tediye tablolarında kolonun adıCanceledolarak yazılır.DocStatus:Oaçık,Ckapalı. Faturada "açık" tamamen ödenmemiş demektir; siparişte tamamen teslim edilmemiş.- Satırda
LineStatusveOpenQty: siparişte kalan miktarRDR1.OpenQty'dir. Fatura satırındakiLineStatusödeme durumunu göstermez, açık fatura için başlıktakiDocStatus'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 şirketiSQL_Latin1_General_CP850_CI_AScollation'ı ile gelir; bu kod sayfasında ş, ğ ve İ yoktur.CardName LIKE '%Güneş%'hata vermez ama aslında "Gunes" arar. DoğrusuCardName LIKE N'%Güneş%'. Büyük/küçük harf duyarsız Türkçe arama içinCardName 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
OINMtablosunu, satılan miktar için fatura satırlarını (INV1) kullanın. - Tutarlar yerel para birimindedir.
DocTotalveLineTotalTL'dir; dövizli belgenin döviz tutarıDocTotalFC, para birimiDocCur, kuruDocRatekolonundadır.DocTotalKDV dahildir. - Pasif kartlar
frozenFor = 'Y'taşır. Aktif cari ve stok listelerindefrozenFor = '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
DocNumile 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.
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.