delphi 实时绑定中的 TStringGrid 显示 (bcd)

TStringGrid show (bcd) in delphi live binding

我在 delphi firemonkey 应用程序的实时绑定中将 TFDQuery 与 TStringGrid 连接起来。

我尝试在基于编辑框的 TFDQuery 中使用过滤器进行搜索,效果很好。

但是,每当我清除编辑框时,我在 TStringGrid 中的一行会显示“(bcd)”,因为它的值如下图所示。

我做错了什么?我该如何解决?

编辑:

  1. 我正在使用 mySql 数据库和 firedac tfdconnection + tfdquery
  2. 该列的数据类型是 AnsiString & FmtBCS(32,0)
  3. 我在 delphi 中使用实时绑定功能。
  4. 我的过滤代码

    with MainQuery do begin Filtered := False; OnFilterRecord := nil; Filter := FilterValue; Filtered := True; end;

  5. 我用TFDConnection.execSQL

  6. 插入到table

“(BCD)”部分总是在所选行上发生变化,如下图。

编辑 2: 要重现我的错误,您可以:

  1. 添加 TStringGrid。
  2. 添加编辑框。
  3. 添加 tfd 连接
  4. 添加 tfdquery
  5. 使用从 tfdquery 到 tstringgrid 的实时绑定。
  6. 在 mysql 中使用 SUM() 向 tfdquery.sql.text 添加查询。示例:"select id, sum(stock) as total_stock from stocks"
  7. 激活 tfdquery
  8. 在编辑框上添加 onkeyup 事件。
  9. 添加此代码:

FilterValue:= 'garmines_id LIKE ''/' +Edit1.Text+'%'' ESCAPE ''/'' '; 使用 FDQuery1 开始<br> 过滤:=假;<br> OnFilterRecord := 零;<br> 过滤器:=过滤器值;<br> 过滤 := True;<br> 结尾;

  1. 运行
  2. 尝试在编辑框中键入内容以确保过滤器正常工作。
  3. 清除编辑框,然后“(BCD)”显示在所选行上。

我重现了这个错误。这是党卫军:

好吧,我仍然不知道究竟是什么导致了这个问题,但我发现出现了避免这个问题的解决方案。

您需要在刷新 TFDQuery 之前将 TStringGrid.selected 值设置为 -1。所以代码变成:

FilterValue:= 'garmines_id LIKE ''/' +Edit1.Text+'%'' ESCAPE ''/'' ';

StringGrid1.selected := -1;

with FDQuery1 do  begin
  Filtered:= false;
  OnFilterRecord := nil;
  Filter := FilterValue;
  Filtered := True;
end;

我怀疑这个问题的原因是来自 mysql sum() 方法的数据类型,即 FmtBCD(32)

转到数据映射规则(firedac 连接) 标记忽略继承的规则 创建 2 条新规则

规则 1:来源:dtBCD/目标数据类型:dtDouble/所有最小值:0/所有最大值:100 规则 2:源:dtfmtbcd/目标数据类型:dtDouble/所有最小值:0/所有最大值:100

点击确定。现在字段将是 dtDouble,并且与 tgrid

兼容