2012-11-27 3 views
4

죄송합니다, 나는 DbGrids에 새로 왔습니다.TIMEDIFF (지금, 그때)를 DB Grid에 표시하는 방법은 무엇입니까?

쿼리의 필드 편집기를 사용해야하고 TIMEDIFF를 캡처 한 다음 DbGrid의 열로 추가해야하는 필드를 추가해야합니까?

필드 편집기를 건너 뛸 수 있습니까? 어떻게 든 TIMEDIFFF를 열로 선언 할 수 있습니까?

이 테이블의 경우 시작 시간, 종료 시간, 기간, 설명 (run_id는 기본 키 &이 표시되지 않음)의 4 개 열로 DbGrid가 필요합니다. 나는 '시간'컬럼에 데이터를 얻는 방법에 관한 난처한 상황에 빠진

...

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에서 시차를 포함한 모든 필드를 생성합니다.

유일한 문제점은 런타임시 DB 그리드에 표시되지 않는다는 것입니다. 디자인 타임에 DB 그리드를 두 번 클릭하면 열이 올바른 것입니다. FielName 속성은 duration으로 설정되며 위에 표시된 쿼리에 의해 다시 실행됩니다. 데이터베이스에는 존재하지 않지만 쿼리에 의해 계산됩니다. 그게 어떻게 든 문제가 될 수 있니?


[Aaaaaaaargh가!] 누군가 내 코드를 "개선"과, 데이타베이스 테이블이 없기 때문에, 따라서 나의 설계 시간 쿼리를! 덮어 쓰기, SELECT * FROM test_runs)으로 (런타임에 프로그래밍 방식으로 쿼리의 텍스트를 설정하려고 duration 필드는 아무도,

단어가 가진했다. DB를 그리드에 표시되지 않은 음색 Rasied입니다되었고, 지금은 당신의 시간을 낭비하기위한 apolgize해야합니다. 죄송합니다.

+1

나는 XE3 및 UniDAC를 사용하여 쿼리를 테스트했으며 예상대로 실행됩니다. 모든 열과 행이 예상대로 표시됩니다. 사용중인 Delphi 버전과 db-access-components를 추가하십시오. –

+1

나는이 질문을 다음과 같이 중복하여 투표하려고한다. http://stackoverflow.com/questions/15262319/displaying-a-mysql-timediff-in-a-db-grid 열린 현상금,하지만 정말 두 질문 사이에 차이가 없어!. – jachguate

답변

7

나는 당신의 쿼리에 계산 필드를 생성하고 추가 할 수 해당 필드를 DbGrid에 연결하십시오.

그렇다면 필드 편집기를 열어 쿼리를 열고 마우스 오른쪽 단추를 클릭 한 다음 새 필드를 선택하거나 Ctrl-N을 누릅니다. 새 필드에 이름 (예 : 기간)을 지정하고 구성 요소 이름을 기본값으로 유지하거나 원하는 경우 이름을 바꿉니다. 유형을 적절하게 설정하고 (이 경우 가장 가능성있는 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; 
2

당신이 데이터 소스를 필요 DBGrid를을 사용하여, 데이터 세트가 각각 각각의 구성 요소에 할당되어야하고, 당신이 만든 확인 연결. 만약 당신이 그리드에서 당신이 당신의 데이터 집합을 확인하는 데 필요한 날짜 차이 컬럼 데이터가 누락되어 있지만 쿼리에서 필드 이름을 표시하면 아무 것도 얻을 수 아마도 당신은 null 데이터 ..... 아마도 당신을 얻을 수 있습니다 .....

3

내가 쿼리의 필드 편집기를 사용하여 어떻게 든 가 TIMEDIFF을 캡처 한 후 그냥 추가하는 것이 새로운 필드를 추가해야 ....... 당신이 당신의 쿼리를 확인할 필요가 너무 헤더 이름을 얻지 않았다 내 DbGrid의 열로? 처음

하지, 해당 필드 편집기

또는/I 필드 편집기를 생략하고 어떻게 든 열로 TIMEDIFFF를 선언해야 할 수 있습니다에서 모든 항목을 삭제 하시겠습니까? 처음

아니, 당신이 열 편집기 필드 편집기에서 모든 제한을 제거하기 때문에, 그리드 내부에 오픈 세트에서 모든 열을 볼 수 그 후 해당 열 편집기에서

을 모든 항목을 삭제 .

격자/데이터에 어떤 현상이 발생했는지 알 수 없으므로 duration 열에 FieldName 속성을 설정하지 않았으므로 그리드에 표시 할 항목을 알 수 없습니다.

+1

+1 삭제는 데이터베이스에 존재하지 않으며 쿼리에 의해 계산되므로 물론 모든 기간을 표시했지만 '기간'은 표시하지 않았습니다. 객체를 다시 추가하면 객체 검사자가'duration'을 포함하여'FieldName' 속성에서 쿼리가 반환 한 필드를 올바르게 제공했습니다. 그러나 그리드에는 '지속 시간'이 표시되지 않습니다 (다른 모든 필드가 표시됨). 'duration'이 쿼리에 의해 계산 되었기 때문에 어떻게 될까요 ?? – Mawg