4

申し訳ありませんが、私はDbGridsを初めて使用します。

クエリのフィールドエディタを使用して、TIMEDIFFをキャプチャする新しいフィールドを追加し、それをDbGridの列として追加する必要がありますか?

または、フィールドエディタをスキップして、どういうわけかTIMEDIFFFを列として宣言できますか?

このテーブルでは、開始時刻、終了時刻、期間、説明の4つの列を持つDbGridが必要です(run_idは主キーであり、表示されません)。

「duration」列にデータを取得する方法について困惑しています...

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およびDelphiIDEで時差を含むすべてのフィールドを生成します。

唯一の問題は、実行時にDBグリッドに表示されないことです。設計時にDBグリッドをダブルクリックすると、列が正しくなります。FielNameプロパティはに設定され、上記durationのクエリによって再調整されます。データベースには存在しませんが、クエリによって計算されます。それはどういうわけか問題でしょうか?


[Aaaaaaaargh !!!]誰かが私のコードを「改善」し、実行時にプログラムでクエリのテキストを設定しようとしました(SELECT * FROM test_runs)したがって、設計時のクエリを上書きします!!データベーステーブルにdurationフィールドがないため、何も表示されませんでしたDBグリッド。

言葉が出て、声が上がって、今はあなたの時間を無駄にしてしまったことをお詫びしなければなりません。ごめん。

4

3 に答える 3

7

クエリに計算フィールドを作成し、そのフィールドをDbGridに追加します。

したがって、あなたが言うように、クエリに対してフィールドエディタを開いた状態で、右クリックして[新しいフィールド]を選択します(またはCtrl-Nを押します)。新しいフィールドに名前(Durationなど)を付け、コンポーネント名をデフォルトのままにするか、必要に応じて名前を変更します。タイプを適切に設定し(この場合はDateTimeである可能性が高い)、フィールドタイプを計算済みに設定します。

次に、クエリの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 に答える
2

DBgrid を使用するには、データソースが必要です。各データセットはそれぞれのコンポーネントに割り当てられ、接続が確立されていることを確認してください。グリッドで何も得られなかった場合は、データセットを確認する必要があります。日付の違いの列データのみが欠落しているが、ヘッダーにクエリのフィールド名が表示されている場合は、おそらく null データを取得している可能性があります.....ヘッダー名も取得できませんでした。クエリを確認する必要があります.......

于 2013-03-06T05:48:12.310 に答える