gpt4 book ai didi

database - 在 DbNavigator Delphi 上按下刷新后的错误结果

转载 作者:搜寻专家 更新时间:2023-10-30 21:48:35 26 4
gpt4 key购买 nike

我在这里遇到了一个非常奇怪的情况。我正在通过 JET 访问数据库 (MDB)。我使用 DBGrid 和 DBNavigator 来允许用户访问它。数据集是使用 TADOQuery 组件创建的,具有以下查询:

SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName

它工作正常。但是每当我按下 DBNavigator 上的刷新按钮时,这个计算字段的结果就会出错。例如,如果通常我在 Age 列上显示 7,在我按 Refresh 后它变成 40149,7变40149,6变40150,0变40156等为了查看正确的结果,我需要再次重新打开查询。

有人可以帮忙吗?

最佳答案

尝试以下操作,它将以天为单位返回年龄。

SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName

对于年龄使用:

SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName

(注意,CINT 回合,INT 没有)

之所以可行,是因为 ACCESS 以与 Delphi 类似的方法存储它的日期/时间,作为一个 float ,其中整数部分是从特定日期开始的天数,小数部分是那天的小数部分(0.25 = 早上 6 点,0.50 = 中午,等等)。因此,如果您想知道两天之间的差异,只需计算天数之间的差异......对于年数,将其除以一年中的天数。

编辑

这里的另一个选择是在 Delphi 中创建一个计算字段并在那里执行逻辑。在您的 onCalculated 事件中,您将编写如下代码:

procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('CALCDATE').AsInteger :=
Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;

编辑

还有第三种方法。不是允许刷新像当前那样工作,而是覆盖行为并使用导航器的 onClick 强制关闭/重新打开数据集:

procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
if Button = nbRefresh then
begin
ds1.Close;
ds1.Open;
end;
end;

关于database - 在 DbNavigator Delphi 上按下刷新后的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com