4

抱歉,我对 DbGrids 很陌生。

我是否应该使用查询的字段编辑器并以某种方式添加一个捕获 TIMEDIFF 的新字段,然后将其添加为我的 DbGrid 中的列?

或者我可以/应该跳过字段编辑器并以某种方式将 TIMEDIFFF 声明为列?

对于这个表,我想要一个有 4 列的 DbGrid:开始时间、结束时间、持续时间、描述(run_id 是主键,不会显示)。

我对如何将数据放入“持续时间”列感到困惑......

mysql> describe  test_runs;
+------------------+-------------+------+-----+---------+----------------+
| Field            | Type        | Null | Key | Default | Extra          |
+------------------+-------------+------+-----+---------+----------------+
| run_id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| start_time_stamp | timestamp   | YES  |     | NULL    |                |
| end_time_stamp   | timestamp   | YES  |     | NULL    |                |
| description      | varchar(64) | YES  |     | NULL    |                |
+------------------+-------------+------+-----+---------+----------------+
4 rows in set (0.37 sec)

[更新]数据源的查询是

SELECT start_time_stamp,
       end_time_stamp,
       TIMEDIFF(end_time_stamp, start_time_stamp) as duration,
       description

FROM test_runs ORDER BY start_time_stamp DESC

当我在 MySql 中手动执行它时,我得到

mysql> select TIMEDIFF(end_time_stamp, start_time_stamp) as duration FROM
+----------+
| duration |
+----------+
| NULL     |
| 00:04:43 |
| 00:00:13 |
| 00:00:06 |
| 00:00:04 |
+----------+
5 rows in set (0.00 sec)

但数据库网格中的相应列保持空白。任何人都可以帮忙吗?谢谢。


[更新] 如果有帮助,我正在使用 AnyDac。当我使用 AnYDac 查询编辑器并执行它时,该查询会在 MySql 和 Delphi IDE 中生成所有字段,包括时差。

唯一的问题是我在运行时在数据库网格中看不到它。我在设计时双击数据库网格,列是正确的。该FielName属性设置为duration,由上面显示的查询重新调整。它在数据库中不存在,而是通过查询计算出来的;这可能是问题所在吗?


[Aaaaaaaargh !!!] 有人试图“改进”我的代码并在运行时以编程方式设置查询的文本(如SELECT * FROM test_runs),从而覆盖了我的设计时查询!!由于数据库表没有duration字段,因此在数据库网格。

话已经说了,声音也提高了,现在我必须为浪费你的时间而道歉。对不起。

4

3 回答 3

7

我会在您的查询中创建一个计算字段并将该字段添加到您的 DbGrid。

因此,正如您所说,在为查询打开字段编辑器的情况下,右键单击并选择新字段(或按 Ctrl-N)。为您的新字段命名(例如持续时间),保持组件名称默认或根据需要重命名。根据需要设置类型(在这种情况下最有可能是日期时间)并将字段类型设置为计算。

然后,在查询的 OnCalcFields 事件中,将该字段的值设置为所需的值。例如:

procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
  Dataset.FieldByName('description').AsDateTime :=
     DataSet.FieldByName('end_time_stamp').AsDateTime - 
     DataSet.FieldByName('start_time_stamp').AsDateTime;
end;

或者,您也可以在选择查询中包含持续时间作为额外字段。不幸的是,我在这里没有准备好访问 MySQL,但它可能是这样的:

select run_id, start_time_stamp, end_time_stamp, description, 
  (end_time_stamp - start_time_stamp) as duration from test_runs;
于 2012-11-27T03:12:53.550 回答
3

我是否应该使用查询的字段编辑器并以某种方式添加一个捕获 TIMEDIFF 的新字段,然后将其添加为我的 DbGrid 中的列?

不是一开始,从该字段编辑器中删除所有条目

或者我可以/应该跳过字段编辑器并以某种方式将 TIMEDIFFF 声明为列?

不是一开始,从该列编辑器中删除所有条目

之后,您应该会看到网格内打开数据集中的所有列,因为您消除了列编辑器和字段编辑器的所有限制。

作为猜测您的网格/数据会发生什么,您没有设置FieldName列的属性duration,因此网格不知道要呈现什么。

于 2013-03-06T09:33:47.033 回答
2

要使用 DBgrid,您需要一个数据源,每个数据集都应分配给各自的组件,并确保您已建立连接。如果您在网格中没有得到任何东西,您需要检查您的数据集,如果仅缺少日期差异列数据但标题在查询中显示字段名称,那么您可能会得到空数据.....即使您也没有得到标题名称,您需要检查您的查询.......

于 2013-03-06T05:48:12.310 回答