1

私は自分の利益のためにあまりにも賢かったかもしれません:-/

私はいくつかの圧力測定値を保持するテーブルを持っています。これらは常にPSIとして保存されますが、ユーザーはラジオグループボタンを選択してPSIとBARを切り替えることができます。

configurationコードをクリーンに保ち、作業をデータベースにプッシュするために、単一行のアイテム用の2番目のテーブルを作成しました。ユーザーが無線グループを切り替えると、1つの列psi_bar_conversionの値は1または14.5になります。

Delphiでは、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()それが私を混乱させているものです。

助けてくれてありがとう…。

4

3 に答える 3

3

psi_bar_conversion変更を有効にするには、クエリを閉じてから再度開く必要がありますfloat_precision。2つの副選択(からの値configuration)は、クエリが実行されたときにのみ発生します。

于 2012-11-30T03:31:39.087 に答える
3

TDBGridの表示は、(TDataSourceを介して)接続されたTDataSetに依存します。

グリッド値を更新するにTDataSetは、メソッドを使用してデータを更新する必要がありますTDataSet.Refresh

特別なグリッドを更新するには、次のように接続されたデータセットを更新できます。

DBGrid1.DataSource.DataSet.Refresh;

ただし、一部のTDataSetの子孫は更新されず、Embarcaderoによって文書化されています

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;

コンポーネントがRefreshの呼び出し時にデータを再フェッチしなかった場合は、閉じて再度開く必要があります(ドキュメントにも記載されています)

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

IMHOのようなコンポーネントは完全には実装されていないため、これは、Refreshを使用して起動されない不要なイベント(BeforeClose、AfterClose、BeforeOpen、AfterOpen)を呼び出す際の副作用がある回避策にすぎません。

しかし、それはSubSelectsとはまったく関係ありません。

于 2012-12-06T13:30:09.607 に答える
0

私はここで物事のデルファイ側であなたを助けることができないのは残念です。

物事のデータベース側で....

バーとpsiの両方の値をデータベースに保存できない理由はありますか?

保存時に変換を行うことができます。その後、データを表示するときにデータを選択するだけです。これは、保存を実行しているソフトウェアまたはデータベースのトリガーによって実行できます。

私がこれを提案する理由は、psi-bar変換比が変更されないため、不要なデータを表示するたびに大量の処理を実行しているためです...

于 2012-12-06T13:41:09.193 に答える