STLINE dan Hizmet ve Malzemelere ulaşmak

Gönderen Konu: STLINE dan Hizmet ve Malzemelere ulaşmak  (Okunma sayısı 1091 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı feysummer

  • Yeni Kullanıcı
  • *
  • Karma: 0
STLINE dan Hizmet ve Malzemelere ulaşmak
« : 14.11.2020, 19:09 »
SELECT

CLC.DEFINITION_ AS 'Cari Hesap Ünvanı',
INV.FICHENO AS ''Fatura No',
ITM.CODE AS ''Malzeme Kodu',
ITM.NAME AS ''Malzeme Adı',
SRV.CODE AS ''Hizmet Kodu',
SRV.DEFINITION_ AS ''Hizmet Adı',
UNL.NAME AS ''Birim',
STL.AMOUNT AS ''Miktar',
STL.PRICE AS ''Birim Fiyat',
STL.VAT AS ''KDV Oranı',
STL.VATAMNT AS ''KDV Tutarı'

FROM LG_218_01_INVOICE INV

LEFT JOIN LG_218_CLCARD CLC ON CLC.LOGICALREF=INV.CLIENTREF
LEFT JOIN LG_218_01_STLINE STL ON STL.INVOICEREF=INV.LOGICALREF
LEFT JOIN LG_218_SRVCARD SRV ON SRV.LOGICALREF=STL.STOCKREF AND SRV.CARDTYPE=2
LEFT JOIN LG_218_ITEMS ITM ON ITM.LOGICALREF=STL.STOCKREF
LEFT JOIN LG_002_UNITSETL UNL ON UNL.LOGICALREF=STL.UOMREF

WHERE GRPCODE=2 AND INV.CANCELLED=0 AND INV.TRCODE IN(9,3,8,14)

fatura satırlarındaki malzeme ve hizmetleri ayrı ayrı görmek istiyorum. Fakat bu şekilde çalıştırdığımda bazı satırlarda şu şekilde bir çakışma tespit ettim:
STLINE tablosundaki STOCKREF değeri ile aynı olan hem ITEMS da satır var hem de  SRVCARD da. Dolayısıyla aşağıdaki gibi bir satırda hem malzeme hem ürün görünüyor. Ama faturanın orjinalinde orada sadece malzeme var. Bunun önüne nasıl geçebilirim ?

Çevrimdışı hyponectia

  • Logo Kullanıcısı
  • **
  • Karma: 0
  • hyponectia.com
Ynt: STLINE dan Hizmet ve Malzemelere ulaşmak
« Yanıtla #1 : 15.11.2020, 20:01 »
Merhaba,

CASE WHEN ile düzenleyebilirsiniz.

STLINE üzerinde LINETYPE ile kontrol edebilirsiniz.

Örnek:

CASE
WHEN STL.LINETYPE IN (0,6,7) THEN (SELECT CODE FROM LG_218_ITEMS WHERE LOGICALREF=STL.STOCKREF )
WHEN STL.LINETYPE=4 THEN (SELECT  CODE FROM LG_218_SRVCARD WHERE LOGICALREF=STL.STOCKREF)
END AS 'Malzeme/Hizmet Kodu'

Bu yapı ile genel olarak ITEMS ve SRVCARD tablolarına ayrıca bağlanmanıza gerek kalmaz ve ekstradan sütun belirtmenize gerek yok.

Kendi sorgunuzdaki gibi gözükmesini istiyorsanız da yine her bir sütun için CASE WHEN yazmanız gerekir.

Alternatif olarak da hizmet (LINETYPE=4) ve Ticari Mallar (0,6,7) için iki farklı sorgu oluşturup UNION ALL ile de birleştirebilirsiniz.

Kolay gelsin.

Çevrimdışı feysummer

  • Yeni Kullanıcı
  • *
  • Karma: 0
Ynt: STLINE dan Hizmet ve Malzemelere ulaşmak
« Yanıtla #2 : 19.11.2020, 16:43 »
@hypnotectia yanıtınız için teşekkürler. Bu şekilde yapınca oluyor. Şimdi ben rapora bir de satışın türünü ekleyeceğim; yani GO3 ve TG3 ile başlayan stoklar LOGO SATIŞ, 02 ve 07 kodlu hizmetler LOGO DESTEK, TDÜ ve DNM ile başlayan stoklar da DONANIM SATIŞ olarak listelenecek.

SELECT
INV.DATE_ AS 'Fatura Tarihi',
YEAR(INV.DATE_) AS 'Yıl',
CASE MONTH(INV.DATE_)
   WHEN 1 THEN 'Ocak'
   WHEN 2 THEN 'Şubat'
   WHEN 3 THEN 'Mart'
   WHEN 4 THEN 'Nisan'
   WHEN 5 THEN 'Mayıs'
   WHEN 6 THEN 'Haziran'
   WHEN 7 THEN 'Temmuz'
   WHEN 8 THEN 'Ağustos'
   WHEN 9 THEN 'Eylül'
   WHEN 10 THEN 'Ekim'
   WHEN 11 THEN 'Kasım'
   WHEN 12 THEN 'Aralık'
END AS 'Ay',
CLC.DEFINITION_ AS 'Cari Hesap Ünvanı',
INV.FICHENO AS 'Fatura No',
CASE INV.TRCODE
   WHEN 3 THEN 'Toptan Satış İade Ft.'
   WHEN 8 THEN 'Toptan Satış Ft.'
   WHEN 9 THEN 'Verilen Hizmet Ft.'
   WHEN 14 THEN 'Verilen Fiyat Farkı Ft.'
END AS 'Fatura Türü',
INV.SPECODE AS 'Özel Kod',
CASE
   WHEN STL.LINETYPE IN (0,6,7) THEN (SELECT CODE FROM LG_218_ITEMS WHERE LOGICALREF=STL.STOCKREF)
   WHEN STL.LINETYPE=4 THEN (SELECT CODE FROM LG_218_SRVCARD WHERE LOGICALREF=STL.STOCKREF)
END AS 'Malzeme / Hizmet Kodu',
CASE
   WHEN STL.LINETYPE IN (0,6,7) THEN (SELECT NAME FROM LG_218_ITEMS WHERE LOGICALREF=STL.STOCKREF)
   WHEN STL.LINETYPE=4 THEN (SELECT DEFINITION_ FROM LG_218_SRVCARD WHERE LOGICALREF=STL.STOCKREF)
END AS 'Malzeme / Hizmet',
UNL.NAME AS 'Birim',
STL.AMOUNT AS 'Miktar',
STL.LINENET AS 'Tutar',
STL.VATAMNT AS 'KDV',
(STL.LINENET+STL.VATAMNT) AS 'Toplam'


FROM LG_218_01_INVOICE INV

LEFT JOIN LG_218_CLCARD CLC ON CLC.LOGICALREF=INV.CLIENTREF
LEFT JOIN LG_218_01_STLINE STL ON STL.INVOICEREF=INV.LOGICALREF
LEFT JOIN LG_002_UNITSETL UNL ON UNL.LOGICALREF=STL.UOMREF


WHERE GRPCODE=2 AND INV.CANCELLED=0 AND INV.TRCODE IN(9,3,8,14)

şuan sorgu bu şekilde. Ben buraya

Kod: [Seç]
CASE
WHEN ITM.CODE LIKE 'GO3%' OR ITM.CODE LIKE 'TG3%' THEN 'LOGO SATIŞ'
WHEN SRV.CODE='02' OR SRV.CODE='07' THEN 'LOGO DESTEK'
WHEN ITM.CODE LIKE 'TDÜ%' OR ITM.CODE LIKE 'DNM%'
ELSE 'DİĞER'
END AS 'SATIŞ TÜRÜ'

bu kısmı eklemek istiyorum fakat sorgunun altındaki ITEMS VE SRVCARD JOIN lerini kaldırdığımız bu kısım çalışmayacak. Burayı nasıl düzenleyebilirim aynı şekilde çakışma olmadan

Çevrimdışı hyponectia

  • Logo Kullanıcısı
  • **
  • Karma: 0
  • hyponectia.com
Ynt: STLINE dan Hizmet ve Malzemelere ulaşmak
« Yanıtla #3 : 19.11.2020, 17:08 »
Oluşturmak istediğiniz çözüme bağlı biraz:

1- ITEMS ve SRVCARD tablolarında, SPECODE alanlarından birine bahsettiğiniz değerleri ekleyip, yine CASE WHEN ile getirebilirsiniz (bu sefer IT.CODE olmayacak, IT.SPECODE olacak mesela). Sonradan eklenen/güncellenen kartların kontrolü için de seçtiğiniz SPECODE alanını kuruluş bilgilerinde zorunlu hale getirip, özel kodun için tanımlamaları da yaparsanız, rapora her zaman bu seçili değerler gelir. 
2- Bir tane VIEW oluşturup (hem ITEMS hem de SRVCARD tablolarını UNION ALL ile bağlayıp, aşağıda bahsettiğiniz kuralları her bir satıra yazabilirsiniz - ITEMS ve SRVCARD üzerinde herhangi bir değişiklik yapmanıza gerek kalmaz), onun üzerinden satır bazında tekrardan bağlantı yapabilirsiniz.
3- Tablo açıp, tablo içinde sabit/dinamik bir liste oluşturabilirsiniz. SRVCARD ve ITEMS tablolarını bu yeni tabloya TRIGGERlar ile dinamik olarak bağlayıp, aşağıdaki sorgunuza yine CASE WHEN ile devam edebilirsiniz. VIEW ile aynı mantıkta çalışır ama çok uzun sürer.
4- MERGE kullanabilirsiniz (3'tekine benzer şekilde ama bunda trigger yazmanıza gerek kalmaz)
5- Aşağıda halihazırdaki sorgunuzda yer alan CASE WHEN'ler içindeki THEN'in karşılıklarını WHEN'in içine AND ile bağlayabilirsiniz.

Şimdilik aklıma gelenler bunlar.