dokuz-beyaz-logo

SQL Server Grouped Concatenation

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=9
AS
CREATE 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=@STOKKOD
AND TUR =1
GROUP BY TARIH,BELGENO
ORDER 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_TUKETIMLER
where BELGENO IN(SELECT BELGENO FROM TBLBELGE B
WHERE STOKKOD IN(SELECT MAMULKOD FROM TBLRECETE WHERE HAMKOD=@STOKKOD
)
AND TUR=-1)
AND HAMKOD=@STOKKOD
GROUP BY TARIH,BELGENO
--SELECT * FROM #TBLBAKIYE ORDER BY TARIH
--SELECT * FROM #HAMTABLO
--SELECT TARIH,BELGENO,MIKTAR FROM #TBLBAKIYE ORDER BY TARIH
DECLARE @TARIH AS DATE
DECLARE @BELGENO AS VARCHAR(50)
DECLARE @MIKTAR DECIMAL(18,2)
DECLARE @BAKIYE DECIMAL(18,2)=0
DECLARE @ESKIBELGE VARCHAR(50)
DECLARE @ESKIBAKIYE  DECIMAL(18,2)=0
DECLARE @BAKIYEBELGE VARCHAR(50) =''
DECLARE @DEVREDENBAKIYE DECIMAL(18,2)=0
Declare AA Cursor SCROLL FOR  SELECT TARIH,BELGENO,MIKTAR FROM #TBLBAKIYE ORDER BY TARIH
Open AA
--Select çekilen her değer @Y değişkenine aktarılır
Fetch next From AA INTO @TARIH,@BELGENO,@MIKTAR
While(@@Fetch_Status=0)
BEGIN
IF @BAKIYE=0
BEGIN
SET @BAKIYE =@MIKTAR
END
ELSE
BEGIN
SET @BAKIYE = @BAKIYE  + @MIKTAR
END
UPDATE #TBLBAKIYE  SET BAKIYE=@BAKIYE  WHERE TARIH=@TARIH AND BELGENO=@BELGENO
--UPDATE #TBLBAKIYE  SET ESKIBAKIYE=@ESKIBAKIYE WHERE TARIH=@TARIH AND BELGENO=@BELGENO
--set @ESKIBAKIYE=@BAKIYE
Fetch next From AA INTO @TARIH,@BELGENO,@MIKTAR
End
Close AA
Deallocate AA
DELETE FROM TBLBAKIYE WHERE STOKKOD =@STOKKOD
INSERT 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]
AS
DECLARE @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 NULL
BEGIN
Declare TT Cursor SCROLL FOR  SELECT DISTINCT HAMKOD FROM TBL_TMP_TUKETIMLER where HAMKOD IS NOT NULL
Open TT
Fetch next From TT INTO @HAMKOD
While(@@Fetch_Status=0)
BEGIN
PRINT 'EXEC SSP_VOI_3_YURUYENBAKIYE ' + @HAMKOD
EXEC SSP_VOI_3_YURUYENBAKIYE @HAMKOD
PRINT  @HAMKOD
Fetch next From TT INTO @HAMKOD
End
Close TT
Deallocate TT
END
ELSE
BEGIN
SELECT '0' AS SAYI
END
				
			

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

				
					DROP TABLE #T
select TARIH,BELGENO,SUM(TUKETMIKTAR*-1) MIKTAR
INTO #T
FROM TBL_TMP_TUKETIMLER
where BELGENO IN(SELECT BELGENO FROM TBLBELGE B
WHERE STOKKOD IN(SELECT MAMULKOD FROM TBLRECETE WHERE HAMKOD='AMB 012-5'
)
AND TUR=-1)
AND HAMKOD='AMB 012-5'
GROUP BY TARIH,BELGENO
SELECT * FROM #T
DECLARE @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 #T
GROUP BY TARIH, BELGENO,MIKTAR
ORDER BY TARIH, BELGENO;
UPDATE @t SET @BELGELER = BELGELER = COALESCE(
CASE COALESCE(@TARIH, N'')
WHEN TARIH THEN @BELGELER + N', ' + BELGENO
ELSE BELGENO END, N''),
@TARIH = TARIH;
SELECT TARIH, BELGELER = MAX(BELGELER),SUM(MIKTAR) MIKTAR
FROM @t
GROUP BY TARIH
ORDER 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.

Facebook
Pinterest
Twitter
LinkedIn

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir