我正在使用TADODataSet(D7).
我没有使用我的DataSet在设计模式下创建持久字段.
我没有使用我的DataSet在设计模式下创建持久字段.
dsItems.CommandText := 'select ID,ItemName,UserIDCreate from Items'; dsUsers.CommandText := 'select ID,LoginName from Users'; // lookup dataset
如果我双击dsItems并“添加所有文件”,然后单击“新建文件”并定义我的查找字段,一切正常.
生成的dsItem应包含:ID,UserIDCreate,LoginName_Lookup
如何在设计时避免完成所有这些操作,并在打开DataSet之后(或不确定)之前添加查找字段.
换句话说:如何模拟“添加所有文件”然后“新建文件”以在运行时添加查找文件?
注意:
从IDE运行John的代码时出现异常.尝试打开DataSet时发生异常:EOleException并显示消息“发生了未知错误”.
函数TCustomADODataSet.LocateRecord(ADODB.pas)如果FieldCount = 1则行,然后是FLookupCursor.Find ……
我接受答案,因为已编译的程序正在运行.
如果有人在IDE中运行表单时可以验证是否获得异常,那将是很好的.
@R_403_323@
无法打开数据集以在运行时添加查找字段.
您还需要添加您需要访问的任何其他字段作为持久字段,否则,它们将无法访问.以下程序应该有效.但是,如果可以的话,我建议你使用查询并加入你的表格 – 它的编码要少得多,而且我认为更清晰.
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','EmployeeName'); end;