احبتي الكرام اسعد الله اوقاتكم بكل خير
لدي مشكلة غريبة وهي ان التاريخ يعرض للمرة الاولى فقط بشكل صحيح
وعند الفلترة في الداتاقريد من خلال كومبو بوكس يحصل خلل في عرض التاريخ
مع ان الكود نفسه ولم يتغير فيه شي ،، جهازي عربي على اعدادات السعودية
التقويم ام القرى
المرة الأولى يكون بهذا الشكل
وكما تلاحظون التاريخ صحيح وموافق لليوم المقابل له
بعد اختبار رقم اخر وفلترة البحث ينقص التاريخ يوم كما في الصورة التالية
ايضا وضعت زر تحديث ولكنه لايعطي نتائح صحيحة بعد الفلترة اما قبل الفلترة فهو يعطي نتائح صحيحة
ارجو منكم اخوتي مساعدتي في هذه المشكلة حيث اني مبتدى نوعا
مرفق لكم مشروعي شاكر سلفا كل من تعاون معي..
هذة المشكلة واجهت الكثييييييير من المبرمجين
لأن الـ provider الخاص بقواعد أكسس OleDb لا يدعم إلا التقويم الميلادي , والمصيبة أنه حتى له اسلوب خاص في التعامل مع التاريخ بغض النظر عن التاريخ المعد في النظام، والطامة الأكبر أن مايكروسوفت لم تشرح طريقة عمل قواعد اكسس بشكل كامل في ما يخص الـ OleDb وكيف يتعامل مع التواريخ ( أحجية لا يعرفها أحد )
عند تنفيذ الإستعلام
SELECT * from gyabt
النتيجة طبيعية
لكن الغريب والذي يجعلك فعلاً ترفع حاجبيك إلى الأعلى من الدهشة الغموض الذي يحدث عند تنفيذ الإستعلام بهذا الشكل
SELECT * from gyabt where XXX=YYY
بغض النظر عن ماذا يأتي بعد الكلمة where المهم أنك إستخدمة الكلمة where
لا تعلم مالذي يحدث في التطبيق
تتغير إعدادت التقويم بشكل لا يمت بصلة لأي شي
لماذا لا تعلم
ما الذي تغير لا تعلم
المهم ان التطبيق بعد تنفيذ جملة إستعلام تحتوي على الكلمة where يحدث شيء غريب
جميع البيانات تأتي بشكل طبيعي ، إلا إذا حاولت التحويل بين التواريخ من ميلادي إلى هجري والعكس، الكلمة where لك بالمرصاد.
قبل إستخدام الكلمة where تحويل التاريخ صحيح
بعد الكلمة where النتيجة غير مضمونة إما ناقص أو زائد أو يساوي بعض المرات
ابتعد عن اكسس إذا كنت فعلاً تحتاج إلى التعامل مع التواريخ الهجرية. ( معاناه أنت في غنى عنها )
الف شكر على ردودكم اخوتي الخبراء ،، افهم من هذا انه لو تم تعديل قاعدة البيانات الى اصدار اقدم فلا مشكلة؟
ايضا لو تم الاستغناء عن الاكسس واستخدام قواعد sql او حتى صفحة اكسل هل ستختفي المشكلة ؟
شاكر للجميع وكتب الله اجركم
المشكلة تحدث لما تدخل تعديلات على جملة الاستعلام
فلما تضع شرط التحديد تختل التعديلات وتعطيك التاريخ بحسب معادلة التحويل بين التاريخين ضمن السستم
(ربما معادلة قديمة في آكسس لم تنتبه لها مايكروسوفت حتى الان)
لاحظ جملة الاستعلام ("Select * From gyabt")
لاحظ استخدام الـ (*) وهنا الحل والمشكلة :
هنا يتم التعويض بحسب ما طلبت من البرنامج أن يعطيك التاريخ بإعدادات المملكة السعودية بحسب محاكي الفيجول استديو
بينما لو عينت أسماء الحقول (الأعمدة) بعد (Select) أو (Where) ستحدث المشكلة لأنها ستترك أمر التعديل لمعادلة الأكسس القديمة
لما تكون بدون تحديد بيشتغل طبيعي(لما تستخدم *)،
ولما تحدد عرض حقول محددة أو بشرط حقل ما تحدث المشكلة.
--
لكن ..
لكن يمكن تجاوز هذه المشكلة باستخدام لغة الاستعلام Linq وكذلك ضمن الـ Limpda
يعني بتخلي جملة الاستعلام ثابتة والتي هي ("Select * From gyabt")
ولكن البحث سيتم في الجدول الناتج والذي هو (dt)
بالتالي يصبح الكود :
كود :
Dim ci As CultureInfo
ci = New CultureInfo("ar-sa")
CultureInfo.DefaultThreadCurrentCulture = ci
Dim conn As New OleDbConnection("provider=microsoft.ace.oledb.12.0; data source=FprintDB.accdb")
Dim da As New OleDbDataAdapter("Select * From gyabt", conn)
Dim dt As New DataTable
da.Fill(dt)
Dim TA = From dd In dt.AsEnumerable()
Where dd(0) = ComboBox1.SelectedItem
DataGridView1.DataSource = TA.CopyToDataTable()
DataGridView1.Columns(1).DefaultCellStyle.Format = ("yyyy/MM/dd")
(07-04-23, 05:03 PM)Taha Okla كتب : [ -> ]لكن يمكن تجاوز هذه المشكلة باستخدام لغة الاستعلام Linq وكذلك ضمن الـ Limpda
يعني بتخلي جملة الاستعلام ثابتة والتي هي ("Select * From gyabt")
ولكن البحث سيتم في الجدول الناتج والذي هو (dt)
بالتالي يصبح الكود :
كود :
Dim ci As CultureInfo
ci = New CultureInfo("ar-sa")
CultureInfo.DefaultThreadCurrentCulture = ci
Dim conn As New OleDbConnection("provider=microsoft.ace.oledb.12.0; data source=FprintDB.accdb")
Dim da As New OleDbDataAdapter("Select * From gyabt", conn)
Dim dt As New DataTable
da.Fill(dt)
Dim TA = From dd In dt.AsEnumerable()
Where dd(0) = ComboBox1.SelectedItem
DataGridView1.DataSource = TA.CopyToDataTable()
DataGridView1.Columns(1).DefaultCellStyle.Format = ("yyyy/MM/dd")
شاكر لك اخي الكريم على الافادة والشكر موصول للاخوة اللي ردوا علي موضوعي اعلاه..
المشكلة ماعندي خلفية عن Linq حاولت اجد مواضيع او دورات تتكلم عنها وللاسف كلها على لغة C# وانا مااعرف الا للفيجول
حاليا رجعت لقاعدة بيانات mdb مع اني ما ارتاح لها بمكن كسر حمايتها بسهولة وانا احتاج اقفل قاعدة البيانات بكلمة مرور بعد الانتهاء من المشروع
أوامر الـ Linq هي نفسها التي تعمل في السي شارب تعمل في الفيجول بيزك دوت نت بدون تغيير
نفس الكود تقريبا ويوجد بعض الفروقات وهي :
1 - نهاية كل كود فاصلة منقوطة في السي شارب.
2 - للتعريف عن متغير في السي شارب من أجل تخزين قيمة جملة الـ Linq نستخدم var
في الفيجول بيزك نستخدم Dim
3 - أوامر الـ Limbda في السي شارب تعين بـ (r1 => r1) بينما في الفيجول بيزك بـ (Function(r1) r1).
وفروقات آخر بسيطة ..
إن كنت تعلمت من قبل البرمجة كائنية التوجه (oop) فأدخل وتعلم اللـ Linq من أي دورة سي شارب وطبقها ضمن الفيجول بيزك ببساطة وستعرف كل شيء عنها خلال يومين وتتقنها عن آخرها.
وأي شيء قد يشكل عليك بعدها : أدخل على هذا الموقع وأطرح سؤالك وستجد الكثير من يفيدك بما تريد وأكثر بإذن الله.
(06-04-23, 06:02 AM)assuhimi كتب : [ -> ]احبتي الكرام اسعد الله اوقاتكم بكل خير
لدي مشكلة غريبة وهي ان التاريخ يعرض للمرة الاولى فقط بشكل صحيح
وعند الفلترة في الداتاقريد من خلال كومبو بوكس يحصل خلل في عرض التاريخ
مع ان الكود نفسه ولم يتغير فيه شي ،، جهازي عربي على اعدادات السعودية
التقويم ام القرى
المرة الأولى يكون بهذا الشكل
وكما تلاحظون التاريخ صحيح وموافق لليوم المقابل له
بعد اختبار رقم اخر وفلترة البحث ينقص التاريخ يوم كما في الصورة التالية
ايضا وضعت زر تحديث ولكنه لايعطي نتائح صحيحة بعد الفلترة اما قبل الفلترة فهو يعطي نتائح صحيحة
ارجو منكم اخوتي مساعدتي في هذه المشكلة حيث اني مبتدى نوعا
مرفق لكم مشروعي شاكر سلفا كل من تعاون معي..
(06-04-23, 01:51 PM)assuhimi كتب : [ -> ]الف شكر على ردودكم اخوتي الخبراء ،، افهم من هذا انه لو تم تعديل قاعدة البيانات الى اصدار اقدم فلا مشكلة؟
ايضا لو تم الاستغناء عن الاكسس واستخدام قواعد sql او حتى صفحة اكسل هل ستختفي المشكلة ؟
شاكر للجميع وكتب الله اجركم
استخدام SQLServer ليس فيه هذه المشكلة وهو أفضل بكثير بالإضافة لمسألة الأمان العالية
جرب تعديل نوع البيانات في قاعدة البيانات من تاريخ إلى نص أو (نص مختصر)
و في الفورم ادخل التاريخ عن طريق اداة DateTimePicker
و بإذن الله راح تضبط معك