SQL - drzewo grup towarowych

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

Moderator: mikey

Kris86
Posty: 206
Rejestracja: 09 wrz 2021, 18:27
Rola: Administrator CDN XL
Wersja: 2019

SQL - drzewo grup towarowych

Post autor: Kris86 »

Witam,
Z XL:
Jak wyglądałoby zapytanie SQL po stronie DB.
Chcę uzyskać w formie tekstowej drzewo, tylko grup towarowych z jego poziomami/pod poziomami, bez indeksów towarowych w tych grupach.

Chodzi mi po głowie coś takiego:
Grupa -> Podgrupa1 -> Podgrupa1.1 -> Podgrupa1.2
Grupa -> Podgrupa1 -> Podgrupa1.1 -> Podgrupa1.2 -> Podgrupa1.3
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.2
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.1.1
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.2 -> Podgrupa2.2.1
... itd

w zapisie:

Kod: Zaznacz cały

\\Grupa\Podrupa1\Podgrupa1.1\Podgrupa1.2
\\Grupa\Podrupa1\Podgrupa1.1\Podgrupa1.2\Podgrupa1.3
\\Grupa\Podrupa2\Podgrupa2.1\Podgrupa2.2
... itd
Grupa - to korzeń główny struktury drzewa

Dziękuję za wszelką pomoc.

Misek
Posty: 40
Rejestracja: 09 wrz 2014, 08:39
Rola: Administrator CDN XL
Wersja: 2016
Lokalizacja: Wrocław

Re: SQL - drzewo grup towarowych

Post autor: Misek »

Kod: Zaznacz cały

SELECT cdn.TwrGrupaPelnaNazwa (GIDNumer), * FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
   0
  ,-16
  ,-1
  ,NULL
  ,'|')

mirek_s
Posty: 36
Rejestracja: 14 lip 2008, 19:36
Rola: Użytkownik CDN XL
Wersja: 2023

Re: SQL - drzewo grup towarowych

Post autor: mirek_s »

Czy można uzyskać info na temat parametrów funkcji
PobierzDrzewoGrupTowarowychKuLisciom

przypuszczam że

@GIDNumer INT to <ID Grupy nadrzędnej>
, @GIDTyp SMALLINT = - 16 ???
, @GrONumer INT = NULL ???
, @SciezkaTyp TINYINT = NULL ???
, @Separator VARCHAR(3) = '\' to < separator rozdzielający poszczególne poziomy>

Czy można prosić o podpowiedź ?

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

Re: SQL - drzewo grup towarowych

Post autor: praiser »

@SciezkaTyp i @Separator obecnie nic nie robią, ponieważ funkcja została uproszczona. Parametry funkcji wciąż istnieją, więc trzeba je przekazać, ale nie mają wpływu na wynik.

@GidNumer to numer grupy lub towaru zależy od tego co przekazujesz w @GidTyp, który wskazuje typ obiektu, domyślnie -16 czyli grupa towarowa ale można przekazać 16 czyli typ indeksu towarowego i wtedy dostaniesz grupy w których towar z @Gidnumer się znajduje.

opis funkcji jednak wskazuje jasno, że funkcja nie tworzy drzewa „ku liściom” dla towarów zatem dla typ 16 (towar) nie bardzo się nadaje

@GrONumer (domyślnie NULL) też praktycznie stracił znaczenie po re-faktoryzacji funkcji (zamiana TwrGrupy na TwrLinki) więc nie ma co sobie nim zaprzątać głowy.

czyli drzewo dla grupy począwszy od grupy nr 6 w dół ku liściom wywołasz tak

SELECT cdn.TwrGrupaPelnaNazwa (GIDNumer),
* FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
6
,-16
,NULL
,NULL
,NULL)

A np. grupy dla indeksu o numerze 6 - trzeba dołożyć warunek filtrujący żeby zawęzić wynik i odczytać nazwę z GroNumer a nie GidNumer (ale bez budowy drzewa)

SELECT
cdn.TwrGrupaPelnaNazwa(GroNumer),
* FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
6
,16
,NULL
,NULL
,NULL)
where GidNumer=6
--------------------------------
Pozdrawiam
WW

mirek_s
Posty: 36
Rejestracja: 14 lip 2008, 19:36
Rola: Użytkownik CDN XL
Wersja: 2023

Re: SQL - drzewo grup towarowych

Post autor: mirek_s »

Dziękuję za odpowiedź. Męczyłem się z tabelą TwrGrupy, a tu teraz to Twrlinki.
Ja mam ten sam towar w kilku grupach i jak ma dzisiaj wyglądać zapytanie, które zwraca całą ścieżkę grup i indeks towarowy.
Czy można jakąś podpowiedź.

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

Re: SQL - drzewo grup towarowych

Post autor: praiser »

Jeśli chcesz zwrócić indeksy z grupami do których należą to użyj innej funkcji, CDN.BudujTwrLinkiKuKorzeniowi.

Kod: Zaznacz cały

SELECT 
    towar.Twr_Kod,
    towar.Twr_Nazwa,
    cdn.TwrGrupaPelnaNazwa(link.GrONumer) AS PelnaNazwaGrupy,
    link.GrONumer,
    link.Lisc,
    link.LiczbaPowtorzen
FROM CDN.TwrKarty towar
OUTER APPLY CDN.BudujTwrLinkiKuKorzeniowi(towar.Twr_GidNumer, 16) link
WHERE towar.Twr_Archiwalny = 0
    AND link.Lisc = 1  -- oznacza najniższy poziom przypisania towaru w hierarchii danej gałęzi
Jeśli towar jest w kilku grupach jednocześnie, zwróci osobny wiersz dla każdej grupy.
Jeśli towar jest na kilku poziomach tego samego drzewa, liczba powtórzeń najwyższego poziomu wskaże ilość ścieżek w dół.
--------------------------------
Pozdrawiam
WW

ODPOWIEDZ