SQL Server Grouped Concatenation Quirky Update

Merhaba arkadaşlar;

Bu yazım’da sizlere sql server query ile, cursor kullanıp yürüyen bakiye oluşturmayı, oluşturulan yürüyen bakiyedeki satır satır oluşan belgeleri grouped concatenation ile birleştirmeyi göstermeye çalışacağım.

Yukarıdaki şekilde gördüğünüz belgeleri, aşağıdaki şekle dönüştürmeye yarayan kodlarımı sizlerle paylaşıp yazdığım kodları anlatmaya çalışacağım.

Şimdi yürüyen bakiye oluşturmak elbette önemli, Fakat burada yapmak istediğim şeyi sizlere şöyle özetleyeyim.

Bir Mamulün reçetesinde bir hammadde tanımlı ve söz konusu mamul satıldıkça hammaddelerin tüketilmesi gerekiyor.

Satıldıkça tüketilen ham maddeler sonucunda her günün sonunda bir bakiye oluşması gerekmekte.

Bir ham madde için reçete bazında yapılan tüketimlerin gün sonunda bir bakiye oluşmasını sağlamamız gerekiyor.

Bir stok yollayıp o stok’un yürüyen bakiyesini hesaplayan proc aşağıdaki gibidir.

Aşağıdaki cursor’e dikkat ederseniz, cursor kısmı tam olarak can alıcı noktadır.

ALTER PROC [dbo].[SSP_VOI_3_YURUYENBAKIYE]@STOKKOD AS VARCHAR(50),@ALISSATIS AS TINYINT=9ASCREATE TABLE #TBLBAKIYE(TARIH DATE,BELGENO VARCHAR(50),MIKTAR DECIMAL (18,2),BAKIYE DECIMAL(18,2))INSERT INTO #TBLBAKIYE(TARIH,BELGENO,MIKTAR)SELECT TARIH,BELGENO,SUM(MIKTAR*1) MIKTAR FROM TBLBELGE WHERE STOKKOD=@STOKKODAND TUR =1GROUP BY TARIH,BELGENOORDER BY TARIH--SELECT * FROM TBLBELGE WHERE STOKKOD='AMB 001-8'INSERT INTO #TBLBAKIYE(TARIH,BELGENO,MIKTAR)select TARIH,BELGENO,SUM(TUKETMIKTAR*-1) MIKTAR FROM TBL_TMP_TUKETIMLERwhere BELGENO IN(SELECT BELGENO FROM TBLBELGE BWHERE STOKKOD IN(SELECT MAMULKOD FROM TBLRECETE WHERE HAMKOD=@STOKKOD)AND TUR=-1)AND HAMKOD=@STOKKODGROUP BY TARIH,BELGENO--SELECT * FROM #TBLBAKIYE ORDER BY TARIH--SELECT * FROM #HAMTABLO--SELECT TARIH,BELGENO,MIKTAR FROM #TBLBAKIYE ORDER BY TARIHDECLARE @TARIH AS DATEDECLARE @BELGENO AS VARCHAR(50)DECLARE @MIKTAR DECIMAL(18,2)DECLARE @BAKIYE DECIMAL(18,2)=0DECLARE @ESKIBELGE VARCHAR(50)DECLARE @ESKIBAKIYE  DECIMAL(18,2)=0DECLARE @BAKIYEBELGE VARCHAR(50) =''DECLARE @DEVREDENBAKIYE DECIMAL(18,2)=0Declare AA Cursor SCROLL FOR  SELECT TARIH,BELGENO,MIKTAR FROM #TBLBAKIYE ORDER BY TARIHOpen AA--Select çekilen her değer @Y değişkenine aktarılırFetch next From AA INTO @TARIH,@BELGENO,@MIKTARWhile(@@Fetch_Status=0)BEGINIF @BAKIYE=0BEGINSET @BAKIYE =@MIKTARENDELSEBEGINSET @BAKIYE = @BAKIYE  + @MIKTARENDUPDATE #TBLBAKIYE  SET BAKIYE=@BAKIYE  WHERE TARIH=@TARIH AND BELGENO=@BELGENO--UPDATE #TBLBAKIYE  SET ESKIBAKIYE=@ESKIBAKIYE WHERE TARIH=@TARIH AND BELGENO=@BELGENO--set @ESKIBAKIYE=@BAKIYEFetch next From AA INTO @TARIH,@BELGENO,@MIKTAREndClose AADeallocate AADELETE FROM TBLBAKIYE WHERE STOKKOD =@STOKKODINSERT INTO TBLBAKIYE(TARIH,BELGENO,STOKKOD,MIKTAR,BAKIYE)SELECT TARIH,BELGENO,@STOKKOD,MIKTAR,BAKIYE FROM #TBLBAKIYE ORDER BY TARIH ASC

Yürüyen bakiye ssp sini tetikleyen ssp ise şu şekildedir.

ALTER PROC [dbo].[SSP_VOI_4_BAKIYELERIYURUT]ASDECLARE @HAMKOD AS VARCHAR(50)=''SET @HAMKOD = (SELECT TOP 1 HAMKOD FROM TBL_TMP_TUKETIMLER where HAMKOD IS NOT NULL GROUP BY HAMKOD)IF @HAMKOD IS NOT NULLBEGINDeclare TT Cursor SCROLL FOR  SELECT DISTINCT HAMKOD FROM TBL_TMP_TUKETIMLER where HAMKOD IS NOT NULLOpen TTFetch next From TT INTO @HAMKODWhile(@@Fetch_Status=0)BEGINPRINT 'EXEC SSP_VOI_3_YURUYENBAKIYE ' + @HAMKODEXEC SSP_VOI_3_YURUYENBAKIYE @HAMKODPRINT  @HAMKODFetch next From TT INTO @HAMKODEndClose TTDeallocate TTENDELSEBEGINSELECT '0' AS SAYIEND

Ekranda gördüğünüz görüntüyü oluşturabilmek için;

DROP TABLE #Tselect TARIH,BELGENO,SUM(TUKETMIKTAR*-1) MIKTARINTO #TFROM TBL_TMP_TUKETIMLERwhere BELGENO IN(SELECT BELGENO FROM TBLBELGE BWHERE STOKKOD IN(SELECT MAMULKOD FROM TBLRECETE WHERE HAMKOD='AMB 012-5')AND TUR=-1)AND HAMKOD='AMB 012-5'GROUP BY TARIH,BELGENOSELECT * FROM #TDECLARE @TARIH SYSNAME, @BELGENO NVARCHAR(MAX),@BELGELER NVARCHAR(MAX),@MIKTAR Decimal (18,2);DECLARE @t TABLE(TARIH SYSNAME, BELGENO SYSNAME, BELGELER NVARCHAR(MAX),MIKTAR DECIMAL(18,2)PRIMARY KEY (TARIH, BELGENO));INSERT @t(TARIH, BELGENO,MIKTAR)SELECT TARIH, BELGENO,MIKTAR FROM #TGROUP BY TARIH, BELGENO,MIKTARORDER BY TARIH, BELGENO;UPDATE @t SET @BELGELER = BELGELER = COALESCE(CASE COALESCE(@TARIH, N'')WHEN TARIH THEN @BELGELER + N', ' + BELGENOELSE BELGENO END, N''),@TARIH = TARIH;SELECT TARIH, BELGELER = MAX(BELGELER),SUM(MIKTAR) MIKTARFROM @tGROUP BY TARIHORDER BY TARIH;

Dinamik tablo (değişken) dolduran kod blok’unu inceleyebilirsiniz.

Burada amaç günlük oluşan ham madde bakiyelerinin hangi belgeler(satışlar) sonucunda oluştuğunun raporlanmasını sağlamak.