Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

Przyjrzyjcie sie prosze tej tabelce:

Obrazek


Legenda:
IT (pojedynczy produkt)
BP (dwa zlaczone produkty np promocja "2 za 1"
CS (skrzynka,paczka)
PAL (paleta)

To co chce zrobic to kwerenda sprawdzajaca czy waga nizszego poziomu jest mniejsza / rowna wadze poziomu wyzszego. Oczywiscie zrobienie takiej walidacji kazdej jednostki do poziomu jednostki podstawowej ( w tym wypadku CS) jest proste. Mi jednak chodzi o sprawdzenia takie : waga IT do waga BP, waga BP do wagi CS, waga CS do wagi PL. Oczywiscie trzeba pamietac ze poziomow moze byc wiecej.

Bede wdzieczny za pomoc w tej kwerendzieRadosław Dumania edytował(a) ten post dnia 16.03.12 o godzinie 12:32
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

A skąd mam wiedzieć co że kolejność jest taka it->bp->cs>pal?
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

hmm. to jest wlasnie podchwytliwosc jedna.

Kolejnosc mozna wykazac w tym cwiczeniu : mianownik / licznik i ustawic w kolejnosci rosnacejRadosław Dumania edytował(a) ten post dnia 16.03.12 o godzinie 13:10
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

No to cos się nie zgadza, bo chcesz uzyskać kolejnosć taką

it->bp->cs>pal

a rosnąco licznik/mianownik będzie odwrotnie, więc chyba malejąco:

it(16)->bp(4)->cs(1)>pal(1/50)
?
edit: mianownik/licznik z rozpędu widziałem to matematycznieMichał Dziubek edytował(a) ten post dnia 16.03.12 o godzinie 13:22
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

Klucz do sukcesu to stworzyć lp dla produktu i jednostki, później to już tylko złączenie:

SELECT poziom1.material,
poziom1.jednostka & " -> " & poziom2.jednostka AS porownanie,
poziom1.waga,
poziom2.waga
FROM (SELECT produkty.material,
produkty.jednostka,
produkty.waga,
produkty.mianownik / produkty.licznik AS or,
(SELECT COUNT(*)
FROM produkty AS rn
WHERE produkty.mianownik / produkty.licznik >
rn.mianownik / rn.licznik
AND rn.material = produkty.material) AS lp
FROM produkty) poziom1
INNER JOIN (SELECT produkty.material,
produkty.jednostka,
produkty.waga,
produkty.mianownik / produkty.licznik AS or,
(SELECT COUNT(*)
FROM produkty AS rn
WHERE produkty.mianownik / produkty.licznik >
rn.mianownik / rn.licznik
AND rn.material = produkty.material) AS lp
FROM produkty) AS poziom2
ON poziom1.lp = poziom2.lp - 1
AND poziom1.material = poziom2.material
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

Dzieki. To bardzo pomocne :)

A czy jeszcze moglbym prosic o trzy dodatkowe kolumny w rezultacie :) ?

W pierwszej mnoznik , w drugiej wynik przeliczenia (waga nizszego poziomu * mnoznik), a w trzeciej sprawdzenie wykalkulowanej wagi i wagi oryginalnej
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

W moim zapytaniu nie widze iloczynów, wiec nie wiem o jaki mnoznik Ci chodzi...
Ale teraz odwrócmy rolę, ja już pokazałem, że coś potrafię, teraz czas na Ciebie, napisz co zrobileś i z czym masz problem.
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

No ja to w tym wypadku niewiele pokaze bo poziom zaawansowania tej kwerendy przekracza moje umiejetnosci obecnie :) Nie rozumiem troche jednej rzeczy - na ktorej utknalem:

to co zrobilem to po prostu zastosowalem Twoja kwerende :)

Nie rozumiem tego :

ON poziom1.lp = poziom2.lp - 1

Kwerenda nie otwiera sie w widoku projektu. Wyskakuje blad:
"Microsoft Access can't represent the join expression poziom1.lp = poziom2.lp - 1 in Desig view"

W momencie kiedy zmienie na:
ON poziom1.lp = poziom2.lp

moge otworzyc widok projektu, ale po uruchomieniu kwerendy otrzymuje porownanie tych samych poziomow tzn CS -> CS , CU -> CU

W tym punkcie dobre jest to ze moge dodac obliczenie mnoznika i kalkulowanie wagi. Jednak przywrocenie pozniej oryginalnego zapisu:

ON poziom1.lp = poziom2.lp - 1

powoduje blad :Type mismatch in expression
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

Glupi jestem :)

Zamiast :

ON poziom1.lp = poziom2.lp - 1

pisalem
ON poziom1.material = poziom2.material - 1

Chyba za dlugo przed monitorem siedze dzis :)

Teraz juz sobie tam rade: wynik pokaze jak skoncze :)

PzdrRadosław Dumania edytował(a) ten post dnia 16.03.12 o godzinie 18:09
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

Kluczem do zrozumienia tej kwerendy jest to podzapytanie:
SELECT produkty.material, 
produkty.jednostka,
produkty.waga,
produkty.mianownik / produkty.licznik AS or,
(SELECT COUNT(*)
FROM produkty AS rn
WHERE produkty.mianownik / produkty.licznik >
rn.mianownik / rn.licznik
AND rn.material = produkty.material) AS lp
FROM produkty


Które zwraca mi poziom zagłębienia danej jednostki, odpal je sobie samo i przyjrzyj kolumnie lp.=>
jeżeli chce poznać jak jednostka jest niżej to muszę popatrzyc na lp - 1
Dlatego połączenie tych dwóch podzapytań tak wygląda, czyli weź wszystkie jednoski i połącz z poziomem niżej (lp-1)

błąd wynika z tego, że QBE nie potrafi odwzorować graficznie takie sprzężenia, ale jak chce się wykonywać coś więcej niż tylko select-y to warto pouczyć się sql-a
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Kwerenda sprawdzajaca wage poziomow logistycznych w...

A teraz zagadka :)

Kwerenda wyglada tak: ( z gory przepraszam za brak formatowania)

SELECT poziom1.material, [poziom1].[jednostka] & " -> " & [poziom2].[jednostka] AS porownanie, poziom1.jednostka, poziom2.jednostka, poziom1.waga, poziom2.waga, poziom1.mianownik, poziom2.mianownik, poziom1.licznik, poziom2.licznik, IIf([poziom1]![licznik]=1,[poziom2]![mianownik]/[poziom1]![mianownik],[poziom1]![licznik]/[poziom2]![licznik]) AS Multiplier, [poziom2]![waga]*[Multiplier] AS Calculated_Upper_Level_Gross, IIf([poziom1]![waga]=0 Or [poziom2]![waga]=0 Or [Calculated_Upper_Level_Gross]>[poziom1]![waga],"issue","") AS [Check]
FROM (SELECT produkty.material, produkty.[jednostka], produkty.[waga], produkty.[mianownik], produkty.[licznik], produkty.[mianownik]/produkty.[licznik] AS [or], (SELECT COUNT(*) FROM produkty AS rn WHERE produkty.mianownik / produkty.licznik > rn.mianownik / rn.licznik AND rn.material = produkty.material) AS lp FROM produkty) AS poziom1 INNER JOIN (SELECT produkty.material, produkty.[mianownik], produkty.[licznik], produkty.[jednostka], produkty.[waga], produkty.[mianownik]/produkty.[licznik] AS [or], (SELECT COUNT(*) FROM produkty AS rn WHERE produkty.mianownik / produkty.licznik > rn.mianownik / rn.licznik AND rn.material = produkty.material) AS lp FROM produkty) AS poziom2 ON (poziom1.lp = poziom2.lp - 1) AND (poziom1.material = poziom2.material);

Tabela wyglada tak:
Nazwa: produkty
Pola:
material: tekst
jednostka: tekst
licznik: long integer
mianownik: long integer
waga: double, 2 miejsca po przecinku

Przy takich danych w tabeli kwerenda pokazuje nieprawidlowo issue:

material jednostka licznik mianownik waga Weight unit
202890 CS 1 1 0.466 KG
202890 PAL 360 1 167.76 KG

Bede wdzieczny za wskazowke
pzdr

Następna dyskusja:

Kwerenda SQL przez VBA




Wyślij zaproszenie do