اولا اسف على التأخير في الرد انشغلت في بعض الامور ولكني وجدت وقت اخيرا لانظر في الامر ، وبعد بحث على الانترنت وجدت ان المشكلة تكمن في ان الكود المكتوب ب vba او الموديول في الاكسل لا يعمل الا داخل الاكسس فقط ، ولا يتعرف عليه محرك قاعدة البيانات oledb الذي نستخدمه للتعامل مع قاعدة البيانات خارج برنامج الاكسس وداخل بيئة الدوت نت تحديدا ،
ولا توجد طريقة للاسف لجعله مقروء بالنسبة للدوت نت
وبالتالي اي query يستخدم اي من الكود المكتوب داخل موديول لن يتمكن الدوت نت من التعرف على الدوال الموجودة فيه
ولكن هذه ليست نهاية الموضوع
توصلت الى فكرة اظنها مناسبة وتوفر عناء كتابة الامر من جديد على VB.Net
ما قمت به هو اني اخدت كامل الكود المكتوب في مودويل الاكسس وقمت بعمل موديول في VB.net ووضعت الكود به
التشابه بين vba و vb.net كبير الى حد ما ، الامر بحاجة فقط لبعض التعديلات مثلا
vba.Date اصبحت Date.Now و وهكذا
بعد ذلك اخدت كود الاستعلام من Access على هيئة SQL واستبدلت الاجزاء التي تنادي على الدوال بنص فارغ ، هكذا ينفذ الاستعلام بنجاح ويوفر لنا مكان في ال DataTable نعدل عليه
بعد ذلك قمت بالجري على صفوف الداتا تابل واستخدمت الدوال التي في الموديول :
كود :
Dim con As New OleDbConnection("provider = microsoft.ace.oledb.12.0 ; data source= " & Application.StartupPath & "\fullbyan.accdb")
Dim cmdString As String = "SELECT
student.mslsl,
student.s_name,
student.s_nameenglish,
'' AS fathername,
student.s_code,
student.s_rqmqomy,
CDate(Mid([s_rqmqomy],6,2) & '/' & Mid([s_rqmqomy],4,2) & '/' & Left([s_rqmqomy],1)*100+1700+Mid([s_rqmqomy],2,2)) AS dateofbirth,
'' AS agenow,
'' AS kind,
student.s_gloos,
student.s_class1,
student.s_class,
student.s_degree,
student.s_lastschool,
student.s_address,
student.s_telephone,
'' AS town,
student.s_fatherjob,
student.s_memo,
student.s_year
FROM student;"
Dim cmd As New OleDbCommand(cmdString, con)
Dim dt As New DataTable
con.Open()
dt.Load(cmd.ExecuteReader)
con.Close()
For Each col As DataColumn In dt.Columns
col.ReadOnly = False
Next
For Each r As DataRow In dt.Rows
r("fathername") = MokhtarFamily(r("s_name"), 2, True)
r("agenow") = GetAgeMonthsDays(r("dateofbirth"), True)
r("kind") = mas_n_id_info(r("s_rqmqomy"), 2)
r("town") = mas_n_id_info(r("s_rqmqomy"), 1)
Next
DataGridView1.DataSource = dt
وعملت تماما !
كنت قلقا من ناحية الوقت ان يأخذ التعديل وقت طويل ولكن اتضح ان هذه الطريقة لا تأخذ اكثر من عشر الوقت لجلب البيانات من قاعدة البيانات
إقتباس :Time To Load data from database : 272 ms
Time To Edit data from DataTable : 23 ms
اتمنى ان تكون وصلت الصورة