Erp Asistanı Erp Asistanı
Logo SQL

Logo Stok ve Cari Bakiye SQL: CLFLINE, STLINE ve GETSTTRANSCOEF ile Doğru Hesap

4 dk okuma Erp Asistanı
Logo Stok ve Cari Bakiye SQL: CLFLINE, STLINE ve GETSTTRANSCOEF ile Doğru Hesap

Logo (Tiger, GO 3, GO Plus) kullananların en sık sorduğu iki soru şudur: "Bir carinin bakiyesini hangi kolondan okurum?" ve "Bir stoğun eldeki miktarını nasıl bulurum?" Cevap ikisinde de aynı: Logo bu değerleri kartta tutmaz, hareketlerden hesaplar. Bu yazıda cari bakiye ve stok miktarını doğru hesaplamanın yolunu, gerçek Logo GO 3 veritabanında test edilmiş sorgularla anlatıyoruz.

Neden bakiye bir kolonda durmaz?

Logo, CLCARD (cari kart) veya ITEMS (stok kart) tablolarında hazır bir "bakiye" ya da "eldeki miktar" alanı tutmaz. Bunun yerine:

  • Cari bakiye, CLFLINE (cari hareket) satırlarındaki borç/alacak tutarlarından hesaplanır.
  • Stok miktarı, STLINE (stok hareket) satırlarındaki giriş/çıkış miktarlarından hesaplanır.

Bu tasarım doğru raporun tek yolunu hareketleri toplamak yapar. Karttaki bir alana bakmaya çalışmak yerine aşağıdaki desenleri kullanın. (Tablo ve fonksiyon adlarının firma/dönem önekli olduğunu unutmayın: LG_{firma}_{dönem}_CLFLINE, dbo.LG_{firma}_{dönem}_GETUNITCOEF gibi.)

Cari bakiye: CLFLINE ve SIGN kolonu

CLFLINE her satırında bir tutar (AMOUNT) ve bir yön bayrağı (SIGN) taşır. Kural nettir: SIGN = 0 borç, SIGN = 1 alacak. Bakiye = borç toplamı − alacak toplamı.

-- Tek carinin güncel bakiyesi
SELECT SUM(CASE WHEN F.SIGN = 0 THEN F.AMOUNT ELSE -F.AMOUNT END) AS bakiye
FROM CLFLINE F
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
WHERE C.CODE = @cari_kod AND F.CANCELLED = 0;

Pozitif sonuç carinin borçlu (size ödeyecek), negatif sonuç alacaklı olduğunu gösterir. Tüm carilerin bakiyesini tek listede almak için GROUP BY C.CODE, C.DEFINITION_ ekleyip HAVING ile filtreleyin.

Yürüyen bakiyeli cari ekstre

Ekstrede her satırın yanında o ana kadarki bakiyeyi görmek için pencere fonksiyonu kullanın:

SELECT F.DATE_,
       CASE WHEN F.SIGN = 0 THEN F.AMOUNT ELSE 0 END AS borc,
       CASE WHEN F.SIGN = 1 THEN F.AMOUNT ELSE 0 END AS alacak,
       SUM(CASE WHEN F.SIGN = 0 THEN F.AMOUNT ELSE -F.AMOUNT END)
         OVER (ORDER BY F.DATE_, F.LOGICALREF ROWS UNBOUNDED PRECEDING) AS yuruyen_bakiye
FROM CLFLINE F
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
WHERE C.CODE = @cari_kod AND F.CANCELLED = 0
ORDER BY F.DATE_, F.LOGICALREF;

Sıralamaya DATE_ yanında LOGICALREF'i de eklemek, aynı güne düşen hareketlerde kararlı (deterministik) bir sıra sağlar.

Stok miktarı: iki katsayıyı atlamayın

Stok miktarını SELECT SUM(AMOUNT) FROM STLINE ile toplamak iki nedenle yanlış sonuç verir:

  1. Birim farkı. Satırlar koli, paket, adet gibi farklı birimlerden girilebilir. Ana birime çevirmeden toplamak elmayla armudu toplar. Çözüm: GETUNITCOEF(UINFO1, UINFO2) katsayısıyla çarpmak.
  2. Yön farkı. Giriş ve çıkış aynı AMOUNT işaretiyle durur; hangisinin eksi sayılacağını GETSTTRANSCOEF fonksiyonu belirler. Yönü tek başına IOCODE'dan çıkarmak iade ve özel işlemlerde yanılır.
-- Bir stoğun net eldeki miktarı (giriş − çıkış, ana birimde)
SELECT SUM(
         SL.AMOUNT
         * dbo.GETUNITCOEF(SL.UINFO1, SL.UINFO2)
         * dbo.GETSTTRANSCOEF(SL.TRCODE, SL.IOCODE, SL.LINETYPE, 0, 0, 0, 0, SL.SOURCELINK, SL.BILLED, 0)
       ) AS net_miktar
FROM STLINE SL
WHERE SL.STOCKREF = (SELECT LOGICALREF FROM ITEMS WHERE CODE = @stok)
  AND SL.CANCELLED = 0;

GETSTTRANSCOEF girişe +1, çıkışa −1 (ve iade/özel tiplere uygun işareti) döndürür; böylece toplam gerçek net miktarı verir. Ambar bazında ayırmak isterseniz STLINE.SOURCEINDEX (kaynak ambar numarası) kolonunu GROUP BY'a ekleyebilirsiniz.

En sık üç hata

  • ACTIVE = 1 ile aktif aramak. Logo'da bayrak terstir; aktif kartlar ACTIVE = 0'dır. Bakiye listenizde pasif carileri elemek isterken WHERE C.ACTIVE = 0 yazın.
  • CANCELLED'ı unutmak. İptal edilmiş hareketler tabloda kalır. CANCELLED = 0 filtresi olmadan bakiye ve miktar şişer.
  • Kod ile join. CLFLINE.CLIENTREF, cari kodu değil CLCARD.LOGICALREF'tir. ON C.CODE = F.CLIENTREF yazarsanız sonuç boş döner.

Sık sorulanlar

Logo'da cari bakiye hangi kolonda? Hiçbir kolonda hazır durmaz. CLFLINE hareketlerinden SIGN (0 borç / 1 alacak) ile hesaplanır: bakiye = Σborç − Σalacak. Kart tablosu CLCARD'da bakiye alanı aramayın.

Stok eldeki miktarını neden yanlış alıyorum? Muhtemelen SUM(AMOUNT) kullanıyorsunuz. Doğru miktar için her satırı GETUNITCOEF (birim çevrimi) ve GETSTTRANSCOEF (giriş/çıkış yönü) ile çarpıp toplamanız gerekir; ayrıca CANCELLED = 0 filtresi şarttır.

GETSTTRANSCOEF fonksiyonu hata veriyor. İki nedeni olabilir: fonksiyon adı firma/dönem önekli olmalıdır (dbo.LG_323_01_GETSTTRANSCOEF) ve parametre sırası korunmalıdır. Örnekteki 10 parametreli imzayı birebir kullanın.

Belirli bir tarihe kadarki bakiyeyi nasıl alırım? Sorguya AND F.DATE_ <= @tarih koşulu ekleyin. Yürüyen bakiyeli ekstrede pencere fonksiyonu zaten satır satır birikimli bakiyeyi verir.


Bu hesapları elle kurmak yerine Erp Asistanı ile Türkçe "en yüksek borçlu 10 cariyi getir" ya da "X stoğunun eldeki miktarı" diye sorabilirsiniz; sistem Logo şemasına uygun (SIGN, GETSTTRANSCOEF, LOGICALREF bağları ve doğru önekler dahil) çalışan SQL'i üretir.

Mikro'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. Kredi kartı gerekmez.