TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
do znawców MS SQL , Glock19 28/12/11 01:39 mam baze danych a w niej tabele
-Towary
-Ilosci
w tabeli towary są kolumny :
id_towaru,nazwa, kod
w tabeli ilosci
id_towaru,ilosc
za każdym razem jak pojawia się dokument (pz/wz...)
do bazy ilosci jest insertowany wpis z aktualnym stanem magazynowym
chciałbym napisać selecta który wyświetli
kod towaru + ilosc(aktualną czyli ostatni wpis w tabeli ilosci) na razie poradziłem sobie pętlą w PHP która za każdym razem zadaje to samo pytanie z id z tabeli towary.- jeśli w tabeli Ilosci brak daty/godziny stanu magazynowego lub identyfikatora stanu , bwana 28/12/11 06:49
to wydaje mi się że w ogóle nie ma jak określić ostatnio wstawionego wiersza.
Gdyby tabela Ilosci miała postać:
id_towaru, ilosc, data_stanu
lub
id_towaru, ilosc, id_stanu
gdzie id_stanu jest liczbą z sekwencji o gwarantowanym porządku to zapytanie mogłoby wyglądać tak:
select * from Ilosci where
id_towaru = parametr_id_towaru and
data_stanu = (select max(data_stanu) from Ilosci where id_towaru = parametr_id_towaru)
lub analogicznie
select * from Ilosci where
id_towaru = parametr_id_towaru and
id_stanu = (select max(id_stanu) from Ilosci where id_towaru = parametr_id_towaru)
Stan magazynowy zazwyczaj jest tak ważną informacją, że opatruje się go unikalnym identyfikatorem i zazwyczaj towarzyszy mu data/godzina (timestamp). Jesteś pewien, że model danych jest taki, jak napisałeś?
Wykonanie pętli (kursora) i wczytanie ostatniego wiersza jako najnowszego nie jest prawidłowe jeśli w kursorze nie ma klauzuli ORDER BY. Bez niej nie masz gwarancji, że otrzymasz w ostatnim wierszu ten rekord, który faktycznie ostatnio był wstawiony do bazy. Ponadto odczyt z bazy wielu rekordów po to tylko by odnaleźć ostatni w jakiejś grupie jest bardzo nieekonomiczną konstrukcją."you don't need your smile when I cut
your throat" - chodzi o coś w rodzaju Joina , Glock19 28/12/11 09:38
który wyswietli tabele z kodem i stanem magazynowym
na razie mam cos takiego
SELECT CDN.TwrIlosci.TwI_Ilosc,CDN.Towary.Twr_Kod
FROM CDN.TwrIlosci
JOIN CDN.TwrIlosci ON TwI_TwrId=CDN.Towary.Twr_TwrId
ale zwraca mi kolumne z iloscia wierszy z stanów magazynowych(wszystkich) a nie z iloscia towarów+ stanem oczywiscie w tabeli CDN.Twr_Ilosc jest kolumna TwI_Data z data stanu- zekwencja taka daje to samo: , Glock19 28/12/11 09:40
SELECT CDN.Towary.Twr_Kod, CDN.TwrIlosci.TwI_Ilosc
FROM CDN.Towary
JOIN CDN.TwrIlosci ON TwI_TwrId=CDN.Towary.Twr_TwrId - join to jedno, ale jak (na podstawie których kolumn) chcesz określić który stan magazynowy , bwana 28/12/11 10:21
dla danego towaru jest "bieżący"? jeśli model danych jest taki, jak opisałeś, to nie ma takiej możliwości.
Pierwszy JOIN którego wpisałeś to złączenie tabeli z nią samą (CDN.TwrIlosci join CDN.TwrIlosci) więc w wyniku powinieneś dostać komunikat o błędzie (z powodu odwołania do CDN.Towary.Twr_Kod w SELECT) a nie:
- jedną kolumnę z ilością wierszy (dlaczego z ilością wierszy? nie robiłeś żadnego count()-a,
- jedną kolumnę z ilościami w poszczególnych stanach
- dwie kolumny tj. TwI_Ilosc, Twr_Kod.
Być może takie wyrażenie Ci pomoże:
select towary.kod, ilosci.ilosc
from towary join ilosci on towary.towar_id = ilosci.towar_id
where ilosci.data = (select max(data) from ilosci where towar_id=towary.towar_id)
and towary.towar_id = parametr_towar_id
dostaniesz w wyniku jedną linię: kod towaru i jego stan magazynowy przy najwyższej dacie. Jeżeli w tabeli Ilosci nie ma stanów magazynowych przyszłych (zaplanowanych), to w ten sposób otrzymasz stan bieżący. Jeżeli stany magazynowe dla danego towaru zmieniają się częściej niż wartości w kolumnie TwI_Data to możesz mieć problem.
W tabeli Twr_Ilosci powinno być spełnione wymaganie, że (towar_id, data) jest unikalne. Nie musi być to constraint, wystarczy, że dane takie są.
"parametr_towar_id" to id towaru o którego stan pytasz. Jeśli usuniesz ostatnią linię z mojego "zapytania" to uzyskasz unikalną listę wszystkich towarów które mają jakiekolwiek stany magazynowe i przy każdym z towarów będzie bieżący stan magazynowy (przy założeniu, że stanów przyszłych/planowanych w tej tabeli nie ma).
Pomogłem?"you don't need your smile when I cut
your throat" - w międzyczasie doczytałem i pierwsze zastrzeżenie w mojej odpowiedzi jest nieprawdziwe , bwana 28/12/11 10:25
tzn. doczytałem, że jest "data stanu" i znaczy to że "jest taka możliwość":-)"you don't need your smile when I cut
your throat" - mała errata; pewniej i (moze) szybciej , Tomasz 28/12/11 11:43
SELECT
t.Twr_Kod, i.Ilosc
FROM [dbo].[Towary] AS t
OUTER APPLY (SELECT TOP 1 * FROM [dbo].[TwrIlosci] AS i
WHERE [t].[Twr_Kod] = [i].[Twr_Kod] ORDER BY "data" DESC) AAA
WHERE [t].[Twr_Kod] = xxx
Dzieki temu a) dostaniesz zawsze wszystkie towary, nawet te z iloscia NULL, b) Top 1 * Order By jest szybsze zazwyczaj bo pewnie uzyje sobie indeksuhttps://www.siepomaga.pl/milosz-mosko - I tu wygrywasz znając specyfikę MS SQL , bwana 28/12/11 12:22
:-)"you don't need your smile when I cut
your throat" - yeah, jestem dobry , Tomasz 28/12/11 12:25
wiem o tym :)https://www.siepomaga.pl/milosz-mosko - bezczelny , bwana 28/12/11 21:56
ale i tak masz ode mnie lajka:-D
LIKE '%'"you don't need your smile when I cut
your throat"
- kurde cos mi ciągle nie działa , Glock19 28/12/11 13:14
SELECT t.Twr_Kod, t.Twr_TwrId, i.TwI_Ilosc
FROM [CDN].[Towary] AS t
OUTER APPLY (SELECT TOP 1 * FROM [CDN].[TwrIlosci] AS i
WHERE [t].[Twr_TwrId] = [i].[TwI_TwrId] ORDER BY "TwI_Data" DESC) AAA
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "i.TwI_Ilosc" could not be bound.
jak usune z pierwszej lini i.TwI_Ilosc
to mam tabele kodów z ich ID a nie mam ilosci na magazyne.
Widok niestey pokazuje tylko stany przy inwenturze a nie na "teraz"- re: , Tomasz 28/12/11 13:28
AAA.TwI_Ilosc, teraz AAA jest dla ciebie tabeląhttps://www.siepomaga.pl/milosz-mosko - Działa , Glock19 28/12/11 21:27
super....
- pokombinuj z where i parametrem daty SQL today , pol150257 28/12/11 14:08
123
- Jezeli to jest CDNXL , pol150257 28/12/11 11:47
to zobacz gotowy widok Comarch "Stan magazynu na dzien" (nie mialem do czynienia od paru miesiecy nie pamietam dokladnej nazwy widoku)- dobra widze ze to jest Optima , pol150257 28/12/11 11:49
Nie mialem z tym wynalazkiem za duzo do czynienia, ale tam tez powinnien byc podobny widok.- cdzieki , Glock19 28/12/11 12:10
jest widok Zasoby i tam jest to co potrzebuje.
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|