الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج المكتبة الإسلامية تحتاج الى أنامل الخبراء

بدأه متفائل جداً في 24 أكتوبر 2008 · 1 رد · 911 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

حياكم الله

هذا رابط لبرنامج قمت بتصميمه يشابه برامج الموسوعات المكتبية

صادفتني مشاكل أظنها روتينية عندكم وأراها أنا انها معقدة

الفكرة من البرنامج هي بحثية ... وفي نفس الوقت للتصفح والمطالعة في الكتب

يعني لدينا عدد 4 قواعد بيانات تحتوي على جدول واحد لكل قاعدة بيانات .

جميع هذه القواعد فيها جداول متشابه من حيث الإسم والحقول بالشكل التالي

الجدول o_book

الحقول : ID,Part,Page,Text

قواعد البيانات الأربعة اسمائها بالشكل التالي :

QT1

QT2

QT3

QT4

لعلكم لاحظتم ان تعمدت هذا لتسهيل كتابة الأكواد بدل التكرار

والحمد الله الأخوة الخبراء في المنتديات ماقصورا وكل قدم جهده جزاهم الله خير

بقي عندي هذه المشاكل :

1- في نموذج المطالعة FORM2 يتم تحديد قاعدة البيانات ( الجدول) المطلوب بداخلها وهو عبارة عن كتاب ليظهر على مربع ريتشبوكس في النموذج FORM1 " وقد قمت بذلك " لكن واجهتني مشكلة انني عندما أختار كتاب آخر مرة أخرى ، تخرج لي الرسالة التالية.(This causes two bindings in the collection to bind to the same property). وأتوقع أنه بسبب أن DATASET1 تستقي بياناتها من جدول واحد o_book)).. مع أنني أستخدمت الإجراء DS () والذي يقوم بتغيير نص الإتصال بحسب إسم النود المختار في أداة الشجرة TREE و لا أدري مالخلل بالضبط.

2- بعد تحديد كلمة البحث من نموذج (البحث) FORM3 أنتقل الى النموذج الرئيسي لعرض النتائج في داتاجريدفيو ، تخرج النتائج لكن بطيئة وشريط التقدم لايعمل بحسب كود وضعه الأخ الفاضل الي زودني بالكود ، وأيضا رغم كل هذا لايمكنني أن اتصفح نتائج البحث الا إذا إنتهت الداتاجريد من عملية البحث بشكل كامل ..وهذا أمر يبعث على الملل عند المستخدم ، فالمطلوب إذن

" تسريع عملية البحث

" إظهار النتائج بشكل تدريجي ليتسنى للمستخدم التنقل بين النتائج التي ظهرت أولا في الداتاجريد بدون أن يهنق البرنامج أتوقع أن هذا الامر مفيد لكن أين يوضع ؟ Application.DoEvents()

" عرض الموقع، وإستخدام عداد لإظهار عدد السجلات التي تم ويتم البحث فيها .. بحسب ال ID طبعاً ، بموازة التقدم في شريط التقدم ProgressBar1

3- في نموذج الإنتقال FORM4 بعد إدخال رقم الصفحة والجزء والضغط على إنتقال يتم الإنتقال مباشرة للسجل المحدد المعروض جدوله في النوذج الرئيسي FORM1

وهذا رابط البرنامج ... بارك الله فيكم ونسأل الله أن يؤجر كل من يقدم المساعدة والفائدة للجميع بإذن الله

http://depositfiles.com/files/0357fwikr

#2

السلام عليكم ورحمة الله وبركاته

حياكم الله يا أكارم ...

أتوقع أن لا أحد حمل البرنامج من الرابط وقد يكون حمل من قبل البعض لكن ربما غم عليه بعض الأمور مع أنني قتلت الكود في البرنامج بجمل الشرح والتوضيح ليتسنى لمن أراد المساعدة التعديل وفهم آلية البرنامج ..

عموماً لابأس سنتغلب على المشكلة بإذن الله رغم أنني طرحتها بأكثر من منتدى وحصلت من هنا وهناك فوائد جانبية أفادت كثيرا..

بقي أن أقول إخوتي الأكارم لعل جزء من الكود سيحل المشكلة ولذلك سأطرحه هنا مع شرح لآليته والفائدة منه لتجنب الأخطاء الموجودة فيه لمن أراد التعديل

أولاً :

البرنامج بإختصار يعتمد على ثلاث عمليات

1- عرض البيانات بشكل عادي يعني عرض كل كتاب بسجلاته في ريتشبوكس و2 textbox

وهذا يعني بعد تحديد الكتاب (جدول موجود بقاعدة بيانات مستقلة) وذلك يكون بتحديد إسم الكتاب في اداة الشجرة على النموذج يعني تختار كتاب رقم 1 فيظهر حقوله على الأدوات في النموذج ، ويتم التنقل بين السجلات بأربعة أزرار وضعتها على الفورم وكل إشي تمام وزي الفل ..

المشكلة هنا هي أنه عندما أختار مثلاً كتاب آخر مثلا كتاب رقم 2 من أداة الشجرة تخرج لي رسالة تقول :

This causes two bindings in the collection to bind to the same property.

فهمتها أنا بأنه لايمكن تعبئة أداة الريتش بوكس وأداتي التكستبوكس لعرض الحقول مرة اخرى من قاعدة بيانات أخرى أو جدول آخر أو بصورة أوضح من داتاسيت حتى لو غيرت أسمها من dataset1 to dataset2

أظن وضحت المشكلة ؟ ولمزيد من التوضيح

هذا الكود الذي يتوقف عنده مؤشر رسالة الخطأ:

 Form1.TextBox3.DataBindings.Add("TEXT", DataSet1, "o_book.Page")

بدلت هذا الكود الى الكود التالي :

 Form1.RichTextBox1.Text = DataSet1.Tables.Item("o_book").Rows.Item(0).Item(3)

رائع إنتهى نصف المشكلة ، لكن ظهرت لي مشكلة أخرى وهي عدم تمكني من التنقل بين السجلات :angry: لإنني كنت أستخدم الكود التالي في الإنتقال للسجل التالي في وضعية databindings.add

Me.BindingContext(DataSet1, "o_book").Position += 1

فما البديل عن هذا الكود ؟ ليتناسب مع الكود الجديد الذي إستبدلت به طريقة databindings.add ?

* مشكلة أخرى وهي بطء عملية جلب البيانات ثم عرضها في الريتشبوكس وادوات النصوص بشكل كبير جداً أتعجب منه ، لم يكن حتى في فيجوال بيسيك 6 ؟ وأستخدم هذا الكود لعرض البيانات


'لاحظ القاعدة بدون الترقيم وذلك لتسهيل الكود
Public ConStrQT As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source =" & Application.StartupPath & "\QT")
Dim conStr As New OleDb.OleDbConnection
Public DataSet1 As New DataSet

Public DataSet2 As New DataSet

Public DataSet3 As New DataSet
Public n As TreeNode
Public o As String
Sub DS()

Dim sqlLod1 As String = "select * from o_book"
Dim conStr As New OleDb.OleDbConnection

DataSet1.Clear()
'نص جملة الإتصال وضعته بحسب المتغير n.Name وهو اسم ماحدده المستخدم في اداة الشجرة
conStr.ConnectionString = ConStrQT.ConnectionString & n.Name & ".mdb"

Dim DREP600 As New Data.OleDb.OleDbDataAdapter(sqlLod1, conStr)

If conStr.State = ConnectionState.Open Then
conStr.Close()
End If


Form1.RichTextBox1.Clear()
Form1.TextBox2.Clear()
DREP600.Fill(DataSet1, "o_book")


End Sub
Sub bookname() 'لأختيار إسم الجدول بحسب نتيجة التحديد في اداة الشجرة

If n.Name = "1" Then
o = "كتاب رقم 1"
ElseIf n.Name = "2" Then
o = "كتاب رقم 2"
ElseIf n.Name = "3" Then
o = "كتاب رقم 3"
ElseIf n.Name = "4" Then
o = "كتاب رقم 4"

End If
End Sub
Module Module1

في الإجراء DS يتم إختيار الجدول حسب متغير اسم النوود في اداة الشجرة

في الإجراء bookname استفيد منه في عرض إسم الكتاب في مربع النص في نموذج رقم 1 وأستبدال النصوص لتدل على أسم الكتاب (الجدول) لاحظ أيضا عدم وجود contr.open () and contr.close() (DREP600.Fill(DataSet1, "o_book")) وذلك إجتهاداً مني للتقليل من البطء الناتج في عملية العرض مع أنني وضعتها أيضا ليحتويا جملة

يتم إستدعاء الأجرائين حين الضغط على التحديد في أداة الشجرة بالشكل التالي:


Form1.RichTextBox1.Clear() 'هنا حاولت حل مشكلة رسالة الخطأ التي تظهر عند أختيار كتاب آخر
n = sender.selectednode 'إرسال قيمة المتغيرالمحدد

DataSet1.Clear() 'هنا أيضا حاولت حل مشكلة رسالة الخطأ التي تظهر عند أختيار كتاب آخر
Me.Close()
MsgBox("اضغط موافق ولاحظ بطء عملية التحميل للقاعدة والجدول ")
DS() 'إجراء إختيار قاعدة البيانات وضعته في مودويل لإختصار الأكواد
bookname() ' إجراء لتسمية الجداول وضعته في مودويل وقد نجح معي في قسم المطالعة ولكنه فشل في قسم البحث
'هنا تظهر رسالة الخطأ إن أخترت كتاباً آخر من أداة الشجرة

Form1.RichTextBox1.Text = DataSet1.Tables.Item("o_book").Rows.Item(0).Item(3)
Form1.TextBox1.Text = DataSet1.Tables.Item("o_book").Rows.Item(0).Item(1)
Form1.TextBox3.Text = DataSet1.Tables.Item("o_book").Rows.Item(0).Item(2)
Form1.TextBox4.Text = o ' أسندت لهذا المتغير قيمة n.Name ليستبدل إسم التحديد بعبارة كتبتها في إجراء bookname
'في مربع النص هذا ينبغي أن يظهر النص (اسم الكتاب (رقم الجزء) (رقم الصفحة)) ونجحت في ذلك
Form1.TextBox2.Text = Form1.TextBox4.Text & " " & "ج" & Form1.TextBox1.Text & "ص" & "" & Form1.TextBox3.Text


End Sub
 Private Sub TreeView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles

2- عملية البحث ( وهي هنا للبحث في عدة قواعد بيانات في كل قاعدة جدول إسمه O_book )


Try

Dim conStr As New OleDb.OleDbConnection
DataSet1.Clear() 'تهيئة الداتا سيت للتعبئة في حال قام المستخدم بالبحث مرة أخرى

Form1.ProgressBar1.Value = 0 'هذا السطر حقيقة هو ماأتعبني وقد حذفت القيمة الأخرى للشريط
For i As Integer = 1 To 4 'عدد قواعد البيانات 4
'هذ هذا السطر مفيد ؟ في تقليل وقت البحث ؟ أو تمكين المستخدم من المطالعة خلال عملية البحث
Dim sqlLod As String = "SELECT Part,Page,Text FROM o_book WHERE Text LIKE '%" & ComboBox1.Text & "%'"

conStr.ConnectionString = ConStrQT.ConnectionString & i & ".mdb"

Dim da As New Data.OleDb.OleDbDataAdapter(sqlLod, conStr)

Dim da2 As New Data.OleDb.OleDbDataAdapter(sqlLod, conStr)

Dim comd As New OleDb.OleDbCommandBuilder(da)

Dim comd2 As New OleDb.OleDbCommandBuilder(da2)

da.Fill(DataSet1, "o_book")
da2.Fill(DataSet2, "o_book")

Form1.Label2.Text = DataSet2.Tables(0).DefaultView.Count 'مجموع السجلات التي تم العثور عليها
Form1.Label4.Text = DataSet2.Tables(0).DefaultView.Count ' أريد هنا معرفة عداد السجلات التي يتم فيها البحث بشكل آني
Form1.Label3.Text = DataSet1.Tables(0).DefaultView.Count ' المجموع الكلي لعدد السجلات
If DataSet2.Tables(0).DefaultView.Count > 0 Then
For j As Integer = 0 To DataSet2.Tables(0).DefaultView.Count - 1
Application.DoEvents() 'هذ هذا السطر مفيد ؟ في تقليل وقت البحث ؟ أو تمكين المستخدم من المطالعة خلال عملية البحث
Select Case DataSet2.Tables(0).Rows(j).Item(0) 'هنا أستعضت عن إجراء bookname
Case Is = 1
Form1.Label12.Text = "كتاب رقم1"
Case Is = 2
Form1.Label12.Text = "كتاب رقم 2 "
Case Is = 3
Form1.Label12.Text = "كتاب رقم3"
Case Is = 4
Form1.Label12.Text = "كتاب رقم 4 "
Case Else
Form1.Label12.Text = "جاري البحث" 'محاولة مني لابأس بها
End Select
Next
End If


Form1.DataGridView1.DataSource = DataSet1.Tables("o_book") 'هل هذا هو المكان الصحيح لهذه الجملة؟!
'لم أضع المسج بوكس التالي بسبب أنني أريد الإستمرار طبعاً والبحث في كل القواعد
' MsgBox("استمر")

Form1.DataGridView1.Refresh() 'بصراحة لم ألمس أي فائدة لهذا السطر ولو انه مهم وهو ما اريده

'هذ هذا السطر مفيد ؟ في تقليل وقت البحث ؟ أو تمكين المستخدم من المطالعة خلال عملية البحث

'System.Threading.Thread.Sleep(3000) وضعتها بسبب قلة عدد السجلات حتى استطيع التجربه
Next

Catch ex As Exception
MessageBox.Show(Err.Description, "خطأ في جلب الملف")
End Try
'Form1.Label12.Text = "إنتهى البحث" بإنعدام شريط التقدم إستخدمت هذا السطر
End Sub
'من المهم أن أستخدم أداة ProgressBar1 لكن كيف الطريقة في مثل هذا البرنامج فقد أحترت بصراحة
' وأخشى أن يزيد الطين بلة ويبطيء البرنامج خصوصا عند البحث
'قواعد البيانات التي ساضيفها للبرنامج ضخمة وجب مراعاة هذه النقطة
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

* عملية البحث سليمة وتأتي بالنتائج المطلوبة لكن المشكلة هي في :

1- البطء الشديد في عملية البحث وعرض النتائج في القريد فيو .. فانا أريدها أن تعرض النتائج وفي نفس الوقت أستطيع إختيار نتيجة البحث التي تظهر تباعاً ، لكن هذا غير ممكن فيحصل للبرنامج تهنيج شديد .. لكن اذا لم أحدد اي صف في الداتاجريد تمضي الأمور بسلام ويعرض لي نتائج البحث بشكل رائع لكن المشكلة فقط في بطء عملية البحث ونزول النتائج والتي تهنج البرنامج والجهاز حتى ..

2- طريقة ربط أداة ProgressBar1 بتقدم عملية البحث بحيث لايؤثر على سرعة عملية البحث ؟

3- بعد إتمام النتيجة كيف يمكن تصفح نتائج الداتاجريد فيو يعني مثلاً حددت صفاً يف الناتح من عملية البحث في الداتاجريد فيو مثلا من كتاب رقم 1 صفحة 2 جزء رقم 2 اريد أن اتنقل داخل نفس هذا الجدول بعيدا عن عملية البحث يعني يقرأ متغير ما إسم الكتاب في مربع النص text5 ومن ثم يغير نص الإتصال في المودويل DS أو أي طريقة أخرى للتقليب في صفحات هذا الكتاب حصراً .

المشكلة الثالثة بإذن الله سأتجاوزها إذا تجاوزت المشاكل السابقة وهي عملية الإنتقال الى رقم صفحة معين وجزء معين وهذا معروف جملة إستعلامه بالشكل التالي :

WHERE Part =" & text7.text&" and Page = "&text8.text"

لكن بفرض أن الإستعلام يعرف من أين يستقي بياناته بحسب الجدول المطلوب (اسم الكتاب) وهو هنا المعروض مثلاً في TEXT5.text

>>>>

ليس شرطاً الإجابة على كل المشاكل ..

لكن يكفي أن يشارك كل أخ بما يستطيع والله يجزيه الخير والمنفعة عامة بإذن الله

ملاحظة: أهم شيء تسريع عمليات البحث لإنني سمعت عن جملة Application.DoEvents() وقد وضعتها لكن لافائدة

والسلام عليكم ورحمة الله وبركاته

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…