在Delphi中向FDMemTable添加字段

3

我正在使用DBGrid编写一些内容,但是我不能通过FDQuery获取足够的数据。我想要在“FDQuery”数据之外添加自定义数据。我找到了一个组件,应该能够做到这一点,它被称为FDMemTable。我可以从FDQuery中获取数据到FDMemTable,但我无法添加一个新字段来放置不同的数据。所以我的问题是如何正确地连接数据与FDQuery,并在FDMemTable中添加额外的列。

procedure TWorkflowDM.Temp;
var
  Error: string;
  Temp: string;
begin
  try
    FDQuery1.Open;
    FDQuery1.FetchAll;
    FDMemTable1.Data:= FDQuery1.Data;
    FDMemTable1.FieldDefs.Add('Test', ftString, 20, False);        <-ERROR (Error 'FDMemTable1: Field ''Test'' not found')
    FDMemTable1.Open;
    FDMemTable1.First;
    while not FDMemTable1.Eof do
    begin
      Temp:= FDMemTable1.FieldByName('Test').AsString;
      FDMemTable1.Next;
    end;
  except
    on E: Exception do
      Error:= E.Message;
  end;
end;

为什么需要这样做?你可以在SQL语句中添加一个空列(字段),而无需跳过障碍或使用内存表。 - Ken White
@KenWhite 对于将SQL查询数据集与其他数据合并,我该如何在SQL查询中添加空列?我正在使用Firebird。 - Mr. Nice
SELECT Column1, Column2, Column3, ' ' AS MyNewCol FROM MyTable WHERE SomeCondition 添加了一个新的字符列,可以接受最多10个字符。然后您可以在其他地方使用 FieldByName('MyNewCol')。(当然,将 MyNewCol 替换为您想要的任何其他列别名。)如果您使用的 DBMS 支持像 REPEATREPLICATE 这样的函数,则可以使用它们来代替空格。 - Ken White
@KenWhite 也是一个很好的解决方案。谢谢。 - Mr. Nice
1个回答

4
我们将字段定义从源DataSet复制并追加额外的字段。然后,我们调用CreateDataset可选设置Active为true。这将创建所有必要的字段并打开FDMemTable。然后,我们通过CopyDataset方法填充它。以下代码可行:
procedure TWorkflowDM.Temp;
var
  Error: string;
  Temp: string;
begin
  try
    FDQuery1.Open;
    // FDQuery1.FetchAll;
    FDMemTable1.FieldDefs := FDQuery1.FieldDefs;
    FDMemTable1.FieldDefs.Add('Test', ftString, 20{, False}); // default parameter
    FDMemTable1.CreateDataSet;//or just Open that sets Active to true; 
    FDMemTable1.CopyDataSet(FDQuery1);
    FDMemTable1.First;
    while not FDMemTable1.Eof do
    begin
      Temp := FDMemTable1.FieldByName('Test').AsString;
      FDMemTable1.Next;
    end;
  except
    on E: Exception do
      Error := E.Message;
  end;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接