2013-10-03 5 views
5

मैं फोनगैप का उपयोग करके इन्वेंटरी एप्लिकेशन बना रहा हूं। इसमें मेरे पास स्टॉक प्रबंधन के लिए एक मॉड्यूल स्टॉक है।पुरानी मानों के योग के साथ सम्मिलित करें या बदलें

स्टॉक तालिका क्वेरी

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

सम्मिलित करें या बदलने क्वेरी

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

वहाँ एक ही मुद्दे को इस क्वेरी के साथ नहीं है इसकी पूरी तरह से काम कर रहा है, लेकिन मैं पुराने मानों का योग अपडेट करना चाहते हैं नए एक के साथ।

उदाहरण:

pro_id quantity 
1  5 

यह है जब मैं नई लेन-देन के लिए क्वेरी ऊपर सक्रिय कर देगा मौजूदा रिकॉर्ड तो अब जो 3 मात्रा है तो quantity should be (5 (old) + 3 (new)) = 8.

तो रिकॉर्ड updateing के बाद यह तरह दिखता है।

pro_id quantity 
1  8 

मैं इसे किसी भी विचार को कैसे हल कर सकता हूं। या अगर मैं गलत तरीके से हूं तो मुझे बताएं। धन्यवाद।

+0

मैं आपको नए रिकॉर्ड INSERT के लिए सुझाव दूंगा जो पहले तालिका में मौजूद होने से पहले उन्हें जांचकर मौजूद नहीं है। फिर "मात्रा = मात्रा + 5" के माध्यम से अपनी राशि को बढ़ाने/घटाने से मौजूदा लोगों को अद्यतन करें। – Ouscux

उत्तर

6

वास्तव में मैं इस समाधान का वास्तविक संस्थापक नहीं हूं। असली नायक Daverandom है उसकी मदद से मैंने अपनी समस्या हल की है।

उसने मुझे follow this समाधान का सुझाव दिया है और यह मेरे समाधान को खोजने में वास्तव में सहायक है।

पुराने क्वेरी लगता है जैसे

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

नई क्वेरी की तरह के रूप में

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

अद्यतन लगता है कि:

आप अद्यतन में WHERE pro_id="val" में शामिल नहीं होगा, तो यह सभी पंक्तियों अद्यतन करेगा । ताकि उत्पन्न होगा उचित परिणाम होगा।

जब उपयोगकर्ता आग क्वेरी पहली बार तो मात्रा 2 हो जाएगा और जब आप एक ही क्वेरी दूसरी बार आग यह 4.

तो, हम एक अद्यतन में है कि मूल्य बदल सकते हैं होगा।

फिर से डेवरैंडम के लिए धन्यवाद। अब से

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; 

, जब भी आप एक मौजूदा pro_id, quantity पर अद्यतन बजाय किया जाता है सम्मिलित करने के लिए प्रयास करें:

2

SQLite में, आप एक ट्रिगर ऐसी कार्यक्षमता को संभालने के लिए बना सकते हैं। संघर्ष खंड (OR REPLACE) कोई फर्क नहीं पड़ता क्योंकि ट्रिगर इसे संभाल लेगा (pro_id के लिए)।

फिर भी एक और, ट्रिगर के बिना इस समय, एक बयान समाधान का उपयोग:

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; 

बस नई quantity के साथ नए prod_id और 9999 साथ 123 बदलें।

+0

धन्यवाद लेकिन Daverandom की मदद से मेरे द्वारा पोस्ट उत्तर पूरी तरह से काम कर रहा है :) +1 –

संबंधित मुद्दे