2009-07-08 26 views
5

क्लाइंटडेटासेट के लिए आफ्टरपोस्ट इवेंट हैंडलर में, मुझे वर्तमान रिकॉर्ड के लिए ApplyUpdates फ़ंक्शन अपडेट या डालने के लिए जानकारी चाहिए।मैं कैसे पता लगा सकता हूं कि ApplyUpdates डेटा डालें या अपडेट करेगा या नहीं?

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

उदाहरण कोड: ApplyUpdate पूरा कर लिया है के बाद

procedure TdmMain.QryTestAfterPost(DataSet: TDataSet); 
begin 
    if IsInserting(QryTest) then 
    // ShowMessage('Inserting')... 
    else 
    // ShowMessage('Updating'); 

    QryTest.ApplyUpdates(-1); 
end; 

आवेदन, AfterPost विधि में एक लॉग लिखेंगे। तो यह विधि वह जगह है जो कार्रवाई के सबसे नज़दीक है, मैं एक ऐसा समाधान पसंद करूंगा जो इस घटना हैंडलर में पूरी तरह से डाला जा सके।

क्लाइंटडेटासेट उदाहरण QryTest में जानकारी का उपयोग करके, IInserting फ़ंक्शन को मैं कैसे कार्यान्वित कर सकता हूं?

संपादित करें: मैं ClientDataSet.UpdateStatus को आजमाउंगा जो here समझाया गया है।

+0

आप क्या करने की योजना बना रहे हैं? सत्यापन करें, उपयोगकर्ता इंटरफ़ेस अपडेट करें या कुछ डेटा मैनिपुलेशन करें? – zendar

+0

आवेदन अद्यतन पूरा होने के बाद, एप्लिकेशन AfterPost विधि में एक लॉग लिख देगा। तो यह विधि वह जगह है जो कार्रवाई के सबसे नज़दीक है, मैं एक ऐसा समाधान पसंद करूंगा जो इस घटना हैंडलर में पूरी तरह से डाला जा सके। यहां डेल्टा सरणी की जांच करना सबसे आसान तरीका प्रतीत होता है। – mjn

+0

यदि आप क्लाइंट साइड पर प्रति उपयोगकर्ता लॉग करते हैं तो यह सबसे अच्छी जगह है। यदि आप सभी उपयोगकर्ताओं के लिए केंद्रीय लॉग करना चाहते हैं, तो TDataSetProvider पर AfterApplyUpdates ईवेंट में सर्वर की तरफ बेहतर जगह होगी। – zendar

उत्तर

5

ApplyUpdates आपको वह जानकारी नहीं देता है - क्योंकि यह सम्मिलित करना, अपडेट करना और हटाना हो सकता है।

आवेदन अद्यतन डेल्टा सरणी पर संग्रहीत परिवर्तन जानकारी लागू करें। उस परिवर्तन की जानकारी, उदाहरण के लिए, विभिन्न प्रकारों (प्रविष्टियों, हटाने और अद्यतनों) के किसी भी प्रकार के परिवर्तनों को शामिल कर सकती है और ये सभी एक ही कॉल पर लागू की जाएंगी।

TDatasetProvider पर आपके पास पहले अद्यतनडेटर्ड ईवेंट है (या ऐसा कुछ, नींद स्मृति पर मजेदार चीजें करता है :-))। उस घटना को डेल्टा के प्रत्येक रिकॉर्ड को अंतर्निहित डेटाबेस/डेटासेट पर लागू करने से पहले कहा जाता है और इसलिए ऐसी जानकारी प्राप्त करने के लिए जगह ... लेकिन शोमेसेज लागू प्रक्रिया को रोक देगा।

संपादित करें: अब मुझे याद आया कि एक और विकल्प है: आप डेल्टा को किसी अन्य क्लाइंटडेटसेट डेटा प्रॉपर्टी पर असाइन कर सकते हैं और उस रिकॉर्ड के लिए डेटासेट अपडेटस्टैटस को पढ़ सकते हैं। बेशक, आप से पहले कर applyupdates इस करने के लिए ... की जरूरत

var 
    cdsAux: TClientDataset; 
begin 
    . 
    . 
    <creation of cdsAux> 
    cdsAUx.Data := cdsUpdated.Delta; 
    cdsAux.First; 
    case cdsAux.UpdateStatus of 
    usModified: 
     ShowMessage('Modified'); 
    usInserted: 
     ShowMessage('Inserted'); 
    usDeleted: 
     ShowMessage('Deleted'); // For this to work you have to modify 
           // TClientDataset.StatusFilter 
    end; 
    <cleanup code> 
end; 
+0

यह बहुत अच्छा लगता है। यदि ApplyUpdate केवल एक रिकॉर्ड से संबंधित है, तो डेल्टा मेरी में केवल एक प्रविष्टि होगी जो जानता है कि यह एक अद्यतन या सम्मिलित है या नहीं? तो मुझे डेल्टा में इस जानकारी तक पहुंचने का केवल एक तरीका चाहिए। – mjn

+0

यह दूसरी सीडीएस का उपयोग क्यों करता है? मैं उम्मीद करता हूं कि अद्यतनस्टैटस पहले सीडीएस में पहले से ही उपलब्ध है, इसलिए मैं इसे सीधे पढ़ सकता था। या स्थिति क्या है जवाब देने के लिए दूसरी आवश्यकता क्यों है? – mjn

+0

क्योंकि दूसरे सीडी के साथ आपके पास डेल्टा की सामग्री होगी, और कुछ भी नहीं। लेकिन यह डेटासेट प्रदाता के माध्यम से बिना, काम करने का एक वैकल्पिक तरीका है। –

4
TDataSetProvider पर

BeforeUpdateRecord घटना के रूप में परिभाषित किया गया है:

procedure BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: 
          TCustomClientDataSet; UpdateKind: TUpdateKind; 
          var Applied: Boolean); 

पैरामीटर UpdateKind कहते हैं क्या रिकॉर्ड के साथ किया जाएगा: ukModify, ukInsert or ukDelete । आप इसे इस तरह का परीक्षण कर सकते हैं:

procedure TSomeRDM.SomeProviderBeforeUpdateRecord(Sender: TObject; 
     SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; 
     var Applied: Boolean); 
begin 
    case UpdateKind of 
    ukInsert : 
     // Process Insert; 
    ukModify : 
     // Process update 
    ukDelete : 
     // Process Delete 
    end; 
end; 

नोट: इस घटना के हस्ताक्षर डेल्फी 7. से है अगर यह डेल्फी के बाद के संस्करणों में बदल मैं नहीं जानता।

2

एक TUpdateStatus मूल्य के लिए ClientDataSet.StatusFilter सेट करें और फिर ClientDataSet.RecordCount

उदाहरण के लिए

,

ClientDataSet1.StatusFilter := [usDeleted]; 
ShowMessage(IntToStr(ClientDataSet1.RecordCount)); 

पढ़ने, हटाने प्रश्नों कि निष्पादित किया जाएगा की संख्या वापस आ जाएगी।

हालांकि दो चीजें नोट करें।स्थिति को सेट करना हमारे लिए फ़िल्टर संशोधित हमेशा संशोधित और असम्बद्ध रिकॉर्ड दोनों शामिल करता है, इसलिए आप उस मान का आधा हिस्सा लेते हैं (4 का मान 2 का मतलब 2 अपडेट क्वेरी निष्पादित की जाएगी)। साथ ही, स्थितिफिल्टर को [] (एक खाली सेट) पर सेट करना है कि आप डिफ़ॉल्ट दृश्य (संशोधित, अनमोडिफाइड, और सम्मिलित)

सुनिश्चित करें कि ऐसा करने से पहले कोई पोस्ट न किए गए परिवर्तन पोस्ट किए गए हैं, अन्यथा पोस्ट न किए गए परिवर्तन नहीं हो सकते हैं माना जाता है।

+0

बहुत धन्यवाद, यह सबसे आसान समाधान का गुम टुकड़ा था! Fabricio Araujo से जवाब में मेरी टिप्पणी देखें। – mjn

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

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