Erp Asistanı Erp Asistanı
Logo SQL

Logo Hazır SQL Sorguları: Kopyala-Çalıştır 8 Örnek (GO 3/Tiger)

5 dk okuma Erp Asistanı
Logo Hazır SQL Sorguları: Kopyala-Çalıştır 8 Örnek (GO 3/Tiger)

Logo (Tiger, GO 3, GO Plus) veritabanından hızlı rapor almak isteyenler için en çok ihtiyaç duyulan 8 SQL sorgusunu bir araya getirdik: aktif cari ve stok listesi, satış irsaliyeleri, en çok satan ürünler, cari bakiye, açık siparişler, net stok miktarı ve aylık ciro. Sorguların tamamı gerçek bir Logo GO 3 veritabanında çalıştırılıp doğrulanmıştır.

Önce şu iki kuralı bilin

Logo sorguları iki noktada diğer ERP'lerden ayrılır:

  1. Tablo ve fonksiyon adları firma/dönem önekli. Aşağıdaki sorgularda tabloları mantıksal adıyla (ITEMS, STLINE) yazdık. Kendi veritabanınızda başına önek eklemelisiniz: kart tabloları LG_{firma}_ (örneğin LG_323_ITEMS), hareket/fiş tabloları LG_{firma}_{dönem}_ (örneğin LG_323_01_STLINE). Fonksiyonlar da önekli: dbo.LG_323_01_GETUNITCOEF(...).
  2. ACTIVE = 0 aktif demektir ve ilişkiler LOGICALREF sayısal anahtarıyla kurulur (kodla değil).

Örneğin 323 numaralı firma, 1. dönem için ilk sorgunun tam (önekli) hali şöyle olur:

SELECT CODE, DEFINITION_, CITY, TAXNR
FROM LG_323_CLCARD
WHERE ACTIVE = 0
ORDER BY CODE;

Aşağıda okunabilirlik için önekleri kaldırdık; kendi firma/dönem numaranızı ekleyerek çalıştırın.

1. Aktif cari kartları

SELECT CODE, DEFINITION_, CITY, TAXNR
FROM CLCARD
WHERE ACTIVE = 0
ORDER BY CODE;

CLCARD firma-master tablodur (LG_{firma}_CLCARD). Ünvan DEFINITION_, aktiflik ACTIVE = 0.

2. Stok kartları (KDV oranıyla)

SELECT CODE, NAME, VAT
FROM ITEMS
WHERE ACTIVE = 0
ORDER BY CODE;

ITEMS.VAT doğrudan yüzde orandır (Mikro'daki gibi bir "pointer" değildir). Stok adı NAME, kodu CODE.

3. Bu dönem satış irsaliyeleri

SELECT F.DATE_, F.FICHENO, C.CODE AS cari_kod, C.DEFINITION_ AS cari_ad, F.NETTOTAL
FROM STFICHE F
JOIN CLCARD C ON C.LOGICALREF = F.CLIENTREF
WHERE F.TRCODE = 8 AND F.IOCODE = 3 AND F.CANCELLED = 0
ORDER BY F.DATE_ DESC;

Satış irsaliyesi = TRCODE = 8, IOCODE = 3 (çıkış). Cari bağı CLIENTREF = CLCARD.LOGICALREF. Tarih kolonu DATE_ (alt çizgiyle).

4. En çok satan 10 ürün (miktar bazlı)

SELECT TOP 10 I.CODE, I.NAME,
       SUM(SL.AMOUNT * dbo.GETUNITCOEF(SL.UINFO1, SL.UINFO2)) AS toplam_miktar
FROM STLINE SL
JOIN ITEMS I ON I.LOGICALREF = SL.STOCKREF
WHERE SL.LINETYPE = 0 AND SL.CANCELLED = 0 AND SL.TRCODE = 8
GROUP BY I.CODE, I.NAME
ORDER BY toplam_miktar DESC;

LINETYPE = 0 indirim/promosyon satırlarını dışarıda bırakır. Miktar ana birime GETUNITCOEF(UINFO1, UINFO2) ile çevrilir (fonksiyon da önekli: dbo.LG_{firma}_{dönem}_GETUNITCOEF).

5. En yüksek borçlu 5 cari

SELECT TOP 5 C.CODE, C.DEFINITION_,
       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 F.CANCELLED = 0
GROUP BY C.CODE, C.DEFINITION_
HAVING SUM(CASE WHEN F.SIGN = 0 THEN F.AMOUNT ELSE -F.AMOUNT END) > 0
ORDER BY bakiye DESC;

Cari bakiye CLFLINE hareketlerinden hesaplanır: SIGN = 0 borç, SIGN = 1 alacak. Bakiye = borç − alacak.

6. Açık sipariş kalemleri (kalan miktarıyla)

SELECT O.FICHENO, C.CODE AS cari, I.CODE AS stok,
       OL.AMOUNT, OL.SHIPPEDAMOUNT, (OL.AMOUNT - OL.SHIPPEDAMOUNT) AS kalan
FROM ORFLINE OL
JOIN ORFICHE O ON O.LOGICALREF = OL.ORDFICHEREF
JOIN ITEMS I  ON I.LOGICALREF = OL.STOCKREF
JOIN CLCARD C ON C.LOGICALREF = OL.CLIENTREF
WHERE OL.CLOSED = 0 AND OL.CANCELLED = 0 AND (OL.AMOUNT - OL.SHIPPEDAMOUNT) > 0
ORDER BY O.FICHENO;

Açık kalem: sevk edilmemiş (CLOSED = 0) ve kalanı (AMOUNT − SHIPPEDAMOUNT) sıfırdan büyük satırlar.

7. Bir stoğun net miktarı (giriş − çıkış)

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;

Yönü (giriş +, çıkış −) GETSTTRANSCOEF verir; miktarı birim katsayısıyla GETUNITCOEF düzeltir. Yönü tek başına IOCODE'dan çıkarmayın — iade ve özel işlemlerde yanılırsınız.

8. Aylık satış cirosu (faturadan)

SELECT YEAR(DATE_) AS yil, MONTH(DATE_) AS ay,
       COUNT(*) AS fatura_adedi, SUM(NETTOTAL) AS ciro
FROM INVOICE
WHERE TRCODE = 8 AND CANCELLED = 0
GROUP BY YEAR(DATE_), MONTH(DATE_)
ORDER BY yil DESC, ay DESC;

Satış faturaları INVOICE başlık tablosunda TRCODE = 8 ile tutulur; net tutar NETTOTAL. İptalleri (CANCELLED = 0) dışlamayı unutmayın.

Sık sorulanlar

Bu sorguları doğrudan çalıştırınca "Invalid object name" alıyorum. Logo tablo ve fonksiyon adları firma/dönem önekli olduğundan mantıksal adlar tek başına çalışmaz. Kart tablolarına LG_{firma}_, hareket tablolarına ve fonksiyonlara LG_{firma}_{dönem}_ önekini ekleyin (örneğin LG_323_01_STLINE, dbo.LG_323_01_GETUNITCOEF).

Satış ile alışı nasıl ayırırım? Stok tarafında TRCODE + IOCODE birlikte okunur; satış tipik olarak TRCODE = 8, IOCODE = 3. Fatura tarafında satış INVOICE.TRCODE = 8'dir. Kendi verinizde GROUP BY TRCODE, IOCODE ile dağılımı bir kez teyit edin.

Neden SUM(AMOUNT) yanlış miktar veriyor? İki nedenle: farklı birimlerden girilen satırlar ana birime çevrilmeden toplanır (GETUNITCOEF gerekir) ve giriş/çıkış yönü hesaba katılmaz (GETSTTRANSCOEF gerekir). Net miktar için 7. sorgudaki deseni kullanın.

Cari bakiye kartta yok mu? Hayır; Logo bakiyeyi CLCARD'da tutmaz, CLFLINE hareketlerinden SIGN (0 borç / 1 alacak) ile hesaplarsınız. Detaylı ekstre için ayrı yazımıza bakın.


Bu sorguları elle yazmak yerine Erp Asistanı ile Türkçe sorabilirsiniz: "bu dönem en çok satan 10 ürünü getir" dersiniz, sistem Logo şemasına uygun (LG önekleri, LOGICALREF bağları, doğru fonksiyonlar dahil) çalışan SQL'i üretir; kopyalayıp çalıştırırsınız.

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.