13-09-24, 08:36 PM
(آخر تعديل لهذه المشاركة : 14-09-24, 12:23 AM {2} بواسطة Taha Okla.
تعديل السبب: أخطاء املائية
)
اللي ظاهر عندك في جهازك .. غير اللي عم يظهر عندي في جهازي ...
الترتيب مختلف التسميات مختلفة ..
تعرض أسماء المحافظات تحت عمود اسم القرية ..
وأسماء القرى تحت اسم المحافظة ...
وكذلك خطأ بعرض المديريات والعزلات ..
ربما الخطأ لأنك تستخدم اسماء أعمدة عربية .. وهذا خطأ جسيم مع البرمجة ... (لا تستخدم تسميات بغير اللغة الانكليزية أثناء كتابة الكود سواء كان برمجي أو استعلامي)..
أولاً - اختيار مسميات عربية (له نصيب وافر من تبطيء البيانات).. هذا أول سبب للبطىء..
ثانياً - على فرض أنك قمت بتصحيح المسميات وجعلت كل مسمى في محله ...
والأفضل أن تسميها باللانكليزية --
اذهب إلى قاعدة البيانات وسميها من جديد : فتصبح ..
المعرف : ID1
المحافظة : Governorate
المديرية : Directorate
العزلة : Isolation1
القرية : Village
وضعنا الرقم واحد (بجانب بعض المسميات لأنها أسماء محجوزة فغيرنا بها كي لا نقع بمشكلة عدم التوافق مع قاعدة البيانات)
بعد إعادة التسمية شاهد ولاحظ : هل كل عمود يشير على محتواه من بيانات .... اذا كان لا فصحح -- واذا صحيح فأكمل معنا..
ثالثاً - اذهب إلى البرنامج (المشروع) ..
ضمن خصائص الأداة (DataGridView1) ــ الخاصية (AutoSizeColumnsMode) أنت وضعتها على (Fill) والأفضل أن تكون على (None)
وفي الكود ضمن كود تحميل النافذة أنت وضعت الخاصية (AutoSizeRowsMode) على (AllCells) والأفضل أن تكون على (None)
التغيير بالخصائص أعلاه :
كأنك تقول للبرنامج اكتب سطر في الــ DataGridView1 ثم نسق الخليا خلية خلية.. وهكذا مع كل سطر يضاف لجدول العرض ..
وهذا خطأ أثناء تعبئة البيانات الكبيرة -- وهذا هو الخطأ الثاني عندك والمسبب الأكبر لبطئ عرض البيانات أثناء البحث.
الأسلم والأفضل والأسرع بعد كتابة البيانات أن تقوم بجعل أي عمود من الأعمدة بعرض معين
يعني أجعل العمود الأول يساوي 10 والثاني يساوي 20 والثالث.... إلخ
قيمة تقدرها أنت بحسب حاجة عرض العمود من بيانات ..
فهذه العملية تأخذ منك سطر واحد من الكود لكل عمود .. أي وقت (أربع أسطر)
بينما تنسيق بحسب الخلايا يأخ منك تنفيذ أكواد بعدد أسطر النتيجة ضرب عدد الأعمدة
فلو كان عندك 60 نتيجة فالأكواد المنفذة هي (60 ضرب 4 ضرب 2) = أي وقت 480 سطر من الاكواد على أقل تحديد
فهل وقت تنفيذ 4 أسطر يساوي أو يقارب وقت تنفيذ 480 سطر
رابعاً - كخطوة نحو كود أفضل :
أضف Module جديد وضع فيه الكود التالي :
خامساً - اذهب لنافذة المشروع وأضف عليها :
اضف ثلاث CmboBox
ComboBox1 وفوقها ليبل (المحافظة)
ComboBox2 وفوقها ليبل (المديرية)
ComboBox3 وفوقها ليبل (العزلة)
ضمن كود حدث تحميل الفورم يصبح الكود :
الأدوات الجديدة (ComboBox1 ، ComboBox2) : لها أكواد ضمن أحداثها وهي :
الآن : كود البحث يصبح :
الآن بإمكانك تجريب البرنامج - وتحقق من تصنيف وسرعة البحث ..
لعرض كل بيانات قاعدة البيانات كلها :
- فرغ اسم المحافظة من الكتابة : (ConboBox1) أمسح الكتابة منها (يعني)
- فرغ حقل المديرية من الكتابة. (ConboBox2)
- فرغ حقل العزلة من الكتابة. (ConboBox3)
- في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في الجدول من بيانات.
لعرض كل بيانات محافظة ما :
- اختر اسم المحافظة . من (ConboBox1)
- فرغ حقل المديرية من الكتابة. (ConboBox2)
- فرغ حقل العزلة من الكتابة. (ConboBox3)
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في المحافظة.
لعرض محتويات مديرية :
- اختر اسم المحافظة .
- اختر المديرية.
- فرغ حقل العزلة من الكتابة.
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في المديرية.
لعرض محتويات عزلة:
- اختر اسم المحافظة .
- اختر المديرية.
- اختر العزلة.
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في العزلة.
للبحث عن قرية :
- اختر اسم المحافظة . أو فرغها..
- اختر المديرية. أو فرغها..
- اختر اسم العزلة. أو فرغها..
- أكتب في حقل البحث حرفين أو أكثر من اسم القرية ..
فيعرض لك كل النتائج المشابهة.
لو كنت مش متأكد من طريقة كتابة اسم قرية فتشك بشكل حرف ما (أتركه وأكتب مكانه مسافه)
مثلاً : لا تدري تكتب (المنخ) أو (المناخ) اترك مكان الألف فراغ واكتب (المن خ) وستحصل على نتائج
إن كنت تشكل بوجود (أل التعريف) من عدمه أتركها وأكتب ما كنت متأكد منه فتصبح الكلمة (من خ)
الكود أعلاه تجربة على الطاير ..
وهذه فكرة سريعة : شيء بسيط وبإمكانك عمل أكثر من هذا بكثير ..
بالتوفيق ...
الترتيب مختلف التسميات مختلفة ..
تعرض أسماء المحافظات تحت عمود اسم القرية ..
وأسماء القرى تحت اسم المحافظة ...
وكذلك خطأ بعرض المديريات والعزلات ..
ربما الخطأ لأنك تستخدم اسماء أعمدة عربية .. وهذا خطأ جسيم مع البرمجة ... (لا تستخدم تسميات بغير اللغة الانكليزية أثناء كتابة الكود سواء كان برمجي أو استعلامي)..
أولاً - اختيار مسميات عربية (له نصيب وافر من تبطيء البيانات).. هذا أول سبب للبطىء..
ثانياً - على فرض أنك قمت بتصحيح المسميات وجعلت كل مسمى في محله ...
والأفضل أن تسميها باللانكليزية --
اذهب إلى قاعدة البيانات وسميها من جديد : فتصبح ..
المعرف : ID1
المحافظة : Governorate
المديرية : Directorate
العزلة : Isolation1
القرية : Village
وضعنا الرقم واحد (بجانب بعض المسميات لأنها أسماء محجوزة فغيرنا بها كي لا نقع بمشكلة عدم التوافق مع قاعدة البيانات)
بعد إعادة التسمية شاهد ولاحظ : هل كل عمود يشير على محتواه من بيانات .... اذا كان لا فصحح -- واذا صحيح فأكمل معنا..
ثالثاً - اذهب إلى البرنامج (المشروع) ..
ضمن خصائص الأداة (DataGridView1) ــ الخاصية (AutoSizeColumnsMode) أنت وضعتها على (Fill) والأفضل أن تكون على (None)
وفي الكود ضمن كود تحميل النافذة أنت وضعت الخاصية (AutoSizeRowsMode) على (AllCells) والأفضل أن تكون على (None)
التغيير بالخصائص أعلاه :
كأنك تقول للبرنامج اكتب سطر في الــ DataGridView1 ثم نسق الخليا خلية خلية.. وهكذا مع كل سطر يضاف لجدول العرض ..
وهذا خطأ أثناء تعبئة البيانات الكبيرة -- وهذا هو الخطأ الثاني عندك والمسبب الأكبر لبطئ عرض البيانات أثناء البحث.
الأسلم والأفضل والأسرع بعد كتابة البيانات أن تقوم بجعل أي عمود من الأعمدة بعرض معين
يعني أجعل العمود الأول يساوي 10 والثاني يساوي 20 والثالث.... إلخ
قيمة تقدرها أنت بحسب حاجة عرض العمود من بيانات ..
فهذه العملية تأخذ منك سطر واحد من الكود لكل عمود .. أي وقت (أربع أسطر)
بينما تنسيق بحسب الخلايا يأخ منك تنفيذ أكواد بعدد أسطر النتيجة ضرب عدد الأعمدة
فلو كان عندك 60 نتيجة فالأكواد المنفذة هي (60 ضرب 4 ضرب 2) = أي وقت 480 سطر من الاكواد على أقل تحديد
فهل وقت تنفيذ 4 أسطر يساوي أو يقارب وقت تنفيذ 480 سطر
رابعاً - كخطوة نحو كود أفضل :
أضف Module جديد وضع فيه الكود التالي :
كود :
Imports System.Data.OleDb
Module Module1
Public Function tDataTable(pConn As OleDbConnection, sSQLSelect As String) As DataTable
If pConn.State <> ConnectionState.Open Then pConn.Open()
'---------------------------------------------------------
Dim fCmd As New OleDbCommand(sSQLSelect, pConn)
Dim fDt As New DataTable
fDt.Load(fCmd.ExecuteReader())
'---------------------------------------------------------
If pConn.State <> ConnectionState.Closed Then pConn.Close()
'---------------------------------------------------------
If fDt.Rows.Count > 0 Then
Return fDt
Else
Return Nothing
End If
'---------------------------------------------------------
End Function
Public Sub LoadDataToComboBox(cboBox1 As ComboBox, pConn As OleDbConnection, strSQLFilter As String ,pTableName As String)
If pConn.State <> ConnectionState.Open Then pConn.Open()
'---------------------------------------------------------
cboBox1.ValueMember = pTableName
cboBox1.DisplayMember = pTableName
cboBox1.DataSource = tDataTable(pConn, strSQLFilter)
'---------------------------------------------------------
If pConn.State <> ConnectionState.Closed Then pConn.Close()
'---------------------------------------------------------
End Sub
End Moduleخامساً - اذهب لنافذة المشروع وأضف عليها :
اضف ثلاث CmboBox
ComboBox1 وفوقها ليبل (المحافظة)
ComboBox2 وفوقها ليبل (المديرية)
ComboBox3 وفوقها ليبل (العزلة)
ضمن كود حدث تحميل الفورم يصبح الكود :
كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
LoadDataToComboBox(ComboBox1, con, "SELECT DISTINCT(Governorate) FROM [Coverage Claims]", "Governorate")
'DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
'DataGridView1.RowsDefaultCellStyle.WrapMode = DataGridViewTriState.True
For Each l In InputLanguage.InstalledInputLanguages
If l.culture.ToString.StartsWith("ar") Then InputLanguage.CurrentInputLanguage = l
Next
End Subالأدوات الجديدة (ComboBox1 ، ComboBox2) : لها أكواد ضمن أحداثها وهي :
كود :
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
LoadDataToComboBox(ComboBox2, con, "SELECT DISTINCT(Directorate) FROM [Coverage Claims] Where [Governorate] ='" & ComboBox1.Text & "' ", "Directorate")
End Sub
Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
LoadDataToComboBox(ComboBox3, con, "SELECT DISTINCT(Isolation1) FROM [Coverage Claims] Where [Governorate] ='" & ComboBox1.Text & "' and [Directorate] = '" & ComboBox2.Text & "' ", "Isolation1")
End Subالآن : كود البحث يصبح :
كود :
Private Sub textSerch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles textSerch.TextChanged
Label1.Hide()
Dim txt As String = ""
' If textSerch.Text.Trim = "" Then Label1.Visible = False : Exit Sub
' If textSerch.Text.Trim.Length < 2 Then
If textSerch.Text.Length < 2 Then
Label1.Visible = True
Dim dt2 As New DataTable
DataGridView1.DataSource = Nothing
Exit Sub
End If
Label1.Hide()
'If textSerch.Text.Trim.Length >= 2 Then
If textSerch.Text.Length >= 2 Then
Dim strSS1 As String = " [Governorate] as [المحافظة], [Directorate] as [المديرية], [Isolation1] as [العزلة], [Village] as [القرية] "
Dim strSerch1 As String = textSerch.Text.Replace(" ", "%")
DataGridView1.DataSource = tDataTable(con, "SELECT " & strSS1 & " FROM [Coverage Claims] Where [Governorate] Like '%" & ComboBox1.Text & "%' And [Directorate] Like '%" & ComboBox2.Text & "%' And [Isolation1] Like '%" & ComboBox3.Text & "%' And [Village] like '%" & strSerch1 & "%'")
DataGridView1.ClearSelection()
'If dt.Rows.Count = 0 Then Label1.Show()
Else
End If
If textSerch.Text = "" Then
Label2.Show()
Else
Label2.Hide()
End If
DataGridView1.Columns(0).Width = 150
DataGridView1.Columns(1).Width = 150
DataGridView1.Columns(2).Width = 150
DataGridView1.Columns(3).Width = 150
End Sub
الآن بإمكانك تجريب البرنامج - وتحقق من تصنيف وسرعة البحث ..
لعرض كل بيانات قاعدة البيانات كلها :
- فرغ اسم المحافظة من الكتابة : (ConboBox1) أمسح الكتابة منها (يعني)
- فرغ حقل المديرية من الكتابة. (ConboBox2)
- فرغ حقل العزلة من الكتابة. (ConboBox3)
- في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في الجدول من بيانات.
لعرض كل بيانات محافظة ما :
- اختر اسم المحافظة . من (ConboBox1)
- فرغ حقل المديرية من الكتابة. (ConboBox2)
- فرغ حقل العزلة من الكتابة. (ConboBox3)
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في المحافظة.
لعرض محتويات مديرية :
- اختر اسم المحافظة .
- اختر المديرية.
- فرغ حقل العزلة من الكتابة.
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في المديرية.
لعرض محتويات عزلة:
- اختر اسم المحافظة .
- اختر المديرية.
- اختر العزلة.
- أكتب في حقل البحث (اضغط ع المسافة مرتين أو أكتب فيه (%%))
فيعرض لك كل ما في العزلة.
للبحث عن قرية :
- اختر اسم المحافظة . أو فرغها..
- اختر المديرية. أو فرغها..
- اختر اسم العزلة. أو فرغها..
- أكتب في حقل البحث حرفين أو أكثر من اسم القرية ..
فيعرض لك كل النتائج المشابهة.
لو كنت مش متأكد من طريقة كتابة اسم قرية فتشك بشكل حرف ما (أتركه وأكتب مكانه مسافه)
مثلاً : لا تدري تكتب (المنخ) أو (المناخ) اترك مكان الألف فراغ واكتب (المن خ) وستحصل على نتائج
إن كنت تشكل بوجود (أل التعريف) من عدمه أتركها وأكتب ما كنت متأكد منه فتصبح الكلمة (من خ)
الكود أعلاه تجربة على الطاير ..
وهذه فكرة سريعة : شيء بسيط وبإمكانك عمل أكثر من هذا بكثير ..
بالتوفيق ...
قال صلى الله عليه وسلم:
«كلمتان خفيفتان على اللسان
ثقيلتان في الميزان،حبيبتان إلى الرحمن:
سبحان الله وبحمده، سبحان الله العظيم».
