postgreSQL. Jak zamknac zamowienie jesli pozycje sa CLOSE?

0

Witam.
Mam taki problem. Dla przykladu podam podstawowe kolumny.
Sa zamowienia i do kazdego zamowienia moga byc jakies pozycje zamowienie
Mam dwie tabele

TABELA: zamowienia
id,status
1 , false
2 , false
3 , true

Poniezej jest tabela z pozycjami do zamowienia
TABELA pozycje_zamowienia
id,id_zamowienia,status
1 , 1, true
2 , 1, true
3 , 1 true

4 , 2 true
5 , 2 true

7 , 3 true
7 , 3 true

TRUE oznacza ze dana pozycja jest zamknieta
FALSE oznacza ze dana pozycja jest otwarta
i teraz tak na gridzie z bazy danych mam tak:

zamowienie 1: OTWARTE
pozycje: 1 - zamknieta
pozycja: 2 - zamknieta
pozycja: 3 - zamknieta

zamowienie 2: OTWARTE
pozycja: 1 - zamknieta
pozycja: 2 - zamknieta

zamowienie 3: ZAMKNIETE
pozycja: 1 - zamknieta
pozycja: 2 - zamknieta

I teraz nie wiem jak skonsturowac zapytanie ktore sprawdzi mi

SELECT (wybierz wszystkie zamowienia otwarte dla kazdego z nich
wybierz pozycje zamowienia i jesli wszytskie pozycje danego zamowienia
sa ZAMKNIETE to zaznacz zeby cale zamowienie tez ZAMKNAC)
FROM zamowienia
JOIN pozycje
WHERE statsu zamowienia = OTWARTE

Myslalem zeby zastosowac np funkcje moze
dac funkcje co by zwracala true jesli dla danego zamowienia wszytskie
pozycje bede true i dac false w przypadku gdy tylko jedna chociaz bedzie false

wtedy dac moze SELECT id , CASE CZY_SA_ZAMKNIETE(id_zamowienia) WHEN true THEN UPDATE status = CLOSE WHERE id = id_obecnego_zamowienia_wybranego_z_select END tylko nie wiem jak zrobic te funkcje

0
  1. a gdzie ma "zaznaczyć zeby cale zamowienie tez ZAMKNAC"?
  2. select NIE ZMIENIA danych w bazie, od tego jest update, insert, delete
0

no tu na koncu
wtedy dac moze SELECT id , CASE CZY_SA_ZAMKNIETE(id_zamowienia) WHEN true THEN UPDATE status = CLOSE WHERE id = id END tylko nie wiem jak zrobic te funkcje. czyli jesli funkcja zwroci ze wszystkie sa TRUE to zrobi update

0

to może jeszcze raz i prostym językiem NIE da się zrobić select i update w JEDNYM poleceniu.

0

Heh no faktoza, sprawdzilem i nie da sie.
Czyli co z tym zrobic? musze zaczac zaptanie od UPDATE
i tam umiescic warunek z funkcji?

0

ech

  1. jak chcesz zaktualizować status to musisz wtedy wysłać zapytanie mniej więcej takie
UPDATE zamowienia SET status = TRUE WHERE status = FALSE AND id NOT IN (SELECT DISTINCT id_zamowienia FROM pozycje_zamowienia WHERE status = FALSE)
  1. a jak chcesz pokazać w gridzie to trzeba zrobić SELECT
0

MisiekD zmien nika na BOG :)
No to ja sie tu mecze jak zrobic funkcje z FOR td a tu zadzialalo to co napisales
Moje zapytanie dokladnie wyglada tak:

SELECT id FROM orders WHERE state = FALSE AND canceled = FALSE AND id NOT IN (
SELECT DISTINCT order_id FROM orders_position WHERE done = FALSE) ORDER by id

czyli tak jak napiales. DISTINCT wysweitla ID jesli jakies dane sie powtarzaja wyswietla jedno tylko.
Czyli jesli w pozycjach zamowienia nigdzie nie ma false to ominie to zamowienie i ID danegozamowienia sie
nie wysweitli.

Pierwsza czesc SELECT id WHERE state = false i canceled = false
wysweitla mi wszystkie numery bez wzgledu na status pozycji zamowien
ale dodanie AND id NOT IN (zapytanie z distinct) sprawia ze ma nie wysweitlac tych numerow gdzie
jakas pozycja zamowienia jest zamknieta. To swietna sprawa. i to rozwiazuje moj problem.

zastosowanie selext a nie UPDATE bylo by sprawdzic ile wyskoczy zamowien
Ale po zmianie na update wszstko sie udalo

DZIEKUJE ZA POMOC. [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1