对不起,我是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)
但DB网格中的相应列仍为空白。有人可以帮忙吗?感谢。
[更新]我正在使用AnyDac,如果有帮助的话。当我使用AnYDac查询编辑器并执行它时,查询在MySql和Delphi IDE中生成所有字段,包括时差。
唯一的问题是我在运行时没有在数据库网格中看到它。我在设计时双击数据库网格,列正确。 FielName
属性设置为duration
,由上面显示的查询重新调整。它在数据库中不存在,但是由查询计算;那可能是某种程度上的问题??
[Aaaaaaaar !!!]有人试图“改进”我的代码并在运行时以编程方式设置查询的文本(如SELECT * FROM test_runs)
,从而覆盖我的设计时查询!!因为数据库表没有duration
字段,数据库网格中没有显示。
有话语,声音很粗糙,现在我必须为浪费你的时间而妥协。遗憾。
答案 0 :(得分:7)
我会在您的查询中创建一个计算字段,并将该字段添加到您的DbGrid。
所以,正如你所说,打开字段编辑器进行查询,右键单击并选择New Field(或按Ctrl-N)。为新字段命名(例如持续时间),保持组件名称默认或重命名(如果需要)。根据需要设置Type(在这种情况下最有可能是DateTime)并将Field Type设置为Calculated。
然后,在Query的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;
答案 1 :(得分:3)
我应该使用查询的字段编辑器,并以某种方式添加一个新字段 捕获TIMEDIFF,然后将其添加为我的DbGrid中的列?
首先,不删除该字段编辑器中的所有条目
或者我可以/应该跳过字段编辑器并以某种方式声明 TIMEDIFFF作为一列?
首先,删除该列编辑器中的所有条目
之后,你应该看到网格中开放数据集的所有列,因为你消除了列编辑器和字段编辑器的所有限制。
猜测你的网格/数据会发生什么,你没有为列FieldName
设置duration
属性,因此网格不知道要呈现什么。
答案 2 :(得分:2)
要使用DBgrid,您需要一个数据源,每个数据集应分配给相应的组件,并确保已建立连接。如果你没有得到网格中的任何东西,你需要检查你的数据集,如果只有日期差异列数据丢失,但标题显示查询中的字段名称,那么你可能会获得空数据.....即使你没有得到标题名称你需要检查你的查询.......