2012-10-25 18 views
7

से सम्मिलित करें \ हटाएँ रिकॉर्ड एक TADOQuery मैं एक छोड़ दिया बाहरी का उपयोग कर दो अलग-अलग टेबल से रिकॉर्ड खींच का उपयोग शामिल हो:TADOQuery जुड़ें टेबल - परिणाम

Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier 

मैं एक TDBGrid का उपयोग सफलतापूर्वक मेरी MSSQL DB करने के लिए क्षेत्र अपडेट पोस्ट करने ।

चूंकि विदेशी कुंजी संदर्भ (Courier_Identifier साथ FK_Courier_Identifier) जब मैं एक रिकॉर्ड सम्मिलित मैं एक त्रुटि मिलती है,

'FK_Courier_Identifier' कॉलम के लिए, टेबल Courier_VT में मूल्य अशक्त सम्मिलित नहीं कर सकते; स्तंभ अशक्त

की अनुमति नहीं है लेकिन रिकॉर्ड कूरियर तालिका में पोस्ट किया जाता है, मुझे पता है कि मैं पोस्ट करने से पहले FK_Courier_Identifier को Courier_Identifier आवंटित करने के लिए की जरूरत है लेकिन नहीं कैसे और कहाँ यह

क्या करना है कैसे कर हम इस परिदृश्य में रिकॉर्ड हटाएं? क्या एक TADOQuery का उपयोग करना संभव है?

+3

आप 'अद्वितीय तालिका' एडीओ गतिशील संपत्ति का उपयोग कर सकते हैं। एक संभावित डुप्लिकेट [यहां] (http://stackoverflow.com/questions/7981718/adodataset-deleting-from-joined-table)। हालांकि मुझे यकीन नहीं है कि 'सम्मिलित करें' \ 'अपडेट' भाग काम करेगा (मैं अभी यह सत्यापित नहीं कर सकता)। और मेरा मानना ​​है कि आपको 'पहले पोस्ट' पर 'FK_Courier_Identifier' निर्दिष्ट करने की आवश्यकता है। – kobik

उत्तर

1

AFAIK TADOQuery एकाधिक तालिकाओं में शामिल होने पर सम्मिलित/हटाएं/अपडेट स्टेटमेंट को संभालने में असमर्थ है। इसके पीछे कारण यह है कि यह नहीं पता कि उसे किस तालिका को अपडेट करना है या इसे कैसे करना है।

अन्य डेटाबेस एक्सेस घटकों के साथ सामान्य दृष्टिकोण या तो प्रत्येक प्रकार की डीएमएल वाक्य (ODAC components एक उदाहरण है) के लिए एक संपत्ति प्रदान करना है या आपको अपनी क्वेरी से जुड़ा दूसरा "अपडेट एसक्यूएल" घटक जोड़ना होगा जिसमें इसमें शामिल होगा डीएमएल वाक्यों (Zeos उन घटकों का एक उदाहरण है जो इस दृष्टिकोण का उपयोग करते हैं)।

ने कहा, शायद आपकी सबसे अच्छी शर्त है कि आपके परिदृश्य का इलाज करने के लिए पहले डिलीट और पहले पोस्ट ईवेंट हैंडलर का उपयोग करना है। असल में आप उन्हें डीएमएल वाक्य जारी करने के लिए उपयोग करेंगे, इसे कुछ संग्रहीत प्रोपोक या एसक्यूएल घटक के साथ निष्पादित करें और फिर ईवेंट हैंडलर को निरस्त करें। अधिक जानकारी और कोड नमूना के लिए इस SO question पर स्वीकृत उत्तर की जांच करें।


संपादित: यदि आपका कोड अपडेट प्रबंधित और हटाता है के रूप में आप अपनी टिप्पणी में कह सकते हैं, तो समस्या केवल डालने पर FK_Courier_Identifier के काम के साथ (प्रश्न अधिक ध्यान से पढ़ें जाना चाहिए था निहित है .. ।), आप OnBeforePost ईवेंट हैंडलर का उपयोग करके हल कर सकते हैं जो:

procedure TMyForm.MyADOQueryBeforePost(Sender: TObject); 
begin 
    MyADOQuery.FieldByName('FK_Courier_Identifier').AsString := CourierId; 
end; 
बेशक

, आपको लगता है कि आप जानते हैं कि यहाँ के बाद से मैं मान रहा हूँ क्षेत्र एक varchar है इस कोड को अनुकूलित करने की आवश्यकता है और में डालने से पहले होगा डेटाबेस कूरियर आईडी का मूल्य।

एचटीएच

+0

ADOQuery अद्यतन \ Delete को संभालने में सक्षम है लेकिन सम्मिलित नहीं है, मैं आपके लिंक में देख रहा हूं धन्यवाद! – user1775091

+0

मैंने आपकी टिप्पणी पढ़ने के बाद अपना जवाब संपादित किया। उम्मीद है कि यह अब बेहतर मदद करता है! –

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