Erp Asistanı Erp Asistanı
Logo SQL

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ı Erp Asistanı Editör ekibi 9 dk okuma
Logo Açık Sipariş Raporu SQL: ORFICHE ve ORFLINE Rehberi

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 = 0 ve ORFICHE.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.CLOSED veya ORFICHE üzerinde kapatma kolonu aramak. Kapatma yalnızca ORFLINE.CLOSED alanındadır.
  • LINETYPE = 0 filtresini unutmak. İndirim ve masraf satırlarının da AMOUNT değeri vardır; filtre olmadan kalan miktar şişer.
  • CANCELLED = 0 filtresini sadece başlığa koyup satıra koymamak. İptal edilmiş bir kalem, iptal edilmemiş fişin altında durabilir.
  • CLOSED = 0 ile yetinip (AMOUNT - SHIPPEDAMOUNT) > 0 koşulunu yazmamak. Kısmi sevk edilen satırlarda CLOSED hala 0 olabilir.
  • DUEDATE yerine TIME_ kolonunu tarih fonksiyonuna sokmak. TIME_ int kolondur, DATEADD/DATEDIFF ile birlikte kullanılmaz.
  • Tablo önekini unutmak ve Invalid object name hatası almak. Kart tablolarına LG_{firma}_, hareket tablolarına LG_{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.LOGICALREF ile çö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 →

Bu yazıyı paylaş
Konuşarak raporlayı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.