2012-11-30 25 views
1

我可能對我自己來說太聰明瞭: -/如何強制更新數據庫網格?

我有一張表,裏面有一些壓力測量值。它們始終以PSI存儲,但用戶可以選擇一個收音機組按鈕在PSI和BAR之間切換。

爲了保持代碼清潔並將工作推到數據庫上,我創建了第二個表,其中包含一行configuration項。當用戶切換無線電組時,一列psi_bar_conversion將取值1或14.5。

在Delphi中,我查詢它關係到我的數據庫網格設置了之類的語句

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

所有這一切都工作得很好(也許我解釋太多)。

我所要做的就是在處理單選按鈕切換的函數中添加一些代碼,強制我的數據庫網格刷新其內容,因爲我剛更新了configuration.psi_bar_conversion的值(但沒有我的查詢的直接字段,也不是我的數據源)。

我應該調用Refresh()還是Invalidate()SomeOtherFunction() - DB網格,查詢,datasrouce?這就是讓我困惑的原因。

在此先感謝您的幫助....

+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.Refresh刷新TDataSet中的數據。

要更新一個特殊的網格,你可以刷新這樣的連接數據集:

DBGrid1.DataSource.DataSet.Refresh; 

但有些TDataSet的後裔不會刷新和由英巴卡迪諾

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; 

如果您的組件沒有重新獲取關於調用刷新數據,那麼你必須關閉並重新打開(也由文檔說明)

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

恕我直言,這樣的組件未完全實現,所以這只是有一種變通方法在調用一些可能不需要的事件(BeforeClose,AfterClose,BeforeOpen,AfterOpen)時不會被Refresh觸發的副作用。

但是與SubSelects完全沒有關係。

0

我很害怕我無法幫助你在德爾福方面的事情在這裏。

對事物的datbase側....

是否有你不能只是在數據庫中存儲兩個酒吧和PSI值的原因嗎?

您可以在保存時進行轉換,然後當您想要查看時只需對數據進行簡單選擇即可。這可以通過執行保存的軟件或數據庫中的觸發器完成。

的原因,我認爲這是對PSI酒吧轉化率不會改變,所以你在做一堆您查看不需要數據處理每次的...