为了自己的利益,我可能太聪明了: - /
我有一张桌子可以容纳一些压力测量值。它们始终存储为PSI,但用户可以选择一个无线电组按钮在PSI和BAR之间切换。
为了保持代码清洁并将工作推送到数据库,我为configuration
项创建了第二个表,只有一行。当用户切换无线电组时,一列psi_bar_conversion
将取值1或14.5。
在Delphi中,我的查询与我的数据库网格相关联,使用
之类的语句进行设置SELECT ROUND(inlet_waterPressure_psi /
(SELECT psi_bar_conversion FROM configuration),
(SELECT float_precision FROM configuration))
AS inlet_waterPressure,
FROM measurements
所有这些都很好(也许我解释得太多了。)
我要做的就是在函数中添加一些代码,处理单选按钮切换以强制我的数据库网格刷新其内容,因为我刚刚更新了configuration.psi_bar_conversion
的值(但没有直接字段我的查询,也不是我的数据源。)
我应该调用数据库网格的Refresh()
或Invalidate()
或SomeOtherFunction()
- 查询,数据流吗?这让我感到困惑。
提前感谢您的帮助......
答案 0 :(得分:3)
您需要关闭然后重新打开查询才能使psi_bar_conversion
和float_precision
中的更改生效。两个子选择(对于来自configuration
的值)仅在执行查询时发生。
答案 1 :(得分:3)
TDBGrid表示取决于连接的TDataSet(通过TDataSource)。
要更新网格值,您必须使用方法TDataSet
刷新TDataSet.Refresh
中的数据。
要更新特殊网格,您可以刷新连接的DataSet,如下所示:
DBGrid1.DataSource.DataSet.Refresh;
但是一些TDataSet后代不会刷新,这是由Embarcadero记录的
这取决于您使用的组件(我使用UniDAC进行了测试,并且工作正常)
procedure TForm1.RadioGroup1Click( Sender : TObject );
var
LRate : Extended;
begin
case RadioGroup1.ItemIndex of
0 :
LRate := 1;
1 :
LRate := 14.5;
end;
UniConnection1.ExecSQL( 'UPDATE configuration SET psi_bar_conversion = :conversion', [LRate] );
DBGrid1.DataSource.DataSet.Refresh;
end;
如果你的组件没有重新获取调用Refresh的数据,那么你必须关闭并重新打开(也由文档说明)
DBGrid1.DataSource.DataSet.Close;
DBGrid1.DataSource.DataSet.Open;
恕我直言这样的组件没有完全实现,所以这只是一个解决方法,在调用一些可能不需要的事件(BeforeClose,AfterClose,BeforeOpen,AfterOpen)时会产生副作用,这些事件不会因使用Refresh而被触发。
但它完全与SubSelects无关。
答案 2 :(得分:0)
我很蠢,我无法帮助你解决德尔福方面的问题。
在数据库方面......
是否有任何理由不能将bar和psi值都存储在数据库中?
您可以在保存时进行转换,然后只需在要查看数据时对数据进行简单选择。这可以通过执行保存的软件或数据库中的触发器来完成。
我建议这样做的原因是psi-bar转换率不会改变,因此每次查看不需要的数据时都会进行大量处理......