2012-01-30 14 views
6

मैं TADODataSet (D7) का उपयोग कर रहा हूं।
मैं अपने डेटासेट के साथ डिज़ाइन-मोड में लगातार फ़ील्ड नहीं बनाता हूं।रनटाइम पर TDataSet लुकअप फ़ील्ड कैसे बनाएं?

dsItems.CommandText := 'select ID, ItemName, UserIDCreate from Items'; 
dsUsers.CommandText := 'select ID, LoginName from Users'; // lookup dataset 

dsItems पर मैं डबल क्लिक करें और "सभी फ़ील्ड जोड़ें" और उसके बाद तो "नया दायर" और मेरे देखने फील्ड परिभाषित करते हैं, सब कुछ ठीक काम कर रहा है। जिसके परिणामस्वरूप dsItems शामिल करना चाहिए: ID, ItemName, UserIDCreate, LoginName_Lookup

कर सकते हैं मैं डिजाइन समय में यह सब कर से बचने के लिए कैसे और बाद में एक लुक फील्ड जोड़ें/या उससे पहले (यकीन है कि नहीं?) डेटासेट खोला जाता है।

दूसरे शब्दों में: मैं कैसे अनुकरण और फिर "नया दायर" रन-टाइम में दायर देखने जोड़ने के लिए "सभी फ़ील्ड जोड़ें" करते हैं?


नोट: मैं जब आईडीई से जॉन कोड चल रहा एक अपवाद मिलता है। डेटासेट: EOleException with message 'An unknown error has occured' खोलने का प्रयास करते समय अपवाद होता है।

function TCustomADODataSet.LocateRecord (ADODB.pas) लाइन if FieldCount = 1 then FLookupCursor.Find...

मैं पालन कार्यक्रम क्योंकि जवाब को स्वीकार कर रहा हूँ में काम कर रहा है।
यह अच्छा होगा अगर कोई IDE के अंदर फॉर्म चलाते समय अपवाद प्राप्त करने (या नहीं) को सत्यापित कर सके।

उत्तर

8

रनटाइम पर लुकअप फ़ील्ड जोड़ने के लिए डेटासेट खोला नहीं जा सकता है।

आपको लगातार फ़ील्ड के रूप में उपयोग करने के लिए जो भी अन्य फ़ील्ड एक्सेस करने की आवश्यकता होगी, अन्यथा, वे पहुंच योग्य नहीं होंगे। नीचे की प्रक्रियाओं को काम करना चाहिए। हालांकि, मैं अनुशंसा करता हूं कि यदि आप कर सकते हैं, प्रश्नों का उपयोग करें और अपनी तालिकाओं में शामिल हों - यह बहुत कम कोडिंग है, और मेरी राय में बहुत साफ है।

procedure CreatePersistentFields(ADataset: TDataset); 
Var 
    i: Integer; 
Begin 
    ADataset.FieldDefs.Update; 
    for I := 0 to ADataset.FieldDefs.Count - 1 do 
    if ADataset.FindField(ADataset.FieldDefs[i].Name) = Nil then 
     ADataset.FieldDefs.Items[i].CreateField(ADataset); 
End; 

Procedure CreateLookupField(ATable: TDataSet; AFieldName: String; ALookupDataset:   TDataset; AKeyfields: String; ALookupKeyfields: String; ALookupResultField : String); 
Var 
    I : Integer; 
    NewField : TField; 
Begin 
    with ATable do begin 
    if FieldDefs.Updated = False then 
     FieldDefs.Update; 
    If FindField(AFieldName) = Nil then 
    begin 
     NewField := TStringField.Create(ATable); 
     NewField.FieldName := AFieldName; 
     NewField.KeyFields := AKeyFields; 
     NewFIeld.LookupDataSet := ALookupDataset; 
     NewField.LookupKeyFields := ALookupKeyFields; 
     NewField.LookupResultField := ALookupResultField; 
     NewField.FieldKind := fkLookup; 
     NewField.Dataset := ATable; 
    end; 
    end; 
End; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    AdoDataset1.Close; 
    CreatePersistentFields(TDataset(AdoDataset1)); 
    CreateLookupField(TDataset(AdoDataset1), 'EmployeeNameLook', TDataset(EmployeeTable), 'EmployeeID', 'EmployeeID', 'EmployeeName'); 
end; 
+0

क्या आपका मतलब है कि मुझे इस कोड को चलाने के लिए डिज़ाइन-मोड में "जो भी फ़ील्ड आपको लगातार फ़ील्ड के रूप में उपयोग करने की आवश्यकता होगी" बनाने की आवश्यकता है? – Vlad

+0

मुझे डेटासेट खोलने का प्रयास करते समय 'अज्ञात त्रुटि आई है' संदेश के साथ 'EOleException' मिलता है। – Vlad

+0

आप रनटाइम पर सभी लगातार फ़ील्ड जोड़ सकते हैं। कौन सा हिस्सा अपवाद फेंक रहा है और कौन सी रेखा? –

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