2012-04-19 4 views
12

मेरे पास एक कस्टम TDatasetProvider है जो जो भी डेटा प्रदान करता है, उसे नए फ़ील्ड बनाने की अनुमति देता है।किसी डेटासेट संरचना से डेटा (TDatasetProvider में) को स्थानांतरित करने का तेज़ तरीका

तो, मान लीजिए कि आप मूल डाटासेट पर folowing क्षेत्रों मिल गया है:

  • ग्राहक आईडी
  • नाम
  • उम्र

और तुम DBGrid एक दिखा प्रयोग पर यह चयन करने की आवश्यकता बिटमैप। खैर, आप तब से कर सकते हैं जब से मेरा डीएसपी डेटासेट डेटा में Selected नामक एक बूलियन फ़ील्ड जोड़ सकता है।

तरह से मैं अब ऐसा:

  1. 2 TClientDataset वस्तुओं (उत्पत्ति और लक्ष्य)
  2. उत्पत्ति में बनाएं, मैं लोड डेटा InternalGetRecords विधि के मापदंडों (मैं इसे overrode)
  3. से मिला
  4. लक्ष्य में, मैं fielddefs उत्पत्ति डाटासेट से परिभाषित बना सकते हैं और डेवलपर
  5. द्वारा डिजाइन समय में बनाई गई fielddefs जोड़ने लक्ष्य
  6. पर एक CreateDataset निष्पादित और, पंक्ति-दर-पंक्ति (एक डी फ़ील्ड-बाय-फ़ील्ड), मैं मूल डेटाबेस से डेटा को लक्ष्य डेटासेट
  7. पर कॉपी करता हूं, अंत में, डेटा वैरिएंट को InternalGetRecords से वापसी मान के रूप में वापस कर दें।

मुझे वास्तव में पता नहीं है कि ऐसा करने के लिए एक और अधिक सुरुचिपूर्ण (और तेज़) तरीका है या नहीं। उस परिणाम को पाने के लिए एक और (तेज और/या सुरुचिपूर्ण) तरीका है?

+0

क्या आप बस उस डेटा के बिना मूल डेटासेट पर आंतरिकcalc बूलियन फ़ील्ड नहीं बना सकते हैं? – vavan

+0

इस घटक को बनाने के बाद, जीवन आसान हो गया क्योंकि मैं डेटा फ़ील्ड बना सकता हूं जो सीडीएस डेटा फ़ील्ड के रूप में पहचानते हैं .. –

+0

लेकिन आप बहुत अनावश्यक काम कर रहे हैं। और उन डेटा फ़ील्ड बनाने का क्या मतलब है? – vavan

उत्तर

12

ऐसा लगता है कि स्रोत डाटासेट से डेटा लोड करने के बाद, आप और अधिक क्षेत्रों को जोड़ने के लिए IDSBase.AddField कॉल कर सकते हैं:

uses 
    DB, DBCommon, DBClient, DSIntf; 

type 
    THackClientDataSet = class(TClientDataSet); 

procedure EncodeFieldDesc(var FieldDesc: DSFLDDesc; 
    const Name: string; DataType: TFieldType; Size, Precision: Integer; 
    Calculated: Boolean; Attributes: TFieldAttributes); 
begin 
    // ... copied from TClientDataSet.EncodeFieldDesc 
end; 

//... 
var 
    FldDesc: DSFLDDesc; 
begin 
    FillChar(FldDesc, SizeOf(FldDesc), 0); 
    EncodeFieldDesc(FldDesc, 'SELECTED', ftBoolean, 0, 0, False, []); 
    with THackClientDataSet(DataSet) do 
    Check(DSBase.AddField(@FldDesc)); 
    // now you can create a second client dataset and assign it DataSet.Data directly: 
    // DataSet2.Data := DataSet.Data; 
    // DataSet2 now contains the new field (with empty values in all existing records) 
end; 

मैं इसे अच्छी तरह से परीक्षण नहीं किया था, लेकिन ऊपर दिए गए सरल उदाहरण के रूप में काम किया, मैं दूसरे क्लाइंट डेटासेट नेविगेट करने और सामान्य रूप से सभी क्षेत्रों के मूल्यों को संपादित करने में सक्षम था।

+0

ओएमजी ... यह वास्तव में दिलचस्प है !!! मैं इसे एप की कोशिश करूंगा !!! –

+0

बिल्कुल काम नहीं किया ... मैं फिर से कोशिश करूंगा ... –

+0

लगता है कि यह कुर्सी और कीबोर्ड के बीच एक समस्या थी। शानदार समाधान स्वीकृत और +1। –

-1

आप संपूर्ण डेटासेट, मेटाडेटा और डेटा की प्रतिलिपि बनाने के लिए TClientDataset की डेटा प्रॉपर्टी का उपयोग कर सकते हैं। यह एक TClientDataset को दूसरे में कॉपी करने का सबसे तेज़ तरीका माना जाता है।

देखें http://docwiki.embarcadero.com/RADStudio/en/Assigning_Data_Directly

+0

-1 लगता है कि आपने प्रश्न नहीं पढ़ा है ... लक्ष्य सीडीएस में अलग मेटाडेटा है (अतिरिक्त फ़ील्ड के साथ)। इसलिए यदि मैं वास्तव में उत्पत्ति से लक्ष्य तक डेटा संस्करण की प्रतिलिपि बनाता हूं, तो मेरे पास यह होगा - वांछित अतिरिक्त फ़ील्ड के बिना उत्पत्ति की एक प्रति। –

+0

जैसा कि मैंने आपका प्रश्न पढ़ा है, आपके मूल डेटासेट में आपके नए TDatasetProvider के माध्यम से बनाए गए "नए" फ़ील्ड हैं और फ़ील्ड डेटा आपके ओवरराइड InternalGetRecords से आया है। यह मेरे जवाब का आधार है। अन्यथा, आपको एक कस्टम TDatasetProvider क्यों चाहिए? उत्पत्ति से फ़ील्ड जानकारी कॉपी करते समय आप लक्ष्य में नए फ़ील्ड बना सकते हैं। – crefird

+0

आप गलत पढ़ते हैं। लक्ष्य के नए क्षेत्र हैं। मूल डेटा डेटासेट प्रदाता के पैरामीटर से प्राप्त होता है ("शुद्ध" डेटा डेटा एक्सेस घटकों को मिला)। –

1

सबसे तेज़ तरीका CloneCursor उपयोग करने के लिए किया जाएगा। कुछ इस तरह:

  1. 2 TClientDataset वस्तुओं (उत्पत्ति और लक्ष्य)
  2. उत्पत्ति में बनाएँ, डेटा लोड InternalGetRecords विधि के मापदंडों
  3. लक्ष्य में, fielddefs उत्पत्ति डाटासेट से परिभाषित बनाने से मिला और डेवलपर
  4. Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea
  5. द्वारा डिजाइन समय में बनाई गई fielddefs जोड़ने लक्ष्य अब उत्पत्ति के रूप में एक ही डेटा का एक नया दृश्य में शामिल होंगे, लेकिन आदि जो कुछ क्षेत्रों, फिल्टर, लक्ष्य पर मौजूद द्वारा सीमित। (यदि आपने किसी भी फ़ील्ड को परिभाषित नहीं किया है, तो यह उत्पत्ति के फ़ील्ड की प्रतिलिपि बनायेगा। यदि आप फ़ील्ड को परिभाषित करते हैं, तो यह आपके द्वारा दिए गए कार्यों के साथ चिपक जाता है।)
  6. लक्ष्य से डेटा कॉपी करें, और यह वही होना चाहिए जो आप देख रहे हैं के लिये।
+0

यदि ओपी वास्तव में अतिरिक्त fkData फ़ील्ड रखना चाहता है तो काम नहीं करेगा। यदि उसे केवल कुछ लुकअप, गणना, आंतरिक कैलकुलेटर या समेकित फ़ील्ड हैं, तो कॉपी करने/क्लोनिंग के साथ गड़बड़ करने की कोई आवश्यकता नहीं है और एकल (मूल) सीडी – vavan

+0

का उपयोग करके हासिल किया जा सकता है, मैंने विचार की कोशिश की, लेकिन यह काम नहीं करता - मुझे बस इतना मिलता है उत्पत्ति से डेटा सरणी। शायद मैंने कुछ गलत समझा ... –

0

मेरे पास एक नमूना है जो अधिक लचीलापन प्राप्त करने के लिए अलग-अलग क्षेत्रों की गणना के लिए अज्ञात विधियों का उपयोग करके गतिशील रूप से सीडीएस में फ़ील्ड जोड़ता है।सीडीएस खोलने से पहले, आप इसे खोलने के बजाय गणना किए गए फ़ील्ड जोड़ते हैं ..

क्या आप यही देख रहे हैं? प्रश्न बहुत स्पष्ट नहीं है ...

+2

यह एक टिप्पणी होना चाहिए, जवाब नहीं। – kobik

+0

पौराणिक मार्को कैंटू मेरे नम्र सवाल पर? *** कूल। *** नौकरी पर वापस: मैं cds.open (TDataSetProvider के InternalGetRecords पर) के बाद डेटा फ़ील्ड बना रहा हूं –

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

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