[sql] Grupy towarowe i ich różne poziomy + tłumaczenia

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Pawel Dworak
Posty: 5
Rejestracja: 11 mar 2019, 15:46
Rola: Inny
Wersja: 2022

[sql] Grupy towarowe i ich różne poziomy + tłumaczenia

Post autor: Pawel Dworak »

Witam,

Wszystkie towary u nas w CDN, mają przynajmniej grupy do czwartego poziomu. wiem jak pobrać pełną ścieżkę grupy

Kod: Zaznacz cały

select  
CDN.TwrGrupaPelnaNazwa(TG.TwG_GIDNumer) as 'Grupa Twr'
from cdn.TwrKarty TK
left join CDN.TwrGrupyDom as TGD ON TK.Twr_GIDTyp = TGD.TGD_GIDTyp AND TK.Twr_GIDNumer = TGD.TGD_GIDNumer 
left join CDN.TwrGrupy as TG ON TGD.TGD_GrOTyp = TG.TwG_GIDTyp AND TGD.TGD_GrONumer = TG.TwG_GIDNumer
Mam tez potworka do pobierania grupy pierwszego poziomu wraz z tłumaczeniem:

Kod: Zaznacz cały

SELECT top 1
	TwrGT.TLM_Tekst
	FROM CDN.TwrKarty AS TW
	JOIN CDN.TwrLinki AS T4 ON T4.TwL_GIDTyp=TW.TwR_GIDTyp AND T4.TwL_GIDNumer=TW.TwR_GIDNumer and T4.TwL_GrONumer <> 0
	left join cdn.Tlumaczenia TwrGT on t4.TwL_GrONumer = Twrgt.TLM_Numer  and t4.TwL_GrOTyp =twrgt.TLM_Typ  and Twrgt.TLM_Jezyk = 951 
	WHERE TwR_Typ=1  and tw.Twr_GIDNumer =  ze.ZaE_TwrNumer
Ale nie mogę stworzyć poprawnego zapytania, którego wynik da mi grupę drugiego i trzeciego poziomu i ich tłumaczenia języku angielskim.

Przykład:
Produkt X ma następującą grupę domyślną
OGRÓD/MEBLE/ZESTAWY MEBLI/ZESTAWY BALKONOWE
Potrzebuje zapytania, które w wyniku dam mi w oddzielnych kolumnach: "OGRÓD", "MEBLE","ZESTAWY MEBLI".

Czy jest ktoś wstanie mi podpowiedzieć jak dokować się do tych poszczególnych poziomów grup?

Awatar użytkownika
praiser
Posty: 685
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: [sql] Grupy towarowe i ich różne poziomy + tłumaczenia

Post autor: praiser »

Jest do tego funkcja

[CDN].[PobierzDrzewoGrupTowarowychKuKorzeniowi] (
@GIDNumer INT
, @GIDTyp SMALLINT = - 16
, @GrONumer INT = NULL
, @SciezkaTyp TINYINT = NULL
, @Separator VARCHAR(3) = '\'
--, @Kierunek TINYINT = 0
)

czyli wywołując ją z gidem ostatniego zagnieżdżenia zwróci wszystkie grupy w górę do korzenia
np:
select * from CDN.PobierzDrzewoGrupTowarowychKuKorzeniowi (5197, -16, NULL, NULL, '\') AS PobierzDrzewoGrupTowarowych_1

wynikiem będzie tabelka z którą można się już 'bawić'

Kod Nazwa GIDNumer GIDTyp GrONumer Poziom Sciezka
Grupa Główna Grupa Główna 0 -16 -1 1
TOWARY TOWARY 2 -16 0 1
PODTOWARY PODTOWARY 5195 -16 2 1


Jest też funkcja w drugą stronę:

[CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
@GIDNumer INT
, @GIDTyp SMALLINT = - 16
, @GrONumer INT = NULL
, @SciezkaTyp TINYINT = NULL
, @Separator VARCHAR(3) = '\'
--, @Kierunek TINYINT = 0
)

oraz funkcja do konkretnego miejsca w drzewie

ALTER FUNCTION [CDN].[PobierzDrzewoGrupTowarowych] (
@GIDNumer INT
, @GIDTyp SMALLINT = - 16
, @GrONumer INT = NULL
, @SciezkaTyp TINYINT = NULL
, @Separator VARCHAR(3) = '\'
, @Kierunek TINYINT = 0
)
--------------------------------
Pozdrawiam
WW

Lilpri
Posty: 127
Rejestracja: 13 maja 2019, 11:04
Rola: Administrator CDN XL

Re: [sql] Grupy towarowe i ich różne poziomy + tłumaczenia

Post autor: Lilpri »

Albo typowo TSQLowe rozwiązanie, które pobiera wszystkie poziomy grup

Kod: Zaznacz cały

BEGIN
		;

	WITH T (
		GidTyp
		,ID
		,GrTyp
		,GrNazwa
		,ParID
		,Poziom
		)
	AS (
		SELECT TGD_GIDTyp
			,TGD_GIDNumer
			,TGD_GrOTyp
			,TGD_Kod
			,TGD_Gronumer
			,0 AS poziom
		FROM cdn.twrgrupydom
		WHERE TGD_GrONumer = 0
		
		UNION ALL
		
		SELECT TGD_GidTyp
			,TGD_GIDNumer
			,TGD_GrOTyp
			,TGD_Kod
			,TGD_Gronumer
			,p.poziom + 1 AS poziom
		FROM T p
		INNER JOIN cdn.TwrGrupyDom c ON c.TGD_GrONumer = p.ID
			AND p.GidTyp = - 16
		WHERE c.TGD_Gronumer <> 0
		)
	SELECT *
	INTO #tmpTwrGr
	FROM T

	CREATE UNIQUE CLUSTERED INDEX UIX_2 ON #tmpTwrGr (
		GidTyp
		,ID
		)

	SELECT @poziom_max = MAX(poziom)
	FROM #tmpTwrGr

	SET @poziom = @poziom_max
	SET @sql = N''
	SET @kolumnyTwr = ''
	SET @i = 0

	WHILE @poziom >= 0
	BEGIN
		SET @sql = N'ALTER TABLE #tmpTwrGr ADD Poziom' + CAST(@poziom AS NVARCHAR) + N' nvarchar(40), PoziomID' + CAST(@poziom AS NVARCHAR) + N' nvarchar(40)'

		EXEC (@sql)

		IF @poziom = @poziom_max
		BEGIN
			SET @sql = N'UPDATE #tmpTwrGr
				SET PoziomID' + CAST(@poziom AS NVARCHAR) + '= ParID '

			EXEC (@sql)

			SET @sql = N'UPDATE #tmpTwrGr
				SET Poziom' + CAST(@poziom AS NVARCHAR) + ' = GrNazwa'

			EXEC (@sql)
		END
		ELSE
		BEGIN
			SET @sql = N'UPDATE c
				SET c.Poziom' + CAST(@poziom AS NVARCHAR) + N' = (
					CASE WHEN c.poziom <=' + CAST(@poziom AS NVARCHAR) + N' THEN CAST(c.GrNazwa AS nvarchar)
					ELSE CAST(p.GrNazwa AS nvarchar) END)  
				FROM #tmpTwrGr c
				LEFT JOIN #tmpTwrGr p
				ON c.PoziomID' + CAST(@poziom + 1 AS NVARCHAR) + '= p.ID and  p.GidTyp =-16'

			EXEC (@sql)

			SET @sql = N'UPDATE c
				SET c.PoziomID' + CAST(@poziom AS NVARCHAR) + N' = (
					CASE WHEN c.poziom <=' + CAST(@poziom AS NVARCHAR) + N' THEN CAST(c.ParID AS nvarchar)
					ELSE CAST(p.ParID AS nvarchar) END)  
				FROM #tmpTwrGr c
				LEFT JOIN #tmpTwrGr p
				ON c.PoziomID' + CAST(@poziom + 1 AS NVARCHAR) + '= p.ID and p.GidTyp =-16'

			EXEC (@sql)
		END

		SET @poziom = @poziom - 1
	END

	SET @kolumnyTwr = ''
	SET @i = 0

	WHILE (@i <= @poziom_max)
	BEGIN
		SET @kolumnyTwr = @kolumnyTwr + ',[Produkt - Grupa Poziom ' + LTRIM(@i) + '] = CASE WHEN TWRG.Poziom' + LTRIM(@i) + ' IS NULL THEN ''<nieznany>'' ELSE TWRG.Poziom' + LTRIM(@i) + ' END'
		SET @i = @i + 1
	END
END

Pawel Dworak
Posty: 5
Rejestracja: 11 mar 2019, 15:46
Rola: Inny
Wersja: 2022

Re: [sql] Grupy towarowe i ich różne poziomy + tłumaczenia

Post autor: Pawel Dworak »

Dzięki za podpowiedzi.

Na tą chwilę poczyniłem coś takiego:

Kod: Zaznacz cały

(select TwrGT.TLM_Tekst from(
		select top 1 GIDNumer from(
			select top 2  * from CDN.PobierzDrzewoGrupTowarowych(Twr_GIDNumer,16,null,null,'\',1)
			order by GIDNumer 
		)d order by GIDNumer desc
	)g
	left join cdn.Tlumaczenia TwrGT on g.GIDNumer = TwrGT.TLM_Numer  and TwrGT.TLM_Typ = '-16' and TwrGt.TLM_Pole =2 and TwrGT.TLM_Jezyk = 951  
)as Grupa1,
Zapytanie zwraca tłumaczenie danej grupy.
Da się to lepiej zrobić ?

ODPOWIEDZ