如何将字段添加到TfrxDBDataset

时间:2018-12-14 08:38:48

标签: delphi

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服务器。

感谢您的咨询,

1 个答案:

答案 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;