Logo Açık Sipariş Raporu SQL: ORFICHE ve ORFLINE Rehberi
Logo açık sipariş raporu SQL: ORFICHE ve ORFLINE bağıyla kalan miktar, sevk edilmeyen kalemler ve geciken teslim tarihli bekleyen siparişleri sorgulama rehberi.
Erp Asistanı
Editör ekibi
9 dk okuma
İçindekiler
Logo'da açık sipariş raporu almanın püf noktası, sipariş başlığı ile kalemini iki ayrı tabloda okumaktır: ORFICHE (fiş/başlık) ve ORFLINE (satır/kalem). Sevk edilmemiş kalemi bulmak için ORFLINE.CLOSED ile ORFLINE.SHIPPEDAMOUNT birlikte yorumlanır; ORFICHE.CANCELLED ve ORFLINE.LINETYPE ise rapora sızmaması gereken satırları dışarıda bırakır. Bu rehberde altı sorgu ile bekleyen sevkiyatları, kalan miktarı ve geciken teslim tarihlerini çıkarıyoruz.
Tabloları mantıksal adıyla yazdık. Kendi veritabanınızda kart tablolarına LG_{firma}_ (örneğin LG_323_CLCARD), hareket ve fiş tablolarına LG_{firma}_{dönem}_ (örneğin LG_323_01_ORFLINE) önekini eklemeniz gerekir. Fonksiyonlar da önek alır: dbo.LG_323_01_GETUNITCOEF(...). Tablo adlandırma mantığını geniş anlatmak için Logo tablo yapısı rehberine bakabilirsiniz.
Açık sipariş hangi iki tabloda durur?
Sipariş başlığı ORFICHE, kalemleri ORFLINE tablosundadır ve bağ ORFLINE.ORDFICHEREF = ORFICHE.LOGICALREF ile kurulur. Cari bağı ORFICHE.CLIENTREF = CLCARD.LOGICALREF üzerindendir; cari ünvanı CLCARD.DEFINITION_ kolonundadır (sonda alt çizgi var). Siparişin satış mı alış mı olduğunu ORFICHE.TRCODE belirler: 1 = alınan (satış) sipariş, 2 = verilen (alış) sipariş.
Bir satırın açık kalem sayılması için dört koşul birlikte aranır:
ORFLINE.CLOSED = 0(satır kapanmadı)ORFLINE.LINETYPE = 0(malzeme satırı; indirim, masraf, promosyon değil)(ORFLINE.AMOUNT - ORFLINE.SHIPPEDAMOUNT) > 0(sevk edilecek kalan var)ORFLINE.CANCELLED = 0veORFICHE.CANCELLED = 0(satır ve fiş iptal değil)
| Rapor alanı | Tablo | Kolon |
|---|---|---|
| Sipariş no | ORFICHE | FICHENO |
| Sipariş tarihi | ORFICHE | DATE_ |
| Sipariş yönü | ORFICHE | TRCODE (1 alınan, 2 verilen) |
| Onay durumu | ORFICHE | STATUS (kapatma değil) |
| Cari kodu / ünvanı | CLCARD | CODE / DEFINITION_ |
| Stok | ORFLINE / ITEMS | STOCKREF |
| Sipariş miktarı | ORFLINE | AMOUNT |
| Sevk edilen miktar | ORFLINE | SHIPPEDAMOUNT |
| Kalan miktar | ORFLINE | AMOUNT - SHIPPEDAMOUNT |
| Satır kapandı mı | ORFLINE | CLOSED |
| Satır tipi | ORFLINE | LINETYPE |
| Teslim tarihi | ORFLINE | DUEDATE |
Kritik ayrım: ORFICHE.STATUS siparişin onay bilgisidir (1 öneri, 2 sevkedilemez, 4 sevkedilebilir), kapatma bayrağı değildir. Siparişin açık mı kapalı mı olduğu satır düzeyinde ORFLINE.CLOSED ile izlenir. ORFICHE tablosunda kapatma kolonu aramayın; orada böyle bir alan yoktur.
1. Temel açık sipariş sorgusu
En sade hali: satış siparişlerinin sevk edilmemiş kalemleri, cari ve stok bilgisiyle.
SELECT F.FICHENO,
F.DATE_ AS siparis_tarihi,
C.CODE AS cari_kod,
C.DEFINITION_ AS cari_unvan,
I.CODE AS stok_kod,
I.NAME AS stok_ad,
L.AMOUNT,
L.SHIPPEDAMOUNT,
(L.AMOUNT - L.SHIPPEDAMOUNT) AS kalan_miktar,
L.DUEDATE
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
JOIN ITEMS I ON I.LOGICALREF = L.STOCKREF
WHERE F.TRCODE = 1
AND F.CANCELLED = 0
AND L.CANCELLED = 0
AND L.CLOSED = 0
AND L.LINETYPE = 0
AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
ORDER BY F.DATE_, F.FICHENO;
Sadece onaylanmış siparişleri görmek isterseniz sorguya AND F.STATUS = 4 ekleyin; bu, sevke hazır siparişleri getirir, kapatılmış satırları gizlemez. Kapatma filtresi her zaman L.CLOSED tarafındadır.
2. Kalan miktarı birim çevrimiyle hesaplama
Sipariş kalemi koli ile girilmiş, ana birim adet ise SUM(AMOUNT) yanıltır. Miktarı GETUNITCOEF ile ana birime çevirin.
SELECT F.FICHENO,
I.CODE AS stok_kod,
SUM(L.AMOUNT * dbo.GETUNITCOEF(L.UINFO1, L.UINFO2)) AS siparis_miktar,
SUM(L.SHIPPEDAMOUNT * dbo.GETUNITCOEF(L.UINFO1, L.UINFO2)) AS sevk_miktar,
SUM((L.AMOUNT - L.SHIPPEDAMOUNT) * dbo.GETUNITCOEF(L.UINFO1, L.UINFO2)) AS kalan_miktar
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
JOIN ITEMS I ON I.LOGICALREF = L.STOCKREF
WHERE F.TRCODE = 1
AND F.CANCELLED = 0
AND L.CANCELLED = 0
AND L.CLOSED = 0
AND L.LINETYPE = 0
AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
GROUP BY F.FICHENO, I.CODE
ORDER BY F.FICHENO;
GETUNITCOEF fonksiyonunun kendisi de önek alır (dbo.LG_{firma}_{dönem}_GETUNITCOEF). Farklı birimlerden girilen satırları çevirmeden toplarsanız kalan miktar raporu tutmaz.
3. Geciken siparişler (DUEDATE)
Teslim tarihi geçmiş ve hala sevk edilmemiş kalemler, işletmede en çok sorulan listedir. DUEDATE datetime kolondur, doğrudan GETDATE() ile karşılaştırılabilir.
SELECT F.FICHENO,
F.DATE_ AS siparis_tarihi,
C.CODE AS cari_kod,
C.DEFINITION_ AS cari_unvan,
I.CODE AS stok_kod,
L.DUEDATE,
DATEDIFF(DAY, L.DUEDATE, GETDATE()) AS gecikme_gun,
(L.AMOUNT - L.SHIPPEDAMOUNT) AS kalan_miktar
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
JOIN ITEMS I ON I.LOGICALREF = L.STOCKREF
WHERE F.TRCODE = 1
AND F.CANCELLED = 0
AND L.CANCELLED = 0
AND L.CLOSED = 0
AND L.LINETYPE = 0
AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
AND L.DUEDATE < GETDATE()
ORDER BY L.DUEDATE;
Burada ORFLINE.TIME_ kolonuna dokunmayın; o kolon saat bilgisini bit paketlenmiş int olarak tutar ve tarih fonksiyonuna sokulduğunda 8115 dönüşüm hatası üretir. Tarih işlemi yalnız DATE_ ve DUEDATE gibi datetime kolonlarla yapılır.
4. Cari bazında bekleyen sevkiyat özeti
Aynı cariye ait kaç sipariş açık, toplam ne kadar bekliyor? Satır tutarını sevk edilmemiş kısımla çarparak yaklaşık bir açık tutar da çıkarabilirsiniz.
SELECT C.CODE AS cari_kod,
C.DEFINITION_ AS cari_unvan,
COUNT(DISTINCT F.LOGICALREF) AS acik_siparis_adedi,
SUM(L.AMOUNT - L.SHIPPEDAMOUNT) AS kalan_miktar,
SUM((L.AMOUNT - L.SHIPPEDAMOUNT) * L.PRICE) AS kalan_tutar
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
WHERE F.TRCODE = 1
AND F.CANCELLED = 0
AND L.CANCELLED = 0
AND L.CLOSED = 0
AND L.LINETYPE = 0
AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
GROUP BY C.CODE, C.DEFINITION_
ORDER BY kalan_tutar DESC;
kalan_tutar liste fiyatı üzerinden yaklaşık bir değerdir; satır indirimleri (LINETYPE = 2 satırları) bu hesaba girmez. Kesin tutar için satır neti yerine sipariş başlığındaki toplamları oransal kullanmak gerekir. Sipariş adedini COUNT(*) ile saymayın, o kalem sayısıdır; COUNT(DISTINCT F.LOGICALREF) kullanın.
5. Sipariş bazında açık miktar
Kapatma satır düzeyinde olduğu için, tamamen kapanmamış siparişleri başlık düzeyinde görmek için satırları önce toplayıp sonra süzmek gerekir.
SELECT F.FICHENO,
F.DATE_ AS siparis_tarihi,
C.DEFINITION_ AS cari_unvan,
SUM(CASE WHEN L.CLOSED = 0 AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
THEN L.AMOUNT - L.SHIPPEDAMOUNT ELSE 0 END) AS acik_miktar
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
AND L.CANCELLED = 0 AND L.LINETYPE = 0
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
WHERE F.TRCODE = 1 AND F.CANCELLED = 0
GROUP BY F.FICHENO, F.DATE_, C.DEFINITION_
HAVING SUM(CASE WHEN L.CLOSED = 0 AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
THEN L.AMOUNT - L.SHIPPEDAMOUNT ELSE 0 END) > 0
ORDER BY F.DATE_;
Bu desen, kısmi sevk edilmiş siparişleri de doğru gösterir: sevk edilen miktar düşülür, kalan sıfırdan büyükse sipariş listede kalır.
6. Alış (verilen) siparişleri de aynı mantıkla
Tedarikçiden beklenen malı görmek için tek değişen TRCODE değeridir; cari tarafı bu kez tedarikçiyi gösterir.
SELECT F.FICHENO,
C.CODE AS tedarikci_kod,
C.DEFINITION_ AS tedarikci_unvan,
I.CODE AS stok_kod,
L.DUEDATE,
(L.AMOUNT - L.SHIPPEDAMOUNT) AS bekleyen_miktar
FROM ORFICHE F
JOIN ORFLINE L ON L.ORDFICHEREF = F.LOGICALREF
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
JOIN ITEMS I ON I.LOGICALREF = L.STOCKREF
WHERE F.TRCODE = 2
AND F.CANCELLED = 0
AND L.CANCELLED = 0
AND L.CLOSED = 0
AND L.LINETYPE = 0
AND (L.AMOUNT - L.SHIPPEDAMOUNT) > 0
ORDER BY L.DUEDATE;
Hazır sorgu kalıplarının tamamını Logo hazır SQL sorguları derlemesinde de bulabilirsiniz. Mikro tarafında aynı raporun tablo karşılığı için Mikro açık sipariş raporu SQL yazısına bakın.
Sık yapılan hatalar
ORFICHE.CLOSEDveyaORFICHEüzerinde kapatma kolonu aramak. Kapatma yalnızcaORFLINE.CLOSEDalanındadır.LINETYPE = 0filtresini unutmak. İndirim ve masraf satırlarının daAMOUNTdeğeri vardır; filtre olmadan kalan miktar şişer.CANCELLED = 0filtresini sadece başlığa koyup satıra koymamak. İptal edilmiş bir kalem, iptal edilmemiş fişin altında durabilir.CLOSED = 0ile yetinip(AMOUNT - SHIPPEDAMOUNT) > 0koşulunu yazmamak. Kısmi sevk edilen satırlardaCLOSEDhala 0 olabilir.DUEDATEyerineTIME_kolonunu tarih fonksiyonuna sokmak.TIME_int kolondur,DATEADD/DATEDIFFile birlikte kullanılmaz.- Tablo önekini unutmak ve
Invalid object namehatası almak. Kart tablolarınaLG_{firma}_, hareket tablolarınaLG_{firma}_{dönem}_ekleyin. COUNT(*)ile sipariş sayısı ölçmek. Bu size kalem sayısını verir;COUNT(DISTINCT F.LOGICALREF)doğru sonuçtur.SALESMANREF'i doğrudan isim sanmak. Satış elemanı referansıLG_SLSMAN.LOGICALREFile çözülür.
Sık sorulanlar
Kısmi sevk edilen sipariş açık mı sayılır? Evet. Satırın tamamı sevk edilip CLOSED = 1 olana kadar (AMOUNT - SHIPPEDAMOUNT) > 0 koşulu sağlandığı sürece kalem açık kabul edilir ve her iki miktarı da raporda ayrı görmek en doğrusudur.
Neden ORFICHE ve ORFLINE'ı birleştirmek zorundayım? Çünkü miktar, fiyat, sevk miktarı ve teslim tarihi satırda; cari, sipariş tarihi, sipariş no ve iptal durumu başlıkta tutulur. Bağ ORFLINE.ORDFICHEREF = ORFICHE.LOGICALREF üzerindedir; kodla değil LOGICALREF ile kurulur.
Satış ve alış siparişlerini nasıl ayırırım? ORFICHE.TRCODE ile: 1 alınan (satış) sipariş, 2 verilen (alış) sipariş. Kendi verinizde bir kez GROUP BY TRCODE ile dağılımı teyit etmeniz önerilir.
Geciken sipariş nasıl tanımlanır? DUEDATE < GETDATE() ve kalan miktar sıfırdan büyük olan kalemler gecikmiş sayılır. Teslim tarihi girilmemiş satırlar bu filtreye hiç girmez, bu yüzden DUEDATE IS NOT NULL kontrolünü de isterseniz ekleyebilirsiniz.
Sipariş başlığı ile kalemini, kalan miktarı ve gecikmeyi her seferinde elle birleştirmek zorunda değilsiniz. Erp Asistanı'na "geciken açık satış siparişlerini cari bazında getir" gibi Türkçe bir cümle yazmanız yeterli; sistem ORFICHE ve ORFLINE bağını, CLOSED ve LINETYPE filtrelerini doğru kuran SQL'i üretir. Şemayı tanımak isterseniz Logo tablo yapısı rehberi iyi bir başlangıçtır.
Logo açık sipariş sorgularını kendi veritabanınızda denemek için ücretsiz hesap açın →
Logo'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.