نتيجة خاطئة بعد تحديث الضغط على dbnavigator دلفي
-
18-09-2019 - |
سؤال
لقد واجهت وضعا غريبا جدا هنا. أنا الوصول إلى قاعدة البيانات (MDB) من خلال طائرة. يمكنني استخدام DBGrid و DBNavigator للسماح بالوصول إلى المستخدم. تم إنشاء DataSet باستخدام مكون Tadadoquery، مع الاستعلام التالي:
SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName
أنه يعمل بشكل جيد. ولكن كلما ضغطت على زر التحديث على DBNavigator، فإن نتيجة هذا الحقل المحسوب يصبح خطأ. على سبيل المثال، إذا كان لدي عادة 7 موضحة في العمود العمري، بعد الضغط على التحديث، يصبح 40149، 7 تغييرات على 40149، 6 تغييرات على 40150، 0 إلى 40156 وما إلى ذلك من أجل عرض النتيجة الصحيحة التي أحتاج إلى إعادة فتح الاستعلام مرة أخرى.
أي شخص يمكن أن يساعد؟
المحلول
جرب ما يلي، مما سيعود العمر في أيام.
SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName
بالنسبة للعمر في سنوات الاستخدام:
SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName
(ملاحظة، جولات Cint، Int لا)
السبب في أن هذا يعمل هو أن الوصول إلى تخزين تاريخ / وقته في طريقة مماثلة كدليل، كطفل حيث يمثل الجزء عدد صحيح عدد الأيام منذ يوم محدد والجزء الكسري كجزء كسور من ذلك اليوم (0.25 = 6 صباحا، 0.50 = الظهر، إلخ). وبالتالي، إذا كنت ترغب في معرفة الاختلافات بين يومين، فما عليك سوى خذ الاختلافات بين أرقام اليوم ... لعدد سنوات، فقس على ذلك عدد الأيام في السنة.
تعديل
خيار آخر هنا سيكون إنشاء حقل محسوب في دلفي وأداء المنطق هناك. في حدث الخاص بك oncalculated، ستعهد كود شيء مثل ما يلي:
procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('CALCDATE').AsInteger :=
Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;
تعديل
وحتى الآن طريقة ثالثة. بدلا من السماح للحديث بالعمل كما تفعل حاليا، قم بتجاوز السلوك وإجبار عن قرب / إعادة فتحات البيانات باستخدام OnClick of the Navigator:
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
هذا قبيح جدا، لكنه يفعل الخدعة ..