السلام عليكم ورحمة الله وبركاته
أسف لتأخري في كتابة الدرس الثالث بسب انشغالي ببعض الأمور
على بركة الله نبدأ
بسم الله الرحمن الرحيم
أولا كما ذكرنا في الدرس السابق من ناحية تفادي الأخطاء الناتجة عن قاعدة
بيانات فارغة يمكنك تعديل الأكواد في أزرار التنقل بين السجلات وغيرها
بالشكل التالي مثلا كود الزر " السجل التالي " يصبح
Private Sub cmdnext_Click()
On Error GoTo nexterrAdodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MovePrevious
Else
End If
Exit Sub
nexterr:
Err.Clear
Adodc1.RefreshEnd Sub
التعديل باللون الأحمر
وهكـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ـــــــــــــــــذا عدل الأكواد الأخرى
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ـــــــــــــــــــــــــــــــــــــــــــــ
إذا كنت قد فهمت الدرسين السابقين وقمت بتصميم البرنامج معنا ونفذته
فستلاحظ أنه عند وقوفك على سجل ما وليكن فيه الاسم hircool والآن قمت
بإضافة بعض الأحرف وأصبح الاسم hircoolbef وانتقلت للسجل التالي من دون
الحفظ ثم عدت لنفس السجل ستجد أن الاسم قد حفظ بـ hircoolbef من دون الضغط
على زر الحفظ
ولتفادي ذلك هنالك العديد من الطرق
أولا إذا لم تكن بحاجة لتغيير السجلات أو إضافة سجلات جديدة أو حذف سجلات
قم بتغيير الخاصية LockType للأداة ADODC1 الى القيمة adLockReadOnly
هذا سيجعل قاعدة البيانات للقراءة فقط ولكن يجب إخبار المستخدم بذلك
الان نفذ البرنامج وحاول تعديل سجل ما ثم اضغط على الزر "السجل التالي"
سيظهر خطا ولكن في الواقع أنت تفاديت حدوث الأخطاء في كود "السجل التالي"
السابق حيث سيتم مسح الخطأ ولكن ستتجمد قاعدة البيانات حاول الضغط مرة
أخرى على الزر"السجل التالي" ستبقى عند نفس السجل لذلك قمنا بتحديث قاعدة
البيانات بعد مسح الخطأ
حسنا أنت تريد التعديل على قاعدة البيانات ولكن لا تريد حفظ التغيرات على السجلات الناتج عن خطأ
أي تكون قاعدة البيانات للقراءة فقط ويمكن التعديل في حال أردت ذلك
أضف زر جديد مثلا وسمه cmdlock والكابشن " التعديل على قاعدة البيانات "
غير الخاصية Enabled للأزرار "حفظ" "إضافة سجل " " حذف سجل " إلى False
غير الخاصية LockType للأداة ADODC1 إلى adLockReadOnly
واكتب في الكود مايلي
Private Sub cmdlock_Click()
If Adodc1.LockType = adLockReadOnly Then
Adodc1.LockType = adLockPessimistic
Adodc1.Refresh
cmddelete.Enabled = True
cmdadd.Enabled = True
cmdsave.Enabled = True
cmdlock.Caption = " قاعد البيانات للقراءة فقط "
Else
Adodc1.LockType = adLockReadOnly
Adodc1.Refresh
cmddelete.Enabled = False
cmdadd.Enabled = False
cmdsave.Enabled = False
cmdlock.Caption = "التعديل على قاعدة البيانات "
End If
End Sub
وجرب البرنامج بعد ذلك
ــــــــــــــــــــــــــــــــــــــــــــــــ
ملاحــــــــــظة : يجب التحديث بعد كل تغيير لأحد خصائص قاعدة البيانات
ـــــــــــــــــــــــــــــــــــــــــــــــــ
ويمكنك بدلا من ذلك قفل صناديق النصوص lock=true ووو
الآن أنت تقف مثلا عند سجل رقمه 100 وتريد تعديله تضغط على زر " تعديل قاعدة البيانات "
وفي كود هذا الزر بعد تغيير نمط الإقفال يتم التحديث أي تعود للسجل رقم واحد (مشكلة)
لذلك نضيف ما يلي
Dim a as long
a = Adodc1.Recordset.AbsolutePosition
لحفظ رقم السجل الذي نقف عنده ثم نغير نمط الإقفال
ونعود للسجل
Adodc1.Recordset.Move a – 1,1
أي انتقل عدد من السجلات قدره a-1 مع بدء العد من بعد السجل الأول ووضعنا
a-1 لان السجل الأول لا يعد في هذه الحالة حيث يبدأ العد من بعد السجل
الأول
ويمكن كتابتها بالشكل
Adodc1.Recordset.Move a – 1
لأنها جاءت بعد عبارة تحديث أي نحن نقف على السجل الأول
ويصبح الكود
Private Sub cmdlock_Click()
Dim a As Long
a = Adodc1.Recordset.AbsolutePosition
If Adodc1.LockType = adLockReadOnly Then
Adodc1.LockType = adLockPessimistic
Adodc1.Refresh
cmddelete.Enabled = True
cmdadd.Enabled = True
cmdsave.Enabled = True
cmdlock.Caption = " قاعد البيانات للقراءة فقط "
Else
Adodc1.LockType = adLockReadOnly
Adodc1.Refresh
cmddelete.Enabled = False
cmdadd.Enabled = False
cmdsave.Enabled = False
cmdlock.Caption = "التعديل على قاعدة البيانات "
End If
If a = -1 Then
Else
Adodc1.Recordset.Move a - 1, 1
End If
End Sub
وضعنا الشرط If a = -1 Then
لأنه في حال أردت تعديل قاعدة بيانات فارغة لن يكون هنالك سجل للانتقال
إليه (قاعدة البيانات فارغة ) ولا يمكن الانتقال بين السجلات وتكون قيمة
a=-1 لذلك في هذه الحالة لا نقوم بشيء
الأن قم بإضافة الأداة Microsoft DataGrid Control 6.0 (OLEDB) كما قمت بإضافة الأداة
Microsoft ADO Data Control 6.0 (OLEDB)
وقم بإضافتها للفورم وقم ببعض الإضافات ليصبح الفورم بهذا الشكل (15)
الأن غير خصائص الأداة DataGrid كما هو موضح في الشكل السابق وأهمها
DataSource=Adodc1
لربط الأداة بقاعدة البيانات في Adodc1 حيث تقوم هذه الأداة بإظهار قاعدة البيانات على شكل جداول
AllowAddNew=False
لمنع إضافة السجلات عن طريق هذه الأداة
AllowUpdate=false
لمنع التحديث وحفظ التغيرات التي تطرأ على قاعدة البيانات عن طريق هذه الأداة
AllowDelete=False
لمنع حذف السجلات عن طريق هذه الأداة
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ـــــــــــ
ـــــــــــــــــــــــــــــــــــ
ـــــــــــــــــــ
ــــــــ
ـــ
كما تلاحظ قمنا بإضافة أزرار وصناديق نصوص للقيام بعملية البحث في قاعدة البيانات
وسيتم البحث باستخدام عبارات لغة الاستعلام SQL
مثلا نستخدم الزر cmdsname للبحث حسب الاسم الموجود في صندوق النص
txtsname وبعبارة أدق اختيار السجلات التي تحوي في عمود الاسم على نفس
النص الموجود في txtsname
وللبحث باستخدام عبارات الاستعلام SQL بواسطة الأداة adodc1 يجب أن نغير الخاصية
command type للأداة adodc1 إلى النوع adCmdText ثم نكتب عبارة الاستعلام
لتكون مصدر البيانات للأداة Adodc1 بدلا من الجدول tele وبالتالي يتم عرض
نتيجة الاختيار بواسطة الأداة DataGrid
حيث نكتب في كود الزر " بحث حسب الاسم "
Private Sub cmdsname_Click()
Adodc1.CommandType = adCmdText
_& " '=Adodc1.RecordSource = "SELECT*FROM tele WHERE name
" ' "& txtsname.****
Adodc1.Refresh
End Sub
قمنا
بتغيير commandtype الى adCmdText ثم كتبنا تعبير الاستعلام في مصدر
البيانات وعادة ما تكتب عبارات SQL بحروف كبيرة لتمييزها
ومعنى التعبير السابق اختر في كل الاعمدة من الجدول tele اين يتحقق name
=' *****' (اسم العمود)= نص معين يكون موجود في الصندوق txtsname
ــــــــــــــــــــــــــــ
ونكتب في كود الزر " بحث حسب المدينة"
Private Sub cmdscity_Click()
Adodc1.CommandType = adCmdText
_& " '=Adodc1.RecordSource = "SELECT*FROM tele WHERE city
" ' "& txtscity.****
Adodc1.Refresh
End Sub
ومعنى التعبير السابق اختر في كل الاعمدة من الجدول tele اين يتحقق city
=' *****' (اسم العمود) = نص معين يكون موجود في الصندوق txtsname
ــــــــــــــــــــــــــــ
ونكتب في كود الزر " بحث حسب الرقم "
Private Sub cmdsnum_Click()
Adodc1.CommandType = adCmdText
Adodc1.RecordSource = "SELECT*FROM tele WHERE phone =" & Val(txtsnum.****)
Adodc1.Refresh
End Sub
ـــــــــــــــــــــــــ***ــــــــــــــــــــــــــ
ملاحظة النجوم الأربعة أي تيكست لا تظهر بالأجنبي لا ادري لماذا
لاحـــــــــــــــــــــظ أنه عندما يكون نوع البيانات في العمود عبارة
عن أرقام لا نضع الإشارات ' ' حول القيمة المراد اختيارها
ـــــــــــــــــــــــــ***ـــــــــــــــــــــــــ
ولاحـــــــــــــــــــظ أن اسم العمود هو كلمة واحدة حيث قمت بتعديل اسم العمود في قاعدة البيانات من
Phone number إلى phone (وهذا خطأ مني كان علي ملاحظة ذلك من قيل )
واستخدمنا التابع VAL() للتحويل من النص من النوع String إلىDouble وبالتالي لا نضع الإشارات ' '
ــــــــــــــــــــــ***ـــــــــــــــــــــــــــــ
الان انت ترى مايعرض في الأداة DataGrid وهو عبارة عن مصدر البانيات المرتبط بالأداة adodc1 (القيم التي تم اختيارها )
ولإعادة عرض الجدول بكامله
نغير الخاصية commandType الى adCmdTable
ونجعل مصدر البيانات هو الجدول tele ونكتب في كود الزر " عرض قاعدة البيانات الأصلية "
Private Sub cmdorginal_Click()
Adodc1.CommandType = adCmdTable
"Adodc1.RecordSource = "tele
Adodc1.Refresh
End Sub
كما تلاحظ نقوم بعملية تحديث بعد كل تغيير لأحد خصائص الأداة adodc1
ونكون بذلك قد انتهينا من برنامج متكامل نوعا ما
والحمد لله رب العالمين
أرجو ان تستفيدوا من هذا الدرس والدروس السابقة وإنشاء الله سيكون هناك المزيد
وأي استفسار انا بخدمتكم
ملاحــــــــــــــــــــــــــــــــــــــــــــــــظة
إذا أردت التعرف على المزيد من عبارات الاستعلام SQL يوجد في المرفقات
كتاب من 18 صفحة من إعداد KSA