2013-10-03 18 views
5

Buduję Inwentaryzację za pomocą PhoneGap.In, że mam jeden moduł STOCK do zarządzania zapasami.Wstaw lub zamień na sumę starych wartości

Zdjęcie Tabela Query

CREATE TABLE STOCK (
    sto_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    pro_id INTEGER FOREIGNKEY REFERENCES PRODUCT(pro_id) UNIQUE, 
    quantity TEXT 
) 

INSERT OR REPLACE Zapytanie

INSERT OR REPLACE INTO STOCK (pro_id,quantity) VALUES ("1","5"); 

Tam nie ma ani jednego problemu z tego zapytania jego pracę doskonale, ale chcę zaktualizować SUM w starych wartości Z NOWYM JEDNYM.

Przykład:

pro_id quantity 
1  5 

ten rekord istniejący więc teraz, kiedy zadziała powyżej zapytania dla nowych transakcji, która ma 3 ilość następnie quantity should be (5 (old) + 3 (new)) = 8.

Więc po rekord updateing to wygląda.

pro_id quantity 
1  8 

Jak mogę rozwiązać ten pomysł. lub daj mi znać, jeśli jestem w niewłaściwy sposób. Dzięki.

+0

Proponuję WSTAWIĆ nowe rekordy, które nie istnieją w tabeli, sprawdzając je przed wstawieniem. Następnie AKTUALIZUJ istniejące, zwiększając/zmniejszając ich kwotę za pomocą "quantity = quantity +" 5 '". – Ouscux

Odpowiedz

6

Właściwie nie jestem prawdziwym twórcą tego rozwiązania. Prawdziwym bohaterem jest Daverandom, dzięki niemu mogę rozwiązać mój problem.

Zaproponował mi rozwiązanie follow this i jest to bardzo pomocne przy znajdowaniu mojego rozwiązania.

Starsze zapytanie wygląda jak

INSERT OR REPLACE INTO STOCK (pro_id,quantity) VALUES ("1","5"); 

New Query wygląda jak

INSERT OR IGNORE INTO STOCK (pro_id,quantity) VALUES (1,0) ; 
UPDATE STOCK SET quantity = quantity + 2 WHERE pro_id=1; 

Aktualizacja:

Jeśli nie doda WHERE pro_id="val" w aktualizacji to będzie zaktualizować wszystkie wiersze . W ten sposób wygeneruje odpowiedni wynik.

Kiedy zapytania ogień użytkownik po raz pierwszy wtedy ilość będzie 2 a kiedy ogień samego zapytania po raz drugi będzie 4.

Więc może zmienić tę wartość w każdej aktualizacji.

Jeszcze raz dzięki Daverandom.

2

W SQLite, można utworzyć wyzwalacz obsłużyć taką funkcjonalność:

CREATE TRIGGER t1 BEFORE INSERT ON STOCK WHEN NEW.pro_id IN (SELECT pro_id FROM STOCK) BEGIN 
    UPDATE STOCK SET quantity=COALESCE(NEW.quantity, 0)+COALESCE((SELECT quantity FROM STOCK WHERE pro_id=NEW.pro_id), 0) WHERE pro_id=NEW.pro_id; 
    SELECT RAISE(IGNORE); -- Ignore INSERT 
END; 

Od teraz, gdy próbujesz wstawić istniejący pro_id, aktualizacja quantity odbywa zamiast. Klauzula konfliktu (OR REPLACE) nie ma znaczenia, ponieważ wyzwalacz sobie z tym poradzi (dla pro_id).

Kolejny, tym razem bez wyzwalaczy, używając jednego rozwiązania oświadczenie:

INSERT OR REPLACE STOCK(pro_id, quantity) 
    SELECT npro_id, COALESCE(nqty, 0)+COALESCE(quantity,0) FROM (
     SELECT 123 AS npro_id, 9999 AS nqty 
    ) LEFT JOIN STOCK ON npro_id=pro_id; 

Wystarczy zastąpić 123 z nowym prod_id i 9999 z nowym quantity.

+0

Dzięki, ale odpowiedź wysłana przeze mnie przy pomocy Daverandoma działa idealnie :) +1 –