delphi 实时绑定中的 TStringGrid 显示 (bcd)
TStringGrid show (bcd) in delphi live binding
我在 delphi firemonkey 应用程序的实时绑定中将 TFDQuery 与 TStringGrid 连接起来。
我尝试在基于编辑框的 TFDQuery 中使用过滤器进行搜索,效果很好。
但是,每当我清除编辑框时,我在 TStringGrid 中的一行会显示“(bcd)”,因为它的值如下图所示。
我做错了什么?我该如何解决?
编辑:
- 我正在使用 mySql 数据库和 firedac tfdconnection + tfdquery
- 该列的数据类型是 AnsiString & FmtBCS(32,0)
- 我在 delphi 中使用实时绑定功能。
我的过滤代码
with MainQuery do begin
Filtered := False;
OnFilterRecord := nil;
Filter := FilterValue;
Filtered := True;
end;
我用TFDConnection.execSQL
插入到table
“(BCD)”部分总是在所选行上发生变化,如下图。
编辑 2:
要重现我的错误,您可以:
- 添加 TStringGrid。
- 添加编辑框。
- 添加 tfd 连接
- 添加 tfdquery
- 使用从 tfdquery 到 tstringgrid 的实时绑定。
- 在 mysql 中使用 SUM() 向 tfdquery.sql.text 添加查询。示例:
"select id, sum(stock) as total_stock from stocks"
- 激活 tfdquery
- 在编辑框上添加 onkeyup 事件。
- 添加此代码:
FilterValue:= 'garmines_id LIKE ''/' +Edit1.Text+'%'' ESCAPE ''/'' ';
使用 FDQuery1 开始<br>
过滤:=假;<br>
OnFilterRecord := 零;<br>
过滤器:=过滤器值;<br>
过滤 := True;<br>
结尾;
- 运行
- 尝试在编辑框中键入内容以确保过滤器正常工作。
- 清除编辑框,然后“(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
兼容
我在 delphi firemonkey 应用程序的实时绑定中将 TFDQuery 与 TStringGrid 连接起来。
我尝试在基于编辑框的 TFDQuery 中使用过滤器进行搜索,效果很好。
但是,每当我清除编辑框时,我在 TStringGrid 中的一行会显示“(bcd)”,因为它的值如下图所示。
我做错了什么?我该如何解决?
编辑:
- 我正在使用 mySql 数据库和 firedac tfdconnection + tfdquery
- 该列的数据类型是 AnsiString & FmtBCS(32,0)
- 我在 delphi 中使用实时绑定功能。
我的过滤代码
with MainQuery do begin Filtered := False; OnFilterRecord := nil; Filter := FilterValue; Filtered := True; end;
我用TFDConnection.execSQL
插入到table
“(BCD)”部分总是在所选行上发生变化,如下图。
编辑 2: 要重现我的错误,您可以:
- 添加 TStringGrid。
- 添加编辑框。
- 添加 tfd 连接
- 添加 tfdquery
- 使用从 tfdquery 到 tstringgrid 的实时绑定。
- 在 mysql 中使用 SUM() 向 tfdquery.sql.text 添加查询。示例:
"select id, sum(stock) as total_stock from stocks"
- 激活 tfdquery
- 在编辑框上添加 onkeyup 事件。
- 添加此代码:
FilterValue:= 'garmines_id LIKE ''/' +Edit1.Text+'%'' ESCAPE ''/'' ';
使用 FDQuery1 开始<br>
过滤:=假;<br>
OnFilterRecord := 零;<br>
过滤器:=过滤器值;<br>
过滤 := True;<br>
结尾;
- 运行
- 尝试在编辑框中键入内容以确保过滤器正常工作。
- 清除编辑框,然后“(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
兼容