delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيف تغير التاريخ تلقائيا في قاعدة بيانات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم 
ماهي الطريق الامثل لتغير التاريخ تلقائيا  او اوتوماتكيا في حقل في قاعدة البيانات مثلا بع مرور سبعة ايام
عندي محاولة  
كود :
if now - (ADOTable1.FieldByName('date').value)=7 then adotable.append ADOTable1.FieldByName('date').value:=now; adotable.post;
وذلك مع كامل التسجيلات في الجدول
شكرا
سلام عليكم

اوضح اكثر
عندي حقل تاريخ بقاعدة بيانات اكسس
اذا حل يوم المسجل في الحقل يتم استبداله بتاريخ سبعة ايام القادمة اليا بدون تدخل المستعمل
مثال
في الحقل مسجل 24/03/2016
عندما يحل موعد نفس التاريخ اي 24/03/2016
يتحول الى 31/03/2016 اليا.
لو أنك تستخدم SQL Server لكان الأمر بسيط جداً باستخدام SQL Server Agent, حيث أنه سيقوم بتنفيذ تعليمة SQL للتعديل على الجداول التي تريد و الحقول التي تريد حسب ال Schedule  الذي تريد.

ولكن بما أنك تستخدم أكسس, فعليك بالقيام بهذه العملية بشكل يدوي, إما عن طريق الدلفي بشكل مباشر أو أن تكتب استعلام داخل ملف الأكسس و تقوم بتنفيذه بشكل دوري.

1- عن طريق الدلفي:
يمكن وضع الكود الخاص بالتعديل على حقول التاريخ ضمن تايمر إذا كان برنامجك يعمل بإستمرار, أو أن تضع الكود في حدث on show مثلاً للفورم المتعلق بهذه القضية.
سنفترض أنك تريد التعديل على كامل السجلات:

كود :
 ADOTable1.DisableControls;  ADOTable1.First;  while not ADOTable1.Eof do  begin    if ADOTable1.FieldByName('your date field name').AsDateTime = now then    begin      ADOTable1.Edit;      ADOTable1.FieldByName('your date field name').AsDateTime :=        ADOTable1.FieldByName('your date field name').AsDateTime + 7;      ADOTable1.post;    end;    ADOTable1.Next;  end;  ADOTable1.EnableControls;
2- استعلام الأكسس و تنفيذه:
عليك بإنشاء query داخل ملف الأكسس و تسميه مثلاُ setnewdate وتضع به الكود التالي:
كود :
UPDATE table1 SET mydate = mydate+7 WHERE mydate=date();
الآن كل ما عليك هو تشغيله بشكل دوري من داخل الدلفي, و لعمل ذلك يمكنك استخدام ADOCOMMAND و تضع في خاصية Commandtext اسم الquery الذي أنشئته:
كود :
ADOCommand1.CommandText := 'setnewdate'; ADOCommand1.Execute;

وبهذا سيتم تنفيذ الquery ليؤثر على سجلات الجدول حس المطلوب.
وفقكم الله.
السلام عليكم اخي الكريمPLANSHARP
أشكرك على جوابك السريع وشرحك المتقن الوافي والكافي لقد كنت جوادا في جوابك وتعلمت اشياءا جديدة .كثر الله امثالك ونفعنا الله بعلمك ,حفظك الله اخي ساجرب ما تفضلت به.
السلام عليكم.
السلام عليكم اخي الكريمPLANSHARP
لقد جربت الكود واشتغل على التمام
الا انني سألح عليك قليلا فتحملني بارك الله فيك
ADOTable1.DisableControls; اريد ان أعرف وظيفتها
ثانيا عندي حقل ثان  order يحمل  القيمتين 'أول' أو 'أخير'     اريد ان أربطه مع التاريخ  أعلاه اذا تغير التاريخ وكان order  'أول' يتغير بدوره تلقائيا و يصبح 'أخير'  والعكس اذا كان 'أخير'  يصبح 'أول' .
استسمحك وقتك الثمين
السلام عليكم
و عليكم السلام و رحمة الله وبركاته.
بالنسبة لـ Disablecontrols: تقوم بإيقاف ال adotable من عرض بيانات السجلات ضمن عناصر ال DB-aware , مثل DBedit, Dbmemo, Dbgrid, وذلك لأن الكود سيقوم بعملية scan لكل السجلات ضمن الجدول و هذا لا داعي لإظهاره على العناصر مما قد يسبب بطء في البرنامج.

بالنسبة للتعديل:
كود :
 ADOTable1.DisableControls;  ADOTable1.First;  while not ADOTable1.Eof do  begin    if ADOTable1.FieldByName('your date field name').AsDateTime = now then    begin      ADOTable1.Edit;      ADOTable1.FieldByName('your date field name').AsDateTime :=        ADOTable1.FieldByName('your date field name').AsDateTime + 7;      if ADOTable1.FieldByName('order').AsString = 'أول' then        ADOTable1.FieldByName('order').AsString := 'أخير'      else        ADOTable1.FieldByName('order').AsString := 'أول';      ADOTable1.post;    end;    ADOTable1.Next;  end;  ADOTable1.EnableControls;
وفقكم الله.
السلام عليكم اخي الكريم PLANSHARP أشكرك على شرحك وتحملك فزادي قليل ومعارفي مبعثرة.
لقد اسعدتني اسعدك الله لقد عمل الكود بالتمام و المراد المنشود , إلا انني وضعت date مكان now حتي لا تدخل الساعة وعمل في الأخير. فجزاك الله عنا كل خير ووفقك الله.
ملاحظة: عند استخدام الطريقة الثانية و هي استعلام الأكسس و تنفيذه فإن هذه الطريقة سريعة جداً و أسرع بكثير من الطريقة الأولى.

وإذا أردت ملاحظة الفرق, جرب على جدول به 50 ألف تسجيلة أو أكثر.
(10-04-2016, 02:21 PM)PLANSHARP كتب : [ -> ]ملاحظة: عند استخدام الطريقة الثانية و هي استعلام الأكسس و تنفيذه فإن هذه الطريقة سريعة جداً و أسرع بكثير من الطريقة الأولى.

وإذا أردت ملاحظة الفرق, جرب على جدول به 50 ألف تسجيلة أو أكثر.

السلام عليك أخي 
أحسن الله إليك , معلومة مفيدة جدا, وفقنا الله لبذل العلم النافع.