更新後の間違った結果がDbNavigatorデルファイに押され
-
18-09-2019 - |
質問
私はここで非常に奇妙な状況に直面しています。 私はJETを介してデータベース(MDB)にアクセスしています。私は、ユーザーのアクセスにそれを可能にするためのDBGridとDBNavigatorを使用しています。データセットは、次のクエリで、TADOQueryコンポーネントを使用して作成されます:
SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName
これは正常に動作します。私はDBNavigatorの[更新]ボタンを押すたびしかし、この計算フィールドの結果が間違っているとなります。例えば、通常、私は7歳の列に示されている場合、私は押した後、それは40149になりリフレッシュ 40150から40149まで、6回交換、0 40156に等7つの変化 正しい結果を表示するために、私は再び、クエリを再開する必要があります。
誰が助けることができますか?
解決
日で年齢を返します。これは、次のことを試してみてください。
SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName
年間使用されている年齢の場合:
SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName
(注意、CINTはINTにはない、四捨五入)
これが機能することの理由は、整数部分が特定の日からの日数と、その日の小数部分と小数部分であるfloatとして、デルファイと同様の方法でACCESSストアがその日付/時刻ということです(0.25 =午前6時、0.50 =正午、など)。あなたは二日間の違いを知りたい場合はこのように、ちょうど一日数の違いを取る...数年間、年の日数によって、これを割ます。
編集
ここでもう一つのオプションは、Delphiで計算フィールドを作成し、そこにロジックを実行することです。あなたのonCalculatedイベントでは、次のようなものをコーディングします:
procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('CALCDATE').AsInteger :=
Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;
編集
そして、さらに第3の方法。むしろそれが現在、動作をオーバーライドし、近くを強制/ナビゲーターののonClickを使用して、データセットの再オープンしないようにリフレッシュが機能するよう:
procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
if Button = nbRefresh then
begin
ds1.Close;
ds1.Open;
end;
end;
他のヒント
の代わりに、この間隔パラメータを試してみてください。
SELECT *, (DateDiff ('yyyy',[Birth Date], Now())) AS [Age] FROM TableName
ここで、「間隔」とは何の略かです
yyyy Year
q Quarter
m Month
y Day of Year
d Day
w Weekday
ww Week
h Hour
n Minute
s Second
私はあなたの以前のコメントでテストを行なったし、私も同じエラーを持っています。
私はそれがどこかナビゲータまたはジェットのバグだと思います。
あなたはNAVにリフレッシュを打つとき。示さ40149は、計算されたもののないダブルとして日付表現です。見つかりました。最初の列だけを使用するようにし、それを表示するように見える。
あなたはそれを文字列にキャストしようとした場合、、表示されるデータは、まだ日時です。
Select *, ' ' & DateDiff(.......) as [Age] From table1;
私が最初に計算されたフィールドに入力文字列または数値の列を使用すると、、結果は、それが必要と表示されています。 あなたが試すことができます:
SELECT *, mid(id & (DateDiff ('y',[madate], Now())), len(id) + 1) AS [Age] FROM Table1
それともます:
SELECT *, (id-id) + (DateDiff ('y',[madate], Now())) AS [Age] FROM Table1
これはかなり醜いですが、それはトリックを行います..