if Length(idStrArray)>0 then
begin
with DataModule4.ADQueryTemp do
begin
Close;
SQL.Clear;
SQL.Add('SELECT id, pato, ftest, res FROM tbl ');
SQL.Add('WHERE id IN ('+idStrArray+')');
Open;
(rprMasterDataFish as Tfrxmasterdata).DataSet := frxDst_Multi;
(rprMasterDataFish as Tfrxmasterdata).DataSetName := 'Multi';
end;
end;
你好
我有TfrxDBDataset组件。我可以从上面的表格中添加字段。但是我也想在运行时手动添加字段和值。
我有这样的文本文件:
身份证
1个样本
2个样本
我想阅读此文本文件并将注释插入frxDst_Multi。这可能吗?
我不想在tbl中创建新列作为注释。因为,我有太多的mysql服务器。
感谢您的咨询,
答案 0 :(得分:2)
打开数据集后,您无法将其添加到数据集中,因此您必须先进行操作
可以通过代码或使用TDataSet字段编辑器将其打开。如果你是
通过代码执行此操作,您可以将字段添加到数据集的BeforeOpen
中
事件。
下一个问题是,您不想将字段绑定到表 数据集访问,您需要将其添加为计算字段并设置其值 在数据集的“ OnCalcFields”事件中-参见下面的示例。
理想情况下,添加的字段将是TMemoField,但不幸的是,TMemoField
不能是计算字段(FieldKind
= ftMemo
)。因此,您可能最好的方法是将其设置为String字段,但随后您需要
给它一个固定的最大大小,并在计算字段值时将其截断为该大小。
顺便说一句,我不知道您的TfrxDBDataset
是否支持fkInternalCalc
字段类型,但是如果支持,那么您可以尝试将注释字段添加为TMemoField而不是TStringField字段。
我无法做的一件事是从中加载字段的值 外部文件,因为您没有在q中说出如何确定 要读取的文件名。
很明显,IsNull
事件中的frxDst_MultiCalcFields
检查是为了避免在文件内容已被读取的情况下重新加载文件的开销。
const
NoteFieldSize = 4096;
procedure TForm1.AddNoteField;
var
NoteField : TField;
begin
if frxDst_Multi.FindField('Note') = Nil then begin
NoteField := TStringField.Create(frxDst_Multi);
NoteField.FieldName := 'Note';
NoteField.Size := NoteFieldSize;
NoteField.FieldKind := fkCalculated;
NoteField.DataSet := frxDst_Multi;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
frxDst_Multi.Open;
end;
procedure TForm1.frxDst_MultiCalcFields(DataSet: TDataSet);
var
S : String;
begin
if DataSet.FieldByName('Note').IsNull then begin
S := 'a note'; // replace by code to set the field value
DataSet.FieldByName('Note').AsString := Copy(S, 1, NoteFieldSize);
end;
end;
procedure TForm1.frxDst_MultiBeforeOpen(DataSet: TDataSet);
begin
AddNoteField;
end;