2012-01-30 3 views
6

나는 TADODataSet (D7)을 사용하고 있습니다.
데이터 형식으로 디자인 모드에서 영구 필드를 만들지 않습니다.런타임에 TDataSet 조회 필드를 만드는 방법은 무엇입니까?

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

내가 dsItems을 두 번 클릭하고 "모든 fileds 추가"를 선택한 다음 클릭하면 "새가 제출 한"내 조회 필드를 정의, 모든 것이 잘 작동한다. ID, ItemName, UserIDCreate, LoginName_Lookup

할 수있는 내가 디자인 타임에이 모든 일을 피할 방법 및 후 조회 필드를 추가/또는 그 이전에 (확실하지?) 데이터 집합이 열립니다 : 결과 dsItems이 포함되어야합니다. 즉

는 : 어떻게 다음 런타임 제기 조회를 추가 할 "새가 제출 한" "모든 fileds 추가"를 모방 하는가?


참고 : IDE에서 요한의 코드를 실행할 때 나는 예외를 얻을. 예외는 DataSet을 열려고 할 때 발생합니다 : EOleException with message 'An unknown error has occured'. 라인 if FieldCount = 1 then FLookupCursor.Find...

나는 준수 프로그램 렸기 때문에 답을 수용하고있어에서

function TCustomADODataSet.LocateRecord (ADODB.pas) 노력하고 있습니다.
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

DataSet을 열려고 할 때 '알 수없는 오류가 발생했습니다.'라는 메시지가있는'EOleException '메시지가 나타납니다. – Vlad

+0

런타임에 모든 영구 필드를 추가 할 수 있습니다. 예외를 던지고있는 부분과 어떤 줄을? –

관련 문제