Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » DJopek 21:39
 » rulezDC 21:34
 » dida 21:33
 » Artaa 21:32
 » past 21:32
 » leon 21:29
 » rad 21:28
 » KaszeL 21:28
 » Soulburne 21:26
 » P@blo 21:24
 » b0b3r 21:19
 » elliot_pl 21:09
 » Shark20 21:08
 » Sherif 21:06
 » g5mark 21:03
 » ThY 21:02
 » Ramen 21:02
 » bajbusek 20:56
 » Fasola 20:54
 » wrrr 20:53

 Dzisiaj przeczytano
 41112 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
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.

  1. 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"

  2. 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

    1. 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

    2. 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"

      1. 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"

      2. 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 indeksu

        https://www.siepomaga.pl/milosz-mosko

        1. 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"

          1. yeah, jestem dobry , Tomasz 28/12/11 12:25
            wiem o tym :)

            https://www.siepomaga.pl/milosz-mosko

            1. 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"

          2. 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"

            1. re: , Tomasz 28/12/11 13:28
              AAA.TwI_Ilosc, teraz AAA jest dla ciebie tabelą

              https://www.siepomaga.pl/milosz-mosko

              1. Działa , Glock19 28/12/11 21:27
                super....

            2. pokombinuj z where i parametrem daty SQL today , pol150257 28/12/11 14:08
              123

  3. 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)

    1. 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.

      1. 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