2012-11-30 2 views
1

나는 내 자신의 이익을 위해 너무 영리했을지도 모른다. -/강제로 DB 그리드를 업데이트하는 방법은 무엇입니까?

나는 약간의 압력 측정을 유지하는 테이블을 가지고있다. 이들은 항상 PSI로 저장되지만 사용자는 PSI와 BAR 사이를 토글하기 위해 라디오 그룹 버튼을 선택할 수 있습니다.

코드를 깨끗하게 유지하고 작업을 데이터베이스에 적용하기 위해 두 번째 테이블 인 configuration 개를 하나의 행으로 만들었습니다. 하나의 열 psi_bar_conversion은 사용자가 라디오 그룹을 토글 할 때 1 또는 14.5 값을 취합니다. 내 DB 그리드에 묶어 델파이에서

, 내 쿼리가 잘 작동 모두

SELECT ROUND(inlet_waterPressure_psi/ 
        (SELECT psi_bar_conversion FROM configuration), 
      (SELECT float_precision FROM configuration)) 
     AS inlet_waterPressure, 
FROM measurements 

같은 문으로 설정 (그리고 아마도 내가 너무 많이 설명하고있다).

라디오 버튼을 처리하는 기능에 일부 코드를 추가하여 내 DB 그리드의 내용을 새로 고쳐야합니다. 왜냐하면 방금 configuration.psi_bar_conversion 값을 업데이트했기 때문입니다 (그러나 내 쿼리의 직접 입력 필드는 없습니다. , 내 데이터 소스의).

DB 그리드, 쿼리, 데이터 소스 중 Refresh() 또는 Invalidate() 또는 SomeOtherFunction() -을 호출해야합니까? 그것이 저를 혼란스럽게합니다. 사전에 어떤 도움

덕분에 ....

+2

이럴 디스플레이 전환 같은 이것은 클라이언트 측에서 수행되어야합니다. 두 명의 서로 다른 사용자가 동일한 데이터베이스에 연결된 응용 프로그램을 사용하고 있고 다른 사용자가 PSI에서이를보고 BAR에서 다른 응용 프로그램을보고 싶다면 어떻게됩니까? 데이터 표시는 데이터베이스 수준이 아니라 클라이언트 수준에서 해결해야 할 사항이 아닙니다. 나는이 점에 관해서는 며칠 전에 대답했다는 것을 기억한다. 그것이 무엇이든지 (나는 세부 사항을 기억하지 못한다.) 그것은 클라이언트 측 이었기 때문에 나에게 더 나은 접근법이다. – jachguate

+0

+1 @jachguate - 뛰어난 점. 죄송합니다. 단일 사용자라고 언급하는 것을 잊어 버렸지 만 매우 좋은 지적입니다. – Mawg

답변

3

당신은 닫고을 적용하려면 psi_bar_conversionfloat_precision의 변화를 가지고 쿼리를 다시 할 필요가있다. 두 하위 선택 (configuration 값)은 쿼리가 실행될 때만 발생합니다.

+0

+1 @kenwhite - 대답은 3 분 안에 주어집니다. 당신은 지금 내가 얼마나 바보인지 알고 있습니다. Open()에서 시도했지만 Close()를 먼저 잊었습니다 :-) – Mawg

+0

답변에 덧붙여 TDataSet.Refresh는 대부분의 경우 작업을 수행합니다 (그러나 전부는 아닙니다).) http://docwiki.embarcadero.com/Libraries/XE3/en/Data.DB.TDataSet.Refresh를 참조하십시오. –

+0

@SirRufo : 열 데이터가 변경되는 하위 선택이있는 경우 ** ** 않습니다 ** 검색어는에 따라 다릅니다. 이것은 그 시점이 명확해질 때까지 [다른 게시물] (http://stackoverflow.com/q/13735707/62576)의 길이로 논의되었습니다 (많은 의견 참조). 문제를 다시 혼동하지 마십시오! :-) –

3

TDBGrid 표현은 연결된 TDataSet에 따라 달라집니다 (TDataSource를 통해).

그리드 값을 업데이트하려면 TDataSet에있는 데이터를 새로 고쳐야합니다. 방법은 TDataSet.Refresh입니다. 그것은에 따라 일부 TDataSet의 후손이 새로 고쳐지지 않습니다

DBGrid1.DataSource.DataSet.Refresh; 

그러나 그것은 엠바 카데로

TDataSet.Refresh

에 의해 설명되어 있습니다 :

당신이 연결이 같은 데이터 집합을 새로 고칠 수있는 특별한 그리드를 업데이트하려면 당신이 사용하는 구성 요소 (나는 UniDAC로 테스트를했고 잘 작동한다)

procedure TForm1.RadioGroup1Click(Sender : TObject); 
var 
    LRate : Extended; 
begin 
    case RadioGroup1.ItemIndex of 
    0 : 
     LRate := 1; 
    1 : 
     LRate := 14.5; 
    end; 
    UniConnection1.ExecSQL('UPDATE configuration SET psi_bar_conversion = :conversion', [LRate]); 
    DBGrid1.DataSource.DataSet.Refresh; 
end; 
당신의 구성 요소가 새로 고침을 호출의 데이터를 다시 반입하지 ​​않은 경우 0

, 당신은

DBGrid1.DataSource.DataSet.Close; 
DBGrid1.DataSource.DataSet.Open; 

이럴 이러한 구성 요소가 완전히 구현되지 닫고 (또한 설명서에 명시된) 재개, 그래서이 가진 단지 해결 방법입니다 (아마도 BeforeClose, AfterClose, BeforeOpen, AfterOpen과 같은) 원치 않는 이벤트를 호출 할 때 부작용이 발생합니다.이 이벤트는 새로 고침을 사용하여 시작되지 않습니다.

하지만 SubSelects와는 아무런 관련이 없습니다.

0

여기 델파이 측면에 도움이 될 수 없습니다.사물의 DATBASE 측면에서

....

방금 ​​데이터베이스에 바 PSI 값을 모두 저장할 수없는 이유가 있나요?

저장할 때 변환을 수행 한 다음 데이터를 보려고 할 때 간단한 선택 만하면됩니다. 이것은 데이터베이스에서 저장 또는 트리거를 수행하는 소프트웨어에 의해 수행 될 수 있습니다.

나는이 PSI에 바 변환 비율은 그래서 당신은 당신이 필요하지 않은 데이터를 볼 처리 매번의 무리를하고있는 변경하지 않을 것을 제안 이유 ...