المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : التجوال في كتاب Beginning Access 2003 VBA



أبو يوسف1
23-08-2012, 07:09
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
منذ مدة حاولت ترجمة الكتاب ولكن فترت الهمة وبالامس نويت ان اضع بعض الترجمة لبعض التطبيقات العملية في هذا الكتاب وان شاء الله اوفق في ايصال المعلومة الصحيحة-الله يستر- لقلة معلوماتي في الاكسس والفيجوال اساسا والذي يشجعني على ذلك وجود اساتذة كبار في المملكة العزيزة ارجو منهم التعقيب واصلاح الخطا اينما وجد
وان شاء الله قريبا ارفع شرح الفصل الثاني منه -الفصل الاول لم اجده مفيدا -
وارجو من الله التوفيق
ملاحظة هامة الكتاب من رفع الاخ العزيز شامل وهذا الرابط
http://www.accesswordkingdome.com/forum/showthread.php?t=9071

صالح الصاعدي
23-08-2012, 08:02
وبارك الله فيك
ونحن في انتظر الشرح
وجزاك الله عنا خير

أبو يوسف1
23-08-2012, 11:13
الاخ العزيز صالح الصاعدي
السلام عليكم ورحمة الله وبركاته
تشرفت اخي العزيز بمرورك الكريم
وحياك الله وجزاك الله كل الخير على التشجيع
وان شاء الله يكون الموضوع عند حسن ظنك
ولا غنى دوما عن ملاحظاتكم واصلاح الاخطاء اينما وجدت
مع خالص تحياتي وشكري اخي العزيز

بسم الله وعلى بركة الله ابدا

ا لتجوال الاول

بسم الله الرحمن الرحيم
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
تراجعت عن نيتي بعدم التجوال في الفصل الاول حتى لا يظن احد الاخوة الاعزاء انني اتبع نظام فصل عليكم وفصل علي وكذلك احببت ان اذكر بعض البدايات التي ذكرتها المؤلفة والتي تمر عليها سريعا لان في فصول فادمة سوف تمر عليها بالتفصيل
هذا الكتاب يفترض بالفارئ ان يكون عنده المام بعمل قواعد بيانات فيها جداول ونماذج وايضا ربما ماكروومن الممكن ان يكون قد عمل بعض الاكواد في الاكسس او في الفيجوال والمهم ان يكون مع كل ما سبق عنده الرغبة في تعلم كيف يكتب الكود داخل الاكسس فان كان الوضع كذلك فان هذا الكتاب سوف يكون عونا كبيرا
-انتهت المقدمة للمؤلفة
وحسب علمي من سبق وعرف ما سبق يستطيع فتح برنامج الاكسس على الاقل بواسطة سبع طرق وتكقي طريقة واحدة ليبدا العمل -انتهت مقدمتي-
لكتابة الكود في الاكسس في محرر البيسك وتستطيع الذهاب اليه بعدة طرق منها -ادوات-ماكرو-محرر البيسك وايضا -الت اف 11-وايضا من عناصر الاكسس اختر وحدات نمطية ثم جديد

مثال اقترض وجود نموذج في قاعدة بيانات باسم -frmMain-وعليه زر امر يسمى-cmdText-
نذهب الى محرر البيسك اولا وذلك باختيار زر -cmdText-ثم اختر حدث عند النقر كما في الصورة 1.0
عند ال3 نقاط -...-يفتح شاشة صغيرة عنوانها اختيار منشئ نختر الخيار الاخير -منشئ الكود صورة 1.1
ثم اوكي -ok- سوف يفتح لك صفحة للزر مع تحديد نوع الحدث لاحظ الصورة 1.2
لاحظ انه يمكنك ايضا رؤية نموذج-frmMain-في نافذة المشروع في الجهة العليا من جهة اليسار للشاشة
اذا بدات بكتابة امر في نافذة الكود مثل امر-msgbox-سوف يظهر اداة مساعدة -الاحتمالات الممكنة والمناسبة-لتزودك بتفاصيل العناصر -syntax-المطلوبة لهذا الامر انظر صورة 1.3
وميزة اخرى مفيدة في محرر البيسك هو انه يساعدك في اكمال امر محدد بواسطة سرد خيارات منوفرة كما في الصورة 1.4
لاحظ في الصورة 1.4 كيف ان امر -docmd-قد كتب بعده نقطة في اللحظة التي كتبت فيها النقطة كل الخيارات المتاحة لهذا الامر قد ظهرت ويمكنك ان تختار واحدا منها
ارجو ان اكون قد وفقت في هذه الجولة
واعتذر عن اي خطا في الاملاء او الترجمة اما مزيد من الشرح حول ما سبق فهو بالتاكيد للاخوة الاعزاء ولاساتذة الكبار في مملكتنا العزيزة
لكم جمبعا كل التحيات
مرفق الصور من طرفي اما المثال فهو من المؤلف

أبو يوسف1
24-08-2012, 08:36
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اكمل ان شاء الله وسوف اقسم هذا الفصل الى اقسام لانه طويل وزاخر بالثمار وعلى بركة الله
----------------------------------------------------
الفصل الثاني -الجزء الاول
هذا الفصل هو حجر الاساس امفاهيم متطورة في الفيجوال بيسك-ملاحظة المقصود بالفيجوال او الفيجوال بيسك هنا هو تطبيبقات الفيجوال بيسك للاكسس استعمله انا للاختصار فقط-والتي سوف تغطيها فصول قادمة
افضل تعريف للوحدات النمطية هو انها وعاء لكود الفيجوال بيسك وهي تحتوي على التصاريح والاجراءات .
وكود البيسك هو الموجود في وحدة نمطية او اكثر ويطلب من تطبيق الاكسس لتنفيذ مهمة محددة
الصورة 2.1 تظهر مثال على وحدة نمطية في محرر الفيجوال
لاحظ ان الصورة قد قسمت الى 4 اقسام
الاول -صندوق فيه الكائنات لاختيار الكائن المطلوب الذي عليه المهمة-الحدث-
الثاني -التصريحات او الاحداث
الثالث-التصريحات تصريحات للوحدة النمطية
الرابع-الاجراءات تحتوي على الاجراء القرعي والدوال للوحدة النمطية
وعندما تختار صندوق التصريحات /الاحداث سوف تظهر قائمة فيها الاجراءات الموجودة في الوحدة النمطية كما في الصورة 2.2

انواع الوحدات النمطية
-------------
يوجد نوعان للوحدات النمطية :
الاول-الوحدة النمطية العامة او القياسية :هي التي تحتوي على الاجراءات التي لا تصاحب كائن محدد وانما هي لكل جدول او استعلام او نموذج او تقرير او صفحة او ماكرو داخل القاعدة نفسها
الثاني- الوحدة النمطية الخاصة بالفئة :والتي تخص كائن معين في القاعدةوتستعمل لوحدات النماذج او التقرير
مثالها وحدات النموذج او التقرير التي تحتوي على كود يخص نموذج او تقرير
ومثال وحدات النموذج هو اجراء الحدث مثل حدث النقر للتحكم بالنموذج
احدى الطرق لعمل وحدة نمطية هر اختيار وحدة نمطية من كائنات اكسس في الجهة اليسرى من شاشة برنامج اكسس ثم اختيار جديد وطريقة اخرى من ادراج وثم وحدة نمطية
دعنا الان نعمل قاعدة بيانات فيها نموذج ووحدة نمطية ونستعملها خلال هذا الفصل
1-اعمل قاعدة بيانات باسم- Ch2CodeExamples-ولا داعي لشرح الطريقة وتذكر تفضيل اكسس ملف نسق 2002-2003 ان عدمت الحاجة لنسق 2000
2- في قاعدة البيانات من الكائنات اختر نموذج وذلك بالنقر المزدوج على العرض بطريقة التصميم وايضا يمكن عمل ذلك وانت مؤشر على النماذج بواسطة زر جديد من عرض التصميم من قائمة خيارات ثم موافق
3- تاكد من وجود صندوق الادوات ان لم يكن موجودا اختر من عرض صندوق ادوات
4- اختر مربع نص عدد2 وزر امر عدد1 وضعها على النموذج كما في الصورة 2.3
5-اختر عرض من خصائص لاظهار صندوق الخصائص لكل اداة او اختر الاداة ثم نقر زر الماوس الايمن وغير الاسماء الى - txtValue1, txtValue2, cmdRun
على التوالي كما هو في الصورة 2.4

عارف حسان
24-08-2012, 08:46
وعليكم السلام ورحمة الله وبركاته
رائع أخي أبو يوسف
استمر بهذا الزخم وهذا التألق
فالترجمة لأمهات الكتب -مثل هذا الكتاب- كانت أحد أسباب ازدهار الحضارة العربية, وستكون أحد أسباب عودتها إن شاء الله تعالى.
بارك الله بك .. وأمدك بالعزيمة والتصميم, والمدد والعون.

أبو يوسف1
24-08-2012, 09:54
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
شرفتني زيارتك الكريمة وشجعتني كلماتك ودعواتك الجميلة على الاستمرار ان شاء الله
وبك ربي بارك وجزاك عنا كل الخير اخي واستاذي العزيز

أبو يوسف1
24-08-2012, 10:52
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اعتذر عن تقسيم الجزء الاول الى اجزاء اطلت وانا اكتب واعدل حتى منعت من الاكمال في نفس المشاركة -ايضا احدىصفاتي ضعيف في الوورد ولوحة المفاتيح غير معربة بالكامل -
ملاحظة ايضا احتجت احيانا ان اضيف الى شرح المؤلف -لانني الاحظ ان بعض الشرح غير كاف -صارلك عين تنتقد شرحها كمان-واحتجت الى نفل شرح او معرفة المعنى الدارج او اضافات من مصادر عديدة اشكرهم كثيرا ولا استطيع حصرهم جزى الله المسلمين منهم خيرا وهدى الاخرين والمؤلف للاسلام ان شاء الله
يوجد تعديل في نقطة 5
5-اختر عرض ثم خصائص لاظهار صندوق الخصائص لكل اداة او اختر الاداة ثم نقر زر الماوس الايمن وغير الاسماء الى - txtValue1, txtValue2, cmdRun
على التوالي كما هو في الصورة 2.4
6-غير خاصية الاسم لليبل مربع النص واحد الى- lblValue1
وخاصية الكابشن الى-Value 1
اليبل الثاني الاسم الى-lblValue2
الكابشن الى-Value 2
وخاصية الكابشن ل-cmdRun
الىRun
وكل ذلك كما يظهر في الصورة 2.5
7-احفظ النموذج باسم frmTest واغلق بنقر x
8-اعمل وحدة نمطية جديدة من قائمة كائنات من شاشة قاعدة البيانات من اقصى اليسار
واختر جديد كما في الصورة 2.6
9-سوف تظهر شاشة محرر الفيجوال بيسك استعمل شاشة الخصائص لمحرر البيسك لاعادة
تسمية الوحدة النمطية الى –modBusinessLogic-
كما في الصورة 2.7
ان لم تظهر شاشة الخصائص يمكنك اظهارها من عرض ثم شاشة خصائص
صورة 2.7 تظهر عبارة -Option Explicit-وتعني يجب ان تصرح عن كل المتغيرات قبل استعمالها
في اي مكان في الكود بعض المتغيرات يصرح بها مباشرة تحت هذه الكلمة اما الاخر يصرح عنه
خلال الاجراء
في قسم التصريحات للوحدة النمطية ان لم تكن العبارة-Option Explicit- موجودة للوحدة
التي عملتها اذهب الى ادوات ثم خيارات ثم خانة المحرر اختر مطلوب تصريح متغير
وهو الخيار الثاني ثم موافق انظر الصورة 2.0
ثم اعد اضافة الوحدة النمطية وسوف يظهر عبارة -Option Explicit- وهذا يتطلب ان يتم
تعريف المتغيرات قبل استعمالها
مرفق الصور والمثال من طرفي لان مثال المؤلف فيه تكمله
اعتذر للتوقف هنا والاكمال قريبا ان شاء الله

أحمد الحربي
25-08-2012, 02:08
جميلٌ هذا العمل أخي أبا يوسف
جميلٌ فكرةً وعنواناً
سيكون هذا الموضوع مرجعاً جميلاً
شكر الله لك وبارك فيك

يستحق هذا الموضوع التثبيت بجدارة

أبو يوسف1
25-08-2012, 06:25
اخي واستاذي العزيز احمد الحربي
السلام عليكم ورحمة الله وبركاته
تشرفت بزيارتك الكريمة لموضوعي فزدته جمالا والقا واشكرك اخي واستاذي العزيز على منحه نوط الثبيت فطوقتني بكرمك وجودك المعهودين فبارك الله فيك وجزاك عني واخواني الاعزاء الاعضاء كل الخير
وان شاء الله اوفق في اكمال الشرح بشكل افضل واسال الله التوفيق-دعواتكم الكريمة اخي واستاذي العزيز
والحمد لله انني بهذه الطريقة -وانا معكم -استطيع فراءة الكتاب بشكل افضل وادق -لانه لوحدي لم ولن اقرا الكثير
فلكم انتم جزيل الشكر والتقدير على مساعدتي في قراءة كامل الكتاب ان شاء الله
لكم دوما خالص مودتي وشكري العميقين

أبو يوسف1
25-08-2012, 10:04
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
الفصل الثاني –الجزء الثاني
عرض لملخص الجزء الاول
خلال تجوالنا في الجزء الاول لم نجن سوى المسير وجلسنا
تحت خميلة جميلة وعملنا قاعدة بيانات وبدون كتابة اي كود
لذلك لن تعمل قاعدة البيانات هذه اي شيئ –لا تحزن الكود
ات في الطريق نتابع معا على بركة الله
صنع ومناداة الاجراءات
الاجراءات هي قوالب بناء للوحدات النمطية وكل وحدة نمطية يوجد فيها
اجراء فرعي واحد او اكثر او دالة
وكل اجراء فرعي او دالة تحتوي على عبارة كود البيسك او اكثر

اجراء فرعي ام دالة
الاجراءات يمكن ان تكون اجراءات فرعية او اجراءات دالة
الاجراء الفرعي :ينقذ الحدث –action-ولكن لا يرجع نتيجة محددة
بينما الدالة تنفذ الحدث-action- وترجع نتيجة محددة
وسوف يقدم المؤلف امثلة منوعة لتوضيح هذه الفروقات ان شاء الله
الاجراءات الفرعية والدوال يمكن ان تطلب كلاهما من خلال اجراءات اخرى
ودوال وعندما يكون هناك قدح لحدث مصاحب لكائن مثال نقر زر
-button_click-
كما سيمر في الفصل الثالث ان شاء الله

صنع ومناداة اجراء فرعي جديد
صيغة –syntax-لتصريح اجراء فرعي جديد
بدون محددات-parameters- هو

Sub ProcedureName
'code for the procedure
End Sub صيغة-syntax-لتصريح اجراء فرعي جديد مع متغيرات كمحددات

Sub ProcedureName(Variables)
'code for the procedure
End Subالمتغيرات هي اوعية لتخزين البيانات فلو فرض على الاجراء
ان يستعمل القيمة المخزنة في المتغير المحدد
فان هذا المتغير سوف يمر كمحدد للاجراء
دعنا نعمل اجراء جديد لنرى كيف يعمل

الان نعمل اجراء-VerifyCreditAvail-
هذا الاجراء سوف يعمل مقارنة بين رقمين ليحدد
ان كان الرصيد كافيا للشراء
1-ادخل هذا الكود في –modBusinessLogic-
الوحدة النمطية تحت التصريح -Option Explicit-
ارجع لصورة2.2 للتاكد

Sub VerifyCreditAvail(curTotalPrice As Currency, curAvailCredit As Currency) 'inform user if not enough credit for purchase
If curTotalPrice > curAvailCredit Then
MsgBox "You do not have enough credit available for this purchase."
End If

End Sub2-شغل الاجراء من الجزء الفوري وتشغل من عرض ثم شاشة الجزء الفوري
اطبع الامر كما في الصورة 2.8 في شاشة الجزء الفوري ثم انقر ادخال- Enter –
3-يجب ان ترى الرسالة كما في الصورة 2.9
ملاحظة تخربطت الاكواد عند النسخ واللصق لكن في المثال الامور واضحة
ارجو المعذرة
والى تجوال اخر قريبا ان شاء الله سررت بصحبنكم وتصبحون على خير
مرفق الصور والكود

أبو يوسف1
26-08-2012, 09:10
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
يسرني ان اتابع معكم الرحلة وان كانت الخطوات بطيئة حسب ما ارى حتى فكرت في تجميعها لايام لتكون المادة اكثر لكن اخشى من الركون والتسويف ففضلت قليل دائم ان شاء الله خير من كثير منقطع وبالله التوفيق
حتى لا تسيح الاكواد بين النسخ واللصق ارفقت ايضا نسخة بي دي اف من مشوار الليلة
كيف يعمل هذا-الشرح لعمل الكود-
الاجراء الفرعي –VerifyCreditAvail-يقبل متغيران كمحددات الاول –curTotalPrice-
والاخر-curAvailCredit-

Sub VerifyCreditAvail(curTotalPrice As Currency, curAvailCredit As Currency)الاجراء يحوي عبارة-If-والتي تقارن بين قيمة مجموع السعر الحالي-curTotalPrice-والرصيد المتوفر
الحالي -curAvailCredit-
لترى اذا--If كان مجموع السعر الحالي اكبر من الرصيد المتوفر
فاذا كان هذا هو الحال فان رسالة-MsgBox-لا يوجد رصيد كاف لهذا الشراء سوف تطل براسها

'inform user if not enough credit for purchase
If curTotalPrice > curAvailCredit Then
MsgBox "You do not have enough credit available for this purchase""
End Ifومن المعلوم بداهة ان السطر الاول هو تذكير للمبرمج او شرح للقارئ
ولا يعيره بيسك اهتمانا حيث الفاصلة العلوية تعني –يا سيد بيسك طنش-
والسطر الثاني محور الاجراء اشيع شرحا
والسطر الاخير نهاية – If-
من شاشة فحص الكود الفورية-mediate Window-ترجمته بالامس
بالجزء الفوري
وباختصار لما كانت القيمة- 5.0- اكبر من القيمة-4.93- ظهرت الرسالة

مناداة اجراء فرعي من اجراء اخر
بعدما الاجراء تم صنعه يمكن ان ينادى من خلال اجراء اخر ان رغبت
هذا مثال لتوضيح الصيغة- syntax-

Sub FirstProcedure
'This code calls a procedure called SecondProcedure
SecondProcedure
End Subالان وقد علمت الامر –الصيغة من اعلاه
اكتب كودا لنداء اجراء- VerifyCreditAvail-والتي عملت سابقا من اجراء اخر
Calling VerifyCreditAvail from Another Procedure
نداء – VerifyCreditAvail-من اجراء اخر

الان اعمل اجراء جديد باسم- FinalizeOrder-والذي سوف ينادي اجراء
- VerifyCreditAvail--
1-اضف الاجراء- FinalizeOrder-الى الوحدة النمطية- modBusinessLogic-
وتحت- VerifyCreditAvail-

Sub FinalizeOrder()
declare variables for storing Price and Credit Avail'
Dim curPrice As Currency
Dim curCreditAvail As Currency
give variables values here for illustration purposes'
curPrice = 4.5
curCreditAvail = 3.75
call VerifyCreditAvail procedure'
VerifyCreditAvail curPrice, curCreditAvail
End Sub2-شغل الاجراء – FinalizeOrder- من شاشة فحص الكود الفورية
- Immediate Window-كما في الصورة 2.10
نفس الرسالة السابقة سوف تطل براسها –الرصيد غير كاف-
لا ادري ارى الاكواد مضبوطة في المعاينة لكن في الاعتماد تتخربط
ارجو المعذرة
مرفق المشوار الصورة والكود
والى لقاء اخر ان شاء الله

أبو يوسف1
27-08-2012, 09:39
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
القصل الثاني -الجولة الرابعة
الفصل الثاني –الجزء الرابع
كيف يعمل الكود
اجراء –FinalizeOrder-يستعمل متغيران محليان الاول –curPrice- والثاني-curCreditAvail

Sub FinalizeOrder()
'declare variables for storing Price and Credit Avail
Dim curPrice As Currency
Dim curCreditAvail As Currencyبعد ذلك المتغيران حدد لهما قيم لغايات التوضيح
'
'give variables values here for illustration purposes
curPrice = 4.5
curCreditAvail = 3.75لاحظ انه في غالب الحالات لن تضع القيم في الاجراءات كما نفعل في هذه الامثلةولكن بدلا من ذلك شوف تاخذ القيم من
قاعدة البيانات او من متغبر اخر او من مصدر اخر
ولا داعي لاذكر شرح الكود مرة اخرى لانه تكرار لما سبق

---------مناداة الاجراء الفرعي من حدث---------------------------------

الاجراء الفرعي ينادى من حدث-event- اما تذكر نوعا الوحدة النمطية
امثلة الكودات التي عملتها سابقا كتبت في نوع الوحدة النمطية القياسية-العامة-واتي اسميناها-modBusinessLogic-
سوف تكتب الان في النوع الثاني للةحدات النمطية وهي الوحدة النمطية للفئه المصاحب لنموذج محدد
----------------------------صنع اجراء للكائن باستعمال منشئ الكود-------------------------------
ان كنت تريد كتابة كود لوحدة نمطية للفئة لفورم محدد او تقرير- وهي المرة الاولى لك-
فانه يجب عليك ان تشكل اجراء فارغ باستعمال منشئ الكود ولعلك تذكر في الفصل الاول عند صنع اجراء
حدث جديد ل -cmdTest_Click-وذلك باستعمال منشئ الكود سوف نعيد زيارة منشئ الكود لنتفحص بزيادة
كيف يعمل ودعنا نراك تعمله
مفهوم الاحداث والكائنات المصاحبة لها مشروح بطريقة موسعة في الفصل الثالث –يالله السلامة-

----------اعمل اجراء جديد من –frmTest- باستعمال منشئ الكود-----------------------------
1-ارجع الى شاشة قاعدة البيانات وافتح –frmTest-في عرض التصميم
2- اختر زر الامر –cmdRun-ثم انقر الزر الايمن للماوس لاظهار الخصائص
3- انقر خانة الحدث من شاشة الخصائص اضغط على حدث النقر كما في الصورة2.11
4-اضغط على ال3 نقاط-...-سوف تظهر الصورة 2.12
5-اختر منشئ الكود ثم موافق
6-محرر الفيجوال بيسك سوف يظهر عارضا اجراء فارغ بالاسم -cmdRun_Click- لاحظ 2.13
7- اضف الكود التالي –

Private Sub cmdRun_Click()
'declare variables to store price and avail credit
Dim curPrice As Currency
Dim curCreditAvail As Currency
'assign variables to current values in text boxes on Form
curPrice = txtValue1
curCreditAvail = txtValue2
'call VerifyCreditAvail procedure
VerifyCreditAvail curPrice, curCreditAvail
End Sub8- بعد ذلك اضغط زر حفظ في محرر الفيجوال بيسك
9-ارجع الى نموذج –frmTest-ثم افتحه في عرض الاظهار-View mode-
لتشغيله ولعمل ذلك اضغط عرض من قائمة شريط الادوات والنموذج مفتوح
ضع قيم 2000 للقيمة الاولى
و1500 للقيمة الثانية كما في الشكل 2.15
10- يجب ان ترى نفس الرسالة السابقة انظر الشكل 2.16
تشرح المؤلف كعادتها الامر بالعرض البطيء ولا داعي للتكرار
وحتى لقاء اخر استودعكم الله
اعتذر لعدم التنسيق مرفق الشرح بي دي اف والصور والمثال

أبو يوسف1
28-08-2012, 09:35
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اكمل لكم التجوال والان مع التجوال الخامس للفصل الثاني
ملاحظة الشرح بي دي اف مرفق وكذلك المثال والصور

Creating Additional Procedures for an Object Using the Code Window
عمل اجراء اضافي من كائن باستعمال شاشة الكود
بعد صنع اول اجراء لنموذج او تقرير نكوذج مصاحب او نمطية تقرير بشكل تلقائي قد صنعت
تستطيع بعدها عمل اجراء اضافي لنموذج محدد من خلال شاشة الكود نفسها
مثال ذلك بعد اضافة حدث - cmdRun_Click- كائن النموذج -_frmTest- ظهر في شاشة المشروع بالاسفل
عندما اخترت النموذج – frmTest-في شاشة المشروع سوف تظهر كل الكائنات المصاحبة ل-
frmTest- من عرض ثم استعراض الكائنات –f2- ان لم تظهر انظر الشكل 2.16

في المثال التالي - txtValue1-قد اختير هذا اسم اول صندوق نص في نموذج – frmTest-بعد اختيار
قيمة txtValue1—من قائمة اظهار الكائنات فان القيم في قائمة اظهار التصريحات /الاحداث سوف
تتحدث حسب المتاح ل- txtValue1-
الشكل 2.17 يظهر بعض الاجراءات المتاحة الممكن ان تعمل لصندوق النص - txtValue1-

عندما تختار اي اجراء من القائمة مثل قبل التحديث مباشرة اجراء فارغ سوف يصنع والمؤشرة سوف
تومض جاهزة لك لوضع الكود انظر الشكل 2.18

كتابة الكود لاحداث الكائنات سوف نستعرضه بالتفصيل في الفصل الثالث ان شاء الله
لكن عند هذه النقطة يكفيك معرفة ما هو الاجراء وانه يمكن ان ينادى من اكثر من مكان
مثل نموذج او حدث او اجراء اخر –وكثر الله خيرك



. Create and Call a New Function Procedure
صنع ونداء اجراء دالة جديد
حتى الان كل الامثلة التي راجعتها تعاملت مع صنع ونداء اجراء فرعي
فبل ذلك تعلمت ان اجراء الدالة بستعمل لتنفيذ حدث محدد و ايضا يرجع نتيجة محددة
دعنا نرى ذلك بتوضيح اكثر
الصيغة لتصريح اجراء دالة جديد بدون محددات – parameters-هو:


Function ProcedureName As DataType
'code for the function
End Functionالصيغة لاجراء فرعي جديد الذي بحوي متغيرات كمحددات هو :


Function ProcedureName(Variables) As DataType
'code for the procedure
End Functionلاحظ انه في كلا الحالتين كلمة دالة- Function- قد استعملت بدلا من فرعي- Sub-
ايضا نوع البيانات مطلوب كجزء من تصريح الدالة
نوع البيانات يجب ان يحدد حسب القيمة التي تخرجها الدالة
الان تستطيع ان تعمل دالة جديدة لتةضيح هذه الاجراءات
دالة حساب المكوس-الضريبة- CalculateSalesTax- التي سوف تعملها تاليا تقبل
السعر ومعدل الضريبة كمحددات وتحسب قيمة الضريبة
-----------------------------------طريقة العمل----------------
1- في نموذج – modBusinessLogic- اضف هذه الدالة والمسماه – CalculateSalesTax-
بعد الاجراء الفرعي- FinalizeOrder-

Function CalculateSalesTax(curPrice As Currency, intTaxRate As Double) As Currency
'declare variable for storing calculated tax
Dim dblTaxAmt As Currency
'calculate amt of tax based on price and rate
dblTaxAmt = curPrice * intTaxRate
'return the calculated amt
CalculateSalesTax = dblTaxAmt
End Function2- بعدما تكون قد اضفت الكود يجب ان يظهر شاشة محرر الفيجوال بيسك شيء يشبه الشكل 2.19
3-شغل الدالة الجديدة من شاشة فحص الكود الفورية باستعمال الصيغة كما في الشكل 2.20
calculatesalestax(5.0,0.05) ?
ثم اضغط ادخال- Enter-
شاشة - Immediate Window- لاظهارها من عرض ثم -اختيار Immediate Window

4-بعد ضغط ادخال-. Enter- القيمة 0.25 سوف تظهر في الشاشة
.
واعتذر عن الخطا في التنسيق
والى لقاء اخر ان شاء الله قريبا

طلحة الخير
29-08-2012, 05:49
بارك الله فيك

أبو يوسف1
29-08-2012, 06:33
الاخ العزيز طلحة الخير
السلام عليكم ورحمة الله وبركاته
حباك الله اخي العزيز ويسرني كثيرا ان زرتني اولا فاهلا وسهلا بك دائما في مملكتنا السعيدة ان شاء الله
وان شاء الله تجد دائما ما يسرك
حللت اهلا ووطئت سهلا اخي العزيز
بارك الله بك وحياك دائما

أبو يوسف1
29-08-2012, 09:35
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معكم التجوال لهذه الليلة وكله فصة حياة وتعاريف تسبق امثلة في الموضوع القادم ان شاء الله
مرفق الشرح بي دي اف

الفصل الثاني –الجزء السادس
تشرح المؤلف كعادتها بالشرح البطيء الكود السابق ولا ارى داعي لتكرار الامر
المهم تذكر ان الملاحظ هو انك اجبرت على استعمال علامة السؤال ووضعت المحددات في اقواس
في الامثلة السابقة لم تستعملهن
كما تعلمت الان الصيغة تختلف قليلا بالاعتماد على فيمااذا اردت نداء اجراء فرعي او دالة من شاشة فحص
الكود الفورية
Call a Function from another Procedure
نداء دالة من اجراء اخر
تماما مثل الاجراء الفرعي الدالة يمكن ان تنادى من اجراءات اخرى
الخطوات التي تتبعها هي نفسها التي وصفت في المثال السابق الذي يوضح نداء اجراء فرعي من اجراء فرعي اخر
انت عموما قد اسندت القيمة العائدة للدالة الى متغير محلي وبعد ذلك استعملته بموائمة
مثال لنداء دالة- CalculateSalesTax-من خلال دالة اخرى او اجراء فرعي يمكن ان تستعمل هذا الكود

Dim dblSalesTax As Double
'call the CalculateSalesTax function and assign the result to the local variable
dblSalesTax = CalculateSalesTax(100,.06)
Calling a Function from an Event
نداء دالة من حدث
مرة اخرى فقط مثل الاجراء الفرعي يمكن نداء الدالة من نمطية للفئة مصاحبة للنموذج او تقرير
الخطوات نفسها التي وصفت في المثال السابق الذي يوضح نداء الاجراء الفرعي من حدث
مزيد من الشرح للاحداث يمكن ايجاده من الفصل الثالث ان شاء الله

Scope and Lifetime of Sub Procedures and Functions
مدى وحياة الاجراء الفرعي والدوال
الاجراءات الفرعية والدوال لها دورة حياة معينة والتي تحدد كم يطول حياتهما – Lifetime-
وايضا لهما الصفات التي تحدد من اين يمكن مناداتهما هذا يوضح معنى المدى – Scope-
كيف يتم نداء الاجراء ذلك يحدد كم تطول حياة الاجراء ومن اين يمكن نداءه
اولا دعنا نلقي نظرة على دورة حياة الاجراء
تقليديا الاجراء ينفذ ثم تحتوي كل شيئ-مثل القيم في المتغيرات –التي تحرر من الذاكرة في ظروف
يجب فيها حفظ كل القيم ضمن الاجراء بعد تنفيذه
يمكن ان تصرح بالاجراء من عبارة- Static-
استعمال عبارة- Static-في التصريح سوف اساسا يحفظ الاجراء في الذاكرة من اخر مرة اشتغلت فيها الاجراء
متضمنة كل القيم المصاحبة للمتغيرات
وكما انه يمكنك الادراك ان يوجد طرق اخرى لحفظ القيم المححدة بعد انتهاء الاجراء
الامثلة تشمل استعمال متغيرات عامة او تخزين قيم معينة في قاعدة البيانات لجلبها فيما بعد
مع تحياتي واملي باكمال المشوار فريبا ان شاء الله

أبو يوسف1
30-08-2012, 10:06
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته

نتابع التجوال السابع في الفصل الناني
دعنا نرى كيف نحدد ونعين المدى للاجراء ومن اين ينادى الاجراء
اجراءات الحدث تكون خاصة قي الاساس- في الوضع الطبيعي -- by defaultلكن كل الاجراءات الاخرى والدوال تكون عامة-في الوضع الطبيعي -
في الامثلة التى نفذت حتى الان في هذا الفصل كل الاجراءات كانت تصريحات عامة قياسية - standard public declarations-
صيغة تصريحات الاجراء الفرعي والدوال لم تستعمل دائما كلمة عام- Public-لنفسها لكن هولاء التصريحات
في الواقع مانت تصريحات خاصة
وعندما الاجراء يصرح كاجراء خاص يمكن ان ينادى فقط من خلال نفس الكائن
عبارة عام – Public-يمكن استعمالها لاتاحة الوحدات النمطية من خارج نفس الكائن
.
Using Built-In Functions
استعمال الدوال الداخلية-داخل VBA للاكسس-
لقد رايت بعض الامثلة التي صنعت فيها الدوال الخاصة بك ويجب عليك ان تعرف ان الفيجوال بيسك— -VBA
له قائمة مكثفة من الدوال الداخلية التي يمكن ان تستعملها بدلا من كتابه الكود بنفسك-مش حاب يغلبك الشيخ -VBA
وذلك لبعض الاحداث- -actions العامة المحددة
مثال للدوال الداخلية والتي استعملتها للتو هو دالة- msgbox-
يمكنك الحصول على القائمة الدوال الكاملة المتاحة في وثائق مساعد الفيجوال بيسك- VBA Help-
كما في مواضيع المساعد انظر الشكل 2.21
وتستطيع ايضا رؤية قائمة الدوال المتوفرة باستعمال منشيء التعبير- Expression Builder-
راجع وثائق مساعد الفيجوال لكيفية الوصول الى منشيء التعبير -واجب اختياري واحتقظ بالاجابة لنفسك-

Upgrading Macros to Procedures
تطوير الماكرو للاجراء
الان وانت ما شاء الله عليك قد تعرفت على الاجراءات والدوال - طبعا على ذمة المؤلف-
تستحق ان نذكر-بالخير ان شاء الله-انك تستطيع تحويل الماكرو الموجود الى اجراءات
الاجراءات تزودك فعالية اكثر وسهولة التطويع اكثر مما عند الماكرو لذلك في غالب الحالات يجب البدء باستخدام الاجراءات
--------------------------------------------------------
بدلا من الماكرو
-----------------

الماكرو ذو التنفيذ الاتوماتيكي هو مثال للماكرو الذي يمكن ان تستمر باستعماله للتحكم باي نموذج يظهر-يحمل- عندما تفتح قاعدة البيانات
دعنا ننظر بعجاله على كيف سهلا ان تحول الماكرو الموجود الى اجراء
افترض انه يوجد عندك ماكرو اسمه- mcrOpenFrmTest- كما ظاهر في الشكل 2.22
الماكرو له حدث واحد -حدث فتح نموذج- OpenForm action-
لتحويل الماكرو الى اجراء : اختر ماكرو في شاشة قاعدة البيانات وانقر الزر الايمن للماوس حتى تظهر القائمة المنبثقة
- pop-up menu-كما هو ظاهر في الشكل 2.23
اختر حفظ باسم من الشاشة المنبثقة
صندوق حوار حفظ باسم سوف يظهر . كما في الشكل 2.24
في حوار حفظ باسم حدد الاسم للماكرو المتحول وحدد الخيار لحفظه كوحدة نمطية
بعد نقر موافق صندوق حوار سوف يظهر للسؤال عن ايبين فيمااذا لتضمين كود السيطرة على الخطا والتعقيب
اختر كلا هما وبالضغط على زر التحويل تكون قد حولت الماكرو الى اجراء ورساله تاكيد على نجاح عملية التحول –مبروك-
محرر الفيجوال بيسك سوف يفتح مظهرا النمطية الجديدة قد ادمجت
وعندما تختار النمطية الجديدة سوف ترى ان حدث- OpenForm- قد تحول الى عبارة- DoCmd.OpenForm-
كل هذا الذي تطلب لتحويل الماكرو الى اجراء
اتمنى ان كل شيء كان بهذه السهولة –امنية المؤلف الاولى لا ادرى ان كان لها غيرها –
والى لقاء اخر قريب ان شاء الله
مرفق الاشكال والمثال ونسخة من الشرح

أبو يوسف1
31-08-2012, 09:28
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اتابع ربما لوحدي الجزء الثامن من الفصل الثاني وعلى بركة الله

نUsing Variables and Constants to Store Values
استعمال المتغيرات والثوابت لتخزين القيم
الان وعندك الفكرة الاساسية لفهم كيف تصنع الاجراء-ادعاء المؤلف- ادر انتباهك لتعلم كيف تستعمل المتغيرات والثوابت
في هذه الاجراءات
المتغيرات والثوابت يمكن استعمالها لتخزين قيم التي تستعمل بواسطة برنامج الاكسس
قد شاهدت لتوك امثلة قليلة لاستعمال المتغيرات لتخزين القيم
ساغطي المتغيرات بتفصيل اكثر نونو-مشكورة-لانها هامة جدا لكتابة كود الفيجوال بيسك.
Types of Variables
انواع المتغيرات
اواع متعددة للمتغيرات يمكن التصريح بها وتستعمل في الاجراءات
اكثر المتغيرات شيوعا هي:
لن تشرح المؤلف اجمل من شرح الاخ والاستاذ العزيز احمد الحربي
انظر الرابط http://www.accesswordkingdome.com/forum/showthread.php?t=9004

Declaring and Using Variables
نداء واستعمال المتغيرات
الامثلة السابقة وضحت باختصار ان المتغيرات يمكن ان تصرح باستعمال عبارة – Dim-وهي اختصار لكلمة
- Dimension- وهي تستعمل لتصرح وحجز مكان في الذاكرة لمتغير او اكثر
هنا بعض الامثلة الاضافية :


Dim strMessage As String
Dim rsSales As Adodb.Recordset
Dim intCounter As Integer
Dim blnResponse As Booleanبعد التصريح بالمتغير فان المتغير يحصل قيمته- المعينة- بواسطة وضع المتغير ليساوي القيمة او لتعبير يقدر القيمة
التعبيريمكن ان يحوي عمليات مثل -( =, >,or <),- اكبرمن او اصغر من او يساوي
او اي متغيرات او ثوابت او مفاتيح كلمات او معادلات وما شابه
امثلة اخرى توضح تعيينات المتغيرات سوف توضح في نهاية هذا الفصل –على خير يا رب-

Declaring and Using Arrays
تصريح ونداء المصفوفات
المصفوفات هي عناصر مفهرسة تحمل نفس نوع من البيانات
كل عنصر في المصفوفة له رقم فهرس فريد
المصفوفات اما ثابتة او متغيرة - static or dynamic-
المصفوفات المتغيرة لها الخيار لتكبرفي الحجم و اصغر فهرس للمصفوفة هو الصفر-0- كقيمة افتراضية
هنا مثال عن كيف تصرح وتستعمل المصفوفة


Sub DemoFixedArray()
'declare an array with 5 elements
Dim arstrPictureFile(4) As String
'populate each array element with a value
arstrPictureFile(0) = "Eidfeter.jpg"
arstrPictureFile(1) = "Eidadha.jpg"
arstrPictureFile(2) = "Aqsamosque.jpg"
arstrPictureFile(3) = "Mekka.jpg"
arstrPictureFile(4) = "Madina.jpg"
End Subالمصفوفة السابقة توضح كيف تصرح مصفوفة ذات حجم ثابت
في بعض الحالات يمكن ان لا تعرف كم سيكون حجم المصفوفة لذلك استعمل مصفوفة متغيرة
المصفوفة المتغيرة تصرح بدون ارتباط بفهرس علوي كما في المثال التالي



Sub DemoDynamicArray()
'declare an dynamic array
Dim arstrPictureFile() As String
'once you have determined how big the array needs to be
'such as other code in between, then specify a size
'for the array
ReDim arstrPictureFile(50) As String
'populate the first 5 array elements with a value
arstrPictureFile(0) = "Eidfeter.jpg"
arstrPictureFile(1) = "Eidadha.jpg"
arstrPictureFile(2) = "Aqsamosque.jpg"
arstrPictureFile(3) = "Mekka.jpg"
arstrPictureFile(4) = "Madina.jpg"
End Subعبارة – ReDim-تستعمل لتحدد حجم المصفوفة عندما يكون معروفا
اي قيم كانت مخزنة في المصفوفة عندما تستعمل العبارة- ReDim- ستفقد بسبب تصفير المصفوفة
لانها تعيد هيكلة المصفوفة
يمكنك استخدام عبارة لحفظ القيم في الظروف التي تريد فيها حفظ الفيم السابقة في المصفوفة عندما تستخدم
عبارة – ReDim-
وهي العبارة- ReDim Preserve- لم تذكرها المؤلف ربما في فصول قادمة

Declaring and Using User-Defined Data Types
تصريح واستعمال تعريف نوع البيانات من المستخدم
ان تعريف نوع البيانات من المستخدم يسمح للمستخدم لصنع انواع البيانات الخاصة به
تعريف انواع البيانات من المستخدم يمكن ات يحوي اجزاء مختلفة من المعلومات اما لنفس نوع البيانات
او مختلف عنها

Public Type typTripInfo
strTripLocation As String
dtTripStartDate As Date
dtTripEndDate As Date
strPhotoPath As String
End Typeالكود السابق يمكن وضعه في قسم التصريحات العامة للوحدة النمطية
الان دعنا ننظر الى مثال الاجراء الذي يستخدم – typTripInfo- نوع بيانات معرف من المستخدم


Sub TestUserDefinedType()
'declare a variable as the user defined type typTripInfo
Dim typRecentTrip As typTripInfo
'assign values to the typRecentTrip user defined type
typRecentTrip.strTripLocation = "Italy"
typRecentTrip.dtTripStartDate = "3-18-04"
typRecentTrip.dtTripEndDate = "3-27-04"
typRecentTrip.strPhotoPath = "c:\trips\Italy
End Subفي الاجراء السابق متغير محلي صرح كنوع بيانات معرف من المستخدم –تفصيل مش جاهز-
typTripInfo-- ثم القيم لكل من المتغيرات في نوع البيانات المفصل من المستخدم قد تم تحديدها

Declaring and Using Object Variables
تصريح واستعمال متغيرات الكائنات
متغيرات الكائنات هي متغيرات التي تعود الى الكائنات مثل قواعد البيانات مجموعة السجلات
النماذج او التحكم
.متغيرات الكائنات تسمح لك لصنع مراجع باسماء اقصر من الكائن الاصلي وتمرر الكائنات كمحددات للاجراءات
هنا مثال يوضح كيف تصرح وتستعمل متغير صندوق النص من نمطية نموذج


Sub TestObjectVariable()
'declare an object variable
Dim txtPrice As TextBox
'point the object to the txtValue1 text box
Set txtPrice = Me.txtValue1
' set the text value of the text box
txtPrice.Text = "2000 "
End Subالاجراء السابق يصرح متغير جديد ك- كائن مربع نص ويوجه المتغير الجديد
لمربع النص الموجود- txtValue1- القيمة 2000 قد اسندت الى المتغير الجديد والذي في الحقيقة
ينتهي فيزيائيا بوضع القيمة في صندوق النص الاصلي - txtValue1-في النموذج الذي وجهت فيه المتغير الجديد
والى متابعة قادمة ان شاء الله

عارف حسان
31-08-2012, 09:38
وعليكم السلام ورحمة الله وبركاته
أحسنت أخي أبا يوسف
ولست وحدك أبداً, فكلنا معك, نتابعك بكل الحب والود.
بارك الله بك.

أبو يوسف1
01-09-2012, 03:29
اخي واستاذي العزيز عارف حسان ابا محمد
السلام عليكم ورحمة الله وبركاته
سرني واسعدني وجودك ومتابعتك الكريمتين لموضوعي فمثلك اخي واستاذي العزيز يعد بالف رجل
جمعنا الله في مستفر رحمته والحقنا بصحبة نبيه محمد صلى الله عليه وسلم والقعقاع وصحبه الكرام عليهم من الله الرحمة والرضوان
وبك ربي بارك وجزاك عنا كل الخير
وتقبل دائما خالص تحياتي وتقديري العميقين ا خي واستاذي العزيز ابا محمد

أبو يوسف1
01-09-2012, 09:39
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله التجوال التاسع في الفصل الثاني وعلى بركة الله

Constants
الثوابت
الفيجوال بيسك يسمح لك بصنع الثوابت الخاصة بك او استعمال الثوابت الداخلية في البرنامج


Declaring and Using Constants
نداء واستعمال الثوابت
الثابت هو نوع متغير والذي يحفظ قيمة ثابتة التي لا تتغير
وليس مثل المتغيرات التقليدية
الثوابت تعين قيم عندما تصنعها
الثوابت تصرح بعبارة- Const-بدلا من عبارة- Dim-
هنا بعض الامثلة

Const conWelcomeMessage as String = "Welcome to my first VBA application"
Const conRate as Double = 5.5الثوابت يمكن ان تساعد في زيادة قابلية القراءة للكود
مثال سطر الكود ان استعمل الثابت – conRate- اكثروضوحا واكثر فهما من استعمال --hard-coded
بقيمة 5.5:

dblTotalSales = conRate الثوابت يمكن ان تسهل حفظ تماسك الكود مثال لان الثابت قد صرح في مكان واحد
فانه لا يجب عليك للبحث في كل حادثة عندما يكون المعدل مع قيمة- hard-coded- هي 5.5
قد استعملت في الكود بدلا من ذلك ببساطة استعمل ثابت لتخزين المعدل الحالي وعدل
عليه عندما يتغير المعدل فيما بعد
والصحيح ان عبارة -- hard-coded-والفقرة السابقة لم افهم معناها وبحثت لعلي اوضح اكثر لكن للاسف
لم اوفق ولعل احد المعاني ان مصدر الكود يتغير بتغير المدخلات لكن ذلك لم يوضح المعنى فارجو المعذرة
وكل من عنده شرح فليتفضل مشكورا

Using Built-in Constants
استعمال الثوابت الداخلية
الفيجوال بيسك فيه ثوابت متضمنه فيه عديدة يمكن استعمالها في كتابه الكود ليوفر عليك بدلا من
كتابه الكود بنفسك مثال ذلك دالة – msgbox-لها ثوابت متنوعة يمكن استعمالها بدلا من
العدد الصحيح المحدد- integers-
الثابت – vbOK- يمثل القيمة 1 ويمكن استعماله لفحص او بيان ان زر موافق قد تم نقره
الثابت-vbCance- يمثل القيمة 2 ويستعمل لبيان او فحص فيما اذا زر الالغاء- Cancel-
قد تم نقره
رجاء راجع وثائق المساعدة لمعلومات اوسع متوقرة عن الثوابت

.
Scope and Lifetime of Variables and Constants
مدى ودورة حياة المتغيرات والثوابت
المتغيرات والثوابت لها مدى ودورة حياة مشابهة للاجراء مقارنة لدورة الحياة
المتغيرات خلال الاجراء الفرعي واجراءات الدوال عادة تبقى بينما الاجراء عامل
كلمة- Static-تستعمل عند ضرورة تعديل فترة الحياة التقليدية وحفظ القيمة للمتغير بعد انهاء
استعمالها من اخر اجراء
مدى الاجراء يحدد من اين المتغير يمكن ان يشاهد او يستعمل
.النتغير المعمول محليا خلال الاجراء يمكن ان يشاهد فقط من خلال ذلك الاجراء
الاجراء الذي تم تصريحه في قسم التصريحات العامة يمكن ان يرى من كل الاجراءات في ذلك النمطية المعينة
او بوساطة الاجراءات في كل الوحدات النمطية معتمدا على انه صرح به في العام او الخاص
اذا تم التصريح بالمتغير بالعام فان كل الاجراءات يمكن ان تستعمله وتراه
وان لم يكن فان المتغير يكون خاصا وفقط الاجراء في النموذج الذي يكون فيه التصريح سوف يراه
ملاحظه الرؤية هنا مجازية اي تستطيع التعامل مع المتغير او الثابت حسب وجوده في العام او الخاص
بدون اعادة تعريفه كل مرة ان كان عاما
والان مع المثال :

Declaring a Public Variable
--------------------------------
تصريح متغير عام
في التالي تستطيع تصريح متغير عام لتوضيح كيف تجعل المتغيرات مرئية من الاجراءات في اي
الوحدات النمطية
1- في الوحدة النمطية القياسية- modBusinessLogic-اذهب الى قسم التصريحات العامة انظر الشكل 2.26
2- اضف ثابت عام باسم—-strTestفي قسم التصريحات العامة كما في الشكل السابق

How It Works
---------------- --
كيف تعمل
بتصريح المتغير – strTest-كعام يمكن ان تستعمل وتشاهد الان من اجراءات في اي وحدة نمطية



Naming Conventions
---------------------------------------------------

اصطلاح-تقاليد- التسمية
لعلك لاحظت ان كل الامثلة التي غطت لحد الان يكون بداية كل تصريح لمتغير او لكائن بحرفان او ثلاثة احرف
بادئة مثل للمتغير- strTest- في المثال السابق هذه البادئات تستعمل كتقليد لتسمية اي كائن او متغير
طرق كثيرة للتسمية تستعمل اليوم ربما احدهما كالاخر في الفضل
التالي بعض انواع من التسميات التقليدية كتطبيق قيم
مثال اذا سميت متغير ببادئة والتي تشير الى نوع بياناته فلا داعي لان تتوه بين السطور والسطور للكود لتعرف مكان
مكان تصريح لتعرف نوع بياناته المخزنة
الجدول التالي يوضح بعض التسميات التقليدية التي ارغب لاستعمالها لمتغيراتي –مرفق كصورة
تقاليد اخرى يمكن استعمالها كما ذكر سابقا
ملاحظة المرفق صورة 2.100 و 2.99 للمتغيرات
صورة 2.101 للكائنات
والى لقاء اخر قريب ان شاء الله

مبرمج بلا حدود
01-09-2012, 11:39
جزاكـ الله خير وبارك الله فيك
وجعلها الله في ميزان حسناتك ان شاء الله
ربي يحفظك

أبو يوسف1
02-09-2012, 07:16
الاخ العزيز مبرمج بلا حدود
السلام عليكم ورحمة الله وبركاته
حياك الله اخي العزيز وبارك الله فيك
ولك كما دعوت واجزل لك ربي العطاء ان شاء الله

عبدالله سمور
02-09-2012, 07:29
وما ضرك إذ طلبت الأجر من الخالق واستغنيت عن المخلوقين.

أبو يوسف1
02-09-2012, 08:08
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
ارجو من الادارة الكريمة حذف المشاركة السابقة
والا ساضطر اسفا لفتح موضوع جديد
والى لقاء ان شاء الله

عارف حسان
02-09-2012, 09:54
وما ضرك إذ طلبت الأجر من الخالق واستغنيت عن المخلوقين.
أخي الفاضل/ عبدالله سمور
لم يظهر في الموضوع ما يدل على أن الأخ أبا يوسف قد طلب أجراً من مخلوق.
والأصل أن نحسن الظن بالناس, ولا أحد يعلم البواطن إلا الله.
نسأل الله أن يجعل جميع أعمالنا خالصة لوحهه الكريم, وأن يجنبنا الرياء والنفاق وسوء الأخلاق.


الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
ارجو من الادارة الكريمة حذف المشاركة السابقة
والا ساضطر اسفا لفتح موضوع جديد
والى لقاء ان شاء الله
وعليكم السلام ورحمة الله وبركاته
هون عليك أخي أبا يوسف .. فقد كان السلف الصالح يسمعون ما هو أقسى من ذلك, فلا يتأثرون, لأنهم يعلمون أن سرهم وعلانيتهم سواء, ثم أنهم كانوا يقيلون عثرات الكرام, وليس أكرم عندنا من أخينا أبي يوسف, وأخينا عبدالله سمور.
ثم أنني يا دوب خلصت تنسيق أكواد الموضوع, ولا أستطيع أن أنسق لك موضوعاً جديداً:):):)

عبدالله سمور
03-09-2012, 12:30
نعم لا يعلم البواطن إلا الله.ولا أريد إن أقحم نفسي في دروس للغة العربية أجد نفسي كلا َّعليها ولكن ما كنت أعنيه من العبارة أن أقرر أن الأخ :أبا يوسف حينما كتب ما كتب- جزاه الله خيرا-إنما كان يطلب الأجر من الله-نحسبه كذلك ولا نزكي على الله أحدا- فلا يضره بعد ذلك إن وجد تجاوبا من الخلق أم لم يجد وذلك تعليقا على السطر الثالث من المشاركة رقم 18.وما دار في خلدي وأنا أكتب ما كتبت أن في نفس الأخ مسحة رياء وما كنت سيء الظن بالناس وما تلك من شيمي.
وعليه فإني لا أجد ما أعبر به عن شديد اعتذاري لأخي أبي يوسف عما سببت له من حزن أو ألم.
فيأيها الفاضل:تالله لقد آثرك الله علينا وإن كنا لخاطئين.

أبو يوسف1
03-09-2012, 02:44
اخي واستاذي العزيز عارف حسان
السلام عليكم ورحمة الله وبركاته
سلمت يمناك اخي واستاذي العزيز
وابشر بما يسرك ان شاء الله
لا وقت للتفصيل في هذه العجالة
ومساء التفصيل ان شاء الله


وللاخ العزيز عبدالله سمور ارجو عودتك لتوقيعك الجميل بارك الله فيك

عارف حسان
03-09-2012, 05:01
نعم لا يعلم البواطن إلا الله.ولا أريد إن أقحم نفسي في دروس للغة العربية أجد نفسي كلا َّعليها


أستاذنا القدير/ عبدالله سمور
ربما ألتمس العذر لأخي أبي يوسف عندما وجد في نفسه شيئاً من مشاركتكم السابقة, لأن الكلام حمّالَ أوجه, لكنني لا أجد لنفسي عذراً البتة -وقد كنت أحسبني أفقه لغتي- عندما طلبت منكم حسن الظن بالناس في الوقت الذي أسأت فيه ظني بكم, فصدق فيّ قول أبي الأسود الدؤلي:
وغيرُ تقيّ يأمر الناس بالتقى *** طبيبٌ يداوي الناس وهو عليل
أو القائل:
يا أيها الرجل المـعـلم غيــره *** هلا لنفسـك كان ذا التـعليـم
لا تنـه عن خلق وتأتي مثـله *** عـارٌ عليك إذا فعلت عظيم
ابدأ بنفسك فانهها عن غيها *** فإذا انتهت عنه فأنت حكيم
لكنّ لي -الآن- من حسن الظن بكم أملاً في عفوكم عن خطأي وزلتي, والكريم من عفا.
ملاحظة لغوية:
(ما) في اللغة العربية منها الاستفهامية, ومنها النافية للجنس, وقد حملنا سوء ظننا بأستاذنا عبدالله سمور بأن فسرنا (ما) الواردة في مشاركته السابقة على أنها استفهامية, وكان يجدر بنا أن نحسن الظن به وأن نفسرها على أنها نافية لجنس الضرر, وشتان بين المعنيين.
ها أنذا -أستاذ عبدالله- أحمل الكَلّ عنكم:)


اخي واستاذي العزيز عارف حسان
السلام عليكم ورحمة الله وبركاته
سلمت يمناك اخي واستاذي العزيز
وابشر بما يسرك ان شاء الله

وعليكم السلام ورحمة الله وبركاته
وسلمت يمينك يا أبا يوسف
لن أشعر بالسرور .. إلا بمسامحتك لعبدالله سمور:)

عبدالله سمور
03-09-2012, 06:17
ما شاء الله لا قوة إلا بالله
ذوب العسل المتقاطر من كلماتك يكاد يذهب بالأذهان،فمنكم نتعلم الحسنيين البرمجة والبيان.
ويا أخي في الله:لاتثريب عليك اليوم ، يغفر الله لي ولك.

أبو يوسف1
03-09-2012, 08:51
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
سلمت وسلمت يمناك ابدعت واجدت وجعلته متلالئا زاهرا والعين تحب الجميل فيما ترى وجمال التنسيق ادعى للفهم والتوثيق
وليس ككلمات متناثرة هنا وهناك شتت العقل والملاك فبارك الله بك وجزاك عنا كل الخير

وجزاك الله الخيرفي جميل مسعاك فخشينا ان يوقعنا الشيطان في الهلاك
ولك دوام السرور ولاجل عيناك الكريمتين اهدم الحواجز وابني الجسور للحب مع ابن سمور
فلا هنت ولا هان مسعاك اسرعت للجنان دوما خطاك
وارفق الشرح الطويل لتوضيح ما اشكل وان شاء الله فيها التفصيل

أبو يوسف1
04-09-2012, 07:05
الاخ العزيز عبد الله سمور
السلام عليكم ورحمة الله وبركاته
لن اكون يوما افقه منك لا بالاكسس ولا بالعربية -وانت امير االبديع البيان -ما شاء الله ولا بالدين الحنيف ما شاء الله عليك
عالم وعالم وعالم فتح الله عليك دائما ويسر لك الامور انه على ذلك قدير
اخي العزيز وانت العالم التقي ان شاء الله كما هو ظاهر في جواهر كلامك دائما
ولعلها همسات شيطانيه - سمعتها والقيت بها مغلفة بالعسل رددتها خلفه وانت لاه غافل غيرمنتيه او استعجال في نصحي خوفا من طيران النصيحة -لن اكون اعلم منك تذكر ولكنك نسيت امورا واذكرك بها اخي العزبز
دخلت على موضوعي بدون سلام وكل بداية الدروس ذكرت السلام والحمد لله
وانت يا اخي العزيز تعرف تاثير السلام على السامع وانت داخل عليه وبوجد حديث بذلك لن اتذكره افضل منك
النصيحة تكون بلطف الكلام الذي يفهمه السامع لا يحتمل التاويل -لاحظ انت تنصح ولا تجرح -
انت تعلم وربما تحفظ سورة طه -واكيد تقراها احسن مني -ماذا امر العلي الاعلى سبحانه رسوله موسى عليه وعلى رسولنا افضل الصلاة والسلام مع فرعون مدعي الالوهية
النصيحة على الملاء هي توبيخ لا جدال فيه -ولم الخاص اذن -
واخيرا ذكرت كل هذا حتى اعلن انني واياك بعد هذا اخوة في الله اولا واخرا ولا احمل عليك
واعتذر منك اخي العزيز وارجو ان تسامحني فيما اخطات في حقك
اللهم اغفر لنا ذنوبنا وجنبنا الشيطان وما وسوس واهدنا سبلنا انك انت القوي العزيز
وفق الله الجميع لما يحبه سبحانه ويرضاه

أبو يوسف1
04-09-2012, 07:30
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اعتذر عن الانقطاع واكمل معكم ان شاء الله
Controlling Program Flow
التحكم بسريان البرنامج
حتى الان تعلمت كبف تصنع وحدة نمطية او اكثر لتحوي الكود وايضا صنع الاجراءات ضمن هذة الوحدات النمطية
الان سوف ترى كيف تكتب اوامر ضمن الاجراء والتي تتحكم بسريان البرنامج
التحكم بسريان البرنامج يكون من خلال حلقات لعمل القرارات وبطريقة اخرى سوف نبدا بكتابة كود اتخاذ القرار

Decision Making
-------------------
اتخاذ القرار
في الفيجوال بيسك عبارات كثيرة تستعملها لعمل قرارات في الكود ثم اتخاذ الفعل المناسب بالاعتماد على النتيجة
التالي يعطي امثلة كثيرة على اتخاذ القرارات لتوضيح هذا المفهوم
If. . . Then
عبارة - If...Then- تستعمل لعمل القرارات وتنفيذ اعمال محددة بالاعتماد على موافقة الشروط
الصيغة لعبارة-If...Then-هي :

If CONDITION Then
'code if the condition is met
End If
الصيغة لعبارة - If...Then...Else-هي :


If CONDITION Then
'code if the condition is met
Else
'code if the condition is not met
End If
الصيغة لعبارة - If...Then...ElseIf- هي :


If CONDITION Then
'code if the condition is met
ElseIf CONDITION Then
'code if the ElseIf condition is met
End Ifعبارتي – ElseIf- و – Else- يمكن استعمالهما معا كجزء من نفس عبارة- If...Then-
او يمكن استعمالهما منفصلتين كما هو موضح في المثال السابق
عبارات -- If...Then يمكن ان توضع داخل كل واحد منهم كما قي المثال الثالي:


If intCounter < 0 Then
'reset intCounter to 0
intCounter = 0
ElseIf intCounter > 0 and intCounter < 50 Then
If intCounter = 50 Then
Msgbox "The maximum number of sessions has been reached"
Else
Msgbox "There are still sessions remaining"
End If
intCounter = intCounter + 1
End Ifتطبيق مثال عملي
جاء دورك الان لصنع اجراء جديد مستعملا عبارات - If...Then- اذا ....فان
1- في الوحدة النمطية القياسية- - modBusinessLogicاضف الاجراء- TestIfStatement-


Sub TestIfStatement()
'declare variable to store sales tax value
Dim curSalesTax As Currency
'call function to calculate sales tax
curSalesTax = CalculateSalesTax(500, 0.05)
'evaluate sales tax and write proper message
'to debug window
If curSalesTax <= 10 Then
Debug.Print "You are lucky - the amount of tax is nominal"
ElseIf curSalesTax > 10 And curSalesTax <= 50 Then
Debug.Print "The amount of sales tax could have bought you a nice meal"
Else
Debug.Print "You bought a really nice item for that tax amount"
End If
End Sub2- من شاشة فحص الكود الفورية شغل الاجراء الجديد- TestIfStatement-
النتيجة كما ظهرت في شاشة فحص الكود الفورية انظر الشكل 2.27

مرفق صورة والشرح بي دي اف

أبو يوسف1
05-09-2012, 07:54
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
سلمت يمناك وجزاك الله كل الخير اخي واستاذي العزيز
لا احب ان اثقل عليكم اخي واستاذي العزيز فلو تكرمت بارشادي على كيفية عمل ذلك والطريقة بارك الله فيك
وتقبل دوما خالص تحياتي وتقديري العميقين اخي واستاذي العزيز ابا محمد

الاخ العزيز عبدالله سمور
السلام عليكم ورحمة الله وبركاته
بالله عليك اخي العزيز غير التوقيع فلا مجال لرفع راسي في المرفقات :)

الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نكمل ان شاء لله معا الجزء11 للفصل الثاني وعلى بركة الله


How It Works
شرح المثال السابق
الاجراء – TestIfStatement- ينادي دالة- CalculateSalesTax- والتي صنعتها سابقا
يقدر النتيجة في عبارة- If...Then-ليحدد اي رسالة سوف يظهر في شاشة فحص الكود الفورية
الاجراء يبدا لتصريح متغير لتخزين قيمة الضريبة المحسوبة


Sub TestIfStatement()
'declare variable to store sales tax value
Dim curSalesTax As Currency
المتغير- curSalesTax-يسند الى نتيجة الدالة- CalculateSalesTax-
بكلمات اخرى الاجراء- CalculateSalesTax-ينادى عليه من قيم - hard-coded-
والقيمة الناتجة توضع في المتغير- curSalesTax-


'call function to calculate sales tax
curSalesTax = CalculateSalesTax(500, 0.05)
وبعد ذلك فان عبارة-.. –If.استعملت لتقدير قيمة- curSalesTax-وكتابة رسالة
في شاشة فحص الكود الفورية بالاعتماد على كيفية تقدير التعبير.


'evaluate sales tax and write proper message
'to debug window
If curSalesTax <= 10 Then
Debug.Print "You are lucky - the amount of tax is nominal"
ElseIf curSalesTax > 10 And curSalesTax <= 50 Then
Debug.Print "The amount of sales tax could have bought you a nice meal"
Else
" Debug.Print "You bought a really nice item for that tax amount
End If
End Sub
في المثال الحالي بسبب تحديد القيمة 500 ثمن المبيعات محددات الدالة- CalculateSalesTax-
و 0.05 حددت لمعدل الضريبة وناتج قيمة الضريبة هو 25
لذلك عندما تشغل الاجراء فان شاشة فحص الكود الفورية سوف تظهر الرسالة المناسبة

IIf
الدالة- IIF-
هذه الدلة تستخدم لايسترجاع قيمة واحدة من اثنتان بالاعتماد على الشرط- تحت الفحص- صح ام خطا
الصيغة لدالة- IIf-هي :


IIf(expr, truepart, falsepart)
وهنا هذا المثال


strResult = IIf(intWeight > 25, "Heavy", "Light")
فاذا كان قيمة الوزن- intWeight- اكبر من 25 فان دالة – IIF-
سوف تسترجع القيمة "Heavy"
ثم يسندها للمتغير – strResult-
وغير ذلك –الوزن اقل من 25
المتغير – strResult- سوف يسندها للقيمة "Light"

Conditional If
اذا الشرطية
عبارة - If...Then-الشرطية تمكن من تجميع وتنفيذ مختار لقوالب محددة من الكود
تستعمل عبارة-. If- الشرطية في اكثر من موقع مثل عندما تريد تنفيذ قوالب معينة من الكود خلال
الفحص لكن ليس في النسخة النهائية
او عندما توزع تطبيقك في مناطق مختلفة وتريد تفعيل كود في لعض المناطق معينة وليس في غيرها



التالي مثال للصيغة العامة

If conLanguage = "English" Then
'The code specific to the English version of the software goes here.
ElseIf conLanguage = "Spanish" Then
'The code specific to the Spanish version of the software goes here.
Else
'The code specific to the remaining versions of the software goes here.
End If
Select. . . Case
حالة.......الاختيار
طريقة اخرى في انجاز اتخاذ القرار في كود الفيجوال بيسك هو استعمال عبارة- Select...Case-

هذه العبارة لتسهيل تقييم نفس المتغير لمرات عديدة والقبام بفعل محدد بالاعتماد على التقييم
الصيغة العامة لعبارة - Select...Case- هي :


Select Case VARIABLE
Case VALUE1
'code to run if VARIABLE equals Value1
Case VALUE2
'code to run if VARIABLE equals Value2
Case Else
'code to run for remaining cases
End Select
مثال للتطبيق
دعنا نصنع اجراء جديد نستعمل فيه عبارة- Select...Case-لتوضيح هذه في تفصيل اكثر
1-اضف الاجراء – TestCaseStatement-الى الوحدة النمطية – modBusinessLogic-


Sub TestCaseStatement(strCountry As String)
'evaluate the value of strCountry and display applicable result in debug window
Select Case strCountry
Case "Italy"
Debug.Print "The buildings dating back to 400 BC are incredibleCase "China."
Debug.Print "Great bargains for shoppersCase "Russia"
Debug.Print "A beautiful country with a growing democracy"
Case "Germany"
." Debug.Print "Fantastic food - you will not starve there
Case Else
Debug.Print "You should travel more when you have the chance"
End Select
End Sub2- سغل الاجراء- TestCaseStatement- من شاشة فحص الكود الفورية واختر -"Italy" كمحدد
كما في الصورة 2.28
اضغط موافق لتشغيل الاجراء القيمة الناتجة سوف تظهر في شاشة فحص الكود الفورية

How It Works
شرح العملية
الاجراء- TestCaseStatement- يقبل متغير حرفي اسمه- strCountry-كمحدد


Sub TestCaseStatement(strCountry As String)
المتغير- strCountry- يقدر في عبارة- Select...Case- ليحدد اي من الرسائل
المختلفة يجب ان تظهر
.

'evaluate the value of strCountry and display applicable result in debug window
Select Case strCountry
Case "Italy"
Debug.Print "The buildings dating back to 400 BC are incredible"
Case "China"
Debug.Print "Great bargains for shoppersCase "Russia
" Debug.Print "A beautiful country with a growing democracy
Case "Germany"
Debug.Print "Fantastic food - you will not starve there"
Case Else
Debug.Print "You should travel more when you have the chanceEnd Select"
لانك شغلت الاجراء مستعملا القيمة- "Italy"- كقيمة للدولة فان الرسالة سوف تظهر في
شاشة فحص الكود الفورية
حاول تسغيل الاجراء باستعمال قيم مختلفة للدولة وانظر كيف تختلف النتائج
.
مرفق صورة والشرح بي دي اف

عارف حسان
05-09-2012, 09:27
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
سلمت يمناك وجزاك الله كل الخير اخي واستاذي العزيز
لا احب ان اثقل عليكم اخي واستاذي العزيز فلو تكرمت بارشادي على كيفية عمل ذلك والطريقة بارك الله فيك
وتقبل دوما خالص تحياتي وتقديري العميقين اخي واستاذي العزيز ابا محمد

وعليكم السلام ورحمة الله وبركاته
وإياك جزى على هذا العمل الرائع, والذي أرجو أن يكون صدقةً جاريةً لك إلى يوم الدين.
بالنسبة لتنسيق الأكواد:
يمكنك عمل ذلك من خلال زر الانتقال إلى الوضع المتطور, وليس زر إضافة الرد السريع.
عند انتقالك للوضع المتطور ستجد من ضمن أدوات نافذة الوضع المتطور إمكانية التحكم بالخط من حيث الحجم واللون والبنط وغيره, كما ستجد أداة المربع بهذا الشكل (#) وهي تعني إدراج كود.
ضع المؤشر في سطر جديد, ثم قم بالنفر على الأداة السابقة, سيقوم المحرر بإدراج مربعين بالشكل التالي: [] [] وبداخل كل منهما مكتوب كلمة كود بالانجليزية.
كل ما عليك هو أن تقوم بكتابة أو لصق الكود بين ذينك المربعين كالتالي: [code] اكتب أو الصق الكود هنا [code]

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

أبو يوسف1
06-09-2012, 08:19
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركانه
جزاك الله خيرا مرات عديدة وبارك فيك اخي واستاذي العزيز على جميل شرحك وان شاء اطبق ذلك منذ هذه المشاركة
وارجو من العلي القدير ان يصلك ايضا اجر هذا العمل ان شاء الله لجهودك الملموسة الرائعة ودعمك للعمل كله
واساله تعالى ان يضاعف لك الاجر مرات عديدة الى يوم الين فهو سبحانه اكرم الاكرمين
ومع دعائي لك دوما بموفور الصحة والعاقيه ان شاء الله

واكمل ان شاء الله الجزء 12 من الفصل الثاني الذي شارف على نهايته قريبا ان شاء الله وبالله التوفيق

Loops
حلقات التكرار

انواع مختلفة من الحلقات يمكن استعمالها لدوران عمل معين حتى حدوث سيناريو معين
مثال الحلقات يمكن ان تستعمل لتشغيل كود معين لعدد مرات محددة
الان سوف تتعلم عن طرق مختلقة وقليلة لتصريح الحلقات باستعمال كود الفيجوال بيسك

.
For. . . Next and For Each. . . Next
حلقات التكرار- For...Next- يمكن استعمالها لتشغيل نفس الكود لعدد مرات معينه
حلقات التكرار-- For Each...Next-يمكن استعمالها لتشغيل نفس الكود لكل كائن لتجمع معين مثل
نموذج- for each-في تجمع النماذج


الصيغة الاساسية لحلقات: Each...Next هنا

For counter = start To end
'statements go here
Next [counter]

الصيغة الاساسية لحلقات: Each...Next هنا

For Each element
'statements go here
Next [element]

تطبيق مثال عملي
صنع حلقات تكرار- For. . . Next-
دعنا نصنع حلقات تكرار- For...Next-لترى كيف يعمل
1-ضع هذا الكود لاجراء- TestLoop- في الوحدة النمطية – modBusinessLogic-

Sub TestLoop( )
'declare variable to store Counter
Dim intCounter As Integer
'increment intCounter from 1 to 5 and
'display output in debug window
For intCounter=1To5
Debug.Print intCounter
Next intCounter
End Sub

2-شغل الاجراء- TestLoop-من شاشة فحص الكود الفورية
النتيجة لتشغيل الاجراء كما يظهر في الشكل 2.29

How It Works
شرح عمل المثال
الاجراء- TestLoop-يبدا بتصريح المتغير- intCounter-
لتخزين عدد المرات التي يتكرر فيها حلقات التكرار

Sub TestLoop( )
'declare variable to store Counter
Dim intCounter As Integer


عبارة- For...Next- تاتي تاليا بكود يحدد ان الحلقات يجب ان تعمل بعداد- intCounter-
بادئا من 1 ويكرر مرات عديدة حتى يصل – intCounter- الى 5
عبارة – Next-تزيد قيمة- intCounter-وهو العداد لكل مرة يزيد بقيمة واحد صحيح
وعندما تصل قيمة العداد- intCounter- الى خمسة فان عبارة- Debug.Print-سوف تفعل في اخر مرة-المرة الخامسة-ومن ثم سوف ينتهي التكرار


'increment intCounter from 1 to 5 and
'display output in debug window
For intCounter=1To5
Debug.Print intCounter
Next intCounter


Do. . . Loop
عبارة- Do...Loop- يمكن استعمالها بدلا من - For...Next-
لانجاز نفس الهدف
نوعي الحلقات - Do...Loops- هما –
-Do...While- وايضا - Do...Until-
العبارة الاولى لن تعمل ابدا ان لم يكن الشرط اساسا صحيحا
لكن الثانية دائما تعمل على الاقل مرة
الصيغة الاساسية هي :

Do [{While | Until} condition]
'statements go here
Loop

او يمكنك استعمال هذه الصيغة:

Do
'statements go here
Loop [{While | Until} condition]

الكود التالي يستعمل عبارة- Do...While- لانجاز نفس النتيجة
عند استعمال حلقات تكرار - For...Next-الموصوف سابقا


Do While intCounter <= 5
Debug.Print intCounter intCounter = intCounter + 1
Loop

مثال لحلقات تكرار-Do Unti- كالتالي
.Do Until intCounter = 6
Debug.Print intCounter
intCounter = intCounter + 1
Loop


اذا الشرط في عبارة- Do Until- لا يمكن تحقيقه فان هذا الحلقات تسمي حلقات التكرار غير المنتهيه
والتي سوف تنفذ للابد


While...Wend
عبارة- While...Wend- تنفذ بشكل متكرر بينما شرط معين متحقق
عندما لا يتحقق الشرط فان حلقة التكرار سوف تتوقف وهذا مثال:


intCounter = 1
While intCounter <= 5
Debug.Print intCounter intCounter = intCounter + 1
Wend


مرفق الصورة

أبو يوسف1
07-09-2012, 02:00
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله الجزء 13 للفصل الثاني من التجوال وعلى بركة الله

Documenting Your Code
توثيق الكود

فكرة جيدة ان توثق الكود بشكل صحيح حتى يفهم الاخرين الهدف من كل اجراء ولماذا تمت كتابته بهذه الطريقة ويمكن توثيق الكود بطرق مختلفة
الطريقة النموذجية هي استعمال قسم تعقيبات عامة في بداية كل اجراء
وتستعمل تعقيبات داخل سطر الكود -- in-line لوصف كل جزء من الكود

هنا مثال عن قسم تعقيبات عامة
'************************************************* *******************
'*
'* Procedure Name: TestProcedure
'*
'* Purpose: The purpose of this procedure is to illustrate why
'* documenting your code is so important.
'*
'* Parameters: None.
'*
'* Date Created: March 31, 2004
'* By: Denise M. Gosnell
'*
'* Modification Log:
'* Date Explanation of Modification Modified By
'* -------------- -------------------------------- -------------
'*
'************************************************* *******************
نظام التوثيق السابق زائد كثيرا اذا كان الاجراء اسطر قليلة
بعض انواع اقسام التعقيب العامة يجب ان تستعمل في كل الاجراءات وحتى لو كانت بدون تفاصيل كثيرة كما في المثال السابق
لقد شاهدت كثيرا تعقيبات كثيرة داخل سطر الكود في كل الامثلة التي مرت بك في هذا الفصل وهنا اخر
'display a message to the user
Msgbox "Demonstration of In-Line commenting"
دائما الافضل ان تكتب تعقيبات كثيرة افضل من لو كانت قليلة جدا –زيادة الخير خير-
وكلما زدت مراسا في كتابة كود الفيجوال بيسك سوف ترى كم هو صعب
ان تتابع ماذا يحدث في اجراء معين
هذا صحيح ان ترجع الى الكود بعد مرور وقت ولا تذكر ابدا تفاصيل لماذا كتبت الكود بهذه الطريقة
او وانت تراجع الكود احدا غيرك كتبه
كتابة التعقيبات يعمل هذه الاعمال سهلا جدا


Error Debugging
الان وقد غطيت طرقا كثيرة لكتابة الكود والتحكم بسريان البرنامج دعنا نرى انواع الاخطاء التي
يمكن ان تواجهها كيف تحلها وكيف تكتب تحكم بالاخطاء للتحكم بها

Types of Errors
انواع الاخطاء
انواع الاخطاء تشمل : اخطاء في كتابة الصيغة – syntax-اخطاء تحويل- compile- اخطاء زمن التشغيل
- runtime-اخطاء منطقية- logic-
- كل واحدة سوف تناقش بدورها
.

Syntax Errors
اخطاء الصيغ
هذه الاخطاء التي تحدث بسبب ان الكود المكتوب لا يطابق الصيغة العامة للكود
الصورة 2.30 توضح خطا صيغة حيث ان الخطا يحدث بسبب
ان جزء من عبارة- Dim- مفقود

Compile Errors
اخطاء تحويل البرنامج للغة الالة –التحويل-
ملاحظة استعملت ترجمة – Compile-كتحويل
ويعني هذا نقل البرنامج من الصيغة المقروءة بالاحرف والرموز الى صيغة
لغة الكمبيوتر وهي باستخدام الرقمان صفر وواحد فقط
وربما البعض يطلق التجميع وهو المعنى الحرفي للكلمة لذا حاولت وضع الكلمة الاصلية غالبا
وكذا في الحالات التي اجد قدرتي على الترجمة قد قصرت. وكثيرا ما فعلت –انتهى الايضاح
اخطاء التحويل هي الاخطاء التي تكتشف عند التحويل الذي ربما
عنده صيغة كود صحيحة ولكن لاكثر من سبب لن يتحول
الشكل 2.31 توضح اخطاء حدثت بسبب دالة- CalculateTax-
لا يمكن معرفة مكانها
في هذا المثال تحديدا السبب لحدوث خطا التحويل هو
ان الدالة لم لم يوضع بطريقة صحيحة ك- CalculateTax-
بدلا من – CalculateSalesTax-
.

Runtime Errors
اخطاء وقت التنفيذ-التشغيل-
هذه الاخطاء تحدث عند وقت التشغيل وعندما ينفذ الكود
هذه الاخطاء تشمل الاخطاء بسبب اشياء ممنوعة او مفترض منعها من الحدوث
مثال ذلك سطر الكود الذي يحاول ان يعين متغير لنوع بيانات بقيمة غير مناسبة
يمكن ان يحدث خطا وقت التنفيذ المثال في الشكل 2.32 يشغل دالة
- CalculateSalesTax-ويمرر قيم حرفية كمحددات بدلا من بيانات العملة المطلوبة
- و 8بايت عدد عشري - double-النتيجة خطا وقت التشغيل وفي هذا المثال
نوع الخطا هو عدم الملائمة

Logic Errors
الاخطاء المنطقية
الاخطاء المنطقية هي خلل في المنطق للكود وهي من الاصعب معرفتها
لانها صيغة التركيب صحيحة ولكن يمكن كشفها فقط بفحص الكود والتاكد

Debugging Your Code
كشف وتصحيح الاخطاء
بالتاكيد تحتاج الى فحص واصلاح كود الفيجوال بيسك عندما تواجه اخطاء
محرر الفيجوال بيسك يزود طرق عديدة لمساعدتك في كشف وتصحيح الكود
والان سوف نلقي بعض النظرات على بعض الطرق بتفصيل اكثر ان شاء الله


Using Breakpoints to Step through Code
استعمال نقاط التوقف للتدرج خلال الكود
نقاط التوقف يمكن ضبطها لسطر او اكثر في الكود. وعندما يصل سطر الكود الى نقطة التوقف
فان تشغيل البرنامج يتوقف ويمكن لك الخيار ان تدخل او تمر متجاوزا السطر او الخروج
من الكود ان اخترت الدخول من قائمة – Debugmenu- سوف يشغل السطر الحالي
للكود عند نقطة التوقف
ان تختار تمر متجاوزا سوف يتجاهل السطر الحالي للكود عند نقطة التوقف
ويمر الى السطر التالي للكود

Setting and Using Breakpoints
ضبط واستعمال نقاط التوقف- مثال عملي
حان دورك لضبط نقطة توقف وتعمل مرور في الكود
1-توجه الى الاجراء- TestLoop- الذي عملته في الوحدة النمطية
- modBusinessLogic-
-2 اضبط نقطة التوقف على اسطر - -Debug.Printو – intCounter-في الكود كما في الشكل 2.33
يمكنك ان تضبط نقطة التوقف بواسطة وضع المشيرة على اول سطر الكود من اليسار ثم
النقر على الحافة الجانبية -عند مكان النقطة- تماما كما في الشكل2.33 ولالغاء النقطة انقر
مرة اخرى على النقطة نفسها
3-بعدها افتح نافذة فحص الكود الفورية وشغل الاجراء- TestLoop- الكود سوف يوقف العمل عند اول نقطة توقف
كما في الشكل 2.34
4-وانت على نقطة التوقف استعمل شاشة فحص الكود الفورية للسؤال عن القيمة الحالية
للمتغير – intCounter-لعمل ذلك اطبع -? intCounter-ثم موافق كما في الشكل 2.35
5-القيمة الحالية – intCounter- سوف تظهر في شاشة فحص الكود الفورية يجب ان تضغط
- F5-او اختيار Run ➪Continue لاكمال تنفيذ اسطر الكود
التنفيذ سوف يتوقف عند كل نقطة توقف


How It Works
كيف تعمل
نقاط التوقف تمكنك من عمل مراقبه حثيثة وتحديد قيم المتغيرات وعمل الاجراءات – actions- التي تمكنك من
فحص ومراجعة الكود بفعالية
هذا المثال سيريك كيف تزداد قيمة العداد- intCounter- كلما حلقات التكرار تتكرر


Using the Immediate Window
استعمال شاشة فحص الكود الفورية
وانت جيد الوعي عند هذه النقطة-ما شاء الله عليك-يمكن ان تستعمل شاشة فحص الكود الفورية لنداء –استدعاء-
الاجراءات واظهار النتائج لسطر الكود
وايضا يمكنك من استعمال الشاشة الفورية لتعيين قيم جديدة للمتغيرات
وتعلمت ان عبارة- Debug.Print-تكتب الناتج – output-مباشرة في الشاشة الفورية
عبارة- Debug.Print-يمكن استعمالها لاهداف الفحص

والى لقاء جديد ان شاء الله
مرفق الصور وكذلك الكود لكامل الفصل وهو من طرف الؤلف

أبو يوسف1
07-09-2012, 10:35
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نكمل معا الجزء 14 من الفصل الثاني وعلى بركة الله نبدا

Using the Locals Window
استعمال الشاشات المحلية
الشاشات المحلية تستعمل لاظهار كل الكائنات والمتغيرات التي استعملت في الاجراء الحالي
ان القيم في قائمة الكائنات والمتغيرات يتم تحديثها كل مرة يتوقف فيها تنفيذ البرنامج بشكل مؤقت لوجود نقطة توقف
او مرور خلال الكود

Using the Locals Window
استعمال الشاشات المحلية-مثال عملي-
دعنا نصنع مثالا باستعمال الشلشات المحلية
1- اظهار الشاشة المحلية يكون من عرض ثم الشاشات المحلية
2- شغل الاجراء- TestLoop- من الشاشة الفورية- Immediate Window-
3- تنفيذ الكود سوف يتوقف عندما يصل اول نقطة توقف
لاحظ ان القيم في الشاشة المحلية قد تم تحديثها بالقيمة الحالية ل- intCounter-
4- اضغط الزر- F5- او اختار - Run ➪Continue-لتظل تنفذ اسطر الكود ويجب ان ترى ان قيم
العداد- intCounter- في الشاشة المحلية تتغير كلما تقدمت قي الكود

How It Works
شرح العملية
الشاشة المحلية تسمح لك لمراقية حثيثة وتحديد القيم للمتغيرات هذا المثال يسمح لك لترى كيف
ان القيمة للعداد- intCounter-تزداد كلما تكررت الحلقة

Using the Watch Window
استعمال شاشة المراقبة
تستعمل شاشة المراقبة لترى عددا من الكائنات والمتغيرات في الاجراء الحالي
شاشة المراقبة تستعمل لمراقبة القيم للمتغيرات كلما حدث توقف في نقاط التوقف
تماما مثل القدرة في الشاشات الفورية والمحلية
شاشة المراقبة ايضا عدا عن الامكانيات السابقة لها ميزة اضافية وهي السماح باضافة مرقاب
Watch-والذي يوقف تنفيذ الكود عند حدوث حدث معين او قيمة
هذه الخاصية تمكنك من توقيف النظام تلقائيا عند حدوث حادثة معينة بدون الحاجة الى
عمل نقاط توقف مسبقا

Adding a Watch
عمل مرقاب –مثال عملي
دعنا نرى مثال لاضافة مرقاب باستعمال شاشة المراقبة
1-من قائمة – Debug-في محرر الفيجوال بيسك اختر اضف مرقاب
2-من صندوق الحوار لاضافة المرقاب حدد- intCounter-كمعبر – Expression-
وايضا – TestLoop- كاجراء و- modBusinessLogic- كوحدة نمطية
3- انقر موافق في صندوق الحوار وشاشة المراقبة سوف تظهر
4- شغل الاجراء- TestLoop- من الشاشة الفورية يجب ان ترى القيم تتغير في شاشة المراقبة عندما تصل الى اول نقطة توقف

How It Works
شرح العملية
شاشة المراقبة تتيح لك لمراقبة حثيثة مع تحديد القيم للمتغيرات وايضا التوقف التلقائي للكود عند حدوث حادثة معينة
هذا المثال سيريك كيف تزداد قيمة العداد- intCounter-كلما تكررت الحلقات تماما كما عمل المثال السابق




Using the Call Stack
مناداة –استدعاء- الاجراء

ان استدعاء الاجراء يستعمل لاقتفاء عمليات الاجراءات في البرنامج
وتستطيع استعمال شاشة الاستدعاء من عرض ثم استدعاء الاجراء- View ➪Call Stack-
وعلى اي حال يجب ان تصنع استدعاء الاجراء وانت ليس في وضع كشف وتصحيح الخطا
يوجد طرق كثيرة لصنع استدعاء الاجراء مثل كتابة رسائل مختلفة في الشاشة الفورية عند دخولك في اجراءات
معينة لرؤية ترتيب استدعائهم
مرفق الصور
والى لقاء اخر ان شاء الله

أبو يوسف1
08-09-2012, 07:46
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء 15 وقبل الاخير -ان شاء الله-في الفصل الثاني وعلى بركة الله نبدا

Error Handling
التعامل مع الاخطاء-الاعطال
ملاحظة ترجمت – Error- بالعطل او الخطا او الخلل
الان وانت تعرفت على انواع مختلفة من الاخطاء التي يمكن حدوثها في الكود للفيجوال بيسك وكيف تكشفها فقد
جاء الوقت لتكتب كود التعامل مع الاخطاء ضمن الاجراءات حتى يعمل التطبيق بشكل جيد

Default Error Messages
رسائل الخطا الافتراضية
رسائل الخطا الافتراضية
كلنا استعملنا تطبيقات لا يوجد فيها طريقة جيدة للتعامل مع الاخطاء وربما تجد نفسك خارجا من التطبيق بدون
تحذير او تواجة رسالة غير محببة كما رايت سابقا في هذا الفصل
وبالتاكيد لا ترغب في حدوث ذلك مع الاخرين عند التعامل بالتطبيق الذي تعمله
الاخطاء دائما تحدث ولكن ان صممت طرق التعامل مع الاخطاء بشكل سليم على الاقل يمكن التعامل معها بشكل مقبول

Handling Errors with an On Error Statement
التعامل مع الاخطاء بوجود عبارة الخطا
الاخطاء في اجراءات الفيجوال بيسك باستعمال عبارة عند الخطا- On Error-كما ترى لاحقا

On Error Statement
عبارة عند حدوث الخطا
عبارة عند الخطا –حدوث الخطا – يمكن وضعها في الاجراء لتحدد القسم في الاجراء
المراد القفز اليه عند حدوث الخطا خلال التنقيذ وهنا مثال

Sub Test()
On Error GoTo HandleError
'normal code for the procedure goes here
Exit Sub
HandleError:
'code for handling the error goes here
Exit Sub
End Sub

من ادوات ثم خيارات ثم عام اعمل تمكين لخيار- On All Errors-هذا سوف يساعدك
لرؤية اصل المشكلة وليس التعامل مع الخطا الذي عملته

Resume Statement
عبارة الاسئناف
عبارات الاستئناف واستئناف التالي تستعمل مع عبارات عند الخطا
عبارة الاستئناف-- Resume سوف تجبر عملية التنفيذ للكود للمتابعة عند السطر الذي سبب العطل
واستئناف التالي - Next – Resumeهذه العبارة سوف تجبر عملية تنفيذ الكود للمتابعة عند السطر التالي للمسبب بالعطل
عبارات الاستئناف عادة تستعمل ضمن روتين- routines-التعامل مع الخطا كما في المثال التالي

Sub Test()
On Error GoTo HandleError
'normal code for the procedure goes here
Exit Sub
HandleError:
'code for handling the error goes here
Resume Next
Exit Sub
End Sub



Creating an Error Handler
عمل متعامل مع الخطا –مثال عملي

حان دورك لتدرب يدك لصنع متعامل مع الخطا –لا تخف لن تسقط لا تزال معك-
1-ضع الكود التالي في اجراء جديد وتسميه- TestError- في النمطية- modBusinessLogic-

Sub TestError(intValue1 As Integer, intValue2 As Integer)
On Error GoTo HandleError
'declare variable to store result
Dim intResult As Integer
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2
Exit Sub
HandleError:
MsgBox "An error has occurred in your application: " & Err.Description
Exit Sub
End Sub

2- شغل الاجراء من الشاشة الفورية كما في الشكل 2.41
3- الرسالة التالية سوف تظهر كما في الشكل 2.42

How It Works
شرح العملية
الاجراء – TestError- يقبل متغيران كمحددات وهما :

Sub TestError(intValue1 As Integer, intValue2 As Integer)
وعبارة عند حدوث الخطا تشير الى ان قسم التعامل مع الخطا في الكود يجب تنفيذه عند حدوث الخلل


On Error GoTo HandleError
تم تصريح متغير لتخزين نتيجة الحسابات الرياضية القادمة

'declare variable to store result
Dim intResult As Integer

القيمة- intValue1-سوف تقسم على القيمة- intValue2-

'calculate result by dividing first value by second value
intResult = intValue1 / intValue2

بسبب ان القيمة الثانية-- intValue2 حددت بصفر عند استدعاء الاجراء وتقسم على صفر
فان الخلل يحدث عند تنفيذ السطر السابق من الكود لذلك فان
عملية تنفيذ الكود ستقفز الى المتعامل مع الخلل – HandleError-الذي في اخر الاجراء


HandleError:
MsgBox "An error has occurred in your application: " & Err.Description
Exit Sub
End Sub

رسالة خطا سوف تظهر لاعلام ان خللا حدث وتزود بوصف الخلل


The Err Object
كائن العطل- الخلل –
كائن الخلل بحوي معلومات عن اعطال وقت التنفيذ والتي تحدث عند تنفيذ الكود
متعاملات الاعطال يمكن استعمالها للتزود بمعلومات مفيدة للمستخدم او
للنظام للمساعدة في عمل التصرف الواجب اتخاذه
مثال ذلك كما لاحظت في المثال السابق خاصية الوصف لكائن العطل - Err.Description-
قد استعملت لاضافة وصف للخلل للمستخدم
كائن الخلل له مدى عام - global scope-ولا يحتاج للتصريح. بعض الامثلة لخصائص كائن
العطل متوفرة مثل الرقم, الوصف, في المساعد , ملف مساعدة ومصدر
الرقم والوصف هما اكثر الخصائص استعمالا لكائن الخلل


Raising an Error
ظهور الخلل
كائن الخلل له طريقه للظهور لتسمح لاعطال وفت التشغيل للظهور عند الضرورة
وهذه هي الصيغة

Err.Raise number, source, description, helpfile, helpcontext
عدد المحاورات مطلوب لاظهار الخلل ولكن بعض المحاورات اختيارية
هنا مثال لتوضيح كيف يمكنك اظهار الخلل في الكود

Sub TestErrRaise(intValue1 As Integer, intValue2 As Integer)
On Error GoTo HandleError
'declare variable to store result
Dim intResult As Integer
If intValue2 <> 0 Then
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2
ElseIf intValue2 = 0 Then
'raise a custom divide by 0 error
Err.Raise vbObjectError + 513, "TestErrRaise,-"
"The second value cannot be 0."
End If
Exit Sub
:HandleError
MsgBox "An error has occurred in your application: " & Err.Description
Exit Sub
End Sub

عند ظهور الخلل فان الكود يقفز الى المتعامل مع الخطا تماما كحالة حدوث الخلل في الطريقة التقليدية

مرفق الصور
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
09-09-2012, 07:02
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
يكتمل ان شاء الله الفصل الثاني بنهاية الجزء 16 من الفصل وعلى بركة الله نبدا


Using the Errors Collection
استعمال مجمع الاخطاء
مجمع الاخطاء يخزن اعطال التي حدثت لكائنات - ActiveX Data Objects (ADO) –
الاحدث في قاعدة البيانات الفصل 5 يغطي – ADO-بتفصيل
وفي الوقت الحالي فقط ادرك ان مجمع الاخطاء يستعمل للدوران حول كل خلل
حدث نتيجة عمل قاعدة البيانات, فقط في حالات قليلة يتطلب الاستعانة بمثل هذه الميزة

Creating a Generic Error Handler
عمل متعامل عام للتعامل مع الاخطاء
طريقة اخرى للتعامل مع الاخطاء هي عمل متعامل عام مع الاخطاء
والذي يستدعى من اي اجراء فرعي او دالة

Creating a Generic Error Handler
عمل متعامل عام للتعامل مع الاخطاء –مثال عملي
اعمل متعامل عام للتعامل مع الاخطاء الان –حاضر مام-
1-اضف الاجراء- GeneralErrorHandler- والذي يتبع النمطية- modBusinessLogic-


Public Sub GeneralErrorHandler(lngErrNumber As Long, strErrDesc As String,
strModuleSource As String, strProcedureSource As String)
Dim strMessage As String
'build the error message string from the parameters passed in
strMessage = "An error has occurred in the application."
strMessage = strMessage & vbCrLf & "Error Number: " & lngErrNumber
strMessage = strMessage & vbCrLf & "Error Description: " & strErrDesc
strMessage = strMessage & vbCrLf & "Module Source: " & strModuleSource
strMessage = strMessage & vbCrLf & "Procedure Source: " & strProcedureSource
'display the message to the user
MsgBox strMessage, vbCritical
End Sub

2- اضف الاجراء- TestError2-الى النمطية – modBusinessLogic-


Sub TestError2(intValue1 As Integer, intValue2 As IntegerOn Error GoTo HandleError)
'declare variable to store result
Dim intResult As Integer
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, "modBusinessLogic", -
"TestError2"
Exit Sub
End Sub

3- استدعي الاجراء- TestError2- من الشاشة الفورية بالقيم كما تظهر في الشكل 2.43
4- رسالة كما في الصورة2.44 سوف تظهر


How It Works
شرح العملية
الاجراء - TestError2- يعمل بتطابق قريب من الاجراء- TestError-
- TestError2-له مححدان لمتغيرين

Sub TestError2(intValue1 As Integer, intValue2 As Integer)
عبارة عند حدوث الخطا تحدد ان قسم التعامل مع الخلل للكود يجب تنفيذه عند حصول الخلل

On Error GoTo HandleError
On Error GoTo HandleError
تم التصريح بمتغير ليخزن نتيجة القسمة وبعدها فان القيم التي مررت كمحددات
للاجراء تستعمل للقسمة
وبسبب القيم التي مررت وسببت القسمة على صفر خطا
فان تنفيذ الكود يقفز الى قسم – HandleError-للكود

'declare variable to store result
Dim intResult As Integer
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2

الان قسم –HandleErro-يحوي استدعاء لاجراء- GeneralErrorHandler-
الذي اضفته لتوك
رقم العطل, وصف العطل , اسم النمطية.واسم الاجراء مررت كمحددات للاجراء- GeneralErrorHandler-

HandleError:
GeneralErrorHandler Err.Number, Err.Description, "modBusinessLogic",-
"TestError2"

الان دعنا نتجه الى الاجراء- GeneralErrorHandler- حيث سوف ينفذ بعد المتعامل مع الخطا
الاجراء- GeneralErrorHandler-يقبل رقم العطل ,وصف العطل , مصدر النمطية
ومصدر الاجراء كمحددات

, Public Sub GeneralErrorHandler(lngErrNumber As Long, strErrDesc As String
strModuleSource As String, strProcedureSource As String)


المتغيرتم التصريح به لتخزين رسالة الخطا
رسالة تاخطا عملت بالاعتماد على القيم المختلفة التي مرت الى الاجراء


Dim strMessage As String
'build the error message string from the parameters passed in
strMessage = "An error has occurred in the application."
strMessage = strMessage & vbCrLf & "Error Number: " & lngErrNumber
strMessage = strMessage & vbCrLf & "Error Description: " & strErrDesc
strMessage = strMessage & vbCrLf & "Module Source: " & strModuleSource
strMessage = strMessage & vbCrLf & "Procedure Source: " & strProcedureSource
وبعدها رسالة الخطا ستظهر للمستخدم
'the message to the user
MsgBox strMessage, vbCritical

المتعامل مع الخلل يمكن ان بستدعى اي اجراء تكتبه مغيرا فقط هولاء المتغيرات التي
تحدد النمطية الحالية والاجراء
الاعطال يمكن ربطها بجدول .تنسخ في ملف او بريد الكتروني
لكن- للاسف – هذه الخيارات خارج مجال هذا الكتاب

Summary
الملخص

في هذا الفصل غطيت مفهوم برمجة تطبيقات الفيجوال بيسك –المصاحبه للاكسس-
وتعلمت ان الكود يوضع في الوحدة النمطية العامة او للفئة
وايضا عبارات كودية مختلفه توضع في النمطيات للتحكم في سير التنفيذ ,تخزين القيم وهكذا
وتعلمت كيف تفحص وتنفذ كود الفيجوال الذي عملته , وتصطاد الاخطاء
هذه مهارات الكود للفيجوال بيسك سوف تكون الاساسبات لكل الفصول الباقية
والان وانت تملك الفهم الاساسي لكيف تكتب عبارات الكود في الفيجوال بيسك
دعنا نتحرك الى الفصل الثالث حيث ستستكشف عالم برمجة كائنات التوجه
اعتذر لوجود اخطاء قي الترجمة او الكود او التنسيق او استعمال اكثر من ترجمة للكلمة الواحدة
تم هذا الفصل بعون الله
والى الفصل الثالث ان شاء الله
مرفق الصور

omar19-3
10-09-2012, 02:05
بسم الله ما شاء الله ،،

أستاذى الفاضل أبو يوسف1..

مجهود كبير وعمل شاق وضخم، أسلوب رشيق ممتع، معلومات قيمة جداً جداً ..

لا أجد كلمات تسعفنى لأعبر عما أريد .. سوى جزاك الله خير الجزاء.. وجعله لك ذخراً، وبارك لك فى آلك.

أبو يوسف1
10-09-2012, 06:43
الاخ العزيز omar19-3
السلام عليكم ورحمة الله وبركاته
حياك الله اخي العزيز وبارك الله فيك
اشكر لك حماسك الكبير لكن يا اخي العزيز لا استحق هذه الكلمات الضخمة
لم افعل شيئا يا اخي العزيز فقط وضع كلمات بجانب كلمات وانت اخي العزيز بجميل فهمك حولتها الى شيئ مفيد
لك دوما خالص دعائي بالتوفيق ان شاء الله ولك كما دعوت واكثر

أبو يوسف1
10-09-2012, 08:50
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نبدا التجوال الاول في الفصل الثالث وعلى بركة الله وباسم الله نبدا


Using Objects
تطبيقات البرمجة
استعمال الكائنات
هذا الفصل يوضح المفاهيم الاساسية لبيئة برمجة الكائنات الموجهه مثل استعمال الكائنات في برامجك
سوف تتعلم ان شاء الله تعريف الخصائص ,الطرق-الاساليب-,والاحداث ومتى تستخدم كل واحدة منهم
وبسبب ان الكود يتغلف-كالكبسولة الى كائنات مع خصائصها- -,طرق
واحداث متوافرة للكائنات –المفهوم يسمى برمجة الكائن الموجه
وتستطيع بناء كائنات يمكن اعادة استعمالها والتي توفر بذلك الكثير من وقت التطوير
الكودنة-صناعة الكود-قد تم تسهيله بسبب ان النظام قد تم تنظيمه الى مجموعات صغيرة من الكائنات المتقاربة
بدلا من كائن واحد ضخم
الكود مالتك سوف يكون اسهل في المحافظه عليه بسبب سهولة فهمه
برمجة الكائنات الموجهه مفهوم صعب لاكثر الناس –الله يخليكي ما تخوفينا – ولكن هذا الفصل
سوف يوضح ان الامر ليس حقا بهذه الصعوبة –الله يخلف عليكي طمنتينا-
بعد تغطية الاساسيات لمفاهيم برمجة الكائنات الموجهه سوف تتعلم ايضا عن كثير من كائنات
اكسس وكيف تستعملها والفصل الرابع يغطي برمجة الكائنات الموجهه بتفصيل عام
ربما تريد ان تصنع قاعدة بيانات جديدة لاستعمالها في الامثلة في هذا الفصل
من اكسس اختر ملف ,جديد,فارغ,حدد الاسم للقاعدة - Ch3CodeExamples-ثم انقر اصنع

Elements of an Object
عناصر الكائن
الكائنات هي كل الاشياء التي تكون قاعدة بيانات اكسس مثل :النماذج,التقارير,الوحدات النمطية,
ماكرو,و الجداول
كل كائن له خصائصه التي تحدد سلوكه او مظهره وايضا كذلك الطرق التي تحدد
اي حدث يمكن اخذه بالاعتماد عليه
الكائنات تستجيب للاحداث التي تقدحها الافعال – actions-الماخوذه من
المستخدم او تسبب بها النظام
بعض الاشخاص يخلط بين المجموعات والكائن
المجموعات تتالف من كائنات عديدة لذلك الكائن يمكن ان يكون عضو في المجموعة
بعض الاحيان ترغب في معالجة كائن معين –مثال نموذج معين-
بينما في اوقات اخرى تريد معالجة مجموعة كائنات –كل النماذج في القاعدة-
والى لقاء قريب ان شاء الله

عارف حسان
10-09-2012, 09:02
الله عليك أيها الرائع
هذا الموضوع من أجمل وأفضل المواضيع التي قرأتها في أي منتدى على الإطلاق.
وأرجو ممن يقرأه ويجده مفيداً أن يقوم بتقييمه مثلي, وهذه خمس نجوم لهذا الموضوع, ولو كان هناك أكثر من خمس نجوم لقيّمته بأكثر.
ملاحظة:
أعجبتني "الكودنة" فمن أين أتيت بها أخي أبا يوسف؟!.

أبو يوسف1
10-09-2012, 09:29
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
اشكرك على تشريفك و بحضورك الرائع ودعمك الامحدود
اخي واستاذي العزيز ابا محمد كلماتك الرائعة تجعلني اصدق انني اعمل شيئا كبيرا انا فقط ادرس معكم هذا الكتاب واخشى على نفسي
ان لا استطيع الخروج من المملكة :):) لان راسي قد يتورم
بخصوص هذا المصطلح ارجو ان تسمح لى باستعماله للتخفيف علي من تكرار كتابة احرف اضافية -للاختصار فقط
احاول احيانا ان اشرح حسب فهمي للامر واستعمال كلمات ارتاح لها قد اوفق وقد اخطيئ
والاخوة الاعزاء ارجو منهم اخذ ما يرونه مناسبا وطرح الباقي
جزاك الله كل الخير وحياك الله اخي واستاذي العزيز
لك دوما خالص تحياتي وتقديري العميقين

أبو يوسف1
11-09-2012, 09:08
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله الجزء الثاني من الفصل الثالث وعلى بركة الله

دعنا نتحول الان الى الى بعض اهم المفاهيم في عالم برمجة الكائنات الموجهه :
الخصائص,الطرق.


? What Is a Property
ما هي الخصائص؟
الخصائص هي ما يميز الكائن وذلك بتحديد سلوكه او مظهره.
مثال الخصائص يتضمن الاسم ,العنوان- caption-, او حجم التحكم .
الشكل 3.1يظهر خصائص مختلفه للنموذج
صندوق الحوار هذا يمكن اظهاره بينما النموذج في وضع التصميم. واختر من القوائم اظهار ثم خصائص
او اختر : مفتاحي الت + ادخال- Alt+Enter-.
لاحظ ان بعض الخصائص الظاهرة في الشكل لها قيم اختيارية : اما نعم او لا
وبعضها حقول لادخال النص مثل خاصية العنوان
والاخرى لها خيارات مختلفة ولك الخيار من قائمة منسدلة - drop-down list-
بعد الضبط السابق لخاصية العنوان لهذا النموذج خصيصا وبعد التشغيل لاحظ
كيف ان العنوان للنموذج –الشكل 3.2-قد تم ضبطه للقيمه التي كانت في خصائص صندوق الحوار
وتستطيع اختيار كائنات اخرى على النموذج من القائمة المنسدلة للكائنات من شاشة الخصائص
مثل التحكم بمربع النص او العناوين لاحظ الشكل 3.3
وكما تم مشاهدته قبل قليل بواسطة اختيار كائن اخر من القائمة في صندوق حوار الخصائص
فانك تستطيع اظهار وتعديل خصائصه الشخصية .
كائنات مختلفة تتشارك بخصائص عديدة متشابه. مثال النماذج ,مربعات نص,وعناوين
جميعها لها خاصية – Caption- وايضا خاصية الاسم
شاشة الخصائص تستعمل لاظهار وتعديل الخصائص وايضا كذلك الاحداث
هذا المفهوم سوف يناقش في الفصل ان شاء الله
قيم الخصائص المضبوطة في صندوق الحوار للخصائص مثل خاصية الكابشن التي شوهدت سابقا تسمى
ضبط وقت التصميم
وهذا المصطلح بعني الضبط الذي عملته في وقت التصميم
قيم الضبط هذه ستكون قيم البداية للكائن -الضبط الاولي-
القيم الاوليه هذه يمكن تعديلها في وقت التشغيل كود الفيجوال بيسك
او في وقت اخر في عرض التصميم
مثال ذلك لتغيير خاصية الكابشن للنموذج السابق عند وقت التشغيل يجب استعمال هذا الامر الفيجولي التالي :

Forms.Item("frmTestProperties").Caption = "New caption goes here."
بالاضافة الى صندوق حوار الخصائص ,طريقة اخرى لرؤية الخصائص المتوفرة
للكائن تكون بطباعة الكود الفيجولي في محرر الفيجوال بيسك
الشكل 3.4 يظهر حينما تطبع اسم الكائن الموجود وتنقر مفتاح النقطة فان قائمة الخصائص المتوفرة
لذلك الكائن سوف تطل بكلها
هذه الميزة مساعدة جدا لانها تمنعك من وجوب حفظ الصيغة الدقيقة لكل خاصية –لاحظ اسلوب المحاماه
والالتفاف في التعبير الله يهديها – بدل القول: تريحك من حفظ الصيغة الدقيقة لكل خاصية
فقط الق نظرة على الخاصية عندما تكتب الكود
القيم في القائمة على الشكل 3.4 هي كل الخصائص كما يشار اليها بايقونه تظهر يدا تحمل بطاقة

ايضا يوجد بنود اخرى في القائمة المنسدلة كما سوف اناقش فيما بعد في هذا الفصل
من الان كن مدركا انه يمكن ان ترى قائمة للخصائص متوفرة للكائن صمن شاشة الكود
في محرر الفيجوال بيسك -. VBE-
بعض الكائنات ظاهرة –مثال النماذج ,صندوق النص .العناوين .والتقارير.
بعض الكائنات غير ظاهرة .المستخدم لن يرى شيئا عندما يتم استعمال هذه الكائنات
مثال ذلك للكائنات المخفيه : مجموعة السجلات- recordset- التي تخزن البيانات من قاعدة البيانات
على الرغم من اتك فيما بعد تظهر البيانات من مجموعة السجلات على النموذج
الكائن نفسه-مجموعة السجلات – غير ظاهرة الوجود
كلا الكائنات الظاهرة والشبح –غير الظاهرة لها خصائص
ما زال هناك طريقة اخرى لعرض الخصائص المتوفرة للكائن وهي باستعمال مستعرض الكائن
سيناقش فيما بعد في هذا الفصل ان شاء الله
والى لقاء اخر ان شاء الله

أبو يوسف1
12-09-2012, 09:17
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اتابع التجوال الثالث للفصل الثالث وعلى بركة الله

?What Is a Method
ما هي الطرق ؟
الطرق هي الاحداث او الوقائع التي تحدث للكائن .
وهي فعلا الاجراءات الفرعية او الدوال والتي يتم استدعاؤها لتنفيذ حدث محدد
انت لا ترى الكود خلف الاجراءات الفرعية او الدوال عند استعمال كائنات اكسس الموجودة لكنها هناك موجودة
مثال للطريقة التي استعملتها:

Debug.Print
المبرمجون الذين كتبواالاكسس-ولعلها تقصد نفسها–صنعوا
كائن تصحيح للسماح لك للتفاعل مع الشاشة الفورية كما عملت لفحص الكود صنيعك.
احيانا في الكود المصدري - source code-كائن التصحيح هو اجراء فرعي
او دالة تسمى طباعة والتي تستقبل الرسالة للطباعة كمحددات ومن ثم
لها كود لعرض الرسالة في الشاشة الفورية
ولان مايكروسوفت لم تعطك الكود المصدري للاكسس فانك لن ترى هذا الكود –تاكدت الان
انها احد المبرمجين للاكسس-ولكنه موجود
وهذا صحيح للكائن المصنوع من طرف اخر ثالث –الاجراء الفرعي او
الدالة هو خلف الطريقة
دعنا نلق النظر على مثال لكيف ترى الطرق المتاحة للكائن
في شاشة الكود في المحرر الفيجولي الشكل 3.5
تستطيع طباعة اسم الكائن بعده نقطة وتماما كما عملت سابقا
سترى قائمة منسدلة والتي تريك الطرق المتوفرة .
تذكر من القسم الذي سبق تستطيع ايضا استعمال هذه الميزة
لاظهار الخصائص المتاحة لهذا الكائن
في المثال السابق يمكن رؤية كائن مجموعة السجلات له خصائص مثل الاسم ,لا توافق
ولكن لها ايضا طرق متعددة مثل : تحرك للنهاية ,وتحرك للتالي .
وتستطيع الاخبار فيما اذا البند في القائمة هو خاصية ام طريقة
بالاعتماد على الايقونة الظاهرة الى اليسار .
وتستطيع القول ان الايقونة للطرق تبدو مثل طوبة في حركة
ويمكنك ان تصف الايقونة بشكل مغاير ولكن النقطة -الهدف-
هو ان هذه الايقونة تشير ان البند في القائمة هو طريقة.
تذكر اليد حاملة البطاقة هي ايقونة لشاشة الخصائص.
طريقة اخرىلرؤية الطرق والخصائص متاحة للكائن هو استعمال
مستعرض الكائن كما سوف تشاهد ان شاء الله فيما بعد في هذا الفصل.
والى لقاء اخر ان شاء الله

أبو يوسف1
13-09-2012, 08:51
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع ان شاء الله الجزء الرابع في الفصل الثالث وعلى بركة الله

What Is an Event
ما هو الحدث؟
الاحداث -الوقائع-يتم قدحها بواسطة الافعال الماخوذة من المستخدم والتطبيق
مثل تغيير البيانات ,حركات الماوس, او فتح النموذج
انت تستخدم الكود الفيجولي او الماكرو ليستجيب الى الاحداث- events-
وبكلمات اخرى انت تربط الكود الذي تكتبه مع مستخدم التطبيق مالتك-خاصتك- من خلال الاحداث .
على سبيل المثال حدد اجراء فيجولي او دالة ليعمل عند حدوث حدث معين .
هذا المفهوم تم ايضاحه باختصار في الفصل الثاني عندما صنعت اجراءات جديدة ودوال .
تذكر تذكر انك ربطت الحدث مع الاجراء حتى يعمل الاجراء .
دعنا ننظر الى بعض الامثلة الاضافبة حتى هذا المفهوم الهام يصبح واضح تماما –الله يكثر خيرك –
يوجد طريقة لعرض قائمة من الاحداث المتاحة للتحكم من صندوق حوار الخصائص الذي شاهدته سابقا
لاظهار صندوق حوار الخصائص وكما تذكر يمكن ان تختار من اظهار ثم خصائص
من عرض التصميم.مثل عرض التصميم للنموذج او للتقرير .
الاحداث لكائنات النموذج و التقرير مثل التحكم يمكن ان تجدها بواسطة اختيار
الكائن وثم عرض تبويب الحدث من صندوق حوار الخصائص.
الشكل 3.6 يظهر تبويب الحدث من صندوق حوار الخصائص للنموذج
لاحظ كم من انواع الاحداث المختلفة سردت.
هذه الاحداث تسمح لك لتحدد متى يجب تنقيذ الكود الفيجولي الذي كتبته.
انت عندك بالفعل ثلاثة خيارات لكيف لتشغل الحدث.
عندما تختار حدث معين من القائمة وتنقر الثلاث نقاط(...)سوف يظهر صندوق حوار
في كل الامثلة لحد الان انت قد استعملت منشيء الكود لان هذا الكتاب هو
عن كود تطبيقات الفيجوال بيسك وان اخترت منشيء التعبير فان –""=expression-
سوف تظهر قي صندوق الحوار للخصائص حيث ان التعبيرهو التعبير الذي تم ادخاله في
شاشة منشيء التعبير .واذا تم اختيار منشيء الماكرو فان القيمة ستكون اسم الماكرو .
وان تم اختيار منشيء الكود فان القيمة ستكون – "[Event Procedure]"-
مثل الخصائص فان كائنات مختلفة غالبا لها الكثير او الكل من نفس الاحداث المشتركة .
مثال افترض ان عندك نموذجا فيه مربع نص اسمه- txtName-<هذا يعني
ان خاصية الاسم – Name-اسند لها – txtName-> والذي ستستعمله لاظهار
رساله للمستخدم حينما بحصل حدث عند الضغط على الزر - On Key Press-
اولا اختر صندوق النص- txtName- على النموذج ومن تبويب الحدث
في صندوق حوار الخصائص لمربع النص .
لانك تريد صنع اجراء حدث , اختر خيار اجراء الحدث من القائمة الظاهرة
في الشكل 3.7 ومن الثلاث نقاط ,ان نقرت الثلاث نقاط بدون اختيار خيار
اجراء الحدث سوف يتم سؤالك لاختيار منشيء الكود من قائمة الثلاث خيارات .
عند النقر على الثلاث نقاط فان المحرر الفيجولي يفتح بادئا اجراء جديدا فارغا
لحدث ضغط الزر- KeyPress-
افترض ان الكود التالي قد اضيف الى حدث ضغط الزر لكائن صندوق النص – txtName-


Private Sub txtName_KeyPress(KeyAscii As Integer)
MsgBox "The KeyPress event just firedEnd Sub"

وعند تشغيل النموذج وشيء ما كتب في حقل – txtName- فان الرسالة في الشكل 3.8 ستظهر
لاحظ ان الحدث يطلق قبل ان ترى القيمة في مربع النص على النموذج .
امثلة اخرى للاحداث شائعة الاستخدام هي :-- On Click, On Double Click, and On Open-

لذلك انواع عديدة من الاحداث متوفرة لكائن معين والذي من المستحيل ان تغطيها كلها في هذا الفصل .
على اي حال امل ان تكون قد فهمت ان الحدث يسمح لك لشبك نماذجك وتقاريرك بالكود الفيجولي الذي
كتبته بالاعتماد على احداث معينة والتي تحدث في التطبيق
وفي اللقاء القادم ان شاء الله سوف يكون هناك مثالا لتوضيح الفرق بين الخصائص والطرق والاحداث
والى لقاء قريب ان شاء الله

أبو يوسف1
14-09-2012, 04:04
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل الثالث ان شاء الله وعلى بركة الله نبدا

Using Properties, Methods, and Events
استعمال الخصائص ,الطرق ,والاحداث- تطبيق عملي-
حان دورك لتدرب يديك في مثال مستعملا الخصائص والطرق والاحداث .
وانت تعمل حاول ان تتعقب اي بند هو خصائص واي هو طرق واي هو احداث.
وتستطيع فحص جوابك عندما اوضح المثال
ان لم تكن عاملا –لسه مش عامل معلش طيب رجاء:-
1-اعمل قاعدة بيانات جديدة لاستعمالها لعمل الامثلة لهذا الفصل
باسم-Ch3CodeExamples-
2- اضف نموذجا جديدا الى القاعدة في عرض التصميم .
3- على النموذج الجديد اضف مربع نص وزر امر كما في الشكل 3.9
ان لم يظهر صندوق الادوات –افكرك- لاظهاره من عرض روح صندوق العدة
4- اختر مربع نص, ثم من تبويب عرض ثم خصائص لاظهار صندوق حوار الخصائص
غير خاصية الاسم الى- txtDateOfBirth-
5- اختر الليبل ومن من صندوق حوار الخصائص وغير خاصية
الاسم الى – lblDateOfBirth- وغير خاصية الكابشن برضه لليبل الى:
Enter Date of Birth—
6- اختر زر الامر وغير ايضا الاسم الى- cmdCalculate- والكابشن
الى- Calculate-النموذج بجب ان يشابه الموجود في الشكل 3.10
7- انقر حفظ وحدد الاسم للنموذج ب- frmTestObjects-
8-اختر مربع النص- txtDateOfBirth-مرة اخرى واختر تبويب الحدث
من صندوق حوار الخصائص وعند حدث- On Exit-استقر
واختر منشيء الكود لفتح محرر الفيجوال لكتابة الكود للحدث
احدى الطرق لعمل ذلك هو اختيار اجراء الحدث من القائمة المنسدلة
ومن ثم الثلاث نقاط-...- واختر منشيء الكود من صندوق الحوار الذي يظهر
وفي اي حالة اضف الكود التالي لحدث الخروج – Exit-

Private Sub txtDateOfBirth_Exit(Cancel As Integer)
'if the user did not enter a date, then
'display an error and set the focus back
'to the date of birth text box control.
If Not IsDate(txtDateOfBirth.Text) Then
MsgBox "You must enter a date for the Date of Birth field."
txtDateOfBirth.SetFocus
Cancel = True
End If
End Sub

9-اختر زر الامر- cmdCalculate- وفي تبويب الحدث لصندوق حوار الخصائص
اختر حدث عند النقر- On Click- واضف الكود التالي لاجراء الحدث الوليد كما يظهر هنا :

Private Sub cmdCalculate_Click( )
'declare local variable for month of birth
Dim intMonthOfBirth As Integer
'convert the value in the text box to a
'month and assign the value to the month
'of birth variable
intMonthOfBirth = DatePart("M", CDate(txtDateOfBirth))
'display a message to the user regarding
'the month of birth
MsgBox "Month you were born: " & intMonthOfBirth
End Sub

10- اختر زر حفظ من شريط الادوات لحفظ كل التغييرات .
ارجع الى النموذج – frmTestObjects-واختر زر الحفظ
لحفظ كل التغييرات التي حدثت على النموذج
شغل النموذج بالنقر على زر العرض- View-على شريط الادوات
11- ادخل شيء ما في مربع النص غير التاريخ الشكل 3.11
12- الان اضغط زر الامر- Calculate-الرسالة يجب ان تشابه للتي في الشكل 3.12
13- بعد النقر موافق التركيز يرجع الى حقل مربع النص- Date of Birth-
اطبع تاريخ ميلادك كما في الشكل 3.13
14- انقر زر الامر- Calculate-بجب ان تحصل على الرسالة مشابهه للتي في الشكل 3.14
مرفق الصور والمثال تم اخذه من المؤلف
واعتذر عن اي خطا غير مقصود في الترجمة او النقل اوغيره
وساظل دائما تلميذا بارا ان شاء الله في هذه المملكة الرائعة باهلها الكرام
وهذه دراسة لى احببت ان اشارككم فيها فان توفقت فبحمد الله وان فشلت فلى شرف المحاولة
والله الموفق والهادي
والى لقاء قريب ان شاء الله

أبو يوسف1
15-09-2012, 06:15
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع ان شاء الله الجزء السادس من الفصل الثالث وعلى بركة الله نبدا

How It Works
كيف العمل –شرح المثال بالعرض البطيء –
اولا انت عملت قاعدة بيانات فيها نموذجا عليه مربع نص وايضا زر امر .
وقد حددت بواسطة صندوق الخصائص الخصائص المختلفة للكائنات.
وقد قمت-مشكورا- بعمل اجراين في المحرر الفيجولي بواسطة انزال لمنشيء الكود
من صندوق حوار الخصائص .
اجراء الحدث الاول كان قي حدث الخروج من مربع النص المسمى تاريخ الميلاد النصي .
اجراء حدث الخروج هذا يقبل المتغير – Cancel-كمحدد كقيمة اساسية

Private Sub txtDateOfBirth_Exit(Cancel As Integer)
الكود سوف يقيم القيمة المدخلة في مربع النص من المستخدم
وان كان النسق غير التاريخ فان الرسالة سوف تظهر للمستخدم في مربع النص
باستعمال دالة – msgbox-

'if the user did not enter a date, then
'display an error and set the focus back
'to the date of birth text box control
If Not IsDate(txtDateOfBirth.Text) Then
MsgBox "You must enter a date for the Date of Birth field."

التركيز بعد ذلك يرجع ضبطه الى مربع النص باستعمال طريقة – SetFocus-لمربع النص.

txtDateOfBirth.SetFocus

محدد الالغاء- Cancel- يرجع ضبطه الى صحيح لبيان ان عملية الحدث
يجب ان تتوقف بسبب وجود مشكلة .
ان نسيت ضبط المحدد- Cancel- الى صحيح فان احداث اخرى لا ترغب فيها
ان تنطلق سوف تعمل –تنطلق-لوجود خلل.

Cancel = True
الحدث التالي الذي اضفته كان حدث النقر- Click-لزر الامر المسمى امر الحساب
- cmdCalculate--
حدث النقر اولا يصرح متغير محلي ومن ثم يحول القيمة المدخلة في مربع النص
txtDateOfBirth –
-الى الشهر ويخزن في المتغير المحلي .

Private Sub cmdCalculate_Click( )
'declare local variable for month of birth
Dim intMonthOfBirth As Integer
'convert the value in the text box to a
'month and assign the value to the month
'of birth variable
intMonthOfBirth = DatePart("M", CDate(txtDateOfBirth))

بعد ذلك يتم وضع الكود لاظهار الرسالة للمستخدم .
في هذه الحالة فان الرسالة قد تم عملها بربط العبارة-"Month you were born: "-
مع القيمة في المتغير

'display a message to the user regarding
'the month of birth
MsgBox "Month you were born: " & intMonthOfBirth

وعندما شغلت النموذج ,بداية انت لم تدخل قيمة صحيحة للتاريخ
في مربع النص وبعدها نقرت زر الامر احسب.
اولا حدث الخروج من مربع النص تم .ثم القيمة المدخلة تم تقديرها .
ولان القيمة- المدخلة-لم تكن تاريخا فان رسالة الخلل قد ظهرت مشيرة الى ان التاريخ مطلوب .
والفارة تموضعت بواسطة الحدث ضبط التركيز- set focus- راجعا الى
مربع النص- txtDateOfBirth-
في المرة الثانية ادخلت التاريخ الصحيح - 3-10-74 وهذا باعتقادي تاريخ ميلاد المؤلف-
في حقل مربع النص ونقرت زر الامر احسب .هذه المرة حدث الخروج عمل لكن
لا يوجد مشكلة لذلك فان التطبيق يكمل ويتم عمل حدث النقر لزر الامر احسب
اجراء الحدث انقر يحصل الشهر من قيمة التاريخ المدخل ويظهر الشهر لك
صندوق الرسالة.
حان الوقت لكويز هل ما زلت متابعا لكل الخصائص والطرق والاحداث التي استعملت
في المثال ؟
ان كان كذلك قارن القائمة التي عملتها مع القائمة -مرفق الصورة -
حسنا لم يكن ذلك صعبا جدا اليس كذلك ؟
والى لقاء اخر ان شاء الله

أبو يوسف1
16-09-2012, 07:11
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله الجزء السابع من الفصل الثالث- الذي شارف على الانتهاء- وعلى خير ان شاء الله نبدا ياسم الله

Viewing Objects Using the Object Browser
اظهار الكائنات باستخدام مستعرض الكائنات
الان وقد فهمت بحمد الله ما هي الكائنات وما هي خصائصها ,والطرق,والاحداث
دعنا نلق نظرة على طريقة اخرى لعرض الكائنات .
مستعرض الكائنات هو اداة تسمح لك ان تعرض وتدير الكائنات في التطبيق.
ويمكن ان تستعمل مستعرض الكائنات لتتعلم عن الكائنات الموجودة في الاكسس
وايضا كذلك الكائنات الموجودة في اي برنامج ويندوز 2003.
مستعرض الكائنات يمكن فتحه من محرر الفيجوال بيسك باحدى الثلاث طرق:
باختيار زر مستعرض الكائنات من شريط الادوات
باختيارعرض ثم مستعرض الكائنات او بالضغط على مفتاح-- F2
اي من الثلاث سوف ينتج شاشه مشابهه كما في الشكل 3.15
لاحظ كيف ظهرت القائمة المنسدلة للمكتبات كافة .
القيم الظاهرة في قائمة الفئات هي لفئات كل المكتبات.
وتستطيع اختيار مكتبة معينة مثل اكسس للحد من قائمة الفئات
والاعضاء المقابلة للفئات الظاهرة في الشكل 3.16
لاحظ كيف تستطيع ان تنزل للاسفل الى الفئات وتظهر الخصائص
والطرق والاحداث المتوفرة للفئة التي اخترتها .
في المثال السابق فئة النموذج للاكسس قد تم اختيارها وتستطيع رؤية
حدث – MouseUp- وحدث- MouseWheel- كما هي ظاهرة في الايقونة البرق الصفراء .
خصائص مختلفة مثل –عجلة الماوس,وطرق مختلفة مثل الحركة – Move-
لاحظ في هذا المثال كيف ان حدث- MouseUp-قد تم اختياره وتستطيع
ان ترى الصيغة للحدث في الجزء السفلي للشاشة .وتستطيع رؤية لماذا
مستعرض الكائن اداة مفيدة جدا لاظهار وللعمل مع الكائنات .
واذا غيرت قائمة المكتبة الى المشروع الحالي يمكن رؤية نموذج – frmTestObjects-
لاحظ الشكل 3.17
انقر مرتين على اسم فئة النموذج- frmTestObjects-لعرض شاشة الكود مظهرة
الاجراءات الفرعية والدوال لنمطية الفئة .
في هذا المثال تستطيع رؤية الاجراءات للاحداث المعمولة سابقا في هذا الفصل لنموذج frmTestObjects--


Ways to Refer to Objects
طرق الاشارة للكائنات
يجب ان تعرف الطرق المختلفة للاشارة الى الكائن .هنا بعض الامثلة

Forms.frmTestObjects
Forms!frmTestObjects
Forms("frmTestObjects")
Forms(0)

استعمال النقطة (.) -(Forms.frmTestObjects)-هو المرجع الشخصي
لاغلب الحالات بسبب لانه يمكنك ان ترى قائمة الخصائص, الطرق ,الاحداث
,والثوابت المتاحة عندما تطبع .وانت رايت ذلك مستعملا مع الكائنات سابقا في هذا الفصل .

وتستطيع الاشارة ايضا الى الكائنات باستعمال كلمة- Me- كاختصار.
Me-تعود الى الكائن الحالي . لذلك ان تستعمل – Me- في نمطية النموذج فانها تعود –ترجع او تشير- الى النموذج . وهنا مثال :

Me.txtDateOfBirth
ما يكافيء لكن بشكل اطول لنفس العبارة

Forms.frmTestObjects.txtDateOfBirth
فقط استعمل كلمة- Me- عندما تريد الاشارة الى الكائن الحالي وليس
الى كائن مختلف تماما


Using Access Collections and Objects
استعمال مجموعات وكائنات الاكسس
سابقا في هذا الفصل استعرضت باختصار الفرق بين الكائنات والمجموعات
ملخص:المجموعات يمكن ان تحوي عدة كائنات .مثال يمكن استعمال مجموعة نماذج للتكرار-الدوران-خلال كل النماذج في المشروع, بينما سوف تشير الى كائن نموذج مفرد عندما تريد التعامل مع
مع هذا النموذج بالتحديد فقط .
وفي القاء القادم الامثلة ان شاء الله
والى لقاء قادم ان شاء الله مرفق الصور

أبو يوسف1
17-09-2012, 06:51
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثامن من القصل الثالث وعلى بركة الله نبدا


The Forms Collection and Form Object
مجموعة-مجاميع – النماذج وكائن النموذج
مجموعة النماذج لكائن التطبيق يحتوي كل النماذج في التطبيق .
كائن النموذج يعود الى نموذج محدد في النماذج .دعنا ننظر الى مثال


Using the Forms Collection and Form Object
استعمال مجموعة النماذج وكائن النموذج –مثال تطبيق عملي-
يمكن استعمال مجموعة النماذج وكائن النموذج للحصول على قائمة لكل
النماذج المفتوحة في التطبيق .
1- اعمل نموذج جديد لقاعدة بياناتك السابقة .اضف على النموذج الجديد من صندوق العدة-الادوات-
مربع قائمة- list box- وزر امر .
2-غير خاصية الاسم لمربع القائمة الى- lstForms-.
3-اختر الليبل لمربع القائمة .اضبط خاصية الاسم لمربع القائمة الى- lblForms-
وخاصية الكابشن الى - All forms in project-.
واضبط خاصية – RowSourceType-= نوع مصدر الصف-=الى-ValueList-
4-اختر زر الامر واضبط خاصية الاسم الى- cmdGetForms- وخاصية الكابشن الى- Get List of Forms-
5- حتى الان يجب ان يكون النموذج مشابه لما في الشكل 3.18
6- تاكد من حفظ النموذج بواسطة زر الحفظ و باسم- frmTestForms-
7-اختر زر الامر- cmdGetForms- واظهر صندوق حوار الخصائص
من عرض ثم خصائص ان لم يكن ظاهرا.
اختر تبويب الاحداث- Events-من الخصائص واختر خيار منشيء الكود
لاضافة حدث عند النقر .اضف الكود التاالي في اجراء حدث النقر :

Private Sub cmdGetForms_Click()
Dim frmForms As Form
'loop through forms collection and
'add name of each open form to list box
For Each frmForms In Forms
Me.lstForms.AddItem (frmForms.Name)
Next frmForms
End Sub

8- احفظ الكود في محرر الفيجوال وارجع الى عرض التصميم للنموذج .
9-شغل الاجراء باختيار عرض من شريط الادوات .انقر زر الامر- Get List of Forms-
يجب ان ترى الاسماء لكل النماذج المفتوحة ظاهرة في مربع القائمة كما في الشكل 3.19.

How It Works
كيف يعمل –شرح بالعرض البطيء-
اولا قد صنعت نموذجا جديدا ووضعت عليه–مشكورا-مربع قائمة وزر امر .
ثم ضبطت خصائص عديدة لمربع القائمة وزر الامر باستعمال صندوق الخصائص.
وبعدها صنعت اجراء حدث للتشغيل كلما نقر المستخدم زر الامر- cmdGetForms-
اجراء الحدث دار –من دوران للبحث - خلال مجموعة النماذج للحصول على قائمة
بكل النماذج المفتوحة في التطبيق.واضافة الاسم لاي نموذج مفتوح الى مربع القائمة.

Private Sub cmdGetForms_Click()
Dim frmForms As Form
'loop through forms collection and
'add name of each open form to list box
For Each frmForms In Forms
Me.lstForms.AddItem (frmForms.Name)
Next frmForms
End Sub

نماذج اخرى موجودة في القاعدة غير الواحد الذي ظهر .هل هذا خطا؟ لا ليس كذلك .السبب
لرؤيتك اسما واحدا لنموذجا في مربع القائمة فقط هو لانه النموذج الوحيد المفتوح .
يمكنك استعمال مجموعات اخرى وكائنات, حينما تكون او لا تكون مفتوحة.
سوف ترى في المثال فيما بعد


The Reports Collection and Report Object
مجموعة التقارير وكائن التقرير
مجموعة التقارير تحتوي على كل التقارير المفتوحة في التطبيق,وكائن التقريريشير الى تقرير محدد .
انظر الى مثال اخر .النمطية- modBusinessLogic-يمكن اضافتها الى للقاعدة لتخزين
الاجراءات الفرعية في الامثلة المتبقية.
افترض وجود الاجراء - TestReports – في النمطية-- modBusinessLogic في القاعدة .

Sub TestReports()
Dim rptReport As Report
'loop through each open report in the reports collection
'and display the name in the Immediate window
For Each rptReport In Reports
Debug.Print rptReport.Name
Next rptReport
End Sub

End Sub
لاحظ انه اولا كيف تم التصريح بالمتغير المحلي- rptReport-ككائن تقرير
وبعدها البرنامج يدور- باحثا- خلال كل كائن تقرير في مجموعة التقارير لطبع اسم التقرير
في الشاشة الفورية .اذا كان اي تقرير مفتوح حاليا في القاعدة سترى اسمه في الشاشة الفورية.
= بعد تشغيل الكود السابق = اذا طبعت – TestReports-
ونقرت ادخال.غير ذلك ستحصل على رد فعل خالي-فارغ- للاشارة ان لا يوجد تقرير مفتوح حاليا.
مرفق الصور ومثال القاعدة لكامل الفصل من المؤلف
والى لقاء اخير لهذا الفصل ان شاء الله

أبو يوسف1
18-09-2012, 07:51
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
ننهي في هذا الجزء ان شاء الله الفصل الثالث من التجوال -وبالمناسبة المؤلف ان لم يكن لديها عمل في التاليف او في مراجعة قضية او نزاع او غيره من شؤون المحاماه تقوم مع زوجها بالتجوال حول العالم وتحب كما اذكر روسيا وربما روما وايطاليا كما ذكرت الاماكن هذه في امثلتها -وجاء اسم التجوال مصادفة لما تهوى المؤلف ونبدا مشوار الليلة على بركة الله وباسم الله :

The CurrentProject Object
كائن المشروع الحالي
المشروع الحالي هو لكائن التطلبق يرجع اشارة الى المشروع الحالي .
المشروع الحالي له عدة خصائص مثل : الاسم الكامل – FullName- ونوع المشروع- ProjectType- كما يظهر هنا :

Debug.Print Application.CurrentProject.FullName
Debug.Print Application.CurrentProject.ProjectType

السطران من الكود سوف تطبع خاصتي الاسم الكامل ونوع المشروع
للمشروع الحالي في الشاشة الفورية .
المشروع الحالي فيه ايضا مجموعات عديدة : كل النماذج- AllForms-
كل التقارير- AllReports,-.كل الماكروز- AllMacros-وغيرها .
وعندما تريد الخصول على قائمة لكل النماذج في المشروع بغض النظر عن
ان كانت النماذج مفتوحة تستطيع استعمال مجموعة كل النماذج - AllForms collection-
وهنا المثال:

Sub TestAllForms()
Dim objAccObj As AccessObject
Dim objTest As Object
'set the object equal to the Current Project
Set objTest = Application.CurrentProject
'loop through each form in the AllForms collection
'and print information about each Form to the
'Immediate Window.
For Each objAccObj In objTest.AllForms
Debug.Print objAccObj.Name
Next objAccObj
End Sub

الكود السابق يصرح حالة جديدة للمشروع الحالي اسمه- objTest-
وبعدها يكتب الاسم لكل كائن نموذج في مجموعة كل النماذج
لكائن - objTest- في الشاشة الفورية.


The DoCmd Object

هذا الكائن – DoCmd-وهو الامر اعمل كذا...-ولعله اختصار ل do command
هذا الامر يستعمل لتنفيذ اي امر ماكرو او خيار القائمة – menu- من الكود الفيجولي.
ولقد رايت هذا الامر سابقا في امثلة الفصول السابقة والتي تفتح النماذج مثل التالي:

DoCmd.OpenForm "frmTestObjects"
.وهذا الامر ايضا يستعمل لفتح تقارير ,ذهاب الى سجل مفرد او يطيع
اوامر اخرى عديدة والتي تصدرها من خيار القائمة او الماكرو.

The Screen Object
كائن الشاشة
يستعمل هذا الكائن للاشارة الى النموذج ,قاعدة البيانات ,تقرير,تحكم ,او صفحة بيانات اكسس
والتي عليها حاليا التركيز .مثال للاشارة الى التحكم الفاعل يجب ان ان تستعمل الاتي :


Screen.ActiveControl.Name ?
دعنا ننظر الى مثال اخر:


Using the Screen Object
استعمال كائن الشاشة –تطبيق عملي-
في هذا المثال استعمل كائن الشاشة للحصول على الاسم للنموذج الحالي الفعال
1- افتح النموذج – frmTestForms- والذي تم صنعه سابقا وانتقل الى محرر الفيجوال بيسك
وفي الشاشة الفورية اطبع الاتي :

Screen.ActiveForm.Name ?
2- الاسم للنموذج الفعال الحالي سوف يظهر في الشاشة الفورية لاحظ الشكل 3.20.
How It Works
كيف يعمل
في المثال الحالي انت استعملت الشاشة الفورية لايجاد الاسم للنموذج الفعال على الشاشة باستعمال الامر? Screen.ActiveForm.Name




The Printers Collection and Printer Object
مجموعة الطابعات وكائن الطابعة
مجموعة اخرى مفيدة في كائن التطبيق هو مجموعة الطابعات .
مجموعة الطابعات هو تجميع لكائنات الطابعات وتتضمن كل الطابعات المتوفرة للتطبيق
وتستطيع عمل مثال لمعرفة كيف يعمل هذا .


Using the Printers Collection and Printer Object
استعمال مجموعة الطابعات وكائن الطابعة – مثال تطبيق عملي-
في هذا المثال ستستعمل مجموعة الطابعات وكائن الطابعة لاظهارلاسم كل الة طابعة في شاشة
كشف وتصحيح الاخطاء- Debug window-
1- اضف الاجراء التالي الى النمطية- modBusinessLogic- وان لم تكن قد صنعتها
للان رجاء اعملها –مستنينك بس مش كتير اخر اوتوبيس للثالث حيتحرك قوام - اعملها يا اخي وخلصنا بواسطة اضافة نمطية جديدة .واضف الكود التالي الى النمطية:

Sub TestPrinter()
Dim prtAvailPrinters as Printer
For Each prtAvailPrinters In Application.Printers
With prtAvailPrinters
Debug.Print "Printer name: " & .DeviceName & "Printer driver : "& -
.DriverName.
End With
Next prtAvailPrinters
End Sub

2-شغل الاجراء – TestPrinter- من الشاشة الفورية وسوف ترى قائمة
للطابعات المتوفرة على جهاز الكمبيوتر قريب من الشكل 3.21


How It Works
كيف يعمل –العرض البطيء-
في هذا المثال لقد صنعت اجراء جديدا لاخراج قائمة لكل الطابعات على جهازك الكمبيوتر .
وبدات بصنع اجراء فرعي – TestPrinter-في النمطية- modBusinessLogic-

Sub TestPrinter()
وبعدها- تفضلت مشكورا-بتصريح متغير محلي لكائن الطابعة.

Dim prtAvailPrinters as Printer
وبعدها استعملت حلقة الدوران- For Each- لتكرار البحث عن كل كائنات الطابعات
في مجموعة الطابعات وطبع اسم الالة واسم المشغل او التعريف - driver-لكل
كائن طابعة في الشاشة الفورية.

For Each prtAvailPrinters In Application.Printers
With prtAvailPrinters
Debug.Print "Printer name: " & .DeviceName & "Printer driver : "& -
.DriverName.
End With
Next prtAvailPrinters
End Sub

النتيجة لكل الطابعات على جهازك الكمبيوتر سوف تظهر في الشاشة الفورية .
عندما تنفذ الاجراء من الشاشة الفورية.ربما ياخذ ثوان قليلة لاكمال ظهور لقائمة الطابعات .

Other Objects
كائنات اخرى
عند هذه النقطة يجب ان تكون عندك الفكره لطرق مختلفة لاستعمال الكائنات في
تطبيقاتك في الاكسس وذلك لتنفيذ مهام مختلفة .
كائنات التطبيق الاكثر استعمالا ا في بداياتك لتطبيقات الفيجوال بيسك تم توضيحها.
على اي كائنات التطبيق الاخرى في الاكسس لم توصف في هذا الفصل .
قم بمراجعة وثائق المساعد من محرر الفيجوال بيسك للحصول على معلومات اكثر.
مرفق الصور
والى القصل الرابع قريبا ان شاء الله




.

omar19-3
18-09-2012, 10:21
أستاذى الفاضل أبو يوسف1..

رحم الله والديك فى الدنيا والأخرة ..

جزاك الله كل خير .. وزادك علماً وصبراً وحلما..

أبو يوسف1
19-09-2012, 06:18
اخي العزيز omar19-3
السلام عليكم ورحمة الله وبركاته

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

وزادك علماً وصبراً وحلما
يا رب
حياك الله اخي العزيز وجزاك الله خيرا

أبو يوسف1
19-09-2012, 07:22
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نبدا ان شاء الله التجوال الاول للفصل الرابع و على بركة الله
هذه مقدمة وسريعة تمهيدا لما بعده ان شاء الله

Creating Your Own Objects
اصنع كائناتك
الان وقد فهمت –بحمد الله –المفهوم الاساسي لبرمجة الكائنات الموجهه
تستطيع ان توجه انتباهك الى موضوع تصنيع كائناتك .
هذا الفصل سيزودك بملخص موجز لما قد تعلمته حتى الان .ومن ثم سوف يعلمك
لماذا وكيف تصنع نمطيات لفئات مخصصة –تفصيل على كيفك-مع خصائصها المصاحبة
والطرق والاحداث . وسيغطي ايضا –الفصل-كيف تمدد- extend-الكائنات الموجودة
مثل النماذج او التحكم بوساطة اضافة خصائص مفصلة-مخصصة
من قبلك-وايضا طرق واحداث .
من قبلك-وايضا طرق واحداث .

Using Class Modules to Create Your Own Objects
استعمال نمطيات الفئات لصنع كائناتك
كما تعلمت الكائن يشير الى كل الاشياء التي تشكل قاعدة البيانات متضمنة
النماذج, التقارير, التحكمات .ويواسطة كبسلة –من كبسولة-الكود الى كائنات
تعمل البرامج اسهل للحفاظ عليها واسهل لاعادة استعمالها .
وتعلمت ايضا ان الكائنات لها خصائص وطرق واحداث .
الخصائص هي الصفات للكائن .
الطرق هي الافعال التي تحدث للكائن .
الاحداث هي التي يتم قدحها عندما المستخدم او التطبيق يقوم بافعال .
هذه الكائنات التي عملت عليها في الفصل الثالث صنعت باستعمال نمطيات للفئة على الرغم
من انك لم ترى خصائص الكود المصدري لكائنات الاكسس .
وربما تذكر من الفصل الثاني ان نمطية فئة هي احدى نوعي النمطيات .
النوع الاخر هو النمطية العادية- او القياسية او العامة اختر ما يحلو لك مشكورا-
النمطية القياسية –على اعتبار وقع الخيار على هذا الاسم-تحوي الاجراءات والتي لا تتعلق
او تصاحب مع اي كائن محدد.
الاجراءات التي كتبتها في النمطية- modBusinessLogic-الفصل الثاني – عتبك على اللي
ذاكر-وضعت في نمطيات قياسية .
نمطيات الفئة هي نمطيات تصاحب كائن محدد-مفرد ان شئت -.
نمطيات الفئة تستعمل اما لنموذج او تقرير او لكائن مفصل- من تفصيل او معمول باليد-
مثال نمطيات الفئة للنماذج او التقارير تحتوي على كود والذي يخص- او يقابل-لنموذج
مفرد او فردي اوتقرير مفرد .مثل اجراءات حدث للنماذج او عناصر تحكم والتي كتبتها
في نمطية الفئة التي تخص النموذج في الفصل السابق.
ومنذ اكسس97 نمطيات الفئة يمكن صنعها مستقلة عن النموذج او تقرير.
في مثل هذه الحالات تستعمل لصنع تعريف للكائن المفصل .
هذا الفصل سوف يركز على استعمال نمطيات الفئة لصنع االكائنات المفصلة وايضا تمديد
نمطية الفئة للكائنات الموجودة مع الخصائص المفصلة,الطرق والاحداث .
تستطيع اضافة –تضمين-نمطية فئة جديدة بثلاث طرق:
الاولى فتح شاشة قاعدة البيانات واختيار اضافة ثم نمطية فئة --Insert ➪Class Module.
الثانية من محرر الكود الفيجولي باختيار اضافة ثم نمطية فئة- Insert ➪Class Module-
الطريقة الاخيرة نقر الزر الايمن على مستكشف المشروع من خلال محرر الكود الفيجولي واختيار
-Insert ➪Class Module- من القائمة المنبثقة -يعني كل الطرق تؤدي الى المملكة .
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
21-09-2012, 10:42
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء الثاني في الفصل الرابع وعلى بركة الله وباسم الله نبدا:

تقدم للامام واصنع قاعدة بيانات لاستعمالها للامثلة لهذا الفصل وباسم- Ch4CodeExamples- الان خلاص عندك قاعدة بيانات فارغة.دعنا مؤقتا نحرف انتباهك لتعلم كيف الكائنات المفصلة يجب ان توثق باستعمال مخططات الفئة خلال مرحلة التصميم.وساعطيك بعدها التفاصيل عن كيف تصنع كائنات مفصلة.

Class Diagrams
مخططات الفئة
قبل القفز الى تقنية كودنة الكائنات المفصلة ,يجب ان تفهم كيف تدخل-تناسب- الكائنات المفصلة دورة حياة تطور الانظمة وكيف تعرف وتوثق للكائن الذي يجب صنعه.
ترجع المؤلف لنقاط لم اشرحها في الفصل الاول - ولا مجال للتقدم للخلف–ولان المادة المذكورة لم انوي شرحها اصلا . وللاسف لا وقت للخلف علما ان المؤلف تكرر بعجالة اهم النقاط .وحسب خطتها للكتاب لا يرتبط فصل باخر.
ولعل الوقت يسمح و صفاء الذهن والتوفيق من الله دائما الرجوع للفيجوال بيسك مرة ثانية وتبسيطه لادنى مستوى- وغير مقيد بمؤلف معين- ممكن ان شاء الله.بالعزيمة والاصرار وتوفيق الله لن يصعب شيء باذن الله وقد اهدت المؤلف كتابها الاخر Beginning Access 2007 VBA لابنتها قائلة انها صغيرة جدا لتفهم هذا الان ولكن تامل ان تعلمها ان بالتصميم والارادة يمكن تحقيق اي شيء والسقف الحقيقي هو السماء –اي لا حد لها وطبعا بعد ارادة الخالق وتوفيقه. والكتاب مرفوع في المملكة.
تعلمت من الفصل الاول –الصحيح لم ادرس ولم اتعلم –خلال مرحلة التصميم للتطبيق فانك تولد مواصفات مكتوبة لكيف تكودن- من كود- التطبيق .مخططات النشاطات ,استعمال مخططات الحالات و شاشات النماذج الاولية هي امثلة على
تقنيات لاستعمالها لتوثيق تصاميمك.مخططات الفئة هي تقنيات توثيق اخرى .وانت حاليا مدرك تماما –ما شاء الله عليك-ان الكائن له خصائص ,طرق,واحداث .وفي تطبيقاتك يجب بالتاكيد الاستفادة من الكائنات الموجودة بالاكسس ما امكن .
لذلك لا داعي لاعادة كتابة الكود الذي مبرمجي مايكروسوفت كتبوه لك .على اي حال حسب المناسب يجب ان تستغل الكائنات المفصلة لتعظيم-الى اقصى حد- المواصفات-المميزات الفريدة لتطبيقك .خلال مرحلة التصميم بجب ان تعرف الكائن المفصل لتطبيقك وتوثق الكائن المفصل باستعمال مخططات الفئة.
مخططات الفئة هي امر حرج –او دقيق - في تصميم انظمة الكائنات الموجهه .
المخططات تظهر الفئات ,العلاقات بين الفئات ,وطريقة وجوب بناء الكود .
في المخططات-مخططات الفئة- الخصائص والطرق والتي تعمل –تشكل –الكائن يتم تصورها بالرسم .
مثال في حالة تطبيق مبيعات - Wrox Auto-موصوف في الفصل الاول –ظلك ذكرينا بسيء الذكر
الفصل الاول-انت تعاملت بالسيارات .الشكل 4.1 يظهر مثال لشاشة تصوير بالرسم لادارة السيارات
كما نوقشت في الفصل -الاول-.
الكائن الذي ترغب في صنعة هو كائن السيارة-قررت بدون مشاورة ,حكم العالم على المتعلم-.
يجب ان تستعمل فئة السيارة لتمثيل كائن السيارة .
واجهة المستخدم هي غالبا ما تكون نقطة بداية جيدة لتحديد الخصائص والطرق للكائن .
كائن السيارة له خصائص معينة .: الصنع, الموديل ,السنة,..وهكذا كحقول ظاهرة على واجهة المستخدم .
بالاضافة لهذه الخصائص ,فان كائن السيارة يحتاج طرقا للسماح للطلب سجل معين –سحبها واظهارها – او للاضافة , او تحديث لهذا السجل المحدد .
هذه الطرق تتلازم –توازي- ازرار الربط,اضافة جديد ,تخزين,وحذف- Lookup, Add New, Save,
and Delete- في واجهة المستخدم.
الشكل 4.2 يظهر مثال لمخطط الفئة لكائن السيارة.
لاحظ ان الخصائص لفئة السيارة تم ذكرها اولا . اتبعت بخط فاصل ومن ثم بالطرق المحتواه.
مخطط الفئة في الشكل 4.2 يحتوي على الخصائص المصاحبة –الملازمة- والطرق للتي لها
يجب ان تكتب الكود.
عندما تصنع نظاما جديدا ,اصنع مخططا للفئة والذي يصور-يرسم-كل الكائنات لكامل النظام.
هذه ليست مهمة سهلة وتتطلب جهدا ووقتا للتعلم .ومن اجل البساطة ,سوف اركز على
كتابة خصائص ,طرق ,واحداث مفصلة لكائن السيارة في تطبيق مبيعات - Wrox Auto-.
الحل الكامل يحتوي على نمطيات فئة اخرى ايضا مثل احدها لكائن العميل او لكائن بحث
المخزون.دراسات شاملة لحالات في الفصول 12 و13 سوف تشمل كامل المخططات الفئة الخاصة للنظام .
وهي مصادر ممتازة لصقل فهمك لتوثيق وصنع الكائنات المفصلة.
في الفصل الاول- سيء الذكر –ذكرت ان الكود يمكن ان يفصل الى 3 طبقات منطقية مختلفة .وعلى الرغم
من ان- السيد- اكسس لا تستعمل لتطبيقات 3 طبقات الفيزيائية . في اغلب الحالات فصل الكود الى طبقات منطقية
مختلفة يكون من الافكار الجيدة .
هذا يسهل التحديث جزء مفرد من النظام وترحله الى برنامج اخر .
رجوعا الى مثال فئة السيارة ,ساماشيك –سامشي معك مصاحبا او قائدا ولعلها الاخرى-خلال اضافة مخططات
للفئات اضافية عن فصل لمفهوم الطبقات .
في الواقع يمكن ان تعمل مخططات للفئة في اي ترتيب تريده .لكن تفضيلي الشخصي هو البدء اولا
بطبقة المنطق.
طبقة المنطق في المكان الذي تضع فيه فئاتك الرئيسة مثل السيارة وكل شيء يدور حولها .
مخطط الفئة في الشكل 4.2 يتناسب مع طبقة المنطق .
الان وقد صنعت طيقة المنطق للتطبيق فان الطبقتان الباقيتان هما حقا من السهل عملهما
اي استدعاء لقاعدة البيانات سوف يتم شمله في الفئة في طبقة الوصول للبيانات.
لكل طبقة المنطق نمطية فئة والتي لها طريق تتطلب بيانات من قاعدة البيانات .
انت صنعت نمطية فئة تتوافق- تتماثل- في طبقة الوصول للبيانات .
لذلك فان طبقة المنطق (فئة السيارة) لن تعمل اي استدعاءات مباشرة لقاعدة البيانات
للحصول على بيانات. وبدلا من ذلك فان فئة السيارة تستدعي طريقة في فئة- CarDb-
في طبقة الوصول للبيانات والتي تباعا تحصل البيانات من قاعدة البيانات كما ترى في الشكل 4.3
وبعد صنع مخططات طبقة المنطق وطبقة الوصول للبيانات ,اصنع مخططات العرض لطبقة (واجهة المستخدم).
من المحتمل ان يكون هذا الاسهل في الثلاث للصنع ,بسبب لانك ببساطة تضع كل حالة استعمال على المخطط.
تذكر حالات الاستعمال التي –لم-صنعتها في الفصل الاول والتي تعرف كل
فعل فردي يمكن ان يتخذه المستخدم في تطبيق مبيعات - Wrox Auto- من
واجهة المستخدم كما يوضح الشكل 4.3 ,وتستطيع فقط سرد لحالات الاستعمال
نمطية الفئة لطبقة العرض بسبب ان حالات الاستعمال تعرف خدمات واجهة الاستخدام ليتم اجراءها .
لاحظ كيف كل طبقة ترتبط بطريقة مناسبة للاخرى في حالات الاتصال مع بعضها .
مثال فعل فتح السيارة في طبقة العرض تستدعي طريقة الاسترجاع- Retrieve- فئة السيارة
وهي بالتالي تستدعي طريقة – RetrieveCarDb-في فئة – CarDb-.الكود الذي ينجز طبقة العرض غالبا يكون في نمطية الفئة مصاحب للنموذج او التقرير المتعلق به.
الكود الذي ينجز طبقتي المنطق والوصول للبيانات يكون في نمطيات الفئات المفصلة.
على الرغم ان تغييرات اخرى ممكنة ومقبولة- اي لكل قاعدة شواذ-.
امل –خلي املك بالله –انك بدات ترى كيفة فصل منطق التطبيق الى طبقات.
عند هذه النقطة ,لا تقلق لفهم التفاصيل المعقدة-الله لا يجيب تعقيد ان شاء الله –في تصميم نماذج الفئات لكامل التطبيق .يجب ان تفهم فقط ان مخططات الفئات يمكن ان تستعمل لنمذجة الكائنات المفصلة والتي ترغب في صنعها .
اعود الان لمناقشة تصنيع الكائنات المفصلة وبيان كيف تكتب الكود لانجاز الخصائص
والطرق التي ذكرت في كائن السيارة في الشكل 4.2و4.3 . –وذلك في الجزء القادم ان شاء الله
مرفق الصور
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
22-09-2012, 07:38
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء الثالث من الفصل الرابع وعلى بركة الله وباسم الله نبدا:

Creating Properties
تصنيع الخصائص
للتلخيص الخصائص هي الصفات للكائن .والخصائص للفئة المفصلة –الذي تعملها بنفسك-
يمكن ان تنجز باستعمال المتغيرات العامة او استعمال اجراءات -- Property Let ,
- Property Get- Property Set -.
كلاهما –المتغيرات العامة والاجراءات ستناقش تاليا:

Using Public Variables
استعمال المتغيرات العامة
احدى الطرق لصنع الخصائص للفئة هو استعمال تصريح المتغير العام في نمطية الفئة.
في الفصل الثالث تعلمت كيف تكتب تصريح متغير عام .
وعندما تضع تصريح متغير عام في قسم التصريحات لنمطية الفئة
فانه يصبح خاصية للفئة.هنا المثال :

Public VehicleIdNumber As Double
انا لا اوصي –بعد طول عمر-صنع خصائص باستعمال المتغيرات العامة
لاسباب كثيرة: اولا انت لا تستطيع التحكم-تغيير –بالقيمة بسبب ان الخاصية تم ضبطها .
ثانيا انت لا تستطيع صنع خصائص للقراءة فقط وللكتابة فقط .
–تاخذ المعني من انواع دوائر متكاملة-ICs- الاولى يتم تخزين بيانات فيها مسبقا وداخل
النظام لا يمكن التعديل عليها وانما تاخذ منها البيانات -النظام يقرا منها فقط-
والاخرى فارغة بدون بيانات مسبقا ويمكن تخزين -كتابة- بيانات فيها داخل النظام فقط .
ثالثا انت لا تستطيع بسهولة تثبيت –تاكيد-ما الذي تم اسناده للمتغيرات العامة.
والطريقة الافضل من ذلك –واسال من كان به خبيرا-لصنع الخصائص
سيناقش في التالي ولا يوجد بة هذه السلبيات .

Using Property Let, Property Get, and Property Set
استعمال الخواص المذكورة اعلاه
هذه الاجراءات اعلاه تمكنك من صنع الخصائص بطريقة مرنة اكثر من
استعمال المتغيرات العامة.
الاجراءات- Property Let-يحدد ماذا يحدث عندما تعين قيمة للخاصية .
هنا مثال بسيط مظهرا الصيغة العامة للاجراء- Property Let-.


Public Property Let TestProperty(ByVal strMessage As String)
'code for assigning the property goes here
strTestPropertyVal = strMessage
End Property

في حالات عديدة ,انت تسند قيمة معلمة- parameter-.
ملاحظة كنت اترجمها محددات ووجدت ان المستعمل في المملكة هو –المعلمات –لذلك ارجو الانتباه.
في حالات عديدة ,انت تسند قيمة المعلمة- parameter- مررت الى اجراء
الخاصية لمتغير مصرح به في قسم التصريحات للفئة.
اجراء - Property Let-هو نوع خاص من الاجراءات التي تنفذ كلما انت تعين الخاصية
لقيمة اخرى في الكود .مثال افترض ان لديك سطر الكود هذا:

TestProperty = "This is a new value for the property."
بسبب انك تعين خاصية- TestProperty-لقيمة جديدة فان الاجراءProperty Let-سوف ينفذ.
في المثال الحالي القيمة النصية ذكرت في اقتباس مررت الى الاجراء- Property Let-كمعلمة- strMessage-وقد تم اسنادها للمتغير- strTestPropertyVal-
وتستطيع تضمين اكثر من عبارة اسناد واحده في الاجراء- Property Let-
على سبيل المثال يمكن ان تنفذ فحوصات –الصلاحية- التاكيد او استدعاء طرق
اخرى من خلال اجراء - Property Let-.
المثال التالي يوضح تنفيذ فحوصات-الصلاحية- التاكيد قبل تعيين قيمة الخاصية.

Public Property Let TestProperty(ByVal strMessage As String)
'if the length of the message is less than 25 then set the value
If Len(strMessage) < 25 Then
'code for assigning the property goes here
strTestPropertyVal = strMessage
Else
Msgbox "The message for Test Property cannot exceed 25 characters !"
End If
End Property

وتستطيع النظر في هذا المثال لكيف عند استعمالك الاجراء- Property Let-فانه
يعطيك مرونة اعظم اكثر مما لو صرحت الخاصية كمتغير عام .
الاجراء- Property Get-يستعمل لتحديد ما الذي يجب حدوثه عند استرجاع
قيمة الخاصية.وهنا مثال للصيغة المستعملة لاجراء- Property Get-:

Public Property Get TestProperty As String
TestProperty = strTestPropertyVal
End Property

لاحظ كيف ان الاسم للخاصية قد تم اسناده الى المتغير المحلي – strTestPropertyVal-
والمستخدم لتخزين القيمة الحالية للخاصية.وهذا في التاثير –في وزن-
دالة والتي تعيد القيمة في المتغير المحلي عند الطلب .
تماما مثل الاجراء- Property Set-.الاجراء- Property Get-يمكن ان يتضمن كودا اضافي .
الاجراء- Property Set-يستعمل فقط لتحديد ما الذي يجب حدوثه عندما قيمة الكائن
نوع بيانات- data- قد اسندت .وفي كل الحالات الاخرى يجب ان تستعمل
الاجراء- Property Let-لتحديد ماذا يحدث عندما يتم تعيين قيم الخصائص .
يمكن صنع خصائص –قراءة فقط-بواسطة الغاء الاجراء- Property Let-
وتضمين الاجراء- Property Get- فقط.
اعتذر دوما عن اي اخطاء في الترجمة خاصة وبشكل عام عامة ودائما ارجو من الاخوة الاعزاء مشكورين اخذ الصحيح
وطرح الاخر
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
23-09-2012, 06:01
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل الرابع وعلى بركة الله وباسم الله نبدا:
حان الوقت لتدرب يديك على صنع كل الخصائص لفئة السيارة لتطبيق المبيعات- Wrox Auto-
والذي تم تحليله سابقا .ربما تحتاج لمراجعة الشكل 4.2 لرؤية الخرائط لمخططات الفئة للكود الذي تكتب .


Creating the Properties for the Car Class
صنع الخصائص لفئة السيارة-تطبيق عملي -
1- ان لم تكن عاملا اعمل قاعدة بيانات جديدة لاستعمالها
للامثلة لهذا الفصل واحفظها باسم Ch4CodeExamples--
2- اضف نمطية فئة للقاعدة. ومن المحرر الفيجولي ثم خصائص
غير الاسم لنمطية الفئة الى – clsCar.
3-اضف التصريح التالي في قسم التصريحات العامة لنمطية الفئة- clsCar-

Dim dblVehicleIdNumberVal As Double
Dim intMakeIdVal As Integer
Dim intModelIdVal As Integer
Dim intModelYearVal As Integer
Dim intMileageVal As Integer
Dim intColorIdVal As Integer
Dim intInteriorTypeIdVal As Integer
Dim intInteriorColorIdVal As Integer
Dim intTransmissionTypeIdVal As Integer
Dim intStatusIdVal As Integer
Dim dtReceivedDateVal As Date
Dim dtSoldDateVal As Date
Dim intSoldToPersonIdVal As Integer
Dim strPhotoVal As String
Dim strSpecialFeaturesVal As String
4-اضف اجراء الخصائص لرقم السيارة- VehicleIdNumber- للفئة.
Public Property Get VehicleIdNumber() As Double
VehicleIdNumber = dblVehicleIdNumberVal
End Property
Public Property Let VehicleIdNumber(ByVal Value As Double)
dblVehicleIdNumberVal = Value
End Property

5- اضف اجراءات الخصائص ل- MakeId- للنمطية الفئة .

Public Property Get MakeId() As Integer
MakeId = intMakeIdVal
End Property
Public Property Let MakeId(ByVal Value As Integer)
intMakeIdVal = Value
End Property

6- اضف اجراءات الخصائص ل- ModelId- للنمطية.

Public Property Get ModelId() As Integer
ModelId = intModelIdVal
End Property
Public Property Let ModelId(ByVal Value As Integer)
intModelIdVal = Value
End Property

7- اضف اجراءات الخصائص ل- ModelYear- للنمطية.

Public Property Get ModelYear() As Integer
ModelYear = intModelYearVal
End Property
Public Property Let ModelYear(ByVal Value As Integer)
intModelYearVal = Value
End Property

8- اضف اجراءات الخصائص ل- Mileage- للنمطية.

Public Property Get Mileage() As Integer
Mileage = intMileageVal
End Property
Public Property Let Mileage(ByVal Value As Integer)
intMileageVal = Value
End Property

9- اضف اجراءات الخصائص ل- ColorId-للنمطية.

Public Property Get ColorId() As Integer
ColorId = intColorIdVal
End Property
Public Property Let ColorId(ByVal Value As Integer)
intColorIdVal = Value
End Property

10- اضف اجراءات الخصائص ل—InteriorTypeId للنمطية .

Public Property Get InteriorTypeId() As Integer
InteriorTypeId = intInteriorTypeIdVal
End Property
Public Property Let InteriorTypeId(ByVal Value As Integer)
intInteriorTypeIdVal = Value
End Property

11- اضف اجراءات الخصائص ل- InteriorColorId- للنمطية.

Public Property Get InteriorColorId() As Integer
InteriorColorId = intInteriorColorIdVal
End Property
Public Property Let InteriorColorId(ByVal Value As Integer)
intInteriorColorIdVal = Value
End Property

12- اضف اجراءات الخصائص ل- TransmissionTypeId- للنمطية .


Public Property Get TransmissionTypeId() As Integer
TransmissionTypeId = intTransmissionTypeIdVal
End Property
Public Property Let TransmissionTypeId(ByVal Value As Integer)
intTransmissionTypeIdVal = Value
End Property

13- اضف اجراءات الخصائص- StatusId-للنمطية .

Public Property Get StatusId() As Integer
StatusId = intStatusIdVal
End Property
Public Property Let StatusId(ByVal Value As Integer)
intStatusIdVal = Value
End Property

-اضف اجراءات الخصائص ل – ReceivedDate- للنمطية .

Public Property Get ReceivedDate() As Date
ReceivedDate = dtReceivedDateVal
End Property
Public Property Let ReceivedDate(ByVal Value As Date)
dtReceivedDateVal = Value
End Property

- اضف اجراءات الخصائص ل- SoldDate- للفئة

Public Property Get SoldDate() As Date
SoldDate = dtSoldDateVal
End Property
Public Property Let SoldDate(ByVal Value As Date)
dtSoldDateVal = Value
End Property

- اضف اجراءات الخصائص ل- SoldToPersonId-للفئة .

Public Property Get SoldToPersonId() As Integer
SoldToPersonId = intSoldToPersonIdVal
End Property
Public Property Let SoldToPersonId(ByVal Value As Integer)
intSoldToPersonIdVal = Value
End Property

17- اضف اجراءات الخصائص ل- Photo- للنمطية .

Public Property Get Photo() As String
Photo = strPhotoVal
End Property
Public Property Let Photo(ByVal Value As StringstrPhotoVal = Value)
End Property

18- اضف اجراءات الخصائص ل- SpecialFeatures- للنمطية.

Public Property Get SpecialFeatures() As String
SpecialFeatures = strSpecialFeaturesVal
End Property
Public Property Let SpecialFeatures(ByVal Value As String)
strSpecialFeaturesVal = Value
End Property

19- انقر تخزين من على شريط الادوات لحفظ التغييرات على الفئة.

How It Works
كيف يعمل
اولا انت صنعت نمطية فئة جديدة في قاعدة البيانات المسماه- clsCar-.
بعدها اضفت المتغير المحلي والذي استعمل فيما بعد في اجراءات:- Property Get و Property Set-
لكل خاصية كما يشاهد في الكود التالي:

Dim dblVehicleIdNumberVal As Double
Dim intMakeIdVal As Integer
Dim intModelIdVal As Integer
Dim intModelYearVal As Integer
Dim intMileageVal As Integer
Dim intColorIdVal As Integer
Dim intInteriorTypeIdVal As Integer
Dim intInteriorColorIdVal As Integer
Dim intTransmissionTypeIdVal As Integ
Dim intStatusIdVal As Integer
Dim dtReceivedDateVal As Date
Dim dtSoldDateVal As Date
Dim intSoldToPersonIdVal As Integer
Dim strPhotoVal As String
Dim strSpecialFeaturesVal As String

وبعدها اضفت الاجراءات- Property Get و Property Let-لكل خاصية في النمطية للفئة .
على سبيل المثال اضفت الاجراءات - Property Get و Property Let-الى خاصية – VehicleIdNumber-
لتحديد ما الذي يحدث كلما استرجعت او اسندت قيمة للخاصية على التوالي

Public Property Get VehicleIdNumber() As Double
VehicleIdNumber = dblVehicleIdNumberVal
End Property
Public Property Let VehicleIdNumber(ByVal Value As Double)
dblVehicleIdNumberVal = Value
End Property

وتستطيع استعمال هذه الفئة لاحقا في هذا الفصل لرؤية واحد او اكثر من من افعال هذه الخصائص.
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
24-09-2012, 04:46
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع بعون الله وتوفيقه الجزء الخامس من الفصل الرابع وعلى بركة الله وباسم الله :

Creating Methods
تصنيع الطرق
هل انت مدرك ان الطرق هي افعال تحدث للكائن.
الطرق للفثات المفصلة-المصنعة –تنجز باستعمال الاجراءات الفرعية العامة والدوال.


Using Public Sub Procedures and Functions
استعمال الاجراءات الفرعية العامة والدوال
لانجاز الطريق للفئة المفصلة ببساطة اضف اجراء فرعي او دالة للفئة نفسها .
لقد بت تعرف كيف تصنع اجراء جديدا ,لذلك فان تصنيع طريقة مفصلة سيكون في الواقع سهلا عليك .
لاضافة طريقة مسماه- TestMethod-لنمطية الفئة ,ببساطة اضف الكود التالي:

Public Sub TestMethod()
'code for the method goes here
End Sub

الان اصنع اربعة طرق للفئة – clsCar-: Retrieve, Add, Update, و Delete.
ربما تحتاج لمراجعة الشكل 4.2 لرؤية خرائط المخططات للفئة للكود الذي تكتب.

Creating the Methods for the Car Class
تصنيع الطرق لفئة السيارة -مثال عملي-
1- اضف الطريق- Retrieve- للفئة- clsCar-

Public Function Retrieve(ByVal VehicleId As Integer) As ADODB.Recordset
'Retrieve the detail record for the car
'from the database
'code to call the data access layer that retrieves the record from the database"
Debug.Print "clsCar.Retrieve method"
Debug.Print "VehicleID: " & VehicleId & " will be retrieved from the database."
End Function

2- اضف الطريق – Add-للفئة- clsCar-

Public Sub Update()
'Update the database with the current contents of the Car object
'Code to call the data access layer that updates the existing
'record in the database
Debug.Print "clsCar.Update method"
Debug.Print "Record being updated for VehicleId: " & Me.VehicleIdNumber
End Sub

- اضف الطريق- Update-للفئة- clsCar-

Public Sub Update()
'Update the database with the current contents of the Car object
'Code to call the data access layer that updates the existing
'record in the database
Debug.Print "clsCar.Update method"
Debug.Print "Record being updated for VehicleId: " & Me.VehicleIdNumber
End Sub

4- اضف الطريق- Delete-للفئة- clsCar-

Public Sub Delete()
'Delete the Car record from the database
'Code to call the data access layer that deletes the record from the
database
'Pass the VehicleId value as a parameter
Debug.Print "clsCar.Delete method"
Debug.Print "Record being deleted for VehicleId: " & Me.VehicleIdNumber
End Sub

6-انقر زر الحفظ في شريط الادوات لحفظ المتغيرات على النمطية.

How It Works
كيف يعمل
اولا انت صنعت الطريق- Retrieve-للفئة- clsCar-.وهذا الطريق مسؤول لاستدعاء
طبقة الوصول للبيانات للبحث-واسترجاع- عن سجل سيارة مفرد .:

Public Function Retrieve(ByVal VehicleId As Integer) As ADODB.Recordset
'Retrieve the detail record for the car
'from the database
'code to call the data access layer that retrieves the record from
'the database

لاهداف التوضيح , الطريق يتضمن كودا لطباعة رسالة في الشاشة الفورية لتعريفك
ان الطريق تم تنفيذها.

Debug.Print "clsCar.Retrieve method"
database." Debug.Print "VehicleID: " & VehicleId & " will be retrieved from the
End Function

بعدها صنعت الطريق – Add-للقيام باضافة سجل سيارة جديدة للقاعدة:

() Public Sub Add
'Add the current values in the Car object to the database
'code to call the data access layer that adds the record to th

مرة اخرى الطريق يتضمن كودا لطباعة رسالة في الشاشة الفورية لتعريفك ان الطريق تم تنفيذها.

Debug.Print "clsCar.Add method"
Debug.Print "New record being added for VehicleId : " &
Me.VehicleIdNumber
End Sub

الطرق- Update و Delete-تصنع بنفس الطريقة.

واحد او اكثر من هذه الطرق سوف يستعمل في المثال التالي .
في الجزء القادم توجه للاحداث على خير ان شاء الله .
اعتذر عن الخربطة في الاكواد لم استطع ضبط التنسيق
والى لقاء اخر ان شاء الله قريبا
مرفق قاعدة البيانات من المؤلف للفصل كاملا

أبو يوسف1
24-09-2012, 08:01
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء السويدس من الفصل الرابع وعلى بركة الله

Creating Events
صنع الاحداث
الاحداث تحدث استجابة الى الفعل الماخوذ-المحدث- من المستخدم او النظام.
الاحداث المفصلة –المعمولة بالتفصيل –يمكن ان تصنع في نمطيات الفئة
لكن ايضا يجب ان يتم ابرازها-قدحها -في الكود او او الحدث الذي لن يحدث .


Declaring and Raising Events
تصريح وابراز-قدح- الاحداث
اولا يجب ان تصرح وتقدح الحدث.
تصريح الحدث يمكن ان يضاف الى قسم التصريحات العامة في نمطية الفئة
كما في يظهر هنا:

Public Event EventName(VariableName As DataType)
بعدما تم تصريح الحدث ,اضف الكود الى الاجراء لنمطية الفئة لابراز عبارة الحدث.
لرؤية كيف بعمل هذا ,اصنع حدثا لفئة السيارة.


Creating an Event for the Car Class
تصنيع حدثا لفئة السيارة-مثال عملي-
1-صرح الحدث بعبارة الحدث العام في قسم التصريحات العامة لنمطية

Public Event ActionSuccess(strMessage As String)
2- عدل الطريق الموجود- Update-في – clsCar-
لاضافة الكود التالي :

Public Sub Update()
'Update the database with the current contents of the Car object
'Code to call the data access layer that updates the existing
'record in the database
Debug.Print "clsCar.Update method
Debug.Print "Record being updated for VehicleId: " & Me.VehicleIdNumber
'raise the ActionSuccess event
RaiseEvent ActionSuccess("Updates to existing record saved successfully !")
End Function


How It Works
كيف تعمل
اولا الحدث تم تصريحه في نمطية الفئة باستعمال عبارة الحدث العامة.
تاليا الكود تم اضافته للطريق الموجود- Update-لابراز الحدث.
عند هذه النقطة الكود لن ينتج اي فعل عندما تقدح الحدث.
لصنع الفعل يجب اخذ الخطوات التالية.


Creating the Event Sub Procedure or Function
تصنيع اجراء الفرعي للحدث او الدالة
يجب ان تكتب الكود والذي يتنفذ عند ابراز –قدح- الحدث.
في الفصل الثالث كان عليك ان تصنع اجراء حدث لتحديد ما الذي يجب حدوثة
عندما يحصل الحدث .وانت الان استخدم نفس الخطوات للكائنات المفصلة.
من قسم التصريحات العامة للكائن حيث تريد ان تدير-تسيطر –الحدث
انت تصرح متغير الكائن للفئة التي تسبب الحدث باستعمال مفتاح الكلمات- WithEvents-

Dim WithEvents objCar As clsCar
بعد تصريح الكائن مستعملا – WithEvents-, فان المحرر الفيجولي سوف يظهر
الكائن في قائمة الكائنات ويظهر الاحداث في الاجراء قي القائمة المنسدلة , مثلما يجب
لكل كائن اخر .
يمكنك ان تختار الكائن والحدث من القائمة ,وقالب الكود يتحدد بشكل الي .
اضف الكود الذي تريد تنفيذه عند حصول الحدث .

Private Sub objCar_ActionSuccess(strMessage As String)
'code to execute when event occurs goes here
End Sub

انت حقيقة سوف تصنع الحدث في مثال قاعدة البيانات لحظيا .لكن اولا
يجب ان اغطي مواضيع اخرى قليلة ضرورية لكتابة مثال الكود لادارة الحدث.
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
26-09-2012, 09:04
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء السابع من الفصل الرابع ونبدا باسم الله وعلى بركة الله


Using the Class
استعمال الفئة
بعد كتابة الكود لنمطية الفئة فانك تستطيع استعمال الفئة من اماكن اخرى
في التطبيق.

Instantiating the Class
بناء الفئة
لاستعمال نمطية الفئة في تطبيقاتك ,يحب عليك اولا ان تستخدم
عبارة- Dim-لتصريح الفئة و عبارة- Set- لصنع مثال للفئة كما يظهر هنا

Dim objCar As clsCar
Set objCar = New clsCar

وكما سوف تشاهد بعد لحظه ,الاسطر التالية من الكود لا يشترط وجودها في نفس الاجراء
بعد بناء الفئة سوف تصبح كائن في الذاكرة.

Initialize and Terminate Events
بدء وانهاء الاحداث
بدء وانهاء الاحداث
كل فئة لها حدث بداية وحدث نهابة يمكن استعمالها .
هذه الاحداث يجب استخدامها عندما تريد كود محدد ليعمل كلما تم صنع او الغاء الفئة .
الان ارجع الى مثال تطبيقات مبيعات- -Wrox Auto وحاول تجريب الطرق
والاحداث للفئة- clsCar-
ملاحظة المؤلف تذكر الفئة او نمطية الفئة وكلاهما نفس المعنى.

Using the Properties, Methods, and Events of the Car Class
استعمال الخصائص ,الطرق,والاحداث لفئة السيارة
1- ارجع الى شاشة قاعدة البيانات واصنع نموذجا جديدا .
باستعمال صندوق الادوات في عرض التصميم , ضع مربع نص واحد
واربع ازرار امر على النموذج الجديد كما في الشكل 4.4
2-غير خاصية الاسم لمربع النص الى- txtVehicleId-
غير خاصية الاسم لليبل الى- lblVehicleId-والكابشن الى- Vehicle Id-
غير خاصية الاسماء لازرار الامر بالترتيب الى-
cmdLookup, cmdSave, cmdAddNew, and cmdDelete
غير خصائص الكابشن لازرار الامر بالترتيب الى:
Lookup, Save, AddNew, and Delete
الشكل 4.5 يظهر كيف يجب ان يكون النموذج حتى هذه النقطة.
3- اختر الزر حفظ من شريط الادوات لمصمم النموذج لحفظ النموذج باسم – frmCarDetails-
4- من صندوق حوار الخصائص للنموذج اختر :
حدث عند التحميل - On Load-من تبويب الاحداث استعمل منشيء
الكود لاضافة اجراء حدث فارغ لحدث عند التحميل كما يظهر هنا:

Private Sub Form_Load()
End Sub

5- للحظه اترك حدث تحميل النموذج فارغا واضف الكود التالي الى
قسم التصريحات العامة لفئة- frmCarDetails-

Dim WithEvents objCar As clsCar
6- ارجع الى حدث تحميل النموذج واضف الكود التالي:

Private Sub Form_Load ()
'create a new instance of the car class to use while the form is open
Set objCar = New clsCar
End Sub

7-اضف حدث النقر التالي لفئة- frmCarDetails-:

Private Sub cmdLookup_Click()
'set the value of the VehicleId in the car object
'to the current value in the text box on the form
objCar.VehicleIdNumber = txtVehicleId
'call the Retrieve method
objCar.Retrieve (objCar.VehicleIdNumber)
End Sub

8-اضف حدث الحفظ – Save-التالي لفئة- frmCarDetails-:


Private Sub cmdSave_Click()
'add the values in the car object to the database
objCar.Update
End Sub

9-اضف حدث نجاح العمل – ActionSuccess- التالي لفئة- frmCarDetails-:

Private Sub objCar_ActionSuccess(strMessage As String)'display the message to the user
MsgBox strMessage
End Sub

10- احفظ كل التغييرات بنقر زر الحفظ في المحرر الفيجولي .
ايضا ارجع الىالنموذج وانقر حفظ في شريط ادوات مصمم النموذج .
11- شغل النموذج من اختيار عرض من شريط الادوات
ادخل القيمة لرقم السيارة في مربع النص على النموذج لاحظ الشكل 4.6.
12-انقر زر- Lookup-الشاشة الفورية للمحرر الفيجولي ستظهر مشابه لما في الشكل 4.7
13-ارجع للنموذج وانقر زر الامر المعنون – Save-الشاشة الفورية ستظهر مشابه
لما في الشكل 4.8.
رسالة مشابه للتي تظهر في الشكل 4.9 ستظهر بعد ذلك .
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
27-09-2012, 08:39
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء الثامن من الفصل الرابع وعلى بركة الله وباسم الله :

How It Works
كيف يعمل
بدات بصنع نموذجا جديدا اسمه- frmCarDetails-واضفت عليه مربع نص
واربع ازرار امر .
مربع النص هذا يستعمل لعرض رقم السيارة - Vehicle Id-والاربع
ازرار امر هي تستعمل لعمليات : Lookup, Save, Add New, and Delete.
بعد تغيير خصائص مختلفه لعناصر التحكم ,قمت بتصريح المتغير – objCar-
لتخزين مثال-نسخة-لفئة السيارة- clsCar-.
لاحظ ان احداث مفتاح كلمة-With- قد استعمل كجزء من التصريح
لذلك فان النموذج يكشف الحدث المفصل-المخصص-عند حدوثه .

Dim WithEvents objCar As clsCar
وكما يظهر في الشكل 4.10 حيث كتبت التصريح للكائن فان الاسم لفئة- clsCar-
والذي صنعته يظهر في القائمة المنسدله مع الكائنات الموجودة والتي لم تصنع .
الكود لبناء الفئة قد اضيف لحدث تحميل النموذج للفئة- frmCarDetails

Private Sub Form_Load()
'create a new instance of the car class to use while the form is open
Set objCar = New clsCar
End Sub

ثم اضفت الكود لحدث النقر لزرالامر- cmdLookup-للفئة- frmCarDetails-.
في هذا الحدث عندما المستخدم ينقر على الزر – Lookup-فان خاصية
رقم السيارة- VehicleIdNumber-للفئة- objCar-
يتم اسناد القيمة له من مربع النص .
طريق الاسترجاع بعدها يتم نداءه-استدعاءه-

Private Sub cmdLookup_Click()
'set the value of the VehicleId in the car object
'to the current value in the text box on the form
objCar.VehicleIdNumber = txtVehicleId
'call the Retrieve method
objCar.Retrieve (objCar.VehicleIdNumber)
End Sub

حالما ادخلت الكود لضبط خاصية رقم المركبة- VehicleIdNumber- فان قائمة
منسدلة –الشكل4.11- ستظهر وتبين كل الخصائص والطرق للفئة المخصصة.
واعجباه !!! يا سلام !!! هذه كل الخصائص والطرق التي صنعتها.
ثم اضفت الحدث حفظ- Save-للفئة- frmCarDetails-لنداء الطريق- Update-
عند النقر على زر الحفظ – Save-.

Private Sub cmdSave_Click()
'add the values in the car object to the database
objCar.Update
End Sub

بعدها اضفت الحدث- ActionSuccess-الى الفئة- frmCarDetails-
هذا حدث مخصصوالذي يبرز في الفئة- clsCar-من الطريق – Update-.
بعد بروز الحدث الكود التالي بشتغل:

Private Sub objCar_ActionSuccess(strMessage As String)
'display the message to the user
MsgBox strMessage
End Sub


بعدها شغلت النموذج وادخلت القيمة- VehicleId-في مربع
النص واخترت زر – Lookup-.الشاشة الفورية بعدها ستظهر الرسالة
مبينة ان الطريق- Retrieve-للكائن – clsCar-قد تم تنفيذه.
وبعد النقر على زر الحفظ- Save-فان الشاشة الفورية تظهر الرسالة مبينة
ان الطريق- Update-تم تنفيذه ويظهر في مربع الرسالة .
مبينا ذلك ان السجل قد تم تحديثه بنجاح.
تذكر ان هذا هو الكود الذي سابقا قد اضفته للطريق- Update-
لابراز الحدث المخصص- ActionSuccess-
في هذه الخطوات القليلة انت لم تفحص الخصائص والطرق والاحداث
للكائن المخصص فقط لكن انت ايضا استعملت خصائص وطرق واحداث عديدة
للكائنات الموجودة .
لاحظ ان المثال المستعمل لنموذج – frmCarDetails-يوضح فقط جزئيا
مجموعة عناصر تحكم والتي يمكن ان تكون في شاشة ادارة السيارات
لنسخةانتاج –اي نسخة رسمية من البرنامج-
وتشمل هنا حقل رقم المركبة –السيارة-وقد استعمل لاجل
التبسيط فقط.
مرفق الصور
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
28-09-2012, 06:59
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله الجزء التاسع من الفصل الرابع وعلى بركة الله وباسم الله نبدا:

Advanced Techniques
تقنيات –مهارات-متقدمة
وتتابع دينيس كتابها مدعية انك تملك الفكرة الاساسية لكيفية
استعمال نمطية الفئة لصنع الكائنات الخاصة بك مع خصائصها وطرقها
ليس هذا فحسب وانما باحداثها ايضا .
لذلك فانك تستطيع الان التنقيب المعرفي-متابعة البحث- عن بعض مهارات متقدمة .

Creating Multiple Instances of the Class
صنع امثلة-نسخ- متعددة للفئة
احب ان اوضح هنا –ابو يوسف- ان عملية عمل نسخة– instance- من الكائن عموما
تسمى Instantiating --.
هذه العملية تتم ببساطة بعمل نسخة من الكائن لاستعمالها في الكود الفيجولي .
عمل النسخة هذا يحفظ كل كائن مستقلا عن الاخر .
هذه الاستقلالية تمكن المبرمج من تغيير خاصية لاحدى النسخ من الكائن
لا تؤثر على النسخ الاخرى .
اعتذر ان لم يتم التوضيح سابقا وارجو تصيح ما اشكل من شرح في السابق
بخصوص هذه النقطة . انتهي التوضيح
لقد تعلمت كيف تصرح وتصنع نسخة من الفئة مستعملا عباراتي Dim ,Set—
المثال التالي يوضح كيف تصنع نسخا عديدة من نفس الفئة.

Public Sub TestMultipleInstances()
'declare both clsCar objects
Dim objCar1 As clsCar
Dim objCar2 As clsCar
'instantiate new instances for each
Set objCar1 = New clsCar
Set objCar2 = New clsCar
'set the VehicleId property for the first instance
'of clsCar and then call the previously created
'update method as an example
objCar1.VehicleIdNumber = "98765"
objCar1.Update
'set the VehicleId property for the second instance
'of clsCar and then call the previously created
'update method as an example
objCar2.VehicleIdNumber = "12345"
objCar2.Update
End Sub

لاحظ كيف تم تصريح الكائنين- clsCar-و كيف تمت عملية النسخ.
خاصية رقم المركبة- VehicleIdNumber-لكل نسخة من الفئة
قد تم اسنادها وطريق التحديث- Update-لكل نسخة من الفئة تم استدعاؤها .
وكما يظهر في الشكل 4.12 الشاشة الفورية تظهر الرسالة المتولدة من الطريق
- Update- مشيرة ان السجل تم تحديثه لكل نسخة معنية للفئة .

Creating Class Hierarchies
تصنيع سلسلة-هرمية –الفئات

الفئات يمكن ان ترتبط ببعضها في علاقة فئة اب لابنه وهذه تسلسل او هرمية الفئات .
افترض ان لديك كائنا اسمه الطلبية– Orders-والذي يحتوي على كل التفاصيل
المتعلقة بطلب فردي واحد من المنتجات –يحتوي عدة منتجات ,الفردية صفة الطلب -.
وايضا لديك كائنا اسمه- OrderDetails-والذي يحتوي على تفاصيل عن منتج فردي وحيد
ضمن الطلبية السابقة .
كائن – Orders-يمكن ان يحتوي على عدة كائنات – OrderDetails-
ولعمل علاقة-شرعية طبعا-بين كائن- Orders- وكائن- OrderDetails-
ضع التصريح-اشهار عقد التبني-لفئة الطفل الببو في قسم التصريحات
العامة-الاحوال المدنية عندنا او قيد النفوس-لكائن- Orders- كما يظهر هنا:

Public ItemDetails As OrderDetails
وبعدها استعمل عبارة - Set-لنسخ فئة – OrderDetails-تماما كما عملت لفئة- Orders.
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
30-09-2012, 07:47
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء العاشر من الفصل الرابع ولعله الجزء قبل الاخير لهذا الفصل وعلى بركة الله وباسم الله نبدا:

Working with Enumerated Types
العمل مع الانواع المتعددة-التعدادية-
انواع مختلفة-مجموعة عناصر- يمكن استعمالها عندما تريد جعل –من زمان عن هالكلمة ان شاء الله
مكانها مضبوط – قيمة الخاصية تنحصر في قائمة معينة من الثوابت.
افترض ان لديك هذا الكود في قسم التصريحات العامة للكائن—clsCar-

Public Enum SpecialFeaturesList
SunRoof
MoonRoof
NavigationSystem
IntegratedPhone
Other
End Enum

في تصريحات الخاصية ,سوف ترى نوع متعدد- SpecialFeaturesList-
في قائمة الكائنات المتوفرة ,كما في الشكل 4.13
الاجراء ات- Property Get-و - Property Let-مستعملا التعداد
– SpecialFeaturesList-يظهر كالتالي :

Public Property Get SpecialFeatures() As SpecialFeaturesList
SpecialFeatures = SpecialFeaturesVal
End Property
Public Property Let SpecialFeatures(ByVal Value As SpecialFeaturesList)
SpecialFeaturesVal = Value
End Property

الان في اي وقت تحاول ضبط الخاصية مستعملا عبارة الاسناد فانك
محصور لتلك القيم المحددة في تصريح التعداد كما في الشكل 4.14.
Inheritance Using Implements Keyword
التوريث باستعمال مفتاح الكلمة- Implements-
السيد اكسس يسمح لنوع من الوراثة يسمى - interface inheritance-هذا النوع
من الوراثة يسمح لك بتبني الخصائص والطرق من كائن اخر.
هذه الخاصية يتم تحقيقها –انجازها –بواسطة استعمال مفتاح الكلمة- implements-
كما يظهر في الاسفل :

Implements clsCar
اذا تم وضع الكود السابق في قسم التصريحات العامة لنمطية
فئة جديدة فانك سوف تشاهد كائن- clsCar-في القائمة المنسدلة للكائنات
وايضا كذلك الخصائص والطرق لكائن- clsCar-.
وبعدها تستطيع اختيار خاصية مفرده او طريق وتكتب الكود لذلك الخاصية او
الطريق .هذه السلبية الكبيرة لهذا النوع من الوراثة- interface inheritance-
انه يتطلب منك ان تكتب الكود لتحديث-تطوير- هولاء الخصائص والطرق.
الوراثة الحقيقية مدعومة في لغات البرمجة الاحدث مثل- Visual C++, or Visual Studio .NET-
والتي تمكنك من وراثة كل الخصائص والطرق من فثة اخرى متضمنة كل الكوادات فيها.
Create Custom Properties for Existing Objects
تصنيع الخصائص الخاصة للكائنات الموجودة
لقد تعاملت بالكائنات الموجودة وصنعت الكائنات الخاصة بك .الان سترى طرقا
قليلة لتطوير الكائنات الموجودة باعطائهن خصائص , وطرق واحداث اضافية .
ابدا اولا بالنظر كيف تصنع خصائص خاصة للكائنات الموجودة.
Using Existing Tag Property
استعمال الخاصيةالموجودة--Tag-
احدى الطرق لصنع خاصية خاصة لكائن موجود هو استعمال خاصية – Tag-.
خاصية- Tag-تستعمل فقط عندما تكتب الكود لضبط قيمة واستعمال هذه القيمة
فيما بعد لهدف معين .
مثال انت يمكن ان تستعمل هذه الخاصية لحجز قيمة واسترجاع هذه القيمة فيما بعد .
Using Public Variables
استعمال متغيرات عامة
كما تم الوصف سابقا ,عندما تصنع الخصائص لكائناتك الخاصة ,تستطيع
ايضا تصنيع الخصائص للكائنات الموجودة باستعمال المتغيرات العامة .
لعمل ذلك ,فقط اضف تصريح للمتغير العام لنمطية الفئة للكائنات الموجودة
مثل الفئة الموجودة للنموذج .
مرة اخرى هذه طريقة لا اوصي بها لتصنيع الخصائص.
كما تم نقاشه سابقا ,لا اوصي –دينيس-هذا التوجه لثلاث اسباب اساسية:
اولا لا تستطيع التحكم بالقيمة بسبب ان الخاصية ضبطت .
ثانيا لا تستطيع تصنيع خصائص قراءة فقط و كتابة فقط .
ثالثا لا تستطيع بسهولة توثيق ما الذي تم اسناده للمتغيرات العامة .
طريقة افضل لتصنبع الخصائص سيناقش تاليا لا يحوي هذه السلبيات .
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
01-10-2012, 08:52
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع الجزء الحادي عشر والاخير للفصل الرابع وعلى بركة الله وباسم الله نبدا:


Using Property Let, Property Get, and Property Set Routines
استعمال اجراءات اعلاه
تستطيع استعمال اجراءات السابقة اعلاه لصنع خصائص للكائنات الموجودة
مرة اخرى يمكن عمل ذلك فقط كما عملت للكائنات التي عملتها
فقط اضف الاجراءات - PropertyLet and PropertyGet-للكائن الموجود .
الان اضف خاصية جديدة للنموذج – frmCarDetails- لترى كيف تعمل .

Adding New Property for frmCarDetails Form
اضافة خاصية جديدة للنموذج – frmCarDetails- مثال تطبيقي –
1-من المحرر الفيجولي اختر نمطية الفئة - .-frmCarDetailsاضف التصريح
التالي لقسم التصلايحات العامة للفئة:

Dim strTestPropertyVal As String
2- ايضا من نمطية الفئة – frmCarDetails-اضف اجراء الخاصية التالي :

Public Property Get TestProperty() As String
TestProperty = strTestPropertyVal
End Property
Public Property Let TestProperty(ByVal Value As String)
strTestPropertyVal = Value
End Property

3- من النمطية – frmCarDetails-اضف الاجراء الجديد المسمى- ShowTestProperty-
واكتب مفتاح الكلمة – Me-واتبعها بنقطة كما في الشكل 4.15

How It Works
كيف يعمل
اولا انت اضفت اجراءات خصائص للنموذج الموجود- frmCarDetails-.
بعدها عندما اشرت الى- frmCarDetails -بالكود فقد رايت الخاصية
الخاصة التي اضفتها لتوك في القائمة المنسدلة مع الخصائص الاصلية الاخرى .
الخصائص يمكن اضافتها تقريبا لاي كائن موجود .
خصائص خاصة والتي اضفتها لم توضح في صندوق الحوار للخصائص
لكنها مرئية في شاشة الكود كما ظهرت في الشكل 4.15

Create Custom Methods for Existing Objects
تصنيع الطرق الخاصة لكائنات موجودة
بالاضافة الى الاجراءات الخاصة ,الطرق الخاصة يمكن ايضا صنعها للكائنات الموجودة
باستعمال الاجراءات الفرعية العامة او الدوال .

Using Public Sub Procedures and Functions
استعمال الاجراءات الفرعية العامة والدوال
الطرق الخاصة يمكن ان تصنع بنفس الطريقة التي صنعت بها


Adding New Method for the frmCarDetails Form
اضافة طريق جديدة للنموذج –تطبيق عملي –
1- من المحرر الفيجولي اختر نمطية الفئة- frmCarDetails-.
اضف الطريق التالي للفئة :

الطرق لكائناتك الخاصة ,فقط اضف اجراء فرعي عام او دالة لكائن موجود .
الان اضف طريقا جديدة لنموذج- frmCarDetails-لترى كيف يعمل هذا .

Public Sub TestMethod()
MsgBox "This is a test method added to an existing object"
End Sub

2- من نمطية الفئة- frmCarDetails- اضف اجراء جديد باسم
- DemonstrateCustomMethods- واكتب مفتاح الكلمة- me- واتبعها بنقطة كما في الشكل 4.16

How It Works
كيف يعمل

اولا انت اضفت طريقا جديدا للنموذج الموجود – frmCarDetails-وبعدها
عندما اشرت الى – frmCarDetails-بالكود مستعملا مفتاح الكلمة- me-
فانك رايت الطريق الخاص الذي اضفته للتو في القائمة المنسدلة
معا مع الخاصسة الخاصة التي صنعتها لتوك وايضا الخصائص
والطرق الاصلية .
تماما مثل الخصائص الطرق يمكن اضافتها تقريبا لاي كائن موجود.

Summary
الخلاصة
في هذا الفصل تعلمت –ادعاء دينيس-كيف تصنع مخطط للفئة لنمذجة الفئات
والعلاقات فيما بينها .
مخططات الفئة تزودك بخارطة الطريق –كمان هون خارطة طريق-لبناء
للكود الذي تصنعه.
نموذجيا مخططات الفئة يجب ان تنفصل الى طبقة العرض , طبقة المنطق
وطبقة الوصول للبيانات .
طبقة العرض تظهر استعمالك لمخططات الحالة .
طبقة المنطق هي قلب-جوهر- مخطط الفئة وتحوي نمطيات الفئة والتي هي
جوهر تطبيقاتك .
طبقة المنطق تستدعي طبقة الوصول للبيانات لاي نشاط
مطلوب للاتصال مع قاعدة البيانات .
وبعدها تطرقت لامثلة عدبدة لكيف تصنع الخصائص والطرق والاحداث للكائن الخاص .
الخصائص الخاصة يمكن صنعها باستعمال تصريحات المتغير العام في نمطية الفئة.
الطريقة المفضلة لصنع خاصية خاصة هي كتابة اجراءات عامة
ل-Property Get and Property Let- في نمطية الفئة .
الاجراء- Property Get- يحدد ما الذي يحدث عند استرجاع قيمة الخاصية
واجراء- Property Let- يحدد ما الذي يحدث عندما يتم اسناد الخاصية.
وبعد كتابة الكود للكائن الخاص ,يمكن استعمال الكائن من نمطيات فئة اخرى
او اجراءات بواسطة تصريح الكائن وبناء نسخ منه .
الخصائص ,الطرق ,والاحداث يمكن الوصول لها في الكائنات الخاصة
من شاشة الكود في المحرر الفيجولي تماما مثل الكائنات الموجودة-الاصلية صنع مايكروسوفت-.
انت صنعت طرقا خاصة بواسطة اضافة اجراءات عامة او دوال لنمطية الفئة .
انت اضفت خصائص اضافية وطرقا لكائنات موجودة بنفس الطريقة التي صنعت
خصائصك الخاصة وطرقا للكائنات .
الفرق الوحيد هو انك وضعت الكود في نمطية الفئة للكائنات الموجودة مثل النموذج .

الان وقد تعلمت العمل مع الكائنات الموجودة وكيف تصنع كائناتك .-ادعاء دينيس -.
حان الوقت لتعلم كيف – ADO-يمكن استعماله في تطبيقاتك للتفاعل مع
البيانات في قاعدة البيانات .
والى لقاء اخر في الفصل الخامس قريبا ان شاء الله
مرفق الصور

أبو يوسف1
02-10-2012, 09:21
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الاول من الفصل الخامس وعلى بركة الله وباسم الله نبدا:


Interacting with Data Using ADO and SQL
التفاعل مع البيانات مستعملا ADO and SQL

في هذا الفصل وجه انتباهك لواحد من اكثر المفاهيم اهمية في برمجة الاكسس:
العمل مع البيانات في قاعدة البيانات .
البيانات هي بعد كل ذلك الجوهر-قلب- تقريبا لكل التطبيقات .
المبرمجون نموذجيا يكتبوا التطبيقات لتمكين المستخدمون للتفاعل-التعامل بحركة-
مع البيانات في طرق مفهومة .لعلك صنعت تطبيقات لاكسس والتي تسترجع
بيانات مستعملا النماذج والمرتبطة مباشرة مع الجداول .
هذا الفصل يوسع معرفتك في العمل مع البيانات بتغطية الاساسيات
لاسترجاع وتعديل البيانات من كود- VBA-مستعملا - ActiveX Data Objects (ADO)-.
سوف تصنع نفس نموذج الاتصال في ثلاثة طرق مختلفة لترى المداخل المختلفة
للتفاعل مع نفس مصدر البيانات الضمني .
سوف اغطي الاساسيات لكتابة عبارات – SQL-للتفاعل مع قاعدة البيانات .
الفصل سينتهي –ان شاء الله بقسم موجز عن نموذج كائن- ADOX-

Introduction to Data Access
مقدمة لبيانات اكسس
الادو - ADO - هو اختصار ل - ActiveX Data Objects-.
الداو- DAO- هو اختصار ل- Data Access Objects-
كلاهما يسمح لك التحكم بقاعدة البيانات من خلال الكود الفيجولي لاكسس 2003
ولان الامثلة في الطبعات السابقة من هذا الكتاب ركزت على الداو ,اعطيت تفكيرا
معتبرا فيما اذا ان كان يجب ان ازود الامثلة على الداو في هذه الطبعة .
الداو كان موجودا منذ النسخ الاولية للاكسس وكان طريقا ممتازا للوصول للبيانات
للعمل مع بيانات اكسس المحلية .
الادو اختيار افضل لبناء تطبيقات متعددة المستخدمين ومعقدة ,او تطبيقات
تتفاعل مع مع قواعد البيانات غير الاكسس .
يبدو ان الداو في الواجهة واغلب الكتب والمصادر الاخرى
على الموضوع هذا توصي ان الداو يستعمل لكل للتطورات الحديثة .
انا- دينيس-اوافق بهذه التوصية وقررت لذلك التركيز على امثلة في هذا
الكتاب على الادو–شكرا على المرافعة الطويلة دينيس -.
ان كنت تتعامل مع تطبيقات اقدم تستعمل كود الداو
راجع الطبعات الاقدم اهذا الكتاب لتوضيحات شاملة للداو .
الادو يجب ان لا يلتبس مع - ADO.NET-.
ADO.NET- هو نسخة من الادو صممت لتعمل مع بيئة تطوير - Visual Studio .NET-.
على الرغم الداو و ADO.NET لهما كثيرا من المميزات المشتركة فانهما تختلف
في كثير من الطرق .
في المستقبل من الممكن ان مايكروسوفت تكامل –تدمج- عمليات- ADO.NET-
الى الاكسس للاحلال محل الادو ولكن هذا التكامل غير مؤكد .
هل يعني هذا تطور الاكسس الى تطبيق اخر ؟-تساؤل ابي يوسف-
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
03-10-2012, 08:45
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل الخامس وعلى بركة الله وباسم الله نبدا:

Using ADODB to Work with Data
استعمال – ADODB-للعمل مع البيانات
في هذا القسم سوف تستعرض نموذج كائن الادو وكيف تستعمل الكائنات فيها
للعمل مع البيانات الداخلية في قاعدة البيانات .

The ADO Object Model
نموذج كائن الادو
الشكل 5.1 يعطيك نظرة عن نموذج كائن الادو .
في اعلى المستوى للنموذج توجد عدة مجموعات :
Connection, Recordset, Command, Record, and Stream
وهي الاتصال ,مجموعة السجلات , الامر,الجدول(المائي) او السيل او الناقل
والصحيح لم اوفق في العثور على المعنى الدارج للكائن الاخير وقد عددت
ثلاثة معاني ارجو ان تكون قريبة من المعنى - احدي الترجمات كانت دفق ولم استسيغ هذا المعنى –
وتوضح المقصود علما بانه سياتي على ذكره فيما بعد.
مكتبة الكائن ادو احيانا يشار اليها بانها مكتبة – ADODB-.ومن اجل ان تسيتعمل
المميزات للادو يجب ان ان يكون لديك مرجعا لاحدى مكتبات نسخ الادو في مشروعك .
وتستطيع ان تضيف مرجعا لمكتبة الادو بواسطة اختيار ادوات ثم مراجع من المحرر الفيجولي
واختيار مكتبة من القائمة .الشكل 5.2 يظهر مثالا لمكتبة الادو نسخة 2.7.
نسخ عدة من الادو يمكن ان تتواجد على جهاز الكمبيوتر مثل 2.1 و2.5 و 2.7 و النسخة
التي تختار لمشروعك تعتمد على نسخة الاكسس التي يستخدمها الاخرون في منظمتك
–اي اللذين سيستخدمون مشروعك-.
اذا كان اي واحد منهم يستعمل اكسس 2002 او اعلى يجب عليك
استخدام النسخة 2.7 . وان كان بعضهم يستخدم اكسس 2000 لذلك ممكن ان
تستخدم نسخة 2.5 من الادو .وان كان بعضهم يستخدم اكسس 97 ممكن
ان تستخدم النسخة 2.1 للادو.

The Connection Object
كائن الاتصال
كائن الاتصال هو اعلى مستوى في نموذج كائن الادو .كائن الاتصال
يمكنك من بدء الاتصال مع مصدر البيانات .يجب عليك ان تصرح كائن الاتصال قبل
ان تستخدمه كما يظهر هنا :

Dim cnConnection as ADODB.Connection
بعد التصريح بكائن الاتصال ,يجب تنشيء كائن اتصال جديد كالتالي :

Set cnConnection = New ADODB.Connection
وعندما يتم انشاءه ,كائن الاتصال يمكن ان يفتح للاتصال مع قواعد البيانات
اكسس او اي قواعد بيانات اخرى .
انت تفتح- قناة- اتصال باستعمال الطريق – Open-لكائن الاتصال .
الطريق- Open- يقبل معلمات- -parameters متنوعة
تشمل - connection string, user id, password, and options.

Connecting to Access Databases
الاتصال مع قواعد بيانات الاكسس
انت تحدد مصدر البيانات للاتصال مستعملا - strConnection-وهذا بعدها
يتم استعماله في الطريق – Open-لفتح مصدر البيانات .
في المثال التالي – strConnection-يعمل اتصال مع قاعدة بيانات اكسس
للمشروع الحالي المسمى- Ch5CodeExamples.mdb-


Dim strConnection As String
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0 ;" & -
"Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb ;"
cnConnection.Open strConnection


Connecting to Other Databases
الاتصال مع قواعد بيانات اخرى
الاكسس يمكن ان يكون واجهة لقواعد بيانات مختلفة مثل - SQL Server-
الله الله عليك يا سيرفر تتخبا وراء الاكسس ايه العظمة يا سبد اكسس
سبحان الله وبحمده حكمتك يا رب .
المثال التالي يوضح – strConnection-التي تستعمل
للاتصال لقاعدة بيانات - SQL Server- المسماه- Pubs on-.
المثال المسمي- SQLServerName-مستخدما امان ويندوز .
الكود لم استطع تنسيقه هنا -بالعافية نسقت الذي قبله- مرفق الصورة
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
05-10-2012, 09:54
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل الخامس وعلى بركة الله وباسم الله نبدا:

The Command Object
كائن الامر
كائن الامرهذا يمثل عبارة – SQL-.استعلام او اجراء مخزن والذي
ينفذ على مصدر البيانات ,تماما مثل كائن الاتصال يجب ان تصرح وان
تنشيء كائن الامر قبل ا ن يمكنك ان تستعمله .

Dim cmdCommand As ADODB.Command
Set cmdCommand = New ADODB.Command

بعد انشاء كائن الاتصال الجديد تستطيع ان تسنده لفتح الاتصال واستدعاء
طريق التنفيذ لتنفيذ عبارة اس كيو ال ,استعلام ,اجراء مخزن على مصدر البيانات
هذا المفهوم سيتم توضيحه بتفاصيل اكثر فيما بعد في هذا الفصل تصنع
عبارات اس كيو ال وتستعمل الادو لتنفيذها .
بالاضافة الى ذلك دراسة الحالة الشاملة في الفصل 13 التي تتعامل
مع سيرفر ال اس كيو ال سةف توضح كيفية استخدام كائن الامر
لتمرير معلمات- parameters- للاجراءات المخزنة لسيرفر اس كيو ال .

The Recordset Object
كائن مجموعة السجلات
كائن السجلات يسمح لاسترجاع مجموعة من السجلات من مصدر البيانات
بالاعتماد على شروط معينة .
مجموعة السجلات يمكن ان تكون متصلة او منفصلة .
في المتصلة : تكون مجموعة السجلات باتصال مستمر مع قاعدة البيانات
والتغييرات التي على مجموعة السجلات تحدث لمصدر البيانات الداخلي .
في المنفصلة :يكون الاتصال مع مجموعة السجلات مغلقا مع قاعدة
البيانات وتتعامل مع نسخة المعلومات المحلية .
وتستطيع ان تستعمل كلا النوعان لاظهار البيانات للمستخدم على نموذج مثلا .
الامثلة فيما بعد في هذا الفصل سوف توضح الفرق بين النوعين .

Creating a Recordset
تصنيع مجموعة سجلات
كما عملت في كائن الامر يجب عليك ان تصرح وتنشيء كائن مجموعة
السجلات قبل ان تستعمله .

Dim rsRecordset As ADODB.Recordset
Set rsRecordset = New ADODB.Recordset

بعد ذلك استعمل الطريق- Open-لتجميع مجموعة السجلات في مجموعة سجلات مفردة.
rsRecordset.Open "SELECT * FROM tblSupplier", cnConnection
الطريق – Open-له معالم مختلفة لتحدد كيف تصنع مجموعة السجلات مثل :
CursorType, CursorLocation, LockType, and Options.
نوع المشيرة ,موقع المشيرة,نوع القفل ,خيارات .

CursorType Property
خاصية نوع المشيرة
خاصية نوع المشيرة لكائن مجموعة السجلات تشير الى نوع الحركة
التي تحدث في مجموعة السجلات .
في الوضع الطبيعي الخاصية تكون مضبوطة – adOpenForwardOnly-.
والتي تعني انت فقط تتحرك للامام في التنقل بين السجلات .
مشيرة للامام فقط لا تسمح لتعداد كم سجل في مجموعة السجلات او
الاستعراص للخلف وللامام في مجموعة السجلات .
الكود التالي مثال لضبط خاصية نوع المشيرة.

rsRecordset.CursorType = adOpenStatic
الجدول الذي يلخص الاحتمالات الاربع لخاصية نوع المشيرة .- 1 tableفي المرفقات –.

The CursorLocation Property
خاصية موقع المشيرة
خاصية موقع المشيرة لكائن مجموعة السجلات تحدد اين ترجع المشيرة في
مجموعة سجلات او سجل عندما تفتح مجموعة السجلات .
الادو يدعم قيمتان لخاصية موقع المشيرة: adUseServer and adUseClient.
وهولاء ترجع السجلات للخادم-السيرفر- والعميل بالترتيب.
بالعادة يجب ان تستخدم مشيرة الخادم –السيرفر-ما عدا عندما تكون مشيرة العميل مطلوبة خصيصا.
مثال للصيغة العامة لهذه الخاصية كالتالي:

rsRecordset.CursorLocation = adUseServer

The LockType Property
خاصية نوع الاغلاق

هذه الخاصية تحدد فيما اذا مجموعة السجلات قابلة للتحديث .
الجدول الذي يلخص الاحتمالات الاربع لهذه الخاصية – table 2في المرفقات -.
مثال للصيغة العامة لهذه الخاصية كالتالي:
rsRecordset.LockType = adLockReadOnly

The Options Parameter
معلم الخيارات
هذا المعلم لكائن مجموعة السجلات يسمح بتحديد كيف يجب ان يقيم
المزود جزئية المصدر-ان كانت تمثل شيء اخر غير كائن الامر او ان مجموعة السجلات
يجب ان تسترجع من ملف حيث خزنت سابقا - .اذا لم تحدد خاصية الخيارات سوف يتم تحديدها
عند وقت التشغيل والذي يكون ابطا .
هنا مثال لتحديد معلم الخيارات :

rsRecordset.Open "SELECT * FROM tblSupplier", cnConnection ,-
Options:=adCmdText

مرفق الصور : الجدول1 والجدول 2
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
06-10-2012, 09:23
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل الخامس وعلى بركة الله وباسم الله نبدا :

Building a Contacts Form Bound to a Recordset
بناء نموذج اتصالات مربوط مع مجموعة السجلات –تطبيق عملي-
الان وانت تملك الفكرة الاساسية لضوابط ادو المختلفة فانك تستطيع تطبيق
المفهوم على الواقع العملي ببناء نموذج اتصال والذي يربط ويظهر
البيانات من مجموعة السجلات .
افترض ان نموذج الاتصالات سوف يتم استعماله من شركة = U.S=والتي لا تتعامل
مع العناوين الاجنبية .
1- اصنع قاعدة بيانات جديدة وسمها- Ch5CodeExamples-.
2-اصنع جدولا باسم= tblContacts=بالحقول الموضحة بالشكل 5.3. لاحظ ان
حجم الحقل قد ذكر كجزء من الوصف للمرونة ولتوجيهك عند صنع الجدول.
3-افتح الجدول واضف على الاقل سجلا واحدا للجدول .
4-اصنع نموذجا جديدا باسم= frmContactsBound=.
بواسطة صندوق الادوات ضع 12 مربع نص على النموذج .
عدل خاصية الاسم لكل مربع نص كالاتي :

txtLastName, txtFirstName, txtMiddleName, txtTitle, txtAddress1,
txtAddress2,txtCity, txtState, txtZip, txtWorkPhone, txtHomePhone
txtCellPhone بالترتيب وايضا غير الاسم لخاصية الكابشن لكل ليبل
لكل مربع نص كما في الشكل 5.4.
5-اضف الكود الاتي لاجراء التحميل للنموذج وتستطيع عمل ذلك بواسطة
اختيار النموذج في عرض التصميم واظهار صندوق الخصائص للنموذج
واختيار تبويب الاحداث ومن ثم اختيار منشيء الكود من حدث== OnLoad.


Private Sub Form_Load()
Dim cnCh5 As ADODB.Connection
Dim rsContacts As ADODB.Recordset
Dim strConnection As String
'specify the connection string for connecting to the database
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &-
" Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb;"
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
'specify a cursortype and lock type that will allow updates
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockOptimistic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", cnCh5
End With
'if the recordset is empty
If rsContacts.BOF And rsContacts.EOF Then
MsgBox "There are no records in the database."
Exit Sub
'if the recordset is not empty, then bind the
'recordset property of the form to the rsContacts recordset
Else
Set Me.Recordset = rsContacts
End If

'bind the controls of the form to the proper field in the recordset (which ha
'the same field names as the tblContacts table from which it was generated)
Me.txtLastName.ControlSource = "txtLastName"
Me.txtFirstName.ControlSource = "txtFirstName"
Me.txtMiddleName.ControlSource = "txtMiddleName"
Me.txtTitle.ControlSource = "txtTitle"
Me.txtAddress1.ControlSource = "txtAddress1"
Me.txtAddress2.ControlSource = "txtAddress2"
Me.txtCity.ControlSource = "txtCity"
Me.txtState.ControlSource = "txtState"
Me.txtZip.ControlSource = "txtZip"
Me.txtWorkPhone.ControlSource = "txtWorkPhone"
Me.txtHomePhone.ControlSource = "txtHomePhone"
Me.txtCellPhone.ControlSource = "txtCellPhone"
End Sub

6- احفظ الكود من المحرر الفيجولي من شريط الادوات حفظ.
7- اخفظ النموذج من عرص التصميم من شريط الادوات حفظ .
8-افتح النموذج يجب ان يشبه الشكل 5.5.
9-عدل واحد من السجلات الموجودة.
10-انقر زر اضف جديد = الزر الموسوم سهم ايمن مع نجمة =لاضافة
سجلا جديدا مشابه للشكل 5.6.

How It Works
كيف تعمل
هذا المثال يربط نموذج = frmContactsBound=لمجموعة سجلات ادو .
والان سوف اريك –دينيس-كيف يعمل .
كل الكود الذي يعمل هذا التطبيق هو في حدث التحميل للنموذج - Form_Load -

Private Sub Form_Load()
اولا انت صرحت اتصالا جديدا وكذلك صرحت كائن مجموعة سجلات مع
المتغيرات لحفظ نص الاتصال- connection string-

Dim cnCh5 As ADODB.Connection
Dim rsContacts As ADODB.Recordset
Dim strConnection As String

بعد ذلك حددت قيمة لنص الاتصال والذي يشير الى قاعدة البيانات الحالية .


'specify the connection string for connecting to the database
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & -
"Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb;"

حتى هذه النقطة انت صنعت نسخة اتصال جديدة وفتحت الاتصال


'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection

المجموعة التالية من الكود تنسيء كائنا جديدا لمجموعة سجلات وتضبط
خصائص مختلفة لتؤثر على كيف تتجمع مجموعة السجلات .


'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
'specify a cursortype and lock type that will allow updates
CursorType = adOpenKeyset
CursorLocation = adUseClient.
.LockType = adLockOptimistic
'open the recordset based on tblContacts table using the existing connection
Open "tblContacts", cnCh5.
End With

بعد ضبط الخصائص - CursorType, CursorLocation, and LockType-
تكون مجموعة السجلات قد فتحت على محتويات الجدول- tblContacts-مستعملا الاتصال الموجود .
وان لم تكن مجموعة السجلات لا تحوي اي سجل فان رسالة سوف تظهر


'if the recordset is empty
If rsContacts.BOF And rsContacts.EOF Then
MsgBox "There are no records in the database."
Exit Sub

وان لم تكن مجموعة السجلات فارغة ,فان المجموعة التالية من الكود يربط
خاصية مجموعة السجلات للنموذج مع مجموعة سجلات الادو المسماه- rsContacts-.


'if the recordset is not empty, then bind the
'recordset property of the form to the rsContacts recordset
Else
Set Me.Recordset = rsContacts

End If

وعندما تربط مجموعة السجلات الى النموذج فان الحقول في مجموعة السجلات
تصبح متاحة للربط بالحاكمات المناسبة.
على اي حال النموذج لا يعرف اي حاكمات يجب ان ترتبط مع اي حقول
في مجموعة السجلات حتى تضبط خاصية مصدر التحكم – ControlSource-للحاكمات المناسبة.
مجموعة الكود التالية تعين خاصية مصدر التحكم- ControlSource- لكل مربع نص
للحقل المقابل في مجموعة السجلات والتي تولدت من الجدول – tblContacts- الداخلي .


'bind the controls of the form to the proper field in the recordset (which has
'the same field names as the tblContacts table from which it was generated)
Me.txtLastName.ControlSource = "txtLastName"
Me.txtFirstName.ControlSource = "txtFirstName"
Me.txtMiddleName.ControlSource = "txtMiddleName"
Me.txtTitle.ControlSource = "txtTitle"
Me.txtAddress1.ControlSource = "txtAddress1"
Me.txtAddress2.ControlSource = "txtAddress2"
Me.txtCity.ControlSource = "txtCity"
Me.txtState.ControlSource = "txtState"
Me.txtZip.ControlSource = "txtZip"
Me.txtWorkPhone.ControlSource = "txtWorkPhone"
Me.txtHomePhone.ControlSource = "txtHomePhone"
Me.txtCellPhone.ControlSource = "txtCellPhone"
End Sub

بعد ذلك انت فتحت النموذج في طور العرض وحدثت واضفت سجلات .
ان فتحت الجدول- tblContacts- الداخلي سوف ترى التغيرات التي احدثتها
قد تم حفظها بشكل صحيح كما في الشكل 5.7.
هل لاحظت انه لا يتوجب عليك كتابة اي كود لخواص الاستعراضو التحديث .
اكسس يتولى ذلك الكود بدلا منك اتوماتيكيا لان النموذج ارتبط مع مجموعة السجلات .
ربط النموذج مع مجموعة السجلات طريقة سريعة وبسيطة جدا لتطوير لتطوير
واجهة المستخدم الاساسي ولا تتطلب ان تكتب كودا للاستعراض
وتحديث قاعدة البيانات .
على اي حال استعمال النماذج المرتبطة يمثل بعض السلبيات .
احدى هذه السلبيات ان اتصال قاعدة البيانات يظل مفتوحا طوال الوقت .وانت تعمل في التطبيق .
في التطبيقات التي يوجد فيها مستخدمون كثر لكن بصلاحيات محدودة ,يشكل هذا مشكل .
سلبية اخرى ان السجلات تغلق اطول مما هو واجب بسبب انك دائما تحافظ على فتح الاتصال بقاعدة البيانات .
ان انت ابتعدت عن مكتبك والبرنامج مفتوح لسجل مفرد واحد فاتك بذلك تمنع غيرك من
تحديث نفس السجل بسبب انك قفلته .
في المثال فيما بعد سوف تستكشف كيف تصنع مجموعة سجلات منفصلة
لمساعدة في تقليل بعض هذه المشاكل .
واعتذر عن اي خطا في نقل الكود عند اللصق داخل مربع الكود .يوجد خطا في النقاط او الفاصلة العلوية فارجو الانتباه
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
07-10-2012, 08:30
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل الخامس وعلى بركة الله وباسم الله نبدا

Counting Records in a Recordset
تعداد السجلات في مجموعة السجلات
خاصية تعداد السجلات = RecordCount= في كائن مجموعة السجلات ترجع عدد السجلات في مجموعة السجلات .
افترض ان لديك هذه الاجراء:


Sub TestRecordCount()
Dim cnCh5 As ADODB.Connection
Dim rsContacts As ADODB.Recordset
Dim strConnection As String
'specify the connection string for connecting to the database
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" &
"Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb;"
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
.CursorType = adOpenStatic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", cnCh5
End With
'print the number of records to the Immediate Window
Debug.Print "The total number of records is: " & rsContacts.RecordCount
'close the database connection
cnCh5.Close
'set the recordset and connection to nothing
Set rsContacts = Nothing
Set cnCh5 = Nothing
End Sub

بعد صنع مجموعة السجلات,فان الكود يحدد كم عدد السجلات في مجموعة السجلات
مستعملا خاصية عداد السجل= RecordCount=.
عدد السجلات بعدها يظهر في الشاشة الفورية كما في الشكل 5.8.
في حالة ازالة السطر المحدد لنوع المشيرة= CursorType=فان = a -1=
سوف يعود كعداد للسجل حيث ان مجموعة السجلات ستاخذ الوضع
الاصلى وهو التقدم للامام- forward-only-.

Navigating through a Recordset
الاستعراض خلال مجموعة السجلات
لكائن مجموعة السجلات طرقا= methods=مختلفة والتي تسمح باستعراض
خلال السجلات مفترضا بالطبع ان مجموعة السجلات ضبطت على نوع
المشيرة التي تمكن الاستعراض .
القائمة التالية تشكل اربع طرقا= methods= للاستعراض يمكن استعمالها :


rsRecordset.MoveFirst
rsRecordset.MoveLast
rsRecordset.MoveNext
rsRecordset.MovePrevious

قبل استخدام طرق الاستعراض للسجل في التالي افحص الخصائص
= BOF and EOF=لمجموعة السجلات .(بداية الملف-السجلات
ونهاية الملف-السجلات)
ان كانت خاصية اوس = BOF= صحيحة ,فانه لا يوجد سجل حالي
والموقع الحالي هو واحد قبل السجل الاول .
ان كانت خاصية اخس= EOF=صحيحة ,فانه لا يوجد سجل حالي
والموقع الحالي هو واحد بعد السجل الاخير .
وان كان كلا اوس واخس صحيحا فان مجموعة السجلات تماما فارغة .
يجب عليك التاكد من ان مجموعة السجلات ليست على اوس او اخس قبل
محاولة الوصول الى محتويات مجموعة السجلات ,مثل هذا فان استعراض مجموعة
او انت تحصل على الخطا .
التالي يظهر لك كيف تتجنب الاخطاء.

If NOT rsRecordset.BOF and NOT rsRecordset.EOF Then
rsRecordset.MoveFirst
End If


Adding, Editing, and Deleting Records in a Recordset
اضافة ,تعديل ,وحذف سجلات في مجموعة السجلات
بعدما صنعت مجموعة السجلات فانك تستطيع اضافة او تعديل او حذف سجلات
انت تعلمت للتو من المثال السابق ان اذا كانت مجموعة السجلات مرتبطة
بخاصية – Recordset-والحاكمات االمقابلة على النموذج ,ففي اللحظة
التي تغير فيها السجل على النموذج فانه يتعدل في قاعدة البيانات الداخلية .
انت لست بحاجة لكتابة كود لعمل التعديل .
الادو له طرقا كثيرة والتي تسمح لتنفيذ الاضافة ,التعديل والحذف
من داخل الكود بواسطة الطرق- AddNew, Update, and Delete-
والتي تخص كائن مجموعة السجلات .
وسوف اقدم باختصار كل من هذه الطرق وساوضح كل بتفصيل
بواسطة امثلة عملية –شكرا دينيس-.ان شاء الله .

Adding a New Record with the AddNew Method
اضافة سجل جديد بواسطة الطريق – AddNew-
هذا الطريق يضيف سجل فارغ لمجموعة السجلات والذي يمكن ملؤه بمعلومات اضافية .

rsRecordset.AddNew
اذا كانت مجموعة السجلات متصلة بمصدر البيانات ,فان السجل
سوف يضاف لمصدر البيانات الداخلي غيرذلك –منفصلة-
فان السجل الجديد يخزن في مجموعة السجلات المحلية ويجب ان يتم
تحديثه مع مصدر البيانات الداخلية , او ان السجل الجديد يضيع.
هذا يدعى العمل مع مجموعة البيانات المنفصلة وسيوضح ذلك
بتفصيل في الامثلة القادمة .

Updating an Existing Record with the Update Method
تحديث سجل موجود بالطريق – Update-
هذا الطريق يحدث السجل الحالي .ان استعمل هذا الطريق
مع التقاطع بالطريق – AddNew-فان المعلومات من السجل الفارغ سوف
تنتقل الى نهاية مجموعة السجلات .

rsRecordset.Update
اذا اتصلت مجموعة السجلات مع مصدر البيانات ,فان التغييرات تخزن في
مصدر البيانات الداخلي .وان كانت مجموعة السجلات منفصلة
مع مصدر البيانات فان التغييرات سوف تخزن في مجموعة السجلات المحلية
ويجب ان يتم تحديثها في دفعات او في شكل اخر مع مصدر البيانات
الداخلي او ان التعديلات سوف يتم فقدانها .

Deleting an Existing Record with the Delete Method
حذف سجل موجود بواسطة -الطريق- Delete

هذا الطريق يحذف السجل الحالي .

rsRecordset.Delete
مرة اخرى اذا كانت مجموعة السجلات متصلة مع مصدر البيانات
فان الحذف يحدث على مصدر البيانات الداخلي .
وان كانت منفصلة فان السجل يحذف من مجموعة السجلات المحلية
ويجب فيما بعد ان يزال من مصدر البيانات الداخلي .
والى لقاء اخر قريبا ان شاء الله

عارف حسان
07-10-2012, 08:53
السلام عليكم ورحمة الله وبركاته
وان كان كلا اوس واخس صحيحا فان مجموعة السجلات تماما فارغة .

وعليكم السلام ورحمة الله وبركاته
خاصية اوس (أول سجل) .. وخاصية اخس (آخر سجل)
إبداع :):):)
جميل .. أيها الجميل.

أبو يوسف1
08-10-2012, 06:27
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
احاول ان ابسط الامور وابتعد عن استعمال اللغتان معا وايجاد البديل العربي ما امكن
وان اتفق اطراف على استعمال مدلول معين على شيء ما اصبح عرفا جائز الاستخدام على الاقل فيما بينهم .
اشكر لك اخي واستاذي العزيز ابا محمد حضورك الكريم وبارك بك ربي وجزاك عنا دائما كل الخير
وتقبل دائما خالص تحياتي وتقديري العميقين

omar19-3
08-10-2012, 11:41
الله أكبر عليك أستاذى الكريم أبو يوسف1

بارك الله فيك وآلك..

أحمد الحربي
09-10-2012, 06:32
تجولتُ في هذا التجوال فاستفدتُ فوائد كثيرة
شكر الله لك أخي أبا يوسف وجزاك خيراً
جهدٌ رائعٌ وفكرةٌ غير مسبوقة

إخوتي الكرام ..
هذا الموضوع يُعدّ مرجعاً في مواضيع شتى ، وللاستفادة منه في مواضيع أخرى، انسخ رابط رقم المشاركة، وضعه في موضوعك بطريقتين : إما وضع الرابط فقط، وإما جلب المشاركة إلى الصفحة عن طريق زر لف البطاقات ، وسأجري التطبيق على المشاركة رقم33 :

انقر على رقم المشاركة 33 وانسخ الرابط.

طريقة وضع الرابط :
http://www.accesswordkingdome.com/forum/showpost.php?p=61235&postcount=33
فهنا ستفتح في نافذة جديدة على مشاركة واحدة فقط وهي المشاركة المطلوبة.

طريقة لف البطاقات، وستضع المشاركة داخل موضوعك :
http://www.accesswordkingdome.com/forum/showpost.php?p=61235&postcount=33

أبو يوسف1
09-10-2012, 10:03
الاخ العزيز omar19-3
السلام عليكم ورحمة الله وبركاته
الحمد لله هذا من فضل الله ومن ثم دعواتكم الكريمة .
وبك ربي بارك وجزاك الله الخير كله , وحياك الله اخي العزيز دائما

أبو يوسف1
09-10-2012, 10:21
اخي واستاذي العزيز احمد الحربي
السلام عليكم ولرحمة الله وبركاته
اشكر لك لطفك وتواضعك الجمين ودعمك الكريم المتواصل لهذا العمل واعمال الاخوة والاساتذة الاعزاء الذين كل والحمد لله يقدم ما هو رائع ومفيد .
في هذا الصرح الرائع يوجد بحمد الله جامعة لعلوم الاكسس وتوابعه وددر كثيرة وخلاصة خبرات
لاساتذة علماء كباروالحمد لله .
يحتاج الواحد لاشهر بل لسنوات لادراكها
عندما قدمت اليكم كنت اظن انني اعرف شيئا عن الاكسس -هكذا خيل لي بعد تصفح بعض النشرات والمواضيع-
ولكن في هذه المملكة الرائعة اكتشفت انني كنت جارا لمن سمع بالاكسس -.
الحمد لله مواضيع رائعة مركزة وفي العمق وليست قشورا ولا فتات .
بارك الله بكم دوما وجزاكم الله عنا كل الخير.

أبو يوسف1
09-10-2012, 12:30
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس من الفصل الخامس وعلى بركة الله وباسم الله نبدا :


Building an Unbound Contacts Form Using a Disconnected Recordset
بناء نموذج اتصال غير مربوط مستعملا مجموعة سجلات منفصلة –تطبيق عملي
حان الوقت لبناء نموذج اتصلات معتمدا على مجموعة سجلات منفصلة
1-اختر النموذج الذي صنعته سابقا والمسمى- frmContactsBound-
انقر الزر الايمن للماوس واختر نسخ ثم الصق واعط الاسم- frmContactsUnbound-
للنموذج الوليد .
2- افتح النموذج الوليد وامسح الكود الحالي في حدث التحميل للنموذج من خانة الحدث
من المحرر الفيجولي .
3- اضبط خصائص التالية:- Record Selectors, Navigation Buttons, and Dividing Lines-
الى -- No—كما في الشكل 5.9.
4-اضف سبع ازرار امر للنموذج واضبط خاصية الاسم لكل منهم الى:
cmdMoveFirst, cmdMovePrevious, cmdMoveNext, cmdMoveLast,
cmdAddNew- cmdDelete, and cmdSaveAll على الترتيب .

غير خاصية الكابشن لكل زر امر الى:

Move First, Move Previous, Move Next, Move Last
Add New, Delete, and Save Changes To Database
على الترتيب .غير خاصية الصورة لازرار الاستعراض الاربع
للصور الموجودة المسماه:

Go To First 1, Go To Previous 1, Go To Next
and Go To Last 1 على الترتيب .
بل الصور للازرار يمكنك استعمال النص كما يتطلب الكابشن .
النموذج يجب ان يشابه للنموذج المتوضح في الشكل 5.10
5-اضف الكود التالي لقسم التصريحات العامة للنموذج:

Dim rsContacts As ADODB.Recordset
Dim cnCh5 As ADODB.Connection
Dim strConnection As String

6- اضف الكود التالي لحدث التحميل للنموذج :

Private Sub Form_Load()
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;"
;"Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb"
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
'specify a cursortype and lock type that will allow updates
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", cnCh5
'disconnect the recordset
.ActiveConnection = Nothing
End With
'if the recordset is empty
If rsContacts.BOF And rsContacts.EOF Then
Exit Sub
Else
'move to the first record
rsContacts.MoveFirst
'populate the controls on the form
Call PopulateControlsOnForm
End If
'close the database connection and release it from memory
cnCh5.Close
Set cnCh5 = Nothing
End Sub

7-اصف اجراء الحدث التالي الى نمطية الفئة للنموذج :.

Private Sub cmdAddNew_Click()
'add a new record to the local disconnected recordset
Call AddRecord
End Sub
Private Sub cmdDelete_Click()
'delete the current record from the local disconnected recordset
Call DeleteRecord
End Sub
Private Sub cmdMoveFirst_Click()
'move to the first record in the local disconnected recordset
Call MoveToFirstRecord
End Sub
Private Sub cmdMoveLast_Click()
'move to the last record in the local disconnected recordset
Call MoveToLastRecord
End Sub
Private Sub cmdMoveNext_Click()
'move to the next record in the local disconnected recordset
Call MoveToNextRecord
End Sub
Private Sub cmdMovePrevious_Click()
'move to the previous record in the local disconnected recordset
Call MoveToPreviousRecord
End Sub
Private Sub cmdSaveAll_Click()
'save all changes made to the local disconnected recordset
'back to the database
Call SaveAllRecords
End Sub

8-اضف الاجراء التالي لنمطية الفئة للنموذج :

Sub AddRecord()
'add a new record to the local disconnected recordset
rsContacts.AddNew
'commit the new empty record to the local disconnected recordset
rsContacts.Update
'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearControlsOnForm
End Sub
Sub DeleteRecord()
'delete the record from the local disconnected recordset
rsContacts.Delete
'commit the deletion to the local disconnected recordset
rsContacts.Update
'move to the first record since the current one has been deleted
rsContacts.MoveFirst
'populate the controls on the form
Call PopulateControlsOnForm
End Sub

9-اضف اجراءات الاستعراض التالي لنمطية الفئة للنموذج :

Sub MoveToFirstRecord()
'before performing move operation, save the current record
Call SaveCurrentRecord
'move to the first record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveFirst
'populate the controls on the form with the current record
Call PopulateControlsOnForm
End If
End Sub
Sub MoveToLastRecord()
'before performing move operation, save the current record
Call SaveCurrentRecord
'move to the last record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveLast
'populate the controls on the form with the current record
Call PopulateControlsOnForm
End If
End Sub
Sub MoveToPreviousRecord()
'before performing move operation, save the current record
Call SaveCurrentRecord
'move to the previous record in the local disconnected recordset
'if not already at the beginning
If Not rsContacts.BOF Then
rsContacts.MovePrevious
'populate the controls on the form with the current record
Call PopulateControlsOnForm
End If
End Sub
Sub MoveToNextRecord()
'before performing move operation, save the current record
Call SaveCurrentRecord
'move to the next record in the local disconnected recordset
'if not already at the end
If Not rsContacts.EOF Then
rsContacts.MoveNext
'populate the controls on the form with the current record
Call PopulateControlsOnForm
End If
End Sub

10-اضف الاجراءات التالي لنمطية الفئة للنموذج :

Sub PopulateControlsOnForm()
'Populate the controls on the form with the values of the
'current record in the local disconnected recordset.
'Use the same field names as the tblContacts table from
'which it was generated.
If Not rsContacts.BOF And Not rsContacts.EOF Then
Me.txtLastName = rsContacts!txtLastName
Me.txtFirstName = rsContacts!txtFirstName
Me.txtMiddleName = rsContacts!txtMiddleName
Me.txtTitle = rsContacts!txtTitle
Me.txtAddress1 = rsContacts!txtAddress1
Me.txtAddress2 = rsContacts!txtAddress2
Me.txtCity = rsContacts!txtCity
Me.txtState = rsContacts!txtState
Me.txtZip = rsContacts!txtZip
Me.txtWorkPhone = rsContacts!txtWorkPhone
Me.txtHomePhone = rsContacts!txtHomePhone
Me.txtCellPhone = rsContacts!txtCellPhone
ElseIf rsContacts.BOF Then
'past beginning of recordset so move to next record
rsContacts.MoveNext
ElseIf rsContacts.EOF Then
'past end of recordset so move back to previous record
rsContacts.MovePrevious
End If
End Sub
Sub ClearControlsOnForm()
'clear the values in the controls on the form
Me.txtLastName=""
Me.txtFirstName=""
Me.txtMiddleName=""
Me.txtTitle=""
Me.txtAddress1=""
Me.txtAddress2=""
Me.txtCity=""
Me.txtState=""
Me.txtZip=""
Me.txtWorkPhone=""
Me.txtHomePhone=""
Me.txtCellPhone=""
End Sub
Sub SaveCurrentRecord()
'save the values in the controls on the form to the current record
'in the local disconnected recordset.
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts!txtLastName = Me.txtLastName
rsContacts!txtFirstName = Me.txtFirstName
rsContacts!txtMiddleName = Me.txtMiddleName
rsContacts!txtTitle = Me.txtTitle
rsContacts!txtAddress1 = Me.txtAddress1
rsContacts!txtAddress2 = Me.txtAddress2
rsContacts!txtCity = Me.txtCity
rsContacts!txtState = Me.txtState
rsContacts!txtZip = Me.txtZip
rsContacts!txtWorkPhone = Me.txtWorkPhone
rsContacts!txtHomePhone = Me.txtHomePhone
rsContacts!txtCellPhone = Me.txtCellPhone
End If
End Sub
Sub SaveAllRecords()
'Save current record to local disconnected recordset
Call SaveCurrentRecord
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'set the disconnected recordset to the reopened connection
Set rsContacts.ActiveConnection = cnCh5
'save all changes in the local disconnected recordset back
'to the database
rsContacts.UpdateBatch
'disconnect the recordset again
Set rsContacts.ActiveConnection = Nothing
'close the database connection and release it from memory
cnCh5.Close
Set cnCh5 = Nothing
End Sub

11- اضف اجراء الحدث التالي للنموذج :

Private Sub Form_Unload(Cancel As Integer)
Dim intResponse As Integer
'prompt the user to save changes
intResponse = MsgBox("Save All Changes To Database?", vbYesNo)
If intResponse = vbYes Then
'save all local records in disconnected recordset back
'to the database in a batch update
Call SaveAllRecords
ElseIf intResponse = vbNo Then
MsgBox "Unsaved changes were discarded."
End If
'release the recordset from memory
Set rsContacts = Nothing
End Sub

12- احفظ كل التغييرات في المحرر الفيجولي من حفظ في شريط الادوات
13-احفظ كل التغييرات من عرض التصميم باختيار حفظ من شريط الادوات
14- افتح النموذج في طور العرض حيث يظهر على الشاشة مثل
الذي في الشكل 5.11 مظهرا بعض البيانات .
15-اعمل تغييرات للقيم-الظاهرة- على الشاشة واستعرض للسجل التالي
وعندما ترجع للسجل انتبه ان كانت التغييرات لم تتغير بعد .
16-اغلق النموذج بدون حفظ انظر ان كانت التغييرات التي عملتها سابقا موجودة .
17-اعمل تغييرات للقيم-الظاهرة- على الشاشة واختر الخيار
حفظ جميعا لقاعدة البيانات .
اعتذر عن الاخطاء خلال الصق والنسخ وطبعا دائما عن اخطاء الترجمة او استعمال مفردات غير دارجة
مرفق الصور
مرفق المثال للجزء الرابع مرفق المثال للجزء السادس والامثلة منقوله من المؤلف
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
11-10-2012, 06:26
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع من الفصل الخامس وعلى بركة الله وباسم الله نبدا :

How It Works
كيف تعمل
بداية عملت نسخة من النموذج النموذج الموجود- frmContactsBound-وتفضلت بتسميته
- frmContactsUnbound--ووضعت عليه ازرار اوامر تحكم عددها سبعة وهذه الازرار عنونت
- لاستعراض السجلات =التالي ,السابق,الاول والاخير= وعمليات ,اضافة ,حذف وحفظ .
- وبعدها اضفت الكود لقسم التصريحات العامة للنموذج لكائن - Recordset-وكائن – Connection-
- ومتغير- connection string-وهولاء كلهم وضعوا في قسم التصريحات العامة لان المطلوب ان يظلوا
- في المدى طالما النموذج مفتوح.


Dim rsContacts As ADODB.Recordset
Dim cnCh5 As ADODB.Connection
Dim strConnection As String

تاليا انت اضفت حدث التحميل للنموذج عند فتح الاتصال ومجموعة السجلات انشئت .

Private Sub Form_Load()
strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & -
;"Data Source=" & CurrentProject.Path & "\Ch5CodeExamples.mdb"
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset

وبعد ذلك ضبطت خصائص مختلفة لكائن مجموعة السجلات مثل نوع المشيرة لتحديد
ان المشيرة يجب ان تكون - client side-ونوع القفل ليحدد مجموعة السجلات يجب ان تكون
batch optimistic-.مجموعة السجلات بعدها تم فتحها وفصلت عن مصدر البيانات
باختيار خاصية الاتصال النشط – ActiveConnection- الى لا شيء - nothing-.
[/B]


'set various properties of the recordset
With rsContacts
'specify a cursortype and lock type that will allow updates
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
'open the recordset based on tblContacts table using the existing
connection
.Open "tblContacts", cnCh5
'disconnect the recordset
.ActiveConnection = Nothing
End With

بوضع الانفصال لمجموعة السجلات عن مصدر البيانات فان مجموعة السجلات ببساطة خزنت في الذاكرة المحلية
واي تغيير تم عمله لمجموعة السجلات المنفصلة لا يخزن اوتوماتيكيا في مصدر البيانات الاصلي .
بعدها انت اضفت الكود لاستدعاء اجراء لتجميع الحاكمات على النموذج بالقيم في مجموعة السجلات .

'if the recordset is empty
If rsContacts.BOF And rsContacts.EOF Then
Exit Sub
Else
'move to the first record
rsContacts.MoveFirst
'populate the controls on the form
Call PopulateControlsOnForm
End If

الاتصال مع قاعدة البيانات بعد ذلك تم اغلاقة وحرر من الذاكرة .]

'close the database connection and release it from memory
cnCh5.Close
Set cnCh5 = Nothing
End Sub

وبعدها اضفت اجراءات لاحداث متعددة لاستدعاء بقية الكود عندما يختار المستخدم
خيارات مختلفة على النموذج .مثال حدث- cmdAddNew_Click-قد اضيف
لاستدعاء الاجراء- AddRecord-عندما المستخدم ينقر الزر اضافة جديد على النموذج .
اجراء مشابه قد اضيف للحذف.


Private Sub cmdAddNew_Click()
'a new record to the local disconnected recordset
Call AddRecord
End Sub

اجراءات لاحداث مختلفة قد اضيفت للتعامل مع الاستعراض خلال مجموعة السجلات
مثال حدث النقر- cmdMoveFirst_Click-قد اضيف لاستدعاء الاجراء للانتقال للسجل الاول.

Private Sub cmdMoveFirst_Click()
'move to the first record in the local disconnected recordset
Call MoveToFirstRecord
End Sub

اجراءات اخرى مشابه قد تم اضافتها للتنقل للاخير ,للتالي ,للسابق.
واجراءات احداث اضيفت ايضا للحفظ لاجراء الحدث الحفظ لكل السجلات للتنفيذ
عند النقر على الزر حفظ على النموذج .

Private Sub cmdSaveAll_Click()
'save all changes made to the local disconnected recordset
'back to the database
Call SaveAllRecords
End Sub

وبعدها اضفت الاجراءات والتي تطور حقيقة القلب- الجوهر -لعملية النموذج المنفصل .
الاجراء اضافة سجل يستدعى من حدث عند النقر على الزر- cmdAddNew-.بعد نقر المستخدم
على الزر اضافة جديد من على النموذج .
الاجراء اضافة سجل يستعمل الطريق- AddNew-لاضافة سجلا جديدا لمجموعة السجلات المحلية
المنفصلة –عن المصدر-ويسلم السجل الوليد الفارغ الى مجموعة السجلات المنفصلة
مستعملا الطريق تحديث- Update-.

Sub AddRecord()
'add a new record to the local disconnected recordset
rsContacts.AddNew
'commit the new empty record to the local disconnected recordset
rsContacts.Update

الحاكمات على النموذج بعدها تفرغ حتى يمكن المستخدم من ادخال قيم
للسجل الوليد

'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearControlsOnForm
End Sub

الاجراء حذف سجل يستدعى عند عمل حدث النقر علىالزر - cmdDelete-.
هذا الاجراء يحذف السجل الحالي في مجموعة السجلات المحلية مستعملا الطريق – Delete-
وبعدها يسلم التغييرات لمجموعة السجلات المحلية بوساطة الطريق تحديث- Update-.

Sub DeleteRecord()
'delete the record from the local disconnected recordset
rsContacts.Delete
'commit the deletion to the local disconnected recordset
rsContacts.Update

الاجراء بعد ذلك يعيد تموضع مجموعة السجلات الى السجل الاول ويظهر ذلك
السجل –الاول-على النموذج للمستخدم .

'move to the first record since the current one has been deleted
rsContacts.MoveFirst
'populate the controls on the form
Call PopulateControlsOnForm
End Sub

بعد ذلك تم اضافة اجراءات استعراض مختلفة للتعامل مع الحركة خلال مجموعة السجلات المنفصلة .
مثال الانتقال للسجل الاول يتم استدعاؤه عند قدح حدث النقر على الزر- cmdMoveFirst-.
هذا الاجراء يحفظ السجل الحالي في مجموعة السجلات المحلية قبل التنقل للسجل الاول .


Sub MoveToFirstRecord()
'before performing move operation, save the current record
Call SaveCurrentRecord
'move to the first record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveFirst
'populate the controls on the form with the current record
Call PopulateControlsOnForm
End If
End Sub

مرة اخرى تذكر ان جميع عمليات الحفظ هذه حتى الان فقط تحدث النسخة
المحلية لمجموعة السجلات ولكن ليس جدو ل قاعدة البيانات الداخلي والذي جاءت منه السجلات .
وسوف ترى –طال عمرك بالخير-في لحظات كيف تحفظ التعديلات في مصدر البيانات الاصلي .
الاجراء- PopulateControlsOnForm- تضبط حاكمات مربعات النصوص على النموذج
الى القيمة الحالية في مجموعة السجلات.
بكلمات اخرى هذا الكود يظهر القيم في مجموعة السجلات للمستخدم على النموذج .

Sub PopulateControlsOnForm()
'Populate the controls on the form with the values of the
'current record in the local disconnected recordset.
'Use the same field names as the tblContacts table from
'which it was generated.
If Not rsContacts.BOF And Not rsContacts.EOF Then
Me.txtLastName = rsContacts!txtLastName
Me.txtFirstName = rsContacts!txtFirstName
Me.txtMiddleName = rsContacts!txtMiddleName
Me.txtTitle = rsContacts!txtTitle
Me.txtAddress1 = rsContacts!txtAddress1
Me.txtAddress2 = rsContacts!txtAddress2
Me.txtCity = rsContacts!txtCity
Me.txtState = rsContacts!txtState
Me.txtZip = rsContacts!txtZip
Me.txtWorkPhone = rsContacts!txtWorkPhone
Me.txtHomePhone = rsContacts!txtHomePhone
Me.txtCellPhone = rsContacts!txtCellPhone
ElseIf rsContacts.BOF Then
'past beginning of recordset so move to next record
rsContacts.MoveNext
ElseIf rsContacts.EOF Then
'past end of recordset so move back to previous record
rsContacts.MovePrevious
End If
End Sub
حاكمات المسح على النموذج- ClearControlsOnForm-تفرغ
حاكمات ادخال البيانات للسماح المستخدم لاضافة السجل الجديد .
Sub ClearControlsOnForm()
'clear the values in the controls on the form
Me.txtLastName = ""
Me.txtFirstName = ""
Me.txtMiddleName = ""
Me.txtTitle = ""
Me.txtAddress1 = ""
Me.txtAddress2 = ""
Me.txtCity = ""
Me.txtState = ""
Me.txtZip = ""
Me.txtWorkPhone = ""
Me.txtHomePhone = ""
Me.txtCellPhone = ""
End Sub

اجراء حفظ السجل الحالي- SaveCurrentRecord- يحفظ القيم الموجودة في الحاكمات
على النموذج الى السجل الحالي في مجموعة السجلات المحلية المنفصلة .

Sub SaveCurrentRecord()
'save the values in the controls on the form to the current record
in the local disconnected recordset.
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts!txtLastName = Me.txtLastName
rsContacts!txtFirstName = Me.txtFirstName
rsContacts!txtMiddleName = Me.txtMiddleName
rsContacts!txtTitle = Me.txtTitle
rsContacts!txtAddress1 = Me.txtAddress1
rsContacts!txtAddress2 = Me.txtAddress2
rsContacts!txtCity = Me.txtCity
rsContacts!txtState = Me.txtState
rsContacts!txtZip = Me.txtZip
rsContacts!txtWorkPhone = Me.txtWorkPhone
rsContacts!txtHomePhone = Me.txtHomePhone
rsContacts!txtCellPhone = Me.txtCellPhone
End If
End Sub

الاجراء – SaveAllRecords-ينفذ من حدث النقر على الزر- cmdSaveAll-
الموجود على النموذج .هذا الاجراء مسؤول عن تحديث قاعدة الببانات بالنسخة الحالية
لكل السجلات في مجموعة السجلات المنفصلة .اولا التغييرات تحفظ الى السجلات الحالية
في مجموعة السجلات المحلية والاتصال يعاد انشاؤه مع قاعدة البيانات-المصدر- .

Sub SaveAllRecords()
'Save current record to local disconnected recordset
Call SaveCurrentRecord
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection

لاعادة ربط مجموعة السجلات مع مصدر البيانات الداخلي .خاصية الربط النشط- ActiveConnection-
يجب ان تعين للاتصال الحالي المفتوح .

'set the disconnected recordset to the reopened connection
Set rsContacts.ActiveConnection = cnCh5

بعد اعادة الربط لمصدر البيانات الداخلي .الطريق- UpdateBatch-ينفذ
التحديث في مصدر البيانات الاصلي لكل التغييرات المحلية .

'save all changes in the local disconnected recordset back
'to the database
rsContacts.UpdateBatch

مع اكتمال التحديثات فان مجموعة السحلات مرة اخرى تنفصل لحفظ اتصال مفتوح
والاتصال مع قاعدة البيانات مرة اخرى يحرر .-تحرير انفصال-.

'disconnect the recordset again
Set rsContacts.ActiveConnection = Nothing
'close the database connection and release it from memory
cnCh5.Close
Set cnCh5 = Nothing
End Sub

وكمميزات اضافية الكود وضع تحت الحدث - Form_Unload- حتى يتاكد القاريء من
حفظ التغييرات قبل اغلاق النموذج .- بقراءة الرسالة التي تظهر -


Private Sub Form_Unload(Cancel As Integer)
Dim intResponse As Integer
'prompt the user to save changes
intResponse = MsgBox("Save All Changes To Database?", vbYesNo)
If intResponse = vbYes Then
'save all local records in disconnected recordset back
'to the database in a batch update
Call SaveAllRecords
ElseIf intResponse = vbNo Then
MsgBox "Unsaved changes were discarded."
End If
'release the recordset from memory
Set rsContacts = Nothing
End Sub

لاحظ في هذا –الحالة- المثال يجب عليك كتابة الكود لتنفيذ استعراض السجلات وتحديث السجلات بسبب ان
مجموعة السجلات منفصلة عن مصدر البيانات الداخلي .هذا بالتاكيد استهلاك وقت اضافي
اكثر من مثال مجموعة السجلات المتصلة ,والتي تتعامل مع استعراض السجلات والتحديث للسجلات
بشكل الي .على اي حال انا اوصي –دينيس- ان تستعمل مجموعات السجلات المنفصلة وتتعامل
مع تفاعلات البيانات بدون حفظ الاتصال مفتوحا مع قاعدة البيانتات .
هذا يساعدك في كتابة التطبيق والذي يدعم مستخدمين اكثر ومن السهل ان
يندمج بسهولة اكثر مع قواعد بيانات احدث مثل سيرفر الاس كيو ال .
فيما بعد في هذا الفصل سوف نرى مثالا اخر مستعملا مجموعة سجلات منفصلة وايضا
عبارات اس كيو ال للتعامل مع النماذج المنفصلة .

ودائما ارجو الانتباه للفواصل وعلامات الترقيم في الكودات حيث من اللصق تتخربط احيانا وللاسف لا استطيع ان اضبطها
خايف بدل ما اكحلها اعور عينها .وحدثت فعلا .لذلك الانتباه ضروي .
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
12-10-2012, 03:14
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثامن من الفصل الخامس وعلى بركة الله وباسم الله نبدا :


Sorting, Finding, Filtering records in a Recordset
ترتيب ,ايجاد ,تصفية السجلات في مجموعة السجلات
كائن مجموعة السجلات له خواص وطرق مختلفة والتي تسمح لك بترتيب وتصفية وايجاد السجلات.
بعض الامثلة لهذه الخواص سوف يناقش .

The Sort Property
خاصية الترتيب
هذه الخاصية تسمح لتعديل الدور –الترتيب- الذي تظهر به السجلات في مجموعة السجلات .

Sorting Records for the Unbound Contacts Form
ترتيب السجلات لنموذج الاتصالات المنفصل
انظر الى المثال لكيف ترتب مجموعة السجلات- rsContacts-والتي استعملتها سابقا .
1- في الكود لاجراء حدث التحميل - Form_Load-في النموذج – frmContactsUnbound-حالا بعد
سطر ضبط الخاصية- ActiveConnection-اضف الامر التالي- Sort-:


With rsContacts
'specify a cursortype and lock type that will allow updates
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockBatchOptimistic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", cnCh5
.disconnect the recordset
.ActiveConnection = Nothing
'sort the recordset
".Sort = "txtLastName, txtFirstName, txtMiddleName
End With

2- افتح النموذج واستعرض السجلات .

How It Works
كيف تعمل
الطريق – Sort-لكائن – Recordset-يسمح لك بان تحدد حقلا واحدا او اكثر
بالشكل التي ترتب فيها مجموعة السجلات .
المثال السابق رتب السجلات بالشكل : الاسم الاخير ,الاسم الاول ,الاسم الاوسط.
امل انك لاحظت عندما شغلت النموذج مرة اخرى ان الترتيب كان ابجديا
بالاعتماد على الحقول الثلاث انفة الذكر.


The Find Method
الطريق – Find-
الطريق – Find-لكائن – Recordset-يسمح لك للاستعراض لسجل مفرد والذي يوافق معيار معين .
هنا مثال لاجراء مستعملا الطريق- Find-لتحديد السجل الذي له القيمة - intContactId of 2-



Sub TestFind()
Dim rsContacts As ADODB.Recordset
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
.CursorType = adOpenStatic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", CurrentProject.Connection
End With
'find a contact with the intContactId value of 2
rsContacts.Find "[intContactId] = 2"
'output a message to the Immediate Window regarding find results
If rsContacts.EOF Then
Debug.Print "Specified record not found"
Else
'record was found - display some info
Debug.Print "Contact Id: " & rsContacts!intContactId & -
- & " Last Name: " & rsContacts!txtLastName
" First Name: " & rsContacts!txtFirstName
End If
'close the recordset
rsContacts.Close
'set the recordset and connection to nothing
Set rsContacts = Nothing
End Sub

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

The Filter Property
خاصية التصفية
هذه الخاصية تسمح لك بتصفية مجموعة السجلات الى مجموعة فرعية اصغر
والتي توافق معيار معين .مثال انت ربما تريد بتصفية مجموعة السجلات
للاسماء الاخيرة التي تبدا بحرف معين .


Sub TestFilter()
Dim rsContacts As ADODB.Recordset
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
.CursorType = adOpenStatic
'open the recordset based on tblContacts table using the existing connection
.Open "tblContacts", CurrentProject.Connection
End With
'filter the recordset to contain only records with
'last names starting with D
rsContacts.Filter = "txtLastName Like 'D'*"
'output a message to the Immediate Window regarding find results
If rsContacts.EOF Then
Debug.Print "No records met that criteria."
Else
'record was found - display some info for each record
Do Until rsContacts.EOF
Debug.Print "Contact Id: " & rsContacts!intContactId & -
- & " Last Name: " & rsContacts!txtLastName
" First Name: " & rsContacts!txtFirstName
rsContacts.MoveNext
Loop
End If
'close the recordset
rsContacts.Close
'set the recordset and connection to nothing
Set rsContacts = Nothing
End Sub

المثال السابق يستعمل الخاصية – Filter-لفلترة مجموعة السجلات الى
السجلات والتي تبدا بالحرف – D-.وحتى تؤكد عمل التصفية فان كل
السجلات المتبقية تظهر في الشاشة الفورية كما في الشكل 5.13.


Using Bookmarks to Mark and Locate Data
استعمال العلامات لتمييز-وضع علامة للتمييز- وايجاد -موقع- البيانات
العلامات-المؤشرات - تسمح لك بان تعللم-تميز-المكان في مجموعة السجلات لترجع الى ذلك المكان فيما بعد
مثال افترض انت لديك متغير اسمه- varPosition-والذي تم تصريحه ك – variant-.
تستطيع ان تخزن المكان للسجل الحالي في المؤشرات -.

varPosition = rsContacts.Bookmark
وبعدها ترجع اليه بواسطة ضبط خاصية - Bookmark -الى المكان المخزن .

rsContacts.BookMark = varPosition
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
14-10-2012, 08:14
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء التاسع من الفصل الخامس وعلى بركة الله وباسم الله نبدا

Introduction to SQL
مقدمة الى اس كيو ال
هذه اللغة الاس كيو ال : لغة خاصة لبناء اوامر والتي تتواصل -تتفاهم - مع قواعد البيانات .
يوجد لهجات متغيره من عبارات SQL وتشمل - Jet SQL, ANSI SQL-.
وتعديلات البائع او المصنع -للغة- على - ANSI SQL- مثل -T-SQL – من اجل سيرفر SQL .
الصيغة العامة لعبارات SQL والتي تستخدمها تتغير قليلا- نونو-معتمدة على قاعدة البيانات الداخلية .
في هذا القسم ساغطي –دينيس- SQL والعامة لاغلب قواعد البيانات .
عبارات SQL تستعمل مع و بدون الادو .مثال عبارة SQL يمكن ان تعين لخاصية – RecordSource-
والتي يرتبط اليها النموذج .
المثال في هذا القسم سوف يوضح استعمال عبارات SQL مع الادو .
لاحظ انك تستطيع رؤية عبارات SQL في مصمم الاستعلام وعندك مساعد مصمم الاستعلامات لصنع SQL .
اذا اخترت عرض ثم SQL من شاشة الاستعلام يمكن ان ترى عبارة SQL والتي صنعها الاكسس
لعبارتك .وسوف تتعلم –ان شاء الله –كيف تكتب عبارات SQL بدون استعمال المصمم.

Retrieving Data Using SQL Select Statements
استرجاع البيانات مستعملا عبارات – Select- في SQL
عبارة اختيار- Select-تمكنك من استرجاع السجلات من جدول واحد او اكثر في قاعدة البيانات
ولها الصيغة العامة الاساسية كالتالي:

SELECT columns FROM tables WHERE where-clause ORDER BY columns

Select Clause
جملة اختيار – Select-
ملاحظة كلمة – Clause-قد تعني شبه جملة لكنني استخدمت
المعنى جملة للاختصار .
هذه الجملة تحدد اي اعمدة في الجدول او الجداول الداخلية التي تريد استرجاعها .
لاسترجاع كل السجلات في جدول معين استعمل :


SELECT *
لاختيار اعمده مفردة من الجدول مثل الاسم الاخير ,الاسم الاول اسرد كل اسم مفصولا بفاصلة .

SELECT txtLastName, txtFirstName
تاكيد او تقييد او حصر الخيارات ممكن استخدامها كجزء من عبارة – Select-لتشديد اكثر على
السجلات الراجعة.الراجعة: الجواب او النتيجة للعبارة.
على سبيل المثال تستطيع استعمال الحصر - Distinct-لتحديد النتائج للسجلات الفريدة:


SELECT DISTINCT txtLastName
هذه العبارة تعطي الاسماء الاخيرة الفريدة اي لا يوجد تكرار للاسم .
الحصر - Top-يقيد عدد السجلات الراجعة لعدد محدد اوبنسبة مئوية .
مثال العبارة التالية تحدد العدد للسجلات الراجعة الى خمسة


SELECT TOP 5 intSalesAmt from tblOrders

From Clause
جملة من – From-
هذه الجملة تحدد الجداول التي يتم اختيار السجلات منها .
الصيغة الاساسية للجملة :


FROM tblContacts
يمكن ان تحدد اسما جديدا للجدول او اسما مستعارا للجدول.

FROM tblContacts As Contacts

هذا الاسم- Contacts- ليستعمل في هذه العبارة فقط
هذا الاسم لا يغير الاسم الاصلي-- tblContacts وانما تكنية مؤقته للجدول داخل هذه العبارة فقط .

لاسترجاع بيانات من اكثر من جدول استعمل - Inner, Left, or Right Join-
لربط الجداول معا .
هنا الصيغة الاساسية للربط :

FROM <left table name> <join type> <right table name> ON <left join field
name> = <right join field name>

التالية تبين الخلاف بين كل نوع من الربط :
INNER JOIN: يجمع –يسرد- السجلات من الجداول التي يكون هناك تشابه في قيم الربط في الجداول .

LEFT JOIN: يجمع-يسرد- كل السجلات من الجدول والتي على يسار جملة الربط حتى ان
لم يكن هناك تشابه للسجلات من الجدول في الجهة اليمنى للجملة.

RIGHT JOIN: يجمع-يسرد- كل السجلات من الجدول والتي على يمين جملة الربط حتى ان
لم يكن هناك تشابه للسجلات من الجدول في الجهة اليسرى للجملة.

مثال للربط الداخلي- inner join-:

FROM tblContacts INNER JOIN tblSuppliers ON tblContacts.LastName =
tblSuppliers.LastName

مثال للربط اليساري- left join –:

FROM tblContacts LEFT JOIN tblSuppliers ON tblContacts.LastName =
tblSuppliers.LastName


المثال السابق يعيد-يسرد- كل السجلات من الجدول- tblContacts –وفقط التي
تشابه الموجود في جدول- tblSuppliers-.

Where Clause
جملة بينما
هذه الجملة تستعمل لتحديد –تقييد-الاسطر التي تسترجعها عبارة SQL.
هذه العبارة اختيارية .
ان كانت هذه العبارة موجودة فانها سوف تلحقها عمليات مقارنة مثل:
=, >, <, BETWEEN, IN, , وتعبير نصي مثل -Is Null-

المثال التالي جملة – Where-فيها عملية مقارنة :

WHERE LastName = 'Doe' AND FirstName = 'John'
التعابير في جملة- Where-يفصل بينها عبارات – And- .
اذا الغيت جملة – WHERE-سوف تحصل على كل السجلات المختارة بدون تقييد
يوجد اوقات عندما يكون هذا تماما ما تريده .


Order By Clause
جملة الترتيب ب
هذه الجملة تمكن من تحديد الترتيب الذي تعرض فيه السجلات عند الجلب –الاسترجاع.
مثال افترض انك تريد ترتيب النتائج الاسم الاخير ثم الاسم الاول .
تستطيع ان تستعمل الجملة التالية:


ORDER BY txtLastName, txtFirstName
المثال السابق سوف يسترجع السجلات في الترتيب التصاعدي
وهذا هو الوضع الاساسي –الطبيعي –لاسترجاع السجلات
في الوضع التنازلي استعمل مفتاح الكلمة – DESC-:


ORDER BY txtLastName, txtFirstName DESC

والى لقاء اخر قريبا ان شاء الله

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

أبو يوسف1
14-10-2012, 08:50
اخي واستاذي وطبيبي العزيز عارف حسان ابا محمد
السلام عليكم ورحمة الله وبركاته
ما اسعدني والله ان تقوم اخي العزيز بهذا العمل تكسب الاجر مضاعفا اضعافا كثيرة ان شاء الله .
لقد شاركتم في هذا العمل ومتابعون له دوما فما احوج هذا العمل لمن هو في علمكم وقدرتكم على اخراجة بصورة اجمل وافضل ان شاء الله .لكم الحرية الكاملة كما تشاؤون ودائما بما ترونه مناسبا اخي واستاذي العزيز ابا محمد
جعله الله في ميزان حسناتكم وصدقة جارية ان شاء الله تتضاعف بكل حرف الاف المرات ان شاء الله
اخي واستاذي العزيز لي طلب صغير منكم ارجو تبديل كلمة استاذ باخي هذا شرف كبير لي ان اكون اخاكم في الله ان شاء الله
ولكم كما دعوتكم اضعافا كثيرة ان شاء الله
بارك الله بكم اخي واستاذي وطبيبي العزيز
وتقبل دوما خالص تحياتي وتقديري العظيمين

ملاحظة: اخي العزيز ان اردت رفعت كل الاجزاء على شكل ملفات وورد او بي دي اف هنا او اي موقع اخر

أبو يوسف1
15-10-2012, 08:39
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا ان شاء الله الجزء العاشر من الفصل الخامس وعلى بركة الله وباسم الله نبدا :

Subqueries
الاستعلامات الفرعية
الاستعلامات الفرعية تمكنك من تضمين-ادراج- عبارة اختيار واحدة ضمن عبارة اختيار اخرى
المثال التالي يختار السجلات من جدول – tblContacts- اللواتي لا يحملن نفس الاسم الاخير
من الجدول – tblContactsArchive-.:

SELECT txtLastName, txtFirstName FROM tblContacts WHERE txtLastName Not In
(SELECT txtLastName FROM tblContactsArchive)


Union
الاتحاد
عبارة الاتحاد تمكنك من تجميع البيانات من جدولين واللذان لهما نفس البناء الى مخرج .
مثال افترض ان لديك جدولا باسم- tblContacts- يحوي اتصالات فاعلة
وجدول الارشيف- tblContactsArchive- والذي يحوي الاتصالات المؤرشفة –المخزنة-.
لاسترجاع مجموعة السجلات والتي تجمع البيانات من كلا الجدولين فعليك بعبارة الاتحاد.:


SELECT txtLastName, txtFirstName
FROM tblContacts
UNION ALL SELECT txtLastName, txtFirstName
FROM tblContactsArchive


Using SQL and ADO to Populate a Recordset
استعمال الاس كيو الو الادو لتجميع مجموعة السجلات
الان وبما اتك تعلمت الصيغة الاساسية لعبارة – Select- دعنا نرى هذا المثال
والذي يستعمل عبارة- SQL-مع – ADO-.

المثال التالي يفتح مجموعة سجلات ويستعمل عبارة- SQL-
كمصدر للطريق- Open-.

Sub TestSQLSelect()
Dim rsContacts As ADODB.Recordset
'create a new instance of a recordset
Set rsContacts = New ADODB.Recordset
'set various properties of the recordset
With rsContacts
.CursorType = adOpenStatic
'open the recordset based on SQL statement using the existing connection
.Open "SELECT * FROM tblContacts", CurrentProject.Connection
End With
'loop through the recordset and display some info for
'each record
Do Until rsContacts.EOF
& - Debug.Print "Contact Id: " & rsContacts!intContactId
& - Last Name: " & rsContacts!txtLastName "
First Name: " & rsContacts!txtFirstName"
rsContacts.MoveNext
Loop
'close the recordset
rsContacts.Close
'set the recordset and connection to nothing
Set rsContacts = Nothing
End Sub

يطبع جزء من كل سجل من مجموعة السجلات بعد ذلك في الشاشة الفورية
كما يشاهد في الشكل 5.14 لتمثيل ما اختارت عبارة الاس كيو ال موافق لما توقعت ان تختاره العبارة .
المثال السابق يسترجع البيانات من مصدر البيانات العام :جدول قاعدة البيانات .
على اي حال الادو يمكنك من الاتصال بمصادر بيانات مختلفة ,ويعامل هذه المصادر كجداول افتراضية .
على سبيل المثال تستطيع ان تربط مع Microsoft Outlook مستعملا عبارة SQL
و ADO لتجميع مجموعة البيانات .هنا مثال لكيف تسترجع البيانات من - Outlook Calendar-
عن- -Microsoft Exchange وطباعة النتائج في الشاشة الفورية .


Sub RetrieveCalendar()

Dim strConnection As String
Dim cnConn As ADODB.Connection
Dim rsCalendar As ADODB.Recordset

Set cnConn = New ADODB.Connection
Set rsCalendar = New ADODB.Recordset
With cnConn
".Provider = "Microsoft.JET.OLEDB.4.0
. ConnectionString = "Exchange 4.0;" –


;"- |"MAPILEVEL=Mailbox - Gosnell, Denise &
- " ; "PROFILE=DMG &
TABLETYPE=0;DATABASE=C:\WINDOWS\TEMP \ ;"" &



Open.
End With
With rsCalendar
Open "Select * from Calendar", cnConn, adOpenStatic, -.
adLockReadOnly
'print all records in calendar
Do While Not rsCalendar.EOF
Debug.Print rsCalendar(3).Name & ": " & rsCalendar(3).Value
Debug.Print rsCalendar(10).Name & ": " & rsCalendar(10).Value
Debug.Print vbCrLf
rsCalendar.MoveNext
Loop
.Close
End With
Set rsCalendar = Nothing
cnConn.Close
Set cnConn = Nothing
End Sub

في المثال السابق - Mailbox و Profile كما استعملا بقاعدة البيانات – Outlook- يجب ان يتم تحديدهم
عندما تشغل الكود السابق بصندوق بريد وملف وسترى النتائج مشابهه للتالية في الشاشة الفورية :


Subject: Doctor's Appointment
Received: 5/24/2004 2:30:18 PM
Subject: Meet Benita for lunch
Received: 5/25/2004 10:06:52 AM
Subject: Jazz Fest Training Meeting
Received: 6/10/2004 2:28:51 PM

مرفق الصورة
ارجو الانتباه الى الكودات لانها تخربطت فيها علامات الترقيم
والى لقاء اخر قريبا ان شاء الله

عارف حسان
15-10-2012, 08:40
وعليكم السلام ورحمة الله وبركاته
بارك الله بكم أخي الحبيب أبا يوسف
جميل ردكم هذا ليس مستغرباً منكم
لا .. لا أحتاج إلى أي ملفات إضافية .. يكفيني ما هو موجود هنا في هذا البحر الزاخر.

أبو يوسف1
16-10-2012, 06:30
اخي واستاذي العزيز ابا محمد
السلام عليكم ورحمة الله وبركاته
حياك الله دائما اخي العزيز وابشر دائما بما يسرك ان شاء الله ..وان شاء الله البشرى الكبرى بمرافقة سيد الاولين والاخرين صلى الله عليه وسلم في اعلى الجنان ان شاء الله .
بل البحر الزاخر لا بل اقول المحيط الزاخر والهادر المليء بالدرر والجواهر هذه المملكة الرائعة بما تجود به انفس الكرام والاجواد امثالكم اخي العزيز .هذا الموضوع قطرة في هذا المحيط وان شاء الله تزيد وتبارك بعد جهودكم الكريمة ان شاء الله
حفظكم الله ورعاكم وعلى دروب الخير سدد خطاكم

أبو يوسف1
16-10-2012, 09:05
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الحادي عشر من الفصل الخامس وعلى بركة الله وباسم الله نبدا:

Inserting Data Using SQL Insert Statements
اضافة بيانات مستعملا عبارات اس كيوال – Insert-
عبارة اضافة تستعمل لاضافة بيانات للجدول .الصيغة العامة للعبارة هي :

INSERT INTO tablename (fieldname1, fieldname2, ... fieldnameN) VALUES
(value1, value2, ... valueN)

جملة – Insert-تستعمل لاضافة كل او جزء من السجلات الى قاعدة البيانات .
مثال افترض ان جدول – tblContacts-فيه الحقول :

txtLastName, txtFirstName, txtWorkPhone, and txtHomePhone
لاضافة كل السجلات الى قاعدة البيانات في مثل هذا السيناريو يمكن
استعمال الاتي :

INSERT INTO tblContacts (txtLastName, txtFirstName, txtWorkPhone,
txtHomePhone) VALUES ('Doe', 'Jane', '317-123-4567', '317-987-6543')

وعندما تضيف جزء من سجل للجدول يجب ان تحدد على الاقل الحقول المطلوبة
في الجدول ,عدا ذلك الصيغة العامة تكون نفس المثال المعروض سابقا .
سوف اوضح –دينيس- بتفصيل في المثال فيما بعد ,تستطيع استعمال عبارات الاس كيو ال كجزء من
كائن الامر .والذي عند تنفيذه يضيف سجلات لقاعدة البيانات .

I
nserting Results of a Select into a table
اضافة نتائج للجملة – Select-الى الجدول
احيانا يجب ان تضيف النتائج من عبارة – Select-الى جدول موجود .
وطالما نوع البيانات يتوافق مع بعض فان البيانات من جدول او اكثر يمكن اضافتها
للجدول الاخر .الصيغة الاساسية ترى هنا :

INSERT INTO destination (fieldname1, fieldname2, ... fieldnameN)
SELECT fieldname1, fieldname2, ... fieldnameN
FROM source
[WHERE criteria]

واذا اردت ان تضيف كامل المحتويات الجدول –blContacts- الى الجدول – tblContactsArchive-
عليك استخدام الصيغة التالية :

INSERT INTO tblContactsArchive
SELECT * FROM tblContacts

وايضا طريقة اخرى يمكن ان تسرد كل حقل .


Updating Data Using SQL Statements
تحديث البيانات مستعملا عبارات اس كيو ال
عبارات – Update- تستعمل لتحديث السجلات في قاعدة البيانات .
الصيغة الاساسية لعبارة التحديث:

UPDATE tablename
SET column = value
WHERE criteria

افترض على سبيل المثال ان - Jane Doe-تزوجت مرة اخرى
ويجب تحديث اسمها الاخير الى- Dawson-يجب ان تصدر
عبارة التحديث التالية لتحديث سجلها الموجود .


UPDATE tblContacts
SET txtLastName = 'Dawson'
WHERE txtLastName = 'Doe' AND txtFirstName = 'Jane'

وكما سوف اوضح بالتفصيل في المثال التالى –فيما بعد-,فانك تستطيع استعمال
عبارات الاس كيو ال كجزء من كائن الامر والذي ينفذ على قاعدة البيانات
لتحديث السجلات الموجودة .

Deleting Data Using SQL Statements
حذف البيانات مستعملا عبارات الاس كيو ال
عبارات – Delete-تستعمل لحذف السجلات الموجودة من قاعدة البيانات .
الصيغة الاساسية لعبارات الحذف هي :


DELETE
FROM tablename
WHERE criteria

لحذف سجل - Jane Doe-من قاعدة البيانات معا-الاسم الاول والاخير- تستعمل العبارة التالية :

DELETE from tblContacts WHERE txtLastName = 'Doe' AND txtFirstName = 'Jane'
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
17-10-2012, 08:16
نتابع معا ان شاء الله الجزء الثاني عشر من الفصل الخامس والذي هو على مشارف النهاية ان شاء الله .وخشيت ان اتوه واغرق فيما وضعة الاخ والاستاذ العزيز احمد الحربي جزاه الله الخير وسعدت كثيرا بما قرات على عجالة .واخشى ان ارجع اليه وافقد الذاكرة هناك جراء صرعة في المصارع. وعلى بركة الله وباسم الله نبدا

Modify the Unbound Contacts Form to Use SQL
تعديل نموذج- Unbound Contacts-لاستعمال الاس كيو ال
الان وجه انتباهك للمثال الاخير للعمل مع مجموعة السجلالت المنفصلة .
في هذه الحالة سوف تعدل النموذج الموجود- Contacts-لاستعمال عبارات الاس كيو ال .
1- اختر – frmContactsUnbound-وانقر الزر الايمن واختر نسخ .
احتر خيار اللصق وسم النسخة الجديدة للنموذج – frmContactsUnboundSQL-.
2-عدل خاصية الكابشن – cmdSaveAll- الى- Save Current Record-.
النموذج يجب ان يشبه الموجود في الشكل 5.15.
3-اضف تصريح لمتغير اضافي في قسم التصريحات العامة للنموذج.كما هو هنا:

Dim rsContacts As ADODB.Recordset
Dim cnCh5 As ADODB.Connection
Dim strConnection As String
Dim blnAddMode As Boolean

4- احذف الاجراء الموجود – SaveAllRecords-.
5- احذف الاجراء الموجود- Form_Unload-
6- بدل الاجراء الموجود – AddRecord-بالتالي:


Sub AddRecord()
'set add mode to true
blnAddMode = True
'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearControlsOnForm
End Sub

7- بدل الاجراء الموجود – DeleteRecord- بالتالي:

Sub DeleteRecord()
'don't let the user issue a delete command if in add mode
If blnAddMode = True Then
Exit Sub
End If
Dim intResponse As Integer
'confirm that user really wants to delete record
intResponse = MsgBox("Are you sure you want to delete this record?", vbYesNo)
'if the user cancels delete, then exit this procedure
If intResponse = vbNo Then
Exit Sub
End If
'declare and create new command object
Dim cmdCommand As ADODB.Command
Set cmdCommand = New ADODB.Command
'create a new connection instance and open it using the connection st
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
'declare variable to store current contact
Dim intCurContact As Integer
intCurContact = 0
'generate SQL command to delete current record
Dim strSQL As String
strSQL = "DELETE FROM tblContacts WHERE intContactId = "
& rsContacts!intContactId


'set the command to the current connection
Set cmdCommand.ActiveConnection = cnCh5
'set the delete SQL statement to the command text
cmdCommand.CommandText = strSQL
'execute the delete command against the database
cmdCommand.Execute
'move to the previous record in the local recordset since the
'current one is being deleted
If Not rsContacts.BOF Then
rsContacts.MovePrevious
'save the id of the current (previous) record
intCurContact = rsContacts!intContactId
End If
'while connected to the database, go ahead and
'repopulate the recordset to make sure it contains
'the most current values from the database.
Set rsContacts.ActiveConnection = cnCh5
rsContacts.Requery
Set rsContacts.ActiveConnection = Nothing
'move back to the contact that was current before the
'requery
rsContacts.Find "[intContactId]="& intCurContact
'populate the controls on the form
Call PopulateControlsOnForm
End Sub

8-بدل الاجراء الموجود- SaveCurrentRecord-بالتالي:

Sub SaveCurrentRecord()
Dim cmdCommand As ADODB.Command
Set cmdCommand = New ADODB.Command
Dim strSQL As String
If Not rsContacts.BOF And Not rsContacts.EOF Then
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
Dim intCurContact As Integer
intCurContact = 0
'if adding a new record
If blnAddMode = True Then


'create SQL to insert a new record into the database
'containing the values on the form
strSQL = "INSERT INTO tblContacts ( " & -
txtLastName, txtFirstName, txtMiddleName, " & -"
- & "txtTitle, txtAddress1, txtAddress2, "
- &"txtCity, txtState, txtZip, "
& -" (txtWorkPhone, txtHomePhone, txtCellPhone"
- & "VALUES ( "


Me.txtLastName & " ', " & - & " " '
Me.txtFirstName & " ', " & - & " " '
Me.txtMiddleName & " ', " & - & " " '
Me.txtTitle & " ', " & - & " " '

Me.txtAddress1 & " ', " & - & " " '
Me.txtAddress2 & " ', " & - & " " '
& " ', " & - Me.txtCity & " " '
Me.txtState & " ', " & - & " " '
Me.txtZip & " ', " & - & " " '
Me.txtWorkPhone & " ', " & - & " " '
Me.txtHomePhone & " ', " & - & " " '
Me.txtCellPhone & " ', " & " " '

Else
'create SQL to update the existing record in the
'database with the values on the form


strSQL = "UPDATE tblContacts SET & " & -
txtLastName = '" & Me.txtLastName & " ', " & -"
txtFirstName = '" & Me.txtFirstName & " ', " & -"
txtMiddleName = '" & Me.txtMiddleName & " ', " & - "
txtTitle = '" & Me.txtTitle & " ', " & - "
"txtAddress1 = '" & Me.txtAddress1 & " ', " & -
"txtAddress2 = '" & Me.txtAddress2 & " ', " & -
txtCity = '" & Me.txtCity & " ', " & - "
"txtState = '" & Me.txtState & " ', " & -
txtZip = '" & Me.txtZip & " ', " & - "
"txtWorkPhone = '" & Me.txtWorkPhone & " ', " & -
"txtHomePhone = '" & Me.txtHomePhone & " ', " & -
txtCellPhone = '" & Me.txtCellPhone & " ', " & -"
WHERE intContactId="& rsContacts!intContactId "

'save the id of the current record
intCurContact = rsContacts!intContactId
End If

'set the command to the current connection
Set cmdCommand.ActiveConnection = cnCh5
'set the insert or update SQL statement to the command text
cmdCommand.CommandText = strSQL
'execute the delete command against the database
cmdCommand.Execute
'while connected to the database, go ahead and
'repopulate the recordset to make sure it contains
'the most current values from the database.
Set rsContacts.ActiveConnection = cnCh5
rsContacts.Requery
Set rsContacts.ActiveConnection = Nothing
'move back to the contact that was current before the
'requery
If intCurContact > 0 Then
'move back to the contact that was just updated
rsContacts.Find "[intContactId]="& intCurContact
Else
'if just added new record, move to the beginning of
'the recordset
rsContacts.MoveFirst

End If
'reset add mode flag to false
blnAddMode = False
'populate the controls on the form
Call PopulateControlsOnForm
End If
End Sub

9- بدل الاجراءات التالية –
MoveToFirstRecord, MoveToNextRecord,
MoveToPreviousRecord, and MoveToLastRecord

بالتالية :



Sub MoveToFirstRecord()
'move to the first record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveFirst
'populate the controls on the form with the current record
Call PopulateControlsOnForm
blnAddMode = False
End If
End Sub
Sub MoveToLastRecord()
'move to the last record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveLast
'populate the controls on the form with the current record
Call PopulateControlsOnForm
blnAddMode = False
End If
End Sub

Sub MoveToPreviousRecord()
'move to the previous record in the local disconnected recordset
'if not already at the beginning
If Not rsContacts.BOF Then
rsContacts.MovePrevious
'populate the controls on the form with the current record
Call PopulateControlsOnForm
blnAddMode = False
End If
End Sub
Sub MoveToNextRecord()
'move to the next record in the local disconnected recordset
'if not already at the end
If Not rsContacts.EOF Then
rsContacts.MoveNext
'populate the controls on the form with the current record
Call PopulateControlsOnForm
blnAddMode = False
End If
End Sub

10- شغل النموذج ويجب ان ترى الشاشة مشابهه للشكل 5.16.
11- اختر الزر – Delete-من على النموذج ويجب ان ترى ما يشابه الشكل 5.17.
12- اختر الخيار – Yes-لحذف السجل .

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

التميراوي
18-10-2012, 12:45
يعطيك العافية

أبو يوسف1
19-10-2012, 04:26
الاخ العزيز التميراوي
السلام عليكم ورحمة الله وبركاته
حياك الله اخي العزيز في مملكتنا العزيزة بين اخوتك ومحبيك ان شاء الله
عافاك الله ورعاك وجعل الجنة ماوانا وماواك ان شاء الله .
وان شاء الله تجد ما يسرك دائما
بورك فيك

أبو يوسف1
19-10-2012, 04:44
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث عشر وقبل الاخير من الفصل الخامس وعلى بركة الله وباسم الله نبدا


How It Works
كيف يعمل

اولا انت صنعت نسخة من – frmContactsUnbound- واسميتها – frmContactsUnboundSQL-.
تستطيع عمل تغييرات لهذه النسخة وتظل السابقة كما هي كمثال للمراجعة ايضا .
بعد ذلك عدلت خاصية الكابشن لزر- cmdSaveAll-وحذفت بعض الاجراءات والتي لاداعي
لها للمثال الحالي .وابدلت بعض الاجراءات بداية من – AddRecord-.ضبطت بقيمة منطقية
وهي – True-للاشارة الى انك في طور الاضافة- Add-.
الحاكمات على النموذج بعدها تفرغ حتى يتمكن المستخدم من ادخال قيم الى الحاكمات الفارغة .

Sub AddRecord()
'set add mode to true
blnAddMode = True
'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearControlsOnForm
End Sub

بعدها لدلت الاجراء الموجود – DeleteRecord-بالكود والذي بدا بالتاكيد على ان
المستخدم يود حقا ان يحذف السجل .



Sub DeleteRecord()
'don't let the user issue a delete command if in add mode
If blnAddMode = True Then
Exit Sub
End If
Dim intResponse As Integer
'confirm that user really wants to delete record
intResponse = MsgBox("Are you sure you want to delete this record?", vbYesNo)
'if the user cancels delete, then exit this procedure
If intResponse = vbNo Then
Exit Sub
End If

افترض ان المستخدم لم يلغي عملية الالغاء , لذلك صرحت كائن امر جديد وفتحت اتصالا جديدا .


'declare and create new command object
Dim cmdCommand As ADODB.Command
Set cmdCommand = New ADODB.Command
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection

موقع الاتصال الحالي تم تخزينه للاستعمال فيما بعد .

'declare variable to store current contact
Dim intCurContact As Integer
intCurContact = 0


وبعدها صنعت عبارة اس كيو ال للامر حذف لحذف السجل
معتمدا على قيمة- intContactId- للسجل الحالي.


'generate SQL command to delete current record
Dim strSQL As String
= " strSQL = "DELETE FROM tblContacts WHERE intContactId
rsContacts!intContactId &


وبعدها ضبطت كائن – Command- للاتصال الموجود وخاصية – CommandText-
تم ضبطها لعبارة الاس كيو ال .
وعندما يتم تنفيذ الطريق- Execute-فان عبارة الاس كيو ال تعمل لقاعدة البيانات .


'set the command to the current connection
Set cmdCommand.ActiveConnection = cnCh5
'set the delete SQL statement to the command text
cmdCommand.CommandText = strSQL
'execute the delete command against the database
cmdCommand.Execute

بعد ذلك فان الكود انتقل الى السجل السابق لان السجل الذي قبله تم حذفه للتو .

'move to the previous record in the local recordset since the
'current one is being deleted
If Not rsContacts.BOF Then
rsContacts.MovePrevious
'save the id of the current (previous) record
intCurContact = rsContacts!intContactId
End If

على الرغم من انها متصلة بقاعدة البيانات فان الطريق- Requery-
لل- Recordset-تم تنفيذه لانعاش- اظهار التعديلات- مجموعة السجلات
بالقيم الحالية في قاعدة البيانات .


'while connected to the database, go ahead and
'repopulate the recordset to make sure it contains
'the most current values from the database.
Set rsContacts.ActiveConnection = cnCh5
rsContacts.Requery
Set rsContacts.ActiveConnection = Nothing

الاتصال الذي كان حاليا قبل – requery-بعد ذلك يتم تحديده .

'move back to the contact that was current before the
'requery
rsContacts.Find "[intContactId]="& intCurContact


وعند نهاية الاجراء- DeleteRecord-فان الحاكمات على النموذج تم تجميعها بالسجل الحالي .


'populate the controls on the form
Call PopulateControlsOnForm
End Sub

وبعد تبديل الاجراء- DeleteRecord- بعدها ابدلت الاجراء- SaveCurrentRecord-.
الاجراء بدا بتصريح كائن الامر ومتغير لعبارة الاس كيو ال .

Sub SaveCurrentRecord()
Dim cmdCommand As ADODB.Command
Set cmdCommand = New ADODB.Command
Dim strSQL As String

اذا السجلات وجدت في مجموعة السجلات فان الاتصال يتم فتحه .


If Not rsContacts.BOF And Not rsContacts.EOF Then
'create a new connection instance and open it using the connection string
Set cnCh5 = New ADODB.Connection
cnCh5.Open strConnection
Dim intCurContact As Integer
intCurContact = 0


وان تم استدعاء الاجراء- SaveAll- بسبب انك في طور - Add New Record-
فانت صنعت عبارة الاس كيو ال والتي ادخلت القيم الحالية على النموذج الى قاعدة البيانات .


'if adding a new record
If blnAddMode = True Then
'create SQL to insert a new record into the database
'containing the values on the form
strSQL = "INSERT INTO tblContacts ( " & -
txtLastName, txtFirstName, txtMiddleName, " & -"
- & "txtTitle, txtAddress1, txtAddress2, "
- &"txtCity, txtState, txtZip, "
& -" (txtWorkPhone, txtHomePhone, txtCellPhone"
- & "VALUES ( "


Me.txtLastName & " ', " & - & " " '
Me.txtFirstName & " ', " & - & " " '
Me.txtMiddleName & " ', " & - & " " '
Me.txtTitle & " ', " & - & " " '

Me.txtAddress1 & " ', " & - & " " '
Me.txtAddress2 & " ', " & - & " " '
& " ', " & - Me.txtCity & " " '
Me.txtState & " ', " & - & " " '
Me.txtZip & " ', " & - & " " '
Me.txtWorkPhone & " ', " & - & " " '
Me.txtHomePhone & " ', " & - & " " '
Me.txtCellPhone & " ', " & " " '

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



Else
'create SQL to update the existing record in the
'database with the values on the form
strSQL = "UPDATE tblContacts SET & " & -
txtLastName = '" & Me.txtLastName & " ', " & -"
txtFirstName = '" & Me.txtFirstName & " ', " & -"
txtMiddleName = '" & Me.txtMiddleName & " ', " & - "
txtTitle = '" & Me.txtTitle & " ', " & - "
"txtAddress1 = '" & Me.txtAddress1 & " ', " & -
"txtAddress2 = '" & Me.txtAddress2 & " ', " & -
txtCity = '" & Me.txtCity & " ', " & - "
"txtState = '" & Me.txtState & " ', " & -
txtZip = '" & Me.txtZip & " ', " & - "
"txtWorkPhone = '" & Me.txtWorkPhone & " ', " & -
"txtHomePhone = '" & Me.txtHomePhone & " ', " & -
txtCellPhone = '" & Me.txtCellPhone & " ', " & -"
WHERE intContactId="& rsContacts!intContactId "
'save the id of the current record
intCurContact = rsContacts!intContactId
End If

حينما تكون في طور اضافة جديد او التحديث - Add New or Update-
فانك جاهز لتشغيل عبارة الاس كيو ال على قاعدة البيانات
بواسطة اسناد خاصية – CommandText-الى عبارة الاس كيو ال
وتنفيذ الطريق- Execute.

'set the command to the current connection
Set cmdCommand.ActiveConnection = cnCh5
'set the insert or update SQL statement to the command text
cmdCommand.CommandText = strSQL
'execute the delete command against the database
cmdCommand.Execute

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

'while connected to the database, go ahead and
'repopulate the recordset to make sure it contains
'the most current values from the database.
Set rsContacts.ActiveConnection = cnCh5
rsContacts.Requery
Set rsContacts.ActiveConnection = Nothing

بعدها انتقلت راجعا الى السجل الحالي ان كنت في طور التحديث .


'move back to the contact that was current before the
'requery
If intCurContact > 0 Then
'move back to the contact that was just updated
rsContacts.Find "[intContactId]="& intCurContact
Else
'if just added new record, move to the beginning of
'the recordset
rsContacts.MoveFirst
End If


اخيرا عملت – reset-لعلم طور الاضافة- Add mode flag- الى – False-
بسبب لن تكون في طور الاضافة تحت اي ظرف .
وضبطت الحاكمات على النموذج لعرض القيم في السجلا ت الحالية لمجموعة السجلات .

'reset add mode flag to false
blnAddMode = False
'populate the controls on the form
Call PopulateControlsOnForm
End If
End Sub

وعملت بعض التغييرات الطفيقة للاجراءات :

MoveToFirstRecord, MoveToNextRecord,
MoveToPreviousRecord, and MoveToLastRecord

لازالة النداءات ل – SaveCurrentRecord واضافة عبارة لضبط علم- blnAddMode-
الى- False-.هذه الاجراءات تم تبديلها مرة اخرى للتبسيط لكن ليس بتغيير كبير .

Sub MoveToFirstRecord()
'move to the first record in the local disconnected recordset
If Not rsContacts.BOF And Not rsContacts.EOF Then
rsContacts.MoveFirst
'populate the controls on the form with the current record
Call PopulateControlsOnForm
blnAddMode = False
End If
End Sub

وبعدها شغلت النموذج وتحكمت بقاعدة البيانات متضمنا حذف السجل الموجود .
هذه الاجراءات شغلت لاصدار عبارات الاس كيو ال للقاعدة: لاضافة
تحديث وحذف السجلات وبعدها مجموعة السجلات المنفصلة حدثت مرة اخرى بالقيم
الجديدة في قاعدة البيانات .
هذه طريقة لكتابة الكود والذي يسمح لنماذجك للتفاعل مع البيانات في مصدر البيانات
الداخلي في موضة الانفصال .
والى لقاء اخير في هذا الفصل ان شاء الله قريبا
مرفق مثال الفصل كاملا من طرف د. حقوق دينيس
كالعادة الاكواد تخربطت ارجو الانتباه .

أبو يوسف1
21-10-2012, 07:09
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
لن اجد شرحا افضل مما شرح الاخ والاستاذ العزيز احمد الحربي عن الادوكس جزاه الله خيرا وبارك الله فيه
هذا الرابط
http://www.accesswordkingdome.com/forum/showthread.php?t=80&highlight=adox

http://www.accesswordkingdome.com/forum/showthread.php?t=2664&highlight=adox


http://www.accesswordkingdome.com/forum/showthread.php?t=385&highlight=adox

والى لقاء قريب مع شرح دينيس ان شاء الله

أبو يوسف1
24-10-2012, 09:01
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
كل عام وانم بالف الف خير
نتابع معا الجزء الرابع عشر و الاخير من الفصل الخامس وعلى بركة الله وباسم الله نبدا

Using ADOX to Manipulate Data Objects
استعمال الادوكس للتعامل مع كائنات البيانات
هذه المكتبة –الادوكس- لها نمط كائن والذي يسمح لك ان تصنع كائنات قواعد بيانات
مثل الجداول ,فهارس,مفاتيح وايضا تحكم حماية ,وانشاء تماسك مرجعي في قواعد البيانات
وانجاز تعديلات وحذف متسلسل .
كائن- Catalog-هو اعلى الكائنات في نمط كائنات الادوكس بالجداول ,مجموعات .مستخدمين
اجراءات ,مجموعات العرض .
رجاء راجع المساعد المباشر- online-لنمط كائن الادوكس كاملا .

تماما كما في مكتبة – ADODB-ان اردت استخدام مكتبة الادوكس في
حلولك-تطبيقاتك الاكسسية ,يجب ان تضيف المرجع .
من ادوات ثم مراجع ثم محرر الفيجوال بيسك ,الشكل 5.18يوضح
مرجع لمكتبة الادوكس كجزء من المشروع الحالي .
دعنا ننظر الى امثلة قليلة على ما الذي يمكن عمله بمكتبة الادوكس.


Creating a Table with ADOX
تصنيع جدول بالادوكس
للاغرار –المبتدئين –تستطيع صنع قاعدة بيانات جديدة ,جداول
كائنات اخرى مستعملا مكتبة الادوكس.
الاجراء التالي مثال لكيقية تصنيع جدول جديد في قاعدة بيانات موجودة .


Sub TestCreateTable()
Dim catCatalog As ADOX.Catalog
Dim tblSupplier As ADOX.Table
Set catCatalog = New ADOX.Catalog
Set catCatalog.ActiveConnection = CurrentProject.Connection
'Create and name the new table
Set tblSupplier = New ADOX.Table
With tblSupplier
".Name = "tblSupplier
Columns.Append "CompanyName", adVarWChar, 50.
Columns.Append "CompanyPhone", adVarWChar, 12.
End With
'append the new table to the database
catCatalog.Tables.Append tblSupplier
'release memory
Set catCatalog.ActiveConnection = Nothing
Set catCatalog = Nothing
Set tblSupplier = Nothing
End Sub

اولا تم تصريح كائن – Catalog-جديدا وتم تعيينه للاتصال الحالي المفتوح .
بعدها جدولا جديدا اسمه- tblSupplier-تم صنعه واسما واعمدة جديدة تم تعيينها له .
بعد ذلك الجدول الجديد تعدل الى مجموعة - Catalog.Tables-
والتي اضافتها لقاعدة البيانات .
وبعد تشغيل الاجراء السابق يمكنك رؤية (في الشكل 5.19) ان الجدول الجديد المسمى
- tblSupplier-تم اضافته لقاعدة البيانات.


Managing Security with ADOX
ادارة الامان مع الادوكس
بالاضافة الى ادارة قواعد البيانات والجداول يمكنك ايضا ان استعمال مكتبة الادوكس
لادارة الامان متضمنا المستخدمون ,الارقام السرية , والمجموعات .
المثال التالي يضيف مجموعة جديدة مسماه- Wrox Readers-
وبعدها اضاف مستخدما جديدا مسمى- John Doe-لهذه المجموعة الجديدة



Sub TestAddUsersGroups()
Dim catCatalog As ADOX.Catalog
Dim usrUser As ADOX.User
Dim grpGroup As ADOX.Group
Set catCatalog = New ADOX.Catalog
Set catCatalog.ActiveConnection = CurrentProject.Connection
With catCatalog
'Create a new group
"Groups.Append "Wrox Readers.

'Create a new user
Set usrUser = New ADOX.User
usrUser.Name = "John Doe"
usrUser.ChangePassword "", "initialpassword1"
.Users.Append usrUser
'add the new user to the new group
usrUser.Groups.Append "Wrox Readers"
End With
'release memory
Set catCatalog.ActiveConnection = Nothing
Set catCatalog = Nothing
Set usrUser = Nothing
End Sub

لاحظ مرة اخرى كيف تم استعمال كائن – Catalog- وهذه المرة ككائن مستخدم ومجموعة .
المجموعة الجديدة تم صنعها اولا ثم المستخدم الجديد .واخيرا تم تعديل المستخدم الجديد
الى المجموعة الجديدة .
وبعد تنفيذ الكود السابق يمكنك رؤية في الشكل 5.20 ان جون دو- John Doe-
تم اضافته للمشروع الحالي معا و المجموعة - Wrox Readers-.
صندوق الحوار في الشكل 5.20 يمكن اظهاره من اختيار ادوات –امان
حسابات المجموعات والمستخدمون .

كائن المجموعة له ايضا طرقا اخرى : SetPermissions و GetPermissions

الطريق ضبط الصلاحيات - SetPermissions- يضبط صلاحيات مختلفة
للدخول. والطريق احصل على صلاحيات – GetPermissions-يسترجع
الصلاحيات الحالية والتي تؤثر على المجموعة .
هذه واخرى خصائص كثيرة يمكن التحكم بها مستعملا مكتبة الادوكس .
هذا الجزء لا يقصد ان يكون الادوكس منهكا ومتعبا لكم لكن
كان لتزويدكم فقط بامثلة قليلة لكيف يمكنك استخدام مكتبة الادوكس .
هذا التوضيح من -–دينيس-




Summary
الخلاصة
هذا الفصل غطى واحدا من اهم المفاهيم لبرمجة الاكسس : العمل بالبيانات في قواعد البيانات .
يجب عليك الان لن تكون قد فهمت الاساسيات لاسترجاع وتعديل البيانات من الكود
الفيجولي مستخدما الادو والادوكس :بالاسماء كائنات الاتصال, الامر ومجموعة السجلات .
وتعلمت كيف تعمل مع مجموعة السجلات المتصلة مع النموذج محافظة على الاتصال المفتوح
و اللواتي المنفصلة .

وعند فصل مجموعة السجلات من مصدر البيانات فان التغييرات تحدث محليا ولا يتم حفظها في الطبقة الداخلية
لقاعدة البيانات الا اذا اضفت خطوات اضافية .
وتعلمت ايضا كيف تستعمل عبارات الاس كيوال - Select, Insert, Update, and Delete-
للتفاعل مع قواعد البيانات .واخيرا تعلمت ان كائن الادوكس يسمح لك بالتحكم
بجداول قواعد البيانات, والامان, والمستخدمون , وهكذا .
الفصل التالي يناقش تقنيات –مهارات –مختلفة والتي تمكنك من يناء نماذج تفاعلية
وتزودك ببعض المداخل المفيدة لتحسين تفاعل المستخدم .





مرفق الصور
والى الفصل السادس ان شاء الله قريبا
وكل عام وانتم بالف الف خير

omar19-3
25-10-2012, 10:04
الله يبارك فيك أستاذنا أبويوسف1

كل عام وأنتم إلى الله أقرب وعلى طاعته أدوم

عيد أضحى مبارك أعاده الله علينا والأمة الإسلامية بخير وسعادة وأفضل حال
اللهم ارزقنا الحج إلى بيتك العتيق

شرح أكثر من واف ومجهود كبير متعوب فيه جداً جزاك الله عنا كل خير وبارك لك فى وقتك وآلك جميعاً

أبو يوسف1
26-10-2012, 08:41
اخي العزيز omar19-3
السلام عليكم ورحمة الله وبركاته
اشكرك كثيرا اخي العزيز على دعواتك الجميلة الرائعة.
وبارك الله فيك ولك كما دعوت واكثر ان شاء الله .
ان شاء الله نلتقي ببيت الله العتيق وعلى عرفات ان شاء الله .
وكل عام وانت بالف الف خير يا رب .
تقبل خالص تحياتي وتقديري العظيمين دوما اخي العزيز

أبو يوسف1
26-10-2012, 10:00
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
وكل عام وانتم بالف الف خير .
نتابع معا الجزء الاول من الفصل السادس وعلى بركة الله وباسم الله نبدا :


Building Interactive Forms
بناء نماذج تفاعلية
الفصل الخامس غطى الاساسيات لاستعمال الادو والاس كيو ال للعمل مع مصادر البيانات
وعرفك كيف تظهر البيانات المسترجعة على النموذج من قواعد البيانات .
في هذا الفصل سوف تستعرض طرقا لكيفية بناء نماذج تفاعلية والتحكم بالعمليات
لهذه النماذج برمجيا مستعملا الكود الفيجولي.
مواضيع عديدة والتي تم تغطيتها في هذا الفصل تم توضيحها بامثلة مختلفة خلال
هذا الكتاب ,لكن بعضها يستحق مناقشة منفصلة.

الفصل سوف يغطي:
= الاستعراض بين النماذج .
= فتح , اغلاق, واخفاء النماذج .
= اختيار لنوع التحكم الملائم للاستعمال للبيانات.
= تجميع -تسكين - الحاكمات .
= اظهار رسائل للمستخدمون.
= توثيق البيانات المدخلة في الحاكمات .
= ضبط صف الحاكمات وتوقف التاب - Setting control alignment and tab stops-.



Form Navigation and Flow
استعراض وتدفق النموذج
يمكنك وبطرق مختلفة التحكم بالترتيب والشكل التي يفتح بها النموذج ضمن تطبيق اكسس.
مثلا يمكنك تصميم نماذج لوحة التبديل – switchboard-والتي تسمح للمستخدم بان
يختار النموذج المراد فتحه .
خيار اخر هو فتح النموذج الرئيسي والسماح للمستخدم بفتح نماذج منفصلة من النموذج الرئيسي .
نمط الاستعراض الذي تختاره يعتمد على نوع النظام والطريقة التي يتفاعل المستخدم بها
مع النماذج المختلفة .
خلال طور التصميم يجب عليك اعتبار تدفق النماذج وكيف يستعرض المستخدم من
نموذج لاخر .من السهل جدا ان تتحكم بكيف تظهر النماذج .
المثال التالي يوضح لكيفية فتح ,تخفي ,تصغير ,واغلاق النماذج .



'open a form
DoCmd.OpenForm "FormName"
'close a form
DoCmd.Close acForm, "FormName"
'minimize the current form
DoCmd.Minimize
'hide a form
FormName.Visible = False
'make the form visible again
FormName.Visible = True


التطبيق المصمم جيدا يسمح للمستخدم بان يتفاعل مع التطبيق بدون
الحاجة لفتح النماذج يدويا من شاشة قاعدة البيانات .
طريقة سهلة لفتح النموذج اليا هو استخدام الماكرو- AutoExec-
لتحديد اي نموذج يجب ان يفتح اليا عند بدء التطبيق .


Building a Switchboard Form
بناء نموذج لوحة التبديل
في هذا المثال سوف تبني نموذج لوحة تبديل بسيط والذي يفتح اليا عند بدء التطبيق.
\نموذج لوحة التبديل يمكن المستخدم من فتح نماذج عدة من قائمة من الخيارات .

1-اصنع قاعدة بيانات جديدة اسمها - Ch6CodeExamples-.
2- اضف اربع نماذج جديدة الى التطبيق وسم النماذج على الترتيب :
frmMain, frmAccounts, frmPayments, and frmRegister
3- افتح النموذج الرئيسي في طور التصميم واضف ثلاثة ازرار للامر .
وسم ازار الامر:. cmdAccounts, cmdPayments, and cmdRegister
واضبط الكابشن لازار الاوامر كالتالي وعلى التوالي:
View/Manage Accounts, Make Payments, and View/Manage Register
وايضا اضبط خصائص النموذج - Record Selectors, Navigation Buttons, and Dividing Lines
الى : لا – No-.
مثالا للنموذج حتى هذه النقطة يظهر في الشكل 6.1.
4- اختر زر الامر- cmdAccounts- واضف الكود التالي لحدث النقر :


Private Sub cmdAccounts_Click()
'open the Accounts form
DoCmd.OpenForm "frmAccounts"
'hide the main switchboard form
Forms.Item("frmMain").Visible = False
End Sub

5- اختر زر الامر – cmdPayments- واضف الكود التالي في حدث النقر:

Private Sub cmdPayments_Click()
'open the Accounts form
DoCmd.OpenForm "frmPayments"
'hide the main switchboard form
Forms.Item("frmMain").Visible = False
End Sub

6- اختر زر الامر – cmdRegister-واضف الكود التالي عند حدث النقر:

Private Sub cmdRegister_Click()
'open the Accounts form
DoCmd.OpenForm "frmRegister"
'hide the main switchboard form
Forms.Item("frmMain").Visible = False
End Sub

7- افتح النموذج – frmAccounts-واضف زر امر للنموذج .وغير خاصية الاسم
الى- cmdMenu- وخاصية الكابشن الى- Menu-.
اضف ليبل للنموذج واطبع - View/Manage Accounts-في الليبل .
النموذج يجب ان يشابه كما في الشكل 6.2.
8- اختر زر الامر – cmdMenu-واضف الكود التالي في حدث النقر:


Private Sub cmdMenu_Click()
'display the switchboard main form
Forms.Item("frmMain").Visible = True
'close the current form
DoCmd.Close acForm, "frmAccounts"
End Sub


9- افتح النموذج – frmPayments-واضف زر امر للنموذج .
غير خاصية الاسم لزر الامر الى- cmdMenu- وخاصية الكابشن الى – Menu-.
اضف ليبل للنموذج واضبط الكابشن الى- Make Payment-.
10- اختر زر الامر- cmdMenu-واضف الكود التالي لحدث النقر :


Private Sub cmdMenu_Click()
'display the switchboard main form
Forms.Item("frmMain").Visible = True
'close the current form
DoCmd.Close acForm, "frmPayments"
End Sub

11-افتح النموذج – frmRegister- واضف زر امر للنموذج .
غير خاصية الاسم لزر الامر الى- cmdMenu-وخاصية الكابشن الى- Menu-
اضف ليبل على النموذج واطبع- Check Register-في الليبل .
12- اختر زر الامر- cmdMenu-واضف الكود التالي لحدث النقر:


Private Sub cmdMenu_Click()
'display the switchboard main form
Forms.Item("frmMain").Visible = True
'close the current form
DoCmd.Close acForm, "frmRegister"
End Sub

13- من شاشة قاعدة البيانات اصنع ماكرو جديد وسمه- AutoExec-والذي
يحتوي على امر- OpenForm-للنموذج- frmMain-كما في الشكل 6.3.
14- احفظ كل التغييرات للنماذج والكود الفيجولي.
15-اغلق القاعدة كاملا بواسطة ملف ثم اغلاق ,ثم اعد فتحها . يجب ان تظهر نفس الشاشة اليا كما بالشكل 6.4.
16-اختر الزر- View/Manage Accounts-وشاشة كما في الشكل 6.5 يجب ان تفتح .


مرفق الصور
والى لقاء اخر قريبا ان شاء الله
وكل عام وانتم بالف الف خير يا رب

أبو يوسف1
28-10-2012, 12:17
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل السادس والذي شارف على الانتهاء وعلى بركة الله وباسم الله نبدا :


How It Works
كيف تعمل
في هذا المثال انت صنعت نموذج لوحة تبديل مع ثلاثة ازرار تحكم
وتحت كل زر امر اضفت كودا لفتح النموذج المخصص باستعمال الطريق – OpenForm-
وبعدها اخفيت نموذج لوحة التبديل بضبط خاصية المرئي -Visible- الى خطا.


()Private Sub cmdAccounts_Click
'open the Accounts form "DoCmd.OpenForm "frmAccounts
'hide the main switchboard form Forms.Item("frmMain").Visible = False End Sub
وايضا صنعت ثلاثة نماذج والتي يمكن فتحها من لوحة التبديل وعلى كل واحد من هذه النماذج زر امر قد تم اضافته
للسماح للمستخدم من الرجوع الى قائمة لوحة التبديل .الكود بعد ذلك تم اضافته لحدث النقر لكل زر القائمة
لعدم اخفاء نموذج لوحة التبديل بواسطة ضبط خاصية المرئي- Visible- الى صحيح – True-.
واغلاق النموذج الحالي مستعملا الطريق – Close- لكائن - DoCmd-


()Private Sub cmdMenu_Click 'display the switchboard main form Forms.Item("frmMain").Visible = True 'close the current form "DoCmd.Close acForm, "frmAccounts End Sub
وبعدها اضفت ماكرو – AutoExec-ليفتح نموذج لوحة التبديل عند فتح قاعدة البيانات .
وعند فتح قاعدة البيانات فان الاكسس سوف يشغل اليا اي امر في الماكرو المسمى- AutoExec-
من لوحة التبديل ,واي واحد من النماذج الثلاث يمكن فتحه .وبعدها تستطيع العودة الى لوحة التبديل لاختيار
نموذج مختلف بواسطة زر القائمة في النموذج المخصص.وعلى الرغم من بساطة المثال فانك
تستطيع تطبيق المفهوم على اي تطبيق للاستعراض خلال النماذج .


Working with Controls
العمل بالحاكمات
قبل قراءة هذا الكتاب من المحتمل انك تعاملت مع مختلف الحاكمات على نماذج الاكسس
مثل الليبلات ,مربعات النص,ازرار الاوامر,و مربعات السرد.
وكما انك مدرك الان انه يمكن اضافة الحاكمات للنموذج بواسطة استعمال صندوق الادوات من عرض التصميم .
كما في الشكل 6.6. والان وجه انتباهك الى الموضوع المرتبط:العمل بالحاكمات .
في هذا القسم سوف تستعرض طرقا قليلة للعمل بهذه الحاكمات من خلال الكود الفيجولي.
وتعلمت في الفصل الثالث ان الكائنات لها خصائص وطرق والتي تظهر في شاشة الخصائص
في عرض التصميم. وتعلمت ايضا ان تلك الخصائص والطرق للكائن
يمكن التحكم بها باستعمال الكود الفيجولي .
الحاكمات –عناصر التحكم- هي امثلة للكائنات التي يمكن التحكم بها في هذه الطرق.
على سبيل المثال لقد تعلمت من امثلة الادو في الفصل الخامس ان يمكنك اظهار
البيانات في مربع النص .
ومثال الكود الذي يظهر قيمة في مربع النص هنا:


Me.txtLastName = rsContacts!txtLastName
وعلى الرغم من ان مربعات النص ممتازة لادخال البيانات البسيطة وتظهر قيما صغيرة ومفردة,
فانك في اوقات تتطلب طرقا اعقد لعرض البيانات .
في الاقسام القليلة القادمة سننظر على بعض الامثلة لحاكمات اعقد وتستعمل لبناء تطبيقات اكثر قوة.


Combo Boxes versus List Boxes
مربعات التحرير والسرد مقابل مربعات القائمة
هذه المربعات تمكنك من اظهار خيارات متعددة في قائمة .
وايضا تسمح لك لاظهار اعمدة متعددة من البيانات في قائمة مفردة .
كلاهما لهما الكثير المشترك لكن ايضا يختلفان في بعض الطرق كما موضح في المقارنة : في المرفق.

وتستطيع برمجيا اضافة وازالة مواد من مربعات التحرير والسرد ومربعات القائمة
باستعمال الطرق: AddItem و RemoveItem
المثال بالاسفل يستخدم الطريق – AddItem- لاضافة قيم في مجموعة السجلات الى مربع
التحرير والسرد-المسمى- cboPlan-.


Dim rsPlans As New ADODB.Recordset
'populate the list of plans from the database
Set rsPlans = ExecuteSPRetrieveRS("spRetrievePlans", 0)
cboPlan.RowSource = " "
cboPlan.LimitToList = True
cboPlan.ColumnCount = 2
cboPlan.RowSourceType = "Value List"
cboPlan.BoundColumn = 0
Do While Not rsPlans.EOF
'populate the priority combo box
cboPlan.AddItem rsPlans!PlanId & ";" & rsPlans!PlanName
rsPlans.MoveNext
Loop

في هذا المثال لكل ادخال في مربع التحرير والسرد فان - PlanId and PlanName-
تظهر بسبب الطريق- AddItem-يتلقى قيما مفصولة بفاصلة منقوطة -(;)-.
هذه الفاصلة المنقوطة تستعمل للاشارة ان عدة اعمدة يجب صنعها .
مثالا الكود التالي يضيف قيما لكلا لاعمدة الاسم الاخير والاول الى القائمة.



" cboName.AddItem "Doe;John

Populating Combo and List Boxes
تجميع مربعات التحرير والسرد والقائمة
سوف تجمع الان مربعات السرد والتحرير ومربعات القائمة بنفس القيم
وتوضيح لكيفية استرجاع الخيار من المستخدم .
1- افتح نموذج – frmAccounts-من قاعدة البيانات الحالية- Ch6CodeExamples-.
2- اضف مربع تحرير وسرد ومربع قائمة على النموذج باستعمال صندوق الادوات.
3-اضبط خاصية الاسم امربع التحرير والسرد ل- cboAccounts-وخاصية
الاسم لمربع القائمة الى- lstAccounts-. واضبط كل ليبل الى- Accounts-.
النموذج يجب ان سشابه الشكل 6.7.
4- اضف الكود التالي عند حدث التحميل للنموذج .


Private Sub Form_Load()
'populate the combo box with values from a
'specified list
With cboAccounts
RowSource = " " .
.ColumnCount = 2
"RowSourceType = "Value List.
.LimitToList = True
.BoundColumn = 0
"AddItem "Old National Bank;Car Payment.
"AddItem "Chase Manhattan;MasterCard.
"AddItem "Countrywide Home Loans;House Payment.
End With
'populate the list box with values from a
'specified list

With lstAccounts
" " = RowSource .
.ColumnCount = 2
"RowSourceType = "Value List.
.BoundColumn = 0
"AddItem "Old National Bank;Car Payment.
"AddItem "Chase Manhattan;MasterCard.
"AddItem "Countrywide Home Loans;House Payment.
End With
End Sub


5- اضف الكود التالي لحدث التغير- Change-في مربع التحرير والسرد .

Private Sub cboAccounts_Change()
'display a message to the user of the selected value
MsgBox cboAccounts.Text
End Sub

6- اضف الكود التالي لحدث النقر لمربع القائمة :

Private Sub lstAccounts_Click()
'display a message to the user of the first value in
'the selected column
MsgBox lstAccounts.Column(0)
End Sub

7- افتح النموذج في طور العرض وشغل النموذج .يجب ان ترى مشابه للشكل 6.8.
8-اطبع الحرف- C-النص يجب ان يقفز الى - Chase Manhattan-ثم اطبع – O-في مربع تحرير وسرد .
يجب ان يقفز النص الى - Countrywide Home Loans-لانه يبدا بالحرفان- CO-.
كرر هذه الخطوات لمربع القائمة سوف ترى انه عند طباعة الحرف – C- فان المختار هو
- ChaseManhattan- وعند طباعة حرف – O-فان - Old National Bank-
هو الذي يتم اختياره .
9- يجب ان ترى صناديق الرسائل تظهر القيم المختارة.


How It Works
كيف تعمل
باستعمال الطريق- AddItem- انت اضفت نفس القيم لمربع التحرير ومربع القائمة
حتى ترى الفرق بين الحاكمين جنبا الى جنب.


Private Sub Form_Load()
'populate the combo box with values from a
'specified list
With cboAccounts
RowSource = " " .
.ColumnCount = 2
"RowSourceType = "Value List.
.LimitToList = True
.BoundColumn = 0
"AddItem "Old National Bank;Car Payment.
"AddItem "Chase Manhattan;MasterCard.
"AddItem "Countrywide Home Loans;House Payment.
End With
'populate the list box with values from a
'specified list

With lstAccounts
" " = RowSource .
.ColumnCount = 2
"RowSourceType = "Value List.
.BoundColumn = 0
"AddItem "Old National Bank;Car Payment.
"AddItem "Chase Manhattan;MasterCard.
"AddItem "Countrywide Home Loans;House Payment.
End With
End Sub

خاصية – LimitToList-لمربع التحرير تم ضبطه لصحيح- True- لذلك فقط
القيم في القائمة يجب ان يتم الاختيار منها.
خصائص مختلفة مثل - RowSource and RowSource type-تم تحديدها لاظهار
ان القيم يجب ان تاتي من قائمة القيم اما موضوعة في جدول او اي مصدر اخر .
وايضا اضفت الكود لاظهار القيم المختارة من مربع التحرير ومربع القائمة .
وعند تغيير القيمة في مربع التحرير فان رسالة تظهر للمستخدم القيمة الظاهرة في
حقل النص-مربع التحرير-.


Private Sub cboAccounts_Change()
'display a message to the user of the selected value
MsgBox cboAccounts.Text
End Sub

وعند اختيار القيمة من مربع القائمة فان رسالة تظهر تظهر للمستخدم
القيمة المحتواة في العمود المختار الاول .


Private Sub lstAccounts_Click()
'display a message to the user of the first value in
'the selected column
MsgBox lstAccounts.Column(0)
End Sub


مرفق الصور
مرفق المثال من دينيس لكامل الفصل
والى لقاء اخر ان شاء الله فريبا

أبو يوسف1
29-10-2012, 11:22
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث والاخير من الفصل السادس وعلى بركة الله وباسم الله نبدا



Tab Controls and Subforms
حاكمات التاب والنماذج الفرعية
عندما يكون لديك بيانات كثيرة وتريد اظهارها على نموذج واحد فان حاكمات
التاب تزودك بطريقة واحدة او تنظم البيانات في نموذج واحد لكن في عناصر منفصلة .
حاكمات التاب تسمح لك بوضع حاكمات منفصلة على كل تاب .مثال على ذلك
عندك تاب واحد والذي يحوي معلومات عن مدقق الحساب .
وتاب اخر يحوي معلومات عن حفظ الحساب كما في الشكل 6.9.
ويمكنك ان تشير الى الصفحات لحاكمات التاب في الكود الفيجولي كالتالي:


'show the checking account register
Page1.Visible = True
'hide the savings account register
Page2.Visible = False

في المثال التالي مسجل مدقق الحساب يظهر للمستخدم وحفط الحساب لا يظهر .
هذا مفيد في سيناريو ان سمي مستخدم واحد لكلا الحسابين .لكن مستخدم اخر
سمي فقط لحساب واحد . من الممكن على سبيل المثال ان التحكم برؤية التابات معتمدا على
هوية المستخدم المحددة- user ID-.
طريقة اخرى هي استعمال النماذج الفرعية لادارة النماذج التي تحوي مقادير معقدة
او انواع من البيانات.
النموذج الفرعي هو نموذج داخل نموذج .ولاضافة نموذج فرعي ببساطة اسحب وافلت
النموذج الفرعي من صندوق الادوات تماما كاي اداة تحكم اخرى .
بعدها غير خاصية - Source Object-للنموذج الفرعي الى اسم النموذج الذي
تود ان تعرضه .مثال للنموذج الفرعي في الشكل 6.10.

الشكل 6-10 يظهر نموذج اجراء تجاري –تعامل تجاري-ظاهرا خلال نموذج
حساب .اي نموذج يمكن ان تصنع يمكن اظهاره في نموذج اخر .
وتستطيع بعدها ربط النموذج الفرعي للنموذج الاب حتى تظهر البيانات
المرتبطة مع البيانات على النموذج الاب ( على سبيل المثال لنفس الحساب).
احدى الطرق لربط النموذج الفرعي للنموذج الاب هو استعمال خصائص
-Link Child Fields -و Link Master Fields--

كلما حدث تغيير للنموذج الفرعي فانك تغير النموذج الاصلي لذلك احذر.



Building User Interaction
بناء تفاعل المستخدم
بعد اختيارك الحاكمات المناسبة يجب ان تبرمج طرقا للمستخدمون للتفاعل مع هذه الحاكمات .
يمكنك ان تبرمج التطبيق للتفاعل مع المستخدم في طرق مختلفة .
على سبيل المثال لقد تعلمت تكتب كود اجراء الحدث الذي يتنفذ عندما يجري المستخدم
عمل محدد على النموذج .
في هذا القسم سوف تنظر على مثالين اضافيين لكيف تطور تفاعل المستخدم
في تطبيقاتك .
سوف ترى استعمال دالة الرسالة لسيناريوهات اكثر تعقيدا وعند
التحقق من ادخالات المستخدم .



The MsgBox Function
دالة الرسالة
انت رايت امثلة لكيف تظهر دالة الرسالة رسالة .
دالة الرسالة اكثر قوة من الامثلة البسيطة التي وضحتها حتى الان .
تستطيع حقيقة سؤال اسئلة باجوبة من متعدد وبعدها تعالج الخيارات لاخذ الاجراء
او الفعل المناسب .
مثال لسؤال المستخدم اسئلة نعم لا وبعدها تاخذ فعلا مختلفا معتمدا على رد الفعل
فانك يمكن ان تحدد قيم – vbYesNo-لمعلمة نمط صندوق الرسالة .
المثال التالي ينتظر من المستخدم التاكيد ان الحذف يجب ان يعالج-يكمل-.


Dim intResponse As Integer
'display a Yes/No message box to the user
intResponse = MsgBox("Are you sure you want to delete this record?", vbYesNo,
("? Delete"
'determine how the user responded and act accordingly
If intResponse = vbYes Then
MsgBox "Delete confirmed."
ElseIf intResponse = vbNo Then
MsgBox "Delete cancelled."
End If



Validating User Input
التحقق من ادخالات المستخدم
طريقة اخرى لبناء تفاعل المستخدم هو تزويد المستخدم –تغذية راجعة- بالمراجعة
عند ادخال المستخدم نوع بيانات غير صحيح .
بواسطة واجهة تصحيح خطا البيانات يمكنك تجنب اخطاء في قاعدة البيانات
فيما بعد او مشكلة التماسك بسبب القيم غير الصحيحة .
احدى الطرق لتطوير التحقق من البيانات
One way to implement data في اكسس هو ضبط خصائص
ValidationRule and ValidationText--
لعنصر التحكم لتحديد نوع البيانات الصحيح ورسالة يجب ان تظهر عند
عدم مطابقة البيانات المدخلة للشرط .
وتستطيع السيطرة على التدقيق على البيانات من الكود الفيجولي .
مثل كحدث قبل التحديث او حدث بعد التحديث لعنصر التحكم.-



Adding Data Validation to the frmPayments Form
اضافة تدقيق البيانات الى نموذج – frmPayments-

هنا تعديل عينة تطبيق لتطبيق حدث التدقيق لنموذج- frmPayments-
1-افتح النموذج – frmPayments-في عرض التصميم .
2-اضف مربع نص الى النموذج وسمه – txtValue-
3-في حدث قبل التحديث لمربع النص اضف الكود التالي:


Private Sub txtValue_BeforeUpdate(Cancel As Integer)
If txtValue = "" Or IsNull(txtValue) Then
MsgBox "You must specify a value for this field."
Cancel = True
ElseIf Len(txtValue) > 10 Then
MsgBox "The value for this field must be 10 characters or less."
Cancel = True
End If
End Sub

4- شغل النموذج اختر الحقل وادخل قيمة باكثر من 10 احرف وانقر بعدها زر التاب
لمغادرة الحقل .يجب ان ترى رسالة تبين ان الاحرف يجب ان تكون 10 او اقل .
5-احذف القيمة كاملة حتى يصبح الحقل فارغا ثم انقر تاب للتنقل الى حقل اخر .يجب ان
ترى رسالة تبين ان قيمة يجب ان تحدد للحقل .




How It Works
كيف يعمل
في هذا المثال انت اضفت مربع نص للنموذج .
ثم بعدها اضفت الكود لحدث قبل التحديث –قبل الانتقال للحقل التالي –للتاكد
ان المستخدم قد ادخل بيانات صحيحة في هذا الحقل المطلوب .


Adding Polish to Your Forms
اضافة مسحة تهذيب للنموذج

يمكنك عمل اعمال كثيرة للتاكد من ان نماذجك مهذبة –جميلة المنظر-.
مثالا يجب دائما التاكد من صف الحاكمات على النموذج وعمل فراغات بينهم لعمل
مظهرا واضحا وتظيفا.
انظر على الاختلاف بين النماذج الظاهرة جنبا الى جنب في الشكل 6.11.
النموذج الثاني له مظهر افضل كثيرا من الاول .لضبط المحاذاة بسهولة يمكنك من
الاستمرار بالضغط على مفتاح الشفت لاختيار الحاكمات المتعددة لمحاذاتها .
ثم نقر الزر الايمن ثم اختر محاذاة – Align- ثم اختر اتجاه المحاذاة المطلوبة
من القائمة التي تظهر .

لمسة اخرى جميلة هو التاكد من ان وقفات التاب في الترتيب المرغوب .
لن يكون هناك شك عند استعمالك التاب في خلال عملية ملء الحقول بالمعلومات
بسرعة وتجد نفسك في حقل غير المطلوب .
لتزويد المستخدم بخبرة افضل وعما ادخال واستعراض البيانات باسهل
ما يكون فانه يجب عليك التاكد من ان وقفات التاب لها ترتيب منطقي .
اكسس سهلت لعرض وتعديل وقفات التاب .
لعرض وتعديل وقفات التاب الحالية للنموذج ببساطة اختر عرض ثم ترتيب تاب.
الشاشة مثل الظاهرة في الشكل 6.12 سوف تظهر اين تعدل الترتيب .
وتستطيع ايضا اختيار خيارالترتيب الالي - Auto Order-لجعل
الاكسس اليا يرتب الحاكمات من الاعلى للاسفل ,ومن اليسار لليمين.
هذه التلميحات الاساسية القليلة سوف تساعدك لاظهار تطبيقك مهذبا اكثر .




Summary
الخلاصة
في هذا الفصل غطيت –دينيس-الاساسيات لبناء تطبيقات تفاعلية
متضمنا كيف الاستعراض خلال النماذج باستعمال الكود الفيجولي وكيف
تستعمل حاكمات اكثر تعقيدا لاظهار البيانات واستقبال ادخالات المستخدم .
حتى هذه النقطة فانه عندك الفهم الاساسي لكيف تصمم النماذج لاظهار
وادارة البيانات من قاعدة البيانات .
ستنتقل الى الفصل السابع بعون الله والذي يغطي الطرق المختلفة
لاستعمال الكود الفيجولي لربط واستيراد وتصدير البيانات الى
مصادر بيانات خارجية .


مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
02-11-2012, 11:43
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
بداية ارجو ان يكون جميع الاخوة الذين اكرمهم الله بالحج قد عادوا الى اهليهم سالمين مغفورين الذنب ان شاء الله
وان يكونوا قد دعوا للجميع ان شاء الله وان نسوا ارجو الدعاء لنا جميعا فورا قبل تراكم الذنوب .
نتابع معا الجزء الاول من الفصل السابع وعلى بركة الله وباسم الله نبدا :


Importing, Linking and Exporting Using External Data Sources
الاستيراد والربط والتصدير باستعمال مصادر البيانات الخارجية

في الفصل الخامس غطيت-دينيس-الاساسيات لاستعمال الادو والاس كيو ال
للعمل مع مصادر البيانات .
كل امثلة الادو والاس كيو ال تعاملت مع البيانات المخزنة في الجداول في قاعدة البيانات.
على اي حال في عالم اليوم التقني انت غالبا ما تتعامل مع البيانات والتطبيقات في
انماط –صيغ- مختلفة مثل ملفات نصية وصفحات مسطحة –الاكسل -.
ربما تحتاج لاستيراد او ربط البيانات من مختلف المصادر الى قاعدة بياناتك
لتجنب اعادة طباعة كل المعلومات المخزنة الكترونيا في تنسيق-صيغة- اخر .
في نقطة معينة وفي تطبيق اخر ربما تحتاج البيانات الموجودة في تطبيقك
او تريد اخراج بيانات من تطبيقك لسبب اخر.
في هذه الحالة يمكنك تصدير المعلومات من تطبيقك الى صيغة اخرى.
في هذا الفصل سوف استعرض طرقا مختلفة لاستعمال الكود الفيجولي
لربط واستيراد وتصدير الى مصادربيانات خارجية .
هذا الفصل سوف يغطي:

= الفرق بين الربط ,الاستيراد والتصدير .
=الربط ,الاستيراد ,والتصدير الى قواعد بيانات الاكسس الخارجية ( ملفات MDB).
= الربط ,الاستيراد ,والتصدير الى قواعد بيانات سيرفر الاس كيو ال.
= الربط ,الاستيراد ,والتصدير الى ملفات اخرى مثل الصفحات المسطحة والملفات النصية .
= تصنيع وارسال بريد الكتروني برمجيا .
= تعريف خدمات الويب وكيف تستعمل البيانات المرتجعة من خدمات الويب .
هذه المهارات سوف تمكنك من بناء التطبيقات القوية والتي تتفاعل مع مختلف التطبيقات والانماط.


Linking, Importing, and Exporting Overview
لمحة عن الربط والاستيراد والتصدير

الربط الى بيانات خارجية بعني صنع مؤشر لمصدربيانات خارجي والذي يسمح لك بان تتفاعل
مباشرة مع البيانات الداخلية –قاعدة البيانات-.
استيراد بيانات خارجية حرفيا استيراد نسخة من البيانات الى تطبيقك .
تصدير البيانات يشير الى فكرة استخلاص البيانات من تطبيقك الى ملف خارجي او نمط .

هنا بعض الحالات يجب اعتبارها عند الربط :
=البيانات تكون على سيرفر قاعدة البيانات والذي تطبيقك والاخرون يمكنهم استعماله.
=البيانات تستعمل من برنامج اخر والذي يتطلب نمط الملف الاصلي .
=البيانات الداخلية تحتاج الى التحديث على اسس ثابتة في نمطها الاصلي.

هنا بعض الامور التي تجب اعتبارها عند الاستيراد :
= النظام الموجود يندمج مع التطبيق الجديد والبيانات من النظام القديم
سوف تستخدم في النظام الجديد .(في بعض الحالات يمكنك الاندماج مع نظام اخر لكن
تظل البيانات على سيرفرقاعدة البيانات بدون الحاجة للاستيراد للبيانات ).
= عمليات البيانات العديدة يجب ان تجري على البيانات من المصدر الاخر.
يمكنك الحصول على تحسين الاداء بواسطة استيراد البيانات ,لكن البيانات الداخلية
لكن تكون متزامنة اذا عملت اي تغيير للبيانات بعد استيرادها.
اكسس بسمح لك للربط مع واستيراد من مصادر بيانات مثل - Access (Jet) databases
SQL Server databases, other ODBC databases, Microsoft Sharepoint, XML documents,
HTML documents, text files
Microsoft Exchange, Microsoft Outlook, and spreadsheets such as Microsoft
Excel and Lotus


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


Access and Other Databases
اكسس وقواعد بيانات اخرى
يمكنك استعمال الطريق- TransferDatabase-لكائن- DoCmd-للاستيراد من , ربط مع
وتصدير البيانات الى اكسس وعدة قواعد بيانات , شاملة سيرفر الاس كيو ال و اوراكل.
الصيغة الاساسية للطريق- TransferDatabase-ظاهر في الكود التالي:


DoCmd.TransferDatabase(TransferType, DatabaseType, DatabaseName, ObjectType,
Source, Destination, StructureOnly, StoreLogin)

معلمات مختلفة تستعمل لتحديد كيف يجب ان ينفذ الطريق .
الجدول المرفق يوضح استعمال كل معلمة.

دعنا ننظر الى مثال .افترض انك تريد استيراد بيانات من قاعدة بيانات اكسس
مسماه- SampleDb-. البيانات التي تريد استيرادها هي جدول اسمه- Sales-
وتريد استيراده الى قاعدة بياناتك الحالية تحت نفس الاسم- tblSales-.
يمكنك تشغيل الكود التالي من تطبيقك الاكسسي الحالي :


DoCmd.TransferDatabase acImport, "Microsoft Access " , -
"SampleDb.mdb", acTable, "Sales", "tblSales"

وهنا مثال لاظهار الربط الى جدول يسمى- Sales- في قاعدة بيانات ODBC
مسماه- Wrox-



DoCmd.TransferDatabase acLink, "ODBC Database " , -
-"; ODBC;DSN=DataSourceName;UID=username;PWD=pwd;LANGU AGE=us_english
"DATABASE=Wrox", acTable, "Sales", "dboSales" &

اسم مصدر البيانات – ODBC- يمكن ان يشير الى اي قاعدة بيانات والتي يدعمها
-
ODBC-- شاملا سيرفر الاس كيو ال و اوراكل ,ولتسمية امثلة قليلة .وكما في اي
عملية ربط سوف ترى الجدول او الجداول من شاشة قاعدة بيانات الاكسس.


مرفق الجدول
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
04-11-2012, 05:19
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزءالثاني من الفصل السابع وعلى بركة الله وباسم الله نبدا



Importing Data from the Sample Northwind Database
استيراد بيانات من مثال قاعدة بيانات نورثوند – Northwind-
الان جاء المثال العملي .دعنا نستورد بيانات من قاعدة بيانات – Northwind-والتي
تاتي مع اكسس.
1- اضف نمطية جديدة الى قاعدة البيانات- Ch7CodeExamples-.
2-اضف الكود التالي الى النمطية :



Sub TestTransferDatabase()
'import from Northwind
DoCmd.TransferDatabase acImport, "Microsoft Access" , -
, -"C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb "
acTable, "Employees", "tblEmployees"
End Sub

3-عدل المسار السابق الى الموضع الموجودة فيه قاعدة البيانات على القرص الصلب عندك .
وان لم توجد عندك هذه القاعدة عدل المعلمات الى مرجع قاعدة بيانات موجودة عندك .
4- من الشاشة الفورية في المحرر الفيجولي اطبع: TestTransferDatabase—ثم
انقر ادخال لتشغيل الاجراء.
5- افتح شاشة قاعدة البيانات يجب ان تشاهد الشاشة كما في الشكل 7.1 .


How It Works
كيف يعمل
في هذا المثال استعملت الطريق- TransferDatabase-لاستيراد البيانات من
مثال قاعدة البيانات نورثوند .
المعلمات للطريق-- TransferDatabaseحددت البتات المختلفة من المعلومات
والتي يحتاجها اكسس لتنفيذ الاستيراد.


Sub TestTransferDatabase()
'import from Northwind
DoCmd.TransferDatabase acImport, "Microsoft Access" , -
, -"C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb "
acTable, "Employees", "tblEmployees"
End Sub

وبعد ان شغلت الاجراء ,يجب ان تلاحظ وجود الجدول الجديد في شاشة قاعدة البيانات .


Transferring Complete SQL Server Database
نقل قاعدة سيرفر اس كيو ال كاملة
الطريق- TransferSQLDatabase-يسمح لنقل كامل قاعدة بيانات
سيرفر الاس كيو ال الى قاعدة بيانات اخرى .في التاثير هذا الطريق
يستورد كامل قاعدة بيانات سيرفر الاس كيو ال الى قاعدتك لبيانات اكسس .
هنا الصيغة الاساسية:


DoCmd.TransferSQLDatabase(Server, Database, UseTrustedConnection, Login,
Password, TransferCopyData)

معلمات مختلفة تستعمل لتحديد كيف الطريق يجب تنفيذه.
ا
الجدول 1 في المرفق يوضح استعمال كل معلمة .


على سبيل المثال لنقل كامل محتويات قاعدة البيانات المسماه- Pubs-الى قاعدة البيانات الحالية
يمكنك استعمال الامر مشابه للتالي :


DoCmd.TransferSQLDatabase -
Server:="ServerName" , -
Database:="Pubs" , -
UseTrustedConnection:=True , -
TransferCopyData:=False




Spreadsheets
الصفحات المسطحة
الطريق- TransferSpreadsheet-مشابه كثيرا للطريق- TransferDatabase-
في انه يمكنك من استيراد ,ربط, وتصدير. فقط في هذه الحالة هو يتعامل مع
الصفحات المسطحة .الصيغة كما في الكود التالي :


DoCmd.TransferSpreadsheet(TransferType, SpreadsheetType, TableName,
FileName, HasFieldNames, Range, UseOA)


معلمات مختلفة تستعمل لتحديد كيف يجب تنفيذ الطريق.
الجدول المرفق 2 يوضح استعمال كل معلمة


الان سوف ننتقل الى مثال لكيف تستعمل الطريق – TransferSpreadsheet-لتصدير
بيانات الى الصفحات المسطحة .افترض انك تريد تصدير محتويات جدول الموظفين والذي
لتوك استوردته من نورثوند الى الصفحات المسطحة حتى ترسله بالبريد الالكتروني او لصاحبك .
الكود التالي سوف يصنع صفحات مسطحة جديدة اسمها- Employees.xls- في مجلد
temp directory- - :



DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, -
"tblEmployees", "C:\Temp\Employees.xls"


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

يمكنك استعمال الادو لاختيار , اضافة , تحديث , وحذف البيانات الداخلية
في اغلب مصادر البيانات . في هذا الفصل بواسطة تحديد مزود الادو الصحيح (في هذه الحالة اكسل)

مرفق الصور
مرفق الجدولين
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
06-11-2012, 08:11
الاخوة الاعزاء


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


نتابع معا الجزء الثالث من الفصل السابع وعلى بركة الله وباسم الله نبدا



Text Files



الملفات النصية


الطريق- TransferText-يسمح لك باستيراد من,ربط الى




والتصدير الى ملفات نصية .ولها الصيغة التالية:








DoCmd.TransferText(TransferType, SpecificationName, TableName, FileName,



HasFieldNames, HTMLTableName, CodePage)



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


هذه المعلمات هي مشابهه للطرق-TransferDatabase و TransferSpreadsheet


والتي شاهدتها من قبل .


الجدول 1 المرفق يوضح استعمال كل معلمة.



بعد ذلك دعنا نقفز حالا لاستيراد البيانات من ملف نصي .


Importing Data from a Text File



استيراد بيانات من ملف نصي



الان استورد بياناتت من ملف نصي الى جدول جديد ,يسمى –tblEmails- في قاعدة



بياناتك الاكسسية .



1- اصنع ملف نصي كما في الشكل 7.3واحفظه في C:\temp



2- اضف الاجراء التالي الى النمطية في قاعدة بياناتك :





Sub TestTransferText()



DoCmd.TransferText acImportDelim , , -



"tblEmails", "C:\Temp\emails.txt", True



End Sub


3- شغل الاجراء من الشاشة الفورية في المحرر الفيجولي .


4- ارجع الى شاشة قاعدة البيانات ويجب ان ترى الشاشة تشابه الظاهر في الشكل 7.4 .



How It Works



كيف تعمل


اولا انت صنعت ملفا نصيا ويحتوي سجلات محصورة بالفواصل .


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



Sub TestTransferText()



DoCmd.TransferText acImportDelim , , -



"tblEmails", "C:\Temp\emails.txt", True



End Sub




الطريق – TransferText-استورد الملف المحصور بفواصل الى قاعدة



الجدول الجديد المسمى- tblEmails-,كما في الشكل 7.4.



لاحظ ان المعلمة اسم المواصفة ترك فارغا . انه غير مطلوب عند العمل بالملفات المحصورة .






XML Files



ملفات- XML



XML يشير الى لغة - eXtensible Markup-.



ربما سمعت بالكلمة-XML- لكن ربما لا تعرف ما هي حقيقة ملفات –XML-.



XML هي الصيغة التي تسمح للانظمة لصنع وثائق نصية بسيطة مع tags مختلفة



التي تعرف كيف يجب ترجمة النص.



في نهاية هذا القسم سوف تصنع وثيقة –XML- من الجدول حتى ترى كيف يبدو الواحد .



الفكرة خلف –XML-لاعطاء انواع مختلفة من انظمة التشغيل على قواعد –منصات-



مختلفة بطرق ذات معنى للاتصال الواحدة بالاخرى .



وكلما نما استعمال –XML- وزاد في الشهرة زاد الحاجة لكتابة تطبيقات



الاكسس والتي تستورد وتصدر الى ملفات –XML-.



النسخ الجديدة من منتجات ميكروسوفت تساهم زيادة في التعامل مع –XML-



متضمنا الطريقان:ImportXML و ExportXML والتي تزود الاكسس



لتمكين المستخدمين من استيراد من وتصدير الى قواعد –XML-.



وسوف تنظر على كل منهما على الدور .



الصيغة للطريق ImportXML- - هي :



Application.ImportXML(DataSource, ImportOptions)


مصدر البيانات هو الاسم والمسار لملف-XML-للاستيراد .


ومعلمة –ImportOptions- يمكن ان يكون –acStructureAndData


في الوضع الاساسي


acAppendData, او acStructureOnly


لذلك لاستيراد وثائق –XML- الى الجدول في قاعدة البيانات الاكسسية


يجب ان تستعمل الكود التالي :


Application.ImportXML "employees.xml", acStructureAndData

الطريق – ExportXML- يسمح لك بان تصدر البيانات في قاعدة البيانات



الاكسسية الى ملفات – XML- لتبادل البيانات مع تطبيقات اخرى . هنا الصيغة :




Application.ExportXML(ObjectType, DataSource, DataTarget, SchemaTarget,



PresentationTarget, ImageTarget, Encoding, OtherFlags, FilterCriteria,



AdditionalData)



الجدول 2 المرفق يوضح المعلمات المختلفة لكائن – ExportXML- واستعمالاتها .



انا قلت سابقا -دينيس-انني سازودك بمثال عن ملف –XML-حتى ترى كيف يبدو .حسنا حان الوقت لاستعمال


الطريق –ExportXML- لتصدير واحد من جداولك الى –XML- حتى ترى يعمل ذلك .



افترض ان لديك هذا الاجراء:








Sub TestExportXML()



Application.ExportXML acExportTable, "tblEmployees" , -



, -"c:\Temp\Employees.xml"



"c:\Temp\EmployeesSchema.xml"



End Sub




الاجراء المستعمل للطريق –ExportXML- لتصدير جدول الموظفين –Employees-


في قاعدة بياناتك الى ملف XML يسمى-Employees.xml-.


بعد تنفيذ الاجراء السابق سوف تصنع ملفا –XML-والذي يشبه الملف الموجود في الشكل 7.5 .


لاحظ في الشكل 7.5 كيف – tags- توصف البيانات في طرق مفصلة .


هذا اكثر تفصيلا وطريقة معمارية لتنظيم ووصف البيانات اكثر من – HTML- والتي فقط


صممت لعرض البيانات .


وهذا كل المطلوب لتصدير البيانات من تطبيقاتك الاكسسية للارسال لنظام اخر .


انت الان جاهز لكيف ترسل بريد الكتروني من الكود الفيجولي .



وهذا ما سوف نتابعه في اللقاء القادم ان شاء الله
مرفق الصور
مرفق الجداول

أبو يوسف1
10-11-2012, 01:43
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع وقبل الاخير من الفصل السابع وعلى بركة الله وباسم الله نبدا


E-mails and Outlook
البريد الالكتروني والاوت لوك

احدى الطرق لارسال بريد الكتروني من الكود الفيجولي هو استعمال الطريق-SendObject- كما في التالي:


DoCmd.SendObject(ObjectType, ObjectName, OutputFormat, To, Cc, Bcc, Subject,
MessageText, EditMessage, TemplateFile)


المعلمات : ObjectType, ObjectName, and OutputFormat
تستعمل لتحديد الملف المصنع من قاعدة البيانات لتضمينه كمرفق .
تذكر انا ذكرت سابقا-دينيس-انك صدرت الجدول- tblEmployees-الى اكسل
لترسله بالبريد الالكتروني لزملائك .الطريق- SendObject-يسمح لك لان ترفق
كائنات مخصصة من قاعدة البيانات في واحدة من النسق المختلفة كجزء من البريد الالكتروني.
لذلك لتوليد بريد الكتروني جديد والذي ايضا يرفق مع الجدول- tblEmployees-كمرفق ملف
بتنسيق الاكسل فانه يمكنك استعمال شيئ شبيه بالتالي :



‘Send the Employees file
DoCmd.SendObject acSendTable, "tblEmployees", acFormatXLS , -
"”someone@yahoo.com", , , "Employee List", "For your review.", False

وان لم ترغب بارسال مرفق, لكن فقط تريد ارسال بريد الكتروني مخبري كم تحب الكتاب حتى الان
يمكنك استعمال الامر التالي .-رجاء اعملها انا احب ان احصل على هذا الفحص بالبريد الالكتروني منك !!
-هذا رجاء دينيس والله لا يكسر خاطر انسان-



‘Send the author of this book an email
DoCmd.SendObject acSendNoObject, , , "denisegosnell@yahoo.com”, , , -
, -" ! This is cool "
“I just sent an email from VBA. Really am enjoying your book.", False

ان اردت تعلم اكثر عن التحكم بالاوت لوك من تطبيقات الفيجول بيسك راجع الفصل 10
هناك غطيت الاتمته بمختلف برامج الاوفيس مثل الاوت لوك .
الطريق- SendObject-الذي لتوي ناقشته غير مخصص لاي برنامج بريد الكتروني.



Other Ways to Export Data
طرق اخرى لتصدير البيانات

للان طريقة اخرى لتصدير البيانات يمكن تنفيذها باستعمال الطريق- OutputTo-.
هذا الطريق يمكن ان يصدر بيانات الى مختلف الصيغ:
ASP, DAP, HTML, IIS, RTF, SNP, TXT, and XLS.

الصيغة لهذا الطريق هي :



DoCmd.OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart,
TemplateFile, Encoding)

رجاء راجع الفصل 8 لمعلومات اكثر عن الطريق – OutputTo-.لان كل الفصل مخصص لصنع
التقارير والمخارج المتوافقة مع الويب متضمنة الاتي صنعت بالطريق – OutputTo-



Using Data from Web Services
استعمال البيانات من خدمات الويب
حتى الان في هذا الفصل: لقد تعلمت كيف تتفاعل مع اكثر مصادر البيانات الخارجية الشائعة في تطبيقاتك .
من المواضيع العامة للنقاش في القطاع التقني العالي في هذه الايام هو خدمات الويب.
خدمات الويب هي عناصر معادة الاستخدام وتعتمد على بروتوكول الانترنت الاساسي .
وتمكن الانظمة على مختلف المنصات للتكلم –التفاهم- مع بعضها .
في اسهل طريقة سوف اصف خدمات الويب كبعض الاجراء او الدالة والذي يجعله
الشخص متاحا عبر بروتوكولات النت حتى تتمكن من من استعماله مجانا او بالثمن .
خدمات الويب يمكن تسميتها-(consumed)-بواسطة بالتطبيقات المعتمدة على الويب والتي لا تعتمد
طالما التطبيق يمكنه الاتصال باستعمال بروتوكولات الانترنت الاساسية .
خدمات الويب ترجع استجابة في نسق – XML-والتي يمكن ان تستعمل بعد ذلك
بشكل مناسب في البرنامج المستهلك .
وعلى الرغم من ان خدمات الويب تتصل مستعملة بروتوكلات النت ,فانه يمكن ان تستعمل
خدمات الويب لامور خاصة داخل الشركة .مثال بعض الشركات عندها تكامل افضل في
الكمبيوترات الضخمة- mainframe-وتطبيقات اخرى الى بيئتهم الحالية بواسطة
عرض اجزاء من التطبيقات القديمة كخدمات ويب.
بعد وضع التطبيقات القديمة في المتناول باستخدام خدمات الويب يمكنها ان
تستدعى من منصات اخرى والتي تقليديا لا يمكن ان تتواصل – تتتفاهم- بسهوله .
وعلى الرغم من انني استطيع كتابة فصلا كاملا او حتى كتاب على خدمات
الويب لوحدها –كبيرة يا دينيس من يومك –انا بدي اياك على الاقل
ان تتعلم ما هو المفهوم الاساسي لخدمات الويب .-الله كريم .
وانا ايضا اريد ان اعطيك مثالا بسيطا لكيف تستخدم خدمات الويب من الاخرين
في تطبيقاتك الاكسسية .بقية الفصل هذا سوف تريك كيف تجد وتستهلك
خدمات الويب من الاكسس.
قبل ان تستهلك خدمات الويب يجب عليك ان تنزل وتنصب :
Microsoft Office 2003 Web Services Toolkit
في وقت صناعة هذا الكتاب فان اسهل طريقة للحصول على هذه الاداة هو :
http://msdn.microsoft.com/office/downloads/toolsutils/default.aspx

وبعدها انقر الرابط الى :
Microsoft Office 2003 Web Services Toolkit 2.01

حاليا هذا الرابط من ابي يوسف :

http://www.microsoft.com/en-us/download/confirmation.aspx?id=2224

وبعد التنزيل نصب الاداة وتابع التعليمات للنهاية .
وبعد حصولك على هذه الاداة فانك تستطيع استعمال خدمات الويب من تطبيقاتك الاكسسية .



Adding a Reference to a Web Service
اضافة مرجع لخدمة الويب

الان دعنا نؤكد ان الاداة قد تم تنصيبه وقد تم اضافة مرجعا لمشروعك
الاكسسي لخدمات الويب الموجودة .
1- اكد على تمام تنصيب الاداة بنجاح ولعمل ذلك افتح المحرر الفيجولي واختر
ادوات للتاكد من وجود هذا المرجع كما في الشكل 7.6 .

2- اختر ادوات ثم مراجع خدمات الويب - Web Services References- ثم
اختر الخيار-WebServiceURL- واطبع -URL -التالي في الصندوق :

http://terraserver-usa.com/TerraService2.asmx

انقر زر البحث .شاشة تشبه كما في الشكل 7.7 سوف تظهر .
تحتاج الى اتصال بالنت والا امثلة خدمات الويب الظاهرة هنا لن تعمل .


3-اختر خد مة الويب- TerraService- في اعلى الجزء الايمن
حتى يظهر صندوق الاختيار .وايضا افتح القائمة لترى الاجراءات
الموجودة متضمنا الاجراءات الظاهرة في الشكل 7.8 .
4- اختر الزر اضافة لاضافة المرجع - Terra Web Service لنموذجك .
5- عند الرجوع الى المحرر الفيجولي فانك سوف تشاهد نمطيات فئة متعددة
قد اضيفت الى مشروعك كما في الشكل 7.9 .



How It Works
كيف تعمل
لاضافة مرجع لخدمة الويب , اولا اخترت من الادوات خيار مراجع خدمات الويب .
ولانك سوف تستخدم الخدمة الموجودة في -:
http://terraserver-usa.com/TerraService2.asmx
انت اخترت خيار - Web Service URL- وحددت المسار - Terra Server-
في حقل- URL- كما في الشكل 7.7 .
وايضا بحثت عن الخدمات المنوفرة باستعمال مفاتيح كلمات مخصصة او تحديد
الموقع لخدمات ويب اخرى .
وبعدها اخترت - Terra Server Web service-ونقرت زر الاضافة .
نمطيات فئة كثيرة قد اضيفت لقاعدة البيانات لجعل الاجراءات التي شاهدتها
في الشكل 7.8 متاحة في مشروعك الاكسسي .
وتستطيع اضافة مرجعا لاي خدمة ويب والمتوفرة على شبكتك عبر النت.
او على كمبيوترك المحلى بواسطة الاستعراض الى مكانه .
مثال ميكروسوفت , امازون , جوجل , واي خدمات ويب اخرى يمكنك استعمالها .
معلومات اوفى عن خدمات الويب هذه يمكن تواجدها على:
http://msdn.microsoft.com/webservices/building/livewebservices/

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



مرفق الصور
مرفق المثال للفصل كاملا من طرف المؤلف
مرفق الاداة
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
13-11-2012, 08:36
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس والاخير من الفصل السابع وعلى بركة الله وباسم الله نبدا :
الان وعندك المرجع لخدمات الويب - Terra Server Web service- تستطيع استهلاك
واحدة من الاجراءات من خلال تطبيقك.



Consuming the GetPlaceFacts Method
استهلاك الطريق- GetPlaceFacts-

في هذا المثال سوف تستدعي واحدة من الاجراءات في - Terra Server Web service.-.
اجراء خدمة الويب سوف يستدعي قيم خطوط الطول والعرض ويعيد المدينة ذات الموقع
على هذه الاحداثيات .

1-اضف الاجراء التالي الى نمطية الفئة .


Sub TestWebService()
‘declare a new instance of the web service
Dim ts As clsws_TerraService
Set ts = New clsws_TerraService
‘declare a structure to hold the latitude and longitude values
Dim objLonLatPt As New struct_LonLatPt
‘declare a variable to store the result from the web service
Dim strResult As String
‘assign the latitude and longitude values
objLonLatPt.Lat = "37.7875671”
objLonLatPt.Lon = "-122.4276”
‘Call the web service to return the place for that latitude
‘and longitude
strResult = ts.wsm_ConvertLonLatPtToNearestPlace(objLonLatPt)
‘display the result
MsgBox "The city at that latitude and longitude is: " & strResult
End Sub

- شغل الاجراء من الشاشة الفورية بطباعة – TestWebService- واضغط ادخال .
يجب ان تستقبل رسالة مشابهه كما في الشكل 7.10.


How It Works
كيف يعمل
لاستدعاء - Web service-من تطبيقك ,انت صنعت الاجراء- TestWebService-


Sub TestWebService()
ولتصريح نسخة اخرى من - Web service- فقط صرح اي كائن اخر

‘declare a new instance of the web service
Dim ts As clsws_TerraService
Set ts = New clsws_TerraService

انت صرحت متغير – structure- لتخزين قيم الطول والعرض .
انت صنعت تعريف- structure-في الكود والذي تم توليده عند اضافة - Web service-
لذلك كل ما عليك عمله هو التصريح بمتغير .


‘declare a structure to hold the latitude and longitude values
Dim objLonLatPt As New struct_LonLatPt

بعدها انت صرحت متغير نصي محلي لتخزين النتيجة ل- Web service-


‘declare a variable to store the result from the web service
Dim strResult As String

وانت ضبطت معلمات الطول والعرض ل- objLonLatPt- والتي سوف تمرر الى – Web service-كمعلمات .

‘assign the latitude and longitude values
objLonLatPt.Lat = "37.7875671”
objLonLatPt.Lon = "-122.4276”

السطر بالاسفل حقيقة بستدعي - Web service-على - Terra Server-عبر الانترنت
ويعيد القيمة الى المتغير – strResult.ان لم يكن لديك اتصال مع النت فان خللا سوف يظهر .



‘Call the web service to return the place for that latitude
‘and longitude
strResult = ts.wsm_ConvertLonLatPtToNearestPlace(objLonLatPt)


وحالما تطبع سطر الكود فاك ستلاحظ ان اداة المساعدة قد اظهرت لتبين اي معلمات
مطلوبة ل- Web service-. الشكل 7.11 يظهر مثالا لذلك .

اخر سطر في الكود يظهر النتيجة المسترجعة من - Web service-



‘display the result
MsgBox "The city at that latitude and longitude is: " & strResult
End Sub


وعند تشغيل الاجراء من الشاشة الفورية سوف تستقبل مربع حوار مثل الشكل 7.10 والذي يبين ان
- San Francisco, California, USA- متواجدة في هذه الاحداثيات .

انه مدهش حقا الذي حدث , انت شغلت اجراء بعيدا والموجود في كمبيوتر
شخص اخر واستعملت النتيجة في التطبيق .
املة انك تعرفت ان سهولة استدعاء - Web service- هو تقريبا بسهولة استدعاء اي اجراء اخر .
الفرق الوحيد انه يجب تحديد واضافة المرجع الى -Web service-
وتوثيق معرفتك بالمعلمات المتوقعة



Summary
الخاتمة
في عالم اليوم التقني , اصبح مكان مشترك للشركات لتوقع انظمة تتواصل مع بعضها البعض بطرق لم تكن ممكنة
فقط قبل عقد من الزمن .
في هذا الفصل انت استعرضت الطرق للعمل مع المصادر الخارجية لتسهيل الاتصال بين انظمة مختلفة .

انت تعلمت ان تقنيات الفيجول بيسك لربط ,استيراد ,وتصدير البيانات الى مختلف المصادر
مثل قواعد البيانات , الصفحات المسطحة , وملفات النصوص .
وتعلمت كيف تتعامل مع سيناريوهات اكثر تقدما مثل ارسال رسائل بريد الكتروني برمجيا
واستهلاك خدمات الويب من تطبيقاتك .خدمات الويب تسمح للتطبيقات على مختلف المنصات
لتبادل البيانات عند الطلب وتصبح تقنيات الاتصالت في تزايد الانتشار بين الانظمة .
الفصل 8 سوف يبني على هذا الفصل بتوضيح كيف تصدر البيانات في تطبيقك الى تقارير
ومخارج متوافقة للويب .

مرفق الصور - اظن يوجد عندي مشكلة في الرفع سارفع حال حل المشكلة ان شاء الله
والى لقاء اخر ان شاء الله في الفصل الثامن

أبو يوسف1
13-11-2012, 08:42
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
اعتذر عن الخلل يبدو ان المتصفح فيه مشكلة واستعملت الان متصفحا اخر
هذه الصور المرفقة

أبو يوسف1
16-11-2012, 12:45
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الاول من الفصل الثامن وعلى بركة الله وباسم الله نبدا


Creating Reports
and Web-Enabled Output
صنع تقارير ومخارج شبكية
في الفصل السابع استعرضت طرقا مختلفة للعمل بمصادر البيانات المختلفة ,مثل الربط
الاستيراد والتصدير للبيانات .
في هذا الفصل سوف اغطي :

= تصنيع التقارير برمجيا وكيف تخرج البيانات من قواعد البيانات الاكسسية بالطرق
الممكن استعمالها على الشبكة .مثال سوف تستعرض تضبط مصدر السجلات للتقرير ديناميكيا .
= تصنيع التقرير برمجيا .
= استعمال الطريق- OutputTo- لتصدير البيانات الى مختلف الانماط للشبكة .
مثل - HTML, ASP و data access page files (DAP).



Working with Reports from VBA
العمل بالتقارير من تطبيقات الفيجوال بيسك
التقارير يمكن التحكم بها في طرق عديدة من الكود الفيجولي .مثال يمكنك
تغيير مصدر البيانات الذي يعتمد عليه التقرير من خلال الكود الفيجولي .
وتستطيع ايضا ان تصنع تقارير من الخربشات -البداية- او تعديل التقارير الموجودة
من خلال الكود الفيجولي .
دعنا ننظر على امثلة قليلة لتوضيح اكثر لهذه المفاهيم .
كثير من المثلة في هذا الفصل والتي تتعامل مع التحكم بالتقارير الموجودة تستعمل
قاعدة البيانات نورثوند – Northwind-.اذا اردت ان تصنع هذه الامثلة بنفسك
افتح قاعدة البيانات نورثوند واضف نمطية جديدة .
المقصود هذه الامثلة طبقها بنفسك لان- دينيس - لم ترفقها مع امثلة الكتاب
حيث ان الامثلة العملية فقط هي الموجودة في المثال المرفق مع الفصل الثامن


Setting the Report Data Source
ضبط مصدر بيانات التقرير

خاصية – DataSource- في كائن التقرير يمكن تحديدها كعبارة SQL.
افترض ان لديك تقريرا اسمه- Alphabetical List of Products.
الاجراء التالي يوضح احدى الطرق لامكانية تعديل – DataSource- للتقرير .



Sub ModifyExistingReport()
‘declare a variable to store the SQL string
Dim strSQL As String
‘set the SQL statement value to show only discontinued products
strSQL = "SELECT Products.*, Categories.CategoryName “ & -
& -"FROM Categories INNER JOIN Products ON"
& -"Categories.CategoryID = Products.CategoryID"
" WHERE Products.Discontinued=Yes ;"
‘access the report's design (hidden from the user)
DoCmd.Echo False
DoCmd.OpenReport "Alphabetical List of Products", acViewDesign
‘set the source of the report to the SQL statement
Reports("Alphabetical List of Products").RecordSource = strSQL
‘close the report's design and save changes
DoCmd.Close , , acSaveYes
‘now open the report for the user in preview mode
DoCmd.OpenReport "Alphabetical List of Products", acViewPreview
DoCmd.Echo True
End Sub

اولا كيف ان جملة SQLتم صنعها لتحديد على اي حقول يعتمد التقرير .
ثم بعدها تم الدخول على عرض تصميم التقرير في الوضع المخفي (echo false) حتى لا يرى
المستخدم التعديلات .
بعدها تم اسناد RecordSource الى متغير strSQL. وبعدها تم اغلاق التقرير .والتغييرات حفظت .
اخيرا التقرير تم فتحه في طور المعاينة حتى ترى التغييرات .

عندما تعمل تغييرات اخصائص التقرير ( مثل خاصية RecordSource) فانك في الواقع
يتم التغيير بشكل دائم لهذا الضبط تماما كما لو عملتها في عرض التصميم .
انت لا تعمل تغييرات مؤقته والتي لا تتم بعد تنفيذ الكود .
وتستطيع ان تحدد مجموعة سجلات ADOكمصدر لبيانات التقرير .
وتستطيع ان تعدل المثال السابق كالتالي :



Sub ModifyExistingReport()
‘declare a variable to store the SQL string
Dim strSQL As String
‘set the SQL statement value to show only discontinued products
strSQL = "SELECT Products.*, Categories.CategoryName “ & -
& -"FROM Categories INNER JOIN Products ON"
& -"Categories.CategoryID = Products.CategoryID"
" ; WHERE Products.Discontinued=Yes"
‘declare and instantiate a new recordset
Dim rsDiscontinued As ADODB.Recordset
Set rsDiscontinued = New ADODB.Recordset
‘open the recordset based on the SQL statement
rsDiscontinued.Open strSQL, CurrentProject.Connection
'access the report's design (hidden from the user)
DoCmd.Echo False
DoCmd.OpenReport "Alphabetical List of Products", acViewDesign
‘set the source of the report to the recordset source
Reports("Alphabetical List of Products").RecordSource = rsDiscontinued.Source
‘close the report's design and save changes
DoCmd.Close , , acSaveYes
‘now open the report for the user in preview mode
DoCmd.OpenReport "Alphabetical List of Products", acViewPreview
DoCmd.Echo True
‘close the recordset and free the memory
rsDiscontinued.Close
Set rsDiscontinued = Nothing
End Sub

لاحظ كيف ان المثال استخدم عبارة SQL لصنع مجموعة سجلات ADO ومن ثم
اسند خاصية RecordSource للتقرير الى خاصية Source لمجموعة السجلات .

والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
16-11-2012, 09:37
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل الثامن وعلى بركة الله وباسم الله نبدا


Creating Reports Programmatically
تصنيع التقارير برمجيا
تماما كما تتعامل بالنماذذج وكائنات اكسس الاخرى فانه يمكنك التعامل مع التقارير
برمجيا .تستطيع صنع التقارير من-خربشات- البداية وتعدل على التقارير الموجودة –الجاهزة-.
دعنا ننظر على كيف تصنع التقرير من البداية :



Creating an Empty Report
تصنيع تقرير فارغ
لصنع تقرير جديد استعمل الطريق – CreateReport- وهنا الصيغة الاساسية :



Dim rptReport as Access.Report
Set rptReport = CreateReport

بالاسفل مثالا والذي يصنع تقريرا جديدا فارغا ويستكشف اي تقرير موجود
بنفس الاسم قبل صنع التقرير الجديد .



Sub CreateNewReport()
Dim rptCustomers As Access.Report
Dim strReportName As String
Dim aoAccessObj As AccessObject
‘set the name of the new report
strReportName = "Customers”
‘delete any existing report with that name
For Each aoAccessObj In CurrentProject.AllReports
If aoAccessObj.Name = strReportName Then
DoCmd.DeleteObject acReport, strReportName
End If
Next aoAccessObj
‘create a new Customers Report
Set rptCustomers = CreateReport
‘save and close the new report
DoCmd.Save , strReportName
DoCmd.Close
End Sub


اولا الكود يدور خلال مجموعة – AllReports-لاستكشاف اي تقرير موجود يحمل نفس الاسم .
بعدها كائن تقرير الاكسس- rptCustomers- تم اسناده الى الطريق- CreateReport-.
التقرير بعدها يحفظ بالاسم المحدد .عند هذه النقطة التقرير يكون فارغا ولا يوجد به عناصر تحكم تحكم .
دعنا ننظر كيف نضيف عناصر تحكم الى التقرير .



Adding Controls to the Report
اضافة عناصر تحكم للتقرير

الطريق- CreateReportControl-يسمح لك باضافة عنصر تحكم الى التقرير .
وهذا الطريق له الصيغة الاساسية :



CreateReportControl(ReportName, ControlType, Section, Parent,
ColumnName, Left, Top, Width, Height)

دعنا الان نعدل الكود السابق باضافة اربع حقول للتقرير :
CompanyName, ContactName, Title, andPhone
كل حقل يحتاج الى مربع نص وليبل .
الاجراء التالي المعدل هو احدى الطرق لاتمام ذلك :



Sub CreateNewReport()
Dim rptCustomers As Access.Report
Dim strReportName As String
Dim aoAccessObj As AccessObject
Dim txtTextBox As Access.TextBox
Dim lblLabel As Access.Label
Dim strSQL As String
Dim intPosition As Integer
‘set the name of the new report
strReportName = "Customers”
strSQL = "SELECT * FROM Customers ORDER BY CompanyName”
‘delete any existing report with that name
For Each aoAccessObj In CurrentProject.AllReports
If aoAccessObj.Name = strReportName Then
DoCmd.DeleteObject acReport, strReportName
End If
Next aoAccessObj
‘create a new Customers Report
Set rptCustomers = CreateReport
With rptCustomers
‘set the report record source to the SQL Statement
.RecordSource = strSQL
‘set the height, caption, and other report options
.Section("Detail").Height = 500
.Caption = "Client Contact List”
End With
‘add a Company Name label and text box to the report
intPosition = 0
Set txtTextBox = CreateReportControl(rptCustomers.Name, acTextBox , -
acDetail, , "CompanyName", intPosition)
txtTextBox.Name = "txtCompanyName”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptCustomers.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCompanyName”
lblLabel.Caption = "Company Name”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add a Contact Name label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 350
Set txtTextBox = CreateReportControl(rptCustomers.Name, acTextBox , -
acDetail, , "ContactName", intPosition)
txtTextBox.Name = "txtContactName”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptCustomers.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblContactName”
lblLabel.Caption = "Contact Name”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add a Contact Title label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 500
Set txtTextBox = CreateReportControl(rptCustomers.Name, acTextBox , -
acDetail, , "ContactTitle", intPosition)
txtTextBox.Name = "txtTitle”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptCustomers.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblTitle”
lblLabel.Caption = "Title”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add a Contact Phone label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 1000
Set txtTextBox = CreateReportControl(rptCustomers.Name, acTextBox , -
acDetail, , "Phone", intPosition)
txtTextBox.Name = "txtPhone”
Set lblLabel = CreateReportControl(rptCustomers.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblPhone”
lblLabel.Caption = "Phone”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘save and close the new report
DoCmd.Save , strReportName
DoCmd.Close
End Sub


في مثال الكود الظاهر مرة اخرى في هذا القسم لاحظ كيف ان مربع النص والليبل
تم التصريح بهما وبعد ذلك استعملت لصنع كل من الحقول في التقرير .
مثال ذلك – txtTextBox- تم اسناده الى النتيجة من الطريق – CreateReportControl-
والذي يحدد اسم التقرير ,النوع لقسم التحكم لاضافة التحكم , الاسم للتحكم ,والموقع
الذي يوضع به التحكم .خصائص اخرى مختلفة لمربع النص تم تحديدها مثل الاسم والعرض.
الليبل ايضا تم صنعه وتم تحديد عدد من الضابطات .



‘add a Company Name label and text box to the report
intPosition = 0
Set txtTextBox = CreateReportControl(rptCustomers.Name, acTextBox , -
acDetail, , "CompanyName", intPosition)
txtTextBox.Name = "txtCompanyName”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptCustomers.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCompanyName”
lblLabel.Caption = "Company Name”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True

نفس الخطوات الاساسية بعد ذلك تكرر لصنع كل تحكم للتقرير .

وهنا تنتهي الامثلة التي تتطلب ان تعملها لوحدك .
والتالي امثلة عملية

والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
16-11-2012, 10:22
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل الثامن وعلى بركة الله وباسم الله نبدا



Creating a Report Programmatically
تصنيع التقرير برمجيا –مثال عملي
حان الوقت لصنع التقرير برمجيا .هذا المثال العملي يصنع التقرير بالاعتماد على
جدول جديد والذي انشاته واستعملت عبارة SQL كخاصية – RecordSource- للتقرير .

1- اصنع قاعدة بيانات جديدة وسمها-Ch8CodeExamples-

2- اضف جدولا جديدا باسم –tblComplaints-لقاعدة البيانات كما في الشكل 8.1 .

3- افتح الجدول واضف بعض السجلات مثل الظاهرة في الشكل 8.2 .
4- اضف نمطية الى قاعدة البيانات .لعمل ذلك اختر نمطية من شاشة قاعدة البيانات وانقر الزر جديد .
5- اضف الاجراء –CreateComplaintsReport- الى النمطية .



Sub CreateComplaintsReport()
Dim rptComplaints As Access.Report
Dim strReportName As String
Dim txtTextBox As Access.TextBox
Dim lblLabel As Access.Label
Dim strSQL As String
Dim intPosition As Integer
‘set the name of the new report
strReportName = "Unresolved Customer Complaints”
strSQL = "SELECT * FROM tblComplaints WHERE Resolved=False”
‘create a new Unresolved Customer Complaints Report
Set rptComplaints = CreateReport
With rptComplaints
‘set the report record source to the SQL Statement
.RecordSource = strSQL
‘set the height, caption, and other report options
.Section("Detail").Height = 500
“.Caption = "Unresolved Customer Complaints
End With
‘add a Customer Name label and text box to the report
intPosition = 0
Set txtTextBox = CreateReportControl(rptComplaints.Name, acTextBox , -
acDetail, , "CustomerName", intPosition)
txtTextBox.Name = "txtCustomerName”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptComplaints.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCustomerName”
lblLabel.Caption = "Customer Name”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add a Customer Day Phone label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 350
Set txtTextBox = CreateReportControl(rptComplaints.Name, acTextBox , -
acDetail, , "CustomerDayPhone", intPosition)
txtTextBox.Name = "txtCustomerDayPhone)
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptComplaints.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCustomerDayPhone”
lblLabel.Caption = "Day Phone”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add a Customer Evening Phone label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 500
Set txtTextBox = CreateReportControl(rptComplaints.Name, acTextBox , -
acDetail, , "CustomerEveningPhone", intPosition)
txtTextBox.Name = "txtCustomerEveningPhone)
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptComplaints.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCustomerEveningPhone”
lblLabel.Caption = "Evening Phone”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘add an Issue Description label and text box to the report
intPosition = txtTextBox.Width + txtTextBox.Left + 1000
Set txtTextBox = CreateReportControl(rptComplaints.Name, acTextBox , -
acDetail, , "IssueDescription", intPosition)
txtTextBox.Name = "txtIssueDescription”
txtTextBox.Width = 2000
txtTextBox.Height = 750
Set lblLabel = CreateReportControl(rptComplaints.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblIssueDescription”
lblLabel.Caption = "Issue Description”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True
‘save and close the new report
DoCmd.Save , strReportName
DoCmd.Close
End Sub


6- شغل الاجراء من الشاشة الفورية بطباعة اسم الاجراء: CreateComplaintsReport
ثم انقر ادخال .
7- ارجع الى شاشة قاعدة البيانات واختر تقارير . التقرير الوليد حديثا –CreateComplaintsReport-
يجب ان يكون ظاهرا في شاشة قاعدة البيانات كما في الشكل 8.3 .

8- افتح -Unresolved Customer Complaints-لمراجعة التقرير .
شاشة تشابه كما في الشكل 8.4 يجب ان تظهر .



How It Works
كيف تعمل

اولا انت صنعت قاعدة بيانات جديدة وجدولا اسميته-tblComplaints-
واضفت بعض البيانات كعينة الى الجدول الوليد حتى يكون هناك ما يظهره التقرير.
وبعد ذلك صنعت نمطية جديدة واضفت الاجراء-CreateComplaintsReport-الى النمطية :


Sub CreateComplaintsReport()

الاجراء صرح ببعض المتغييرات للاستعمال في الاجراء , مثل كائن التقرير لتصنيع
تقريرا جديدا ومربع نص وليبل للاضافة للتقرير



Dim rptComplaints As Access.Report
Dim strReportName As String
Dim txtTextBox As Access.TextBox
Dim lblLabel As Access.Label
Dim strSQL As String
Dim intPosition As Integer
‘set the name of the new report
strReportName = "Unresolved Customer Complaints”
strSQL = "SELECT * FROM tblComplaints WHERE Resolved=False”

التقرير الجديد تم صنعه باستعمال الطريق – CreateReport-والخصائص مثل
RecordSource,Height, Caption تم ضبطها .
خاصية –RecordSource- تم اسنادها الى مصدر البيانات الى عبارة SQL.
خاصية ارتفاع قسم التفاصيل – Height- يحدد الحجم لقسم التفاصيل للتقرير :




‘create a new Unresolved Customer Complaints Report
Set rptComplaints = CreateReport
With rptComplaints
‘set the report record source to the SQL Statement
.RecordSource = strSQL
‘set the height, caption, and other report options
.Section("Detail").Height = 500
“.Caption = "Unresolved Customer Complaints
End With


بعد ذلك انت اضفت الكود لصنع عناصر التحكم بالتقرير .مثلا لصنع ليبل جديد لاسم الزبون
ومربع نص فانك استعملت الطريق-CreateReportControl- المعلمات
ل-CreateReportControl- تم تحديدها ضمن امور اخرى,اين تضمن الحقل
(في التقرير او قسم التفاصيل ), ما حقل مصدر البيانات الذي يعتمد عليه الحقل الجديد
وما الموقع الذي يجب ان يبدا به :



‘add a Customer Name label and text box to the report
intPosition = 0
Set txtTextBox = CreateReportControl(rptComplaints.Name, acTextBox , -
acDetail, , "CustomerName", intPosition)
txtTextBox.Name = "txtCustomerName”
txtTextBox.Width = 1800
Set lblLabel = CreateReportControl(rptComplaints.Name, acLabel , -
acPageHeader, , , intPosition)
lblLabel.Name = "lblCustomerName”
lblLabel.Caption = "Customer Name”
lblLabel.Height = txtTextBox.Height
lblLabel.Width = txtTextBox.Width
lblLabel.FontBold = True


نفس الكود الاساسي تكرر مع كل تحكم باقي على التقرير والمقصود هو :
اليبلات ومربعات النص ل-Customer Day Phone, Customer Evening Phone, and Issue Description-.
الاسطر الختامية في الاجراء تخزن وتغلق التقرير .


‘save and close the new report
DoCmd.Save , strReportName
DoCmd.Close
End Sub

وعندما تشغل الاجراء الجديد فان التقرير يكون قد تم صنعه وظهر في شاشة قاعدة البيانات كما في الشكل 8.3 .
التقرير بعدها يفتح في عرض المراجعة كما في الشكل 8.4 حتى ترى النتيجة النهائية لجهودك

مرفق الصور
مرفق المثال بدون التقرير ومع التقرير
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
18-11-2012, 03:18
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل الثامن وعلى بركة الله وباسم الله نبدا


Using the Printer Object to Designate Printing Options
استعمال كائن الطابعة لتعيين خيارات الطباعة
في الفصل الثالث تعلمت عن مجموعة الكابعات وكائن الطابعة .
هذه المجموعة والكائن مهمة اذا اردت التعديل على الهوامش او اي خصائص اخرى للطابعة
من اجل التقارير .
مثلا اذا اردت التعديل على الهوامش وعدد النسخ للطابعة الاولى فانك تستطيع استعمال
الكود مشابه للتالي :



Dim prtPrinter As Printer
Set prtPrinter = Application.Printers(0)
prtPrinter.TopMargin = 500
prtPrinter.BottomMargin = 250
prtPrinter.LeftMargin = 500
prtPrinter.RightMargin = 500
prtPrinter.Copies = 5

ومثالا اخر فانه يمكنك استعمال مجموعة –AllPrinters- للدوران باحثا عن
كل الطابعات على الكمبيوتر واخذ فعل بعض الافعال الفردية مثل اظهار
اسم الطابعة في مربع حوار الطابعة .راجع الفصل 3 لامثلة اضافية .
.

Working with Report Events
العمل باحداث التقرير
عند هذه النقطة يجب عليك ان تكون متالفا مع كيفية اضافة احداث للنماذج
مثل احداث النقر للزر .التقارير لها احداث تماما مثل النماذج ولكن ليس بكثرتها
كما تشاهد في الشكل 8.5 .
وتستطيع ايضا كتابة الكود الفيجولي خلف احداث التقرير ,مثل : فتح ,اغلاق ,تنشيط ,تثبيط.
Open,Close,Activate, and Deactivate

على سبيل المثال انت تريد اظهار رسالة للمستخدم عندما يفتح التقرير لاعلامه
ان التقريريتطلب وقتا طويلا للتحميل .وربما ترغب باضافة شريط ادوات للاظهار من
حدث-Activate- ومن ثم ازالة شريط الادوات عند قدح حدث – Deactivate-.
التالي هو مثال لاضافة وازالة شريط الادوات المعدل من احداث التقرير تنشيط وتثبيط .:


Private Sub Report_Activate()
DoCmd.ShowToolbar "CustomComplaints", acToolbarYes
End Sub

Private Sub Report_Deactivate()
DoCmd.ShowToolbar "CustomComplaints", acToolbarNo
End Sub


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


Exporting Access Data to Web Formats
تصدير بيانات الاكسس الى صيغ الشبكة العالمية

كما تعلمت في الفصل السابع ,فيوجد طرقا مختلفة لتصدير البيانات من الاكسس الى صيغ اخرى .
الطريق – OutputTo- يمكن التصدير الى فورمات مختلفة :

ASP, DAP, HTML, IIS, RTF, SNP, TXT, and XLS
الامثلة في هذا القسم سوف تركز على امثلة الويب ,لكن يمكنك استعمال هذا الطريق للتصدير
الى ملفات نصية او اي فورمات اخر مدعوم.
الصيغة الاساسية للطريق- OutputTo- ظاهرة في الكود التالي :



DoCmd.OutputTo(ObjectType, ObjectName, OutputFormat, OutputFile, AutoStart,
TemplateFile, Encoding)

الان وانت تعرف الصيغة الاساسية للطريق- OutputTo- دعنا ننظر الى كيف نستعمله
للتصدير للبيانات الى الصيغ :
HTML, Active Server Pages (ASP), and data access pages (DAP) formats .
وهذا ما سوف نكمله في اللقاء التالي ان شاء الله

مرفق الصور
والى لقاء اخر ان شاء الله قريبا

ابومنيب
22-11-2012, 02:15
شكرا والف شكر على هذا المجهود الجبار ....... والله يجعله في ميزان حسناتك
واستمر وكلنا معك نتابع بكل حب وتقدير .....

أبو يوسف1
22-11-2012, 06:01
شكرا والف شكر على هذا المجهود الجبار ....... والله يجعله في ميزان حسناتك
واستمر وكلنا معك نتابع بكل حب وتقدير .....

اخي العزيز ابومنيب
السلام عليكم ورحمة الله وبركاته
حياك الله اخي العزيز في مملكتنا الرائعة وان شاء الله تجد دائما ما يسرك .
ان شاء الله يوفقني الله لاكمال هذا الكتاب على خير وبطريقة مرضية يا رب .
اعتذر لعدم تمكني من رفع حلقات في الايام الماضية بسبب وجود جيوب في بناطيل الناس اما انا فعافاكم الله في الانف .
لذلك فقدت التركيز في الترجمة . ونشطت قليلا في مشاركات خفيفة في منتدى شقيق واخر صديق
وازعم بانني اسقطت طائرة اف 16 ليهود من صاروخ كلامي موجه من لوحة المفاتيح .
والحمد لله اولا واخرا .
لك دوما خالص تحياتي وتقديري العميقين اخي العزيز ابا منيب

أبو يوسف1
23-11-2012, 07:19
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل الثامن وعلى بركة الله وباسم الله نبدا


Creating Static HTML Pages
صنع صفحات HTML الثابتة
لا شك انك سمعت عن صفحات ال HTML ومن المرجح انك تعلم انها تستعمل عامة لاظهار صفحات الويب .
ويمكنك ان استعمال الطريق – OutputTo- لتصدير جدول قاعدة البيانات .استعلام .نتائج لعبارات SQL
او اي بيانات الى وثائق HTML الثابته.
وثائق HTML الثابته هي منفصلة عن مصدر البيانات الاصلي ولا تتغير كلما تغير البيانات
الداخلية –حيث الاسم الثابته – Static-
لتصدير النتائج من تقرير لوثائق HTML يجب ان تستعمل عبارة مشابه للتالي:




DoCmd.OutputTo acOutputReport, "ReportName", acFormatHTML,
"c:\temp\ReportName.html"


والان المثال لمعرفة كيف يعمل



Exporting the tblComplaints Table to HTML
تصدير جدول tblComplaints الى HTML -مثال عملي -


هذا المثال سوف يصدر البيانات الموجودة في الجدول tblComplaints والذي صنعته
سابقا في الفصل الى ملف HTML.

1- اضف الاجراء التالي الى النمطية التي صنعتها سابقا .



Sub OutputToHTML()
DoCmd.OutputTo acOutputTable, "tblComplaints", acFormatHTML,
“c:\temp\complaints.html", True
End Sub


2- شغل الاجراء OutputToHTML من الشاشة الفورية بطبع OutputToHTML
ثم نقر زر الادخال .
3- وثيقة HTML المصدرة يجب ان تتفتح اليا في متصفح الويب كما في الشكل 8.6 .



How It Works
كيف تعمل


الاجراء-OutputToHTML- يستعمل الطريق –OutputTo- مع معلمات مختلفة والتي
تشير الى ما الذي يجب تصديره ,في اي صيغة , والى اين .
في هذا المثال الجدول-tblComplaints- يتم تصديره الى صيغة HTML الى ملف جديد
سمي complaints.html. معلمة صحيح – True-عند نهاية العبارة والتالية هي
لمعلمة AutoStart للاشارة ان مستعرض الويب يجب ان يعمل اليا لاظهار الملف .



Sub OutputToHTML()
DoCmd.OutputTo acOutputTable, "tblComplaints", acFormatHTML ,
“c:\temp\complaints.html", True
End Sub

وبعد تشغيل الاجراء السابق ,فان مستعرض الويب فعلا يعمل ويظهر ملف
HTML الوليد في الشاشة مشابه لما في الشكل 8.6 .




Creating ASP Pages
تصنيع صفحات ASP

صفحات الخادم النشطة - Active Server Pages (ASP)-تعمل على خادم الويب
وتستعمل لاظهار البيانات الحالية كلما دخلت عليها .
ملفات – ASP- هي عامة تحتوي على كود مكتوب في بلغة نصية - script language-
مثل : VBScriptمن اجل استعادة البيانات .والتي تحتوي ايضا على كود مكتوب في
بعبارة HTML والتي ترجع الى مستعرض العميل لاظهار المحتويات .
ويمكنك استعمال ألطريق OutputTo لصنع صفحة ASP بطريقة مشابهه لما صنعت بملفHTML.
على سبيل المثال الامر التالي يصنع صفحة ASP معتمدة على جدول tblComplaints



DoCmd.OutputTo acOutputTable, "tblComplaints", acFormatASP ,
"c:\temp\complaints.asp"

الجدول tblComplaints يتم تصديره الى ملف ASP مشابه للمرفق .وهي صورة
Asp1 & asp3 وايضا صفحة من الكتاب وهي asp2 لم استطع التنسيق هنا .

لاحظ ان في صفحة ASP المرفقة ان اوامر نصية فيجولية تصنع مجموعة سجلات
لاستعادة القيم الحالية من الجدول tblComplaints .
وايضا اوامر HTML مختلفة تظهر القيم المسترجعة للمستخدم .
لا مشكلة ان لم تفهم كل الاوامر السابقة .
المثال يوضح يوضح ان يمكنك صنع صفحات ASP والتي باستمرار تسترجع البيانات
من قاعدة بياناتك الاكسسية .وتوضح ايضا ان صفحات ASP يجب ان تعمل من خادم الويب
والذي يدعم صفحات ASP.

صفحات ASP يمكن فتحها من Notepad, Microsoft FrontPage وبرامج اخرى
لان الملف النصي والذي يحتوي فقط على نص .


وعندما تنقل صفحة ASP الى خادم الويب وبعدها تدخل الى صفحة ASP من
مستعرض العميل فانك سترى نتائج مشابهه لما في الشكل 8.6 والفرق الوحيد هو
ان الصفحة الوليدة على الناشط ( المتغير ) مع البيانات الحالية بدلا من صيغة HTML السابقة الثابتة .


والى لقاء اخر قريبا ان شاء الله

مرفق الصور
مرفق صفحة بي دي اف
مرفق صورة فروقات بين الثابت والنشط HTML &ASP

أبو يوسف1
27-11-2012, 06:47
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس وقبل الاخير من الفصل الثامن وعلى بركة الله وباسم الله نبدا



Creating Data Access Pages
تصنيع صفحات البيانات القابلة الدخول
هذه الصفحات -(DAP) هي ملفات من نوع خاص ويمكن الدخول عليها من مستعرض
الويب .والتي تسمح لك بالاستعراض خلالها والتعديل على البيانات في قواعد بيانات الاكسس
وسيرفر SQL.
ويمكنك استعمال برنامج الاكسس لصنع وتعديل وعرض صفحات البيانات القابلة للدخول .
مثل النماذج والتقارير فان صفحات البيانات القابلة للدخول لها عرض تصميم
وعرض زمن التشغيل - runtime view-.
صفحات البيانات القابلة للدخول يمكن عرضها فقط على الاجهزة والتي تحمل
مستعرض الاكبلورر 5 او الاعلى و وجود عناصر اوفيس الويب .
صفحات البيانات القابلة للدخول تخزن كملفات HTML منفصلة .ويمكنك ربط اليها
وعرضها من الاكسس وتستطيع حتى صنعها وتعديلها من الاكسس.



Creating Data Access Pages Using the OutputTo Method
صنع صفحات البيانات القابلة للدخول مستعملا الطريق OutputTo


الكود التالي يستعمل الطريق OutputTo لتصدير جدول tblComplaints
المصنع سابقا الى صفحات البيانات القابلة للدخول .:


DoCmd.OutputTo acOutputTable, "tblComplaints", acFormatDAP.
"c:\temp\complaintsDAP.html"

[B]
لاحظ ان الصفحة تحفظ في صيغة HTML.
صفحات البيانات القابلة للدخول تحفظ في صيغة HTML. لكن تحتوي على كود
اضافي والذي يربط الى قواعد البيانات الاكسس او خادم SQL لاسترجاع
وتعديل البيانات . لا تخلط بين هذه مع وثائق HTML الثابتة والتي تصنع
في احد الامثلة السابقة .
الملف complaintsDAP.html الذي صنع من الكود السابق يشابه الذي في الشاشة
في الشكل 8.7 .
البيانات في الشكل 8.7 يمكن تعديلها من خلال grid ويمكن تعديل البيانات
بشكل اكثر باستعمال الازار في الاسفل .انها تمكنك من اضافة سجلات جديدة
واستعراض من خلال السجلات .كما سوف تشاهد للحظات , صفحات
البيانات القابلة للدخول يمكن ايضا تشابه المنظر والشعور للنموذج التقليدي
بينما المثال في الشكل 8.7 اكثر تشابها لنموذج لصفحات البيانات .



Creating a New Data Access Page from a Form
صنع صفحة بيانات جديدة من نموذج

حتى هذه النقطة سوف تصنع صفحة بيانات جديدة من نموذج .
بعد صنع النموذج سوف تصدر هذا النموذج الى صفحة بيانات مستعملا
الطريق OutputTo. دعنا نبدا :

1- اصنع نموذجا جديدا معتمدا على الجدول tblComplaints مستعملا المعالج .

من شاشة قاعدة البيانات اختر النماذج واصنع نموذجا باستعمال المعالج .


على الشاشة الاولى من المعالج اختر كل الحقول في الجدول tblComplaints لاضافتها الى النموذج وانقر الزر التالي .
حدد العمودي- Columnar-للشكل وانقر التالي مرتان اضافيتان .
على الشاشة الاخيرة للمعالج ,حدد اسما للنموذج frmComplaints وانقر الزر انهاء .
النموذج يجب ان يشابه لما في الشكل 8.8 .
2-تاليا اضف الاجراء التالي الى النمطية :



Sub OutputToDAP()
DoCmd.OutputTo acOutputForm, "frmComplaints", acFormatDAP,
"c:\temp\frmcomplaintsDAP.html"
End Sub


3- شغل الاجراء OutputToDAP من الشاشة الفورية بطباعة اسم الاجراء ثم النقر ادخال .

4- استعرض خلال القرص الصلب وحدد مكان الملف الذي صنعته لتوك انقر
نقرا مزدوجا لفتحه .شاشة تشابه الظاهرة في الشكل 8.9 سوف تعرض .
ملاحظة : يجب وجود مجلد باسم temp على الجزء c: من القرص الصلب حتى يتشكل الملف
5- عدل بعض البيانات من صفحة البيانات



How It Works
كيف تعمل

اولا انت صنعت نموذجا جديدا معتمدا على الجدول tblComplaints مستعملا المعالج .
هذا فقط كان من اجل حفظ وقتك ,حيث يمكنك ان تصنع النموذج من الصفر .
بعدها انت صنعت الاجراء OutputToDAP ظاهرا مرة اخرى في الكود التالي .
الاجراء OutputToDAP يستعمل الطريق OutputTo لاخراج النموذج frmComplaints
الى صفحة البيانات في الملف المسمى frmcomplaintsDAP.html




Sub OutputToDAP()
DoCmd.OutputTo acOutputForm, "frmComplaints", acFormatDAP,
"c:\temp\frmcomplaintsDAP.html"
End Sub


بعدها انت شغلت الاجراء من الشاشة الفورية لصنع صفحة البيانات الجديدة .
بعدها انت فتحت صفحة البيانات في مستعرض الويب وعدلت بعض البيانات .
واذا رجعت الى قاعدة البيانات وتنظر الى الجدول tblComplaints
فانك يجب ان ترى التغييرات التي عملتها من خلال صفحة البيانات في المستعرض
قد خزنت في قاعدة البيانات .

مرفق الصور
مرفق المثال
والى لقاء اخر ان شاء الله قريبا

* أبو ياسر *
27-11-2012, 08:04
قم للمعلم وفه التبجيلا ... كاد المعلم ان يكون رسولا
استاذنا الكريم أبا يوسف ؛ لك كل الود والتقدير على هذه المثابرة وعلى المجهود الجبار في صناعة هذه المدرسة الشاملة
أثابك الله ثواب الصابرين وجعله في ميزان اعمالك

أبو يوسف1
27-11-2012, 08:38
استغفر الله ....استغفر الله ....استغفر الله
اخي واستاذي العزيز ابا ياسر لن اكون يوما معلما لكم .انتم القدوة ولكم قصب السبق في الخيرات .
وهذا بحمد الله مما تعلمته السير على خطاكم وحرصكم على تقديم ما فيه الفائدة للاخوة اعضاء المملكة السعيدة ان شاء الله
ولك بما دعوت واكثر ان شاء الله .
جزاك الله عنا جميعا كل الخير وبارك الله فيك .
وتقبل مني خالص تحياتي وتقديري العظيمين اخي واستاذي العزيز ابا ياسر

أبو يوسف1
27-11-2012, 01:44
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع والاخير من الفصل الثامن وعلى بركة الله وباسم الله نبدا



Viewing and Modifying Data Access Pages from Access
عرض وتعديل صفحات البيانات من الاكسس

لان هذا الكتاب عن تطبيقات الفيجوال بيسك ,سوف ان لن اماشيك –دينيس- خلال كيفية
تصنيع صفحات البيانات الجديدة مستعملا المعالجات والمصممون .
ان كنت مدركا لكيفية صنع النماذج فانك تستطيع ايضا ان تصنع صفحات البيانات الجديدة
مستعملا المصمم.وتستطيع عمل ذلك من قسم الصفحات في شاشة قاعدة البيانات .
على اي حال سوف اعطيك الان مثالا سريعا لكيف تربط صفحات البيانات الموجودة من خلال الاكسس
وحتى تتمكن الاستمرار في العمل معها .



Modifying Data Access Pages from Access
تعديل صفحات البيانات من الاكسس –مثال عملي -

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

1- ارجع الى مشروعك لقاعدة البيانات واختر الصفحات من شاشة قاعدة البيانات .
انقر نقرا مزدوجا الخيار Edit Web page that already exists.

2- من صندوق حوار Locate Web Page الظاهر استعرض الى المكان
في القرص الصلب المخزن فيه الملف frmComplaintsDAP.html ثم انقر فتح .
شاشة تشابه الظاهر في الشكل 8.10 سوف تعرض .
3- اغلق الصفحة ويجب ان ترى شاشة تشابه الموجود في الشكل 8.11



How It Works
كيف تعمل
هذا المثال يظهر لك كيف تعرض وتعدل صفحات البيانات الموجودة من قسم الصفحات
في شاشة قاعدة البيانات .كما في الشكل 8.11 .
صفحات البيانات لها مصمم مشابه للنماذج والتقارير ,لكن حقيقة تخزن في ملف منفصل على القرص الصلب .
انها تزود طريقة لتحول قاعدة بيانات الاكسس الى صيغة سهلة قابلة للتحديث على الويب , طالما اجهزة
الكمبيوترات العميلة – client-التي تصل اليها منصب عليها عناصر الويب المكتبية .




Summary
الخلاصة

في هذا الفصل تعلمت طرقا مختلفة لاسترجاع البيانات برمجيا من الاكسس.
ونظرت الى امثلة كثيرة –دينيس تقول نظرت وليس عملت لانها بذلك تدعي ان لا احدا
يعمل المثال ويكتفي القارىء بالنظر الى امثلتها فقط وهذا توضيح من ابي يوسف-
مثل تصنيع التقارير الجديدة برمجيا وتصدير البيانات الى صيغ الويب المختلفة .
امل انك بدات االفهم انه يوجد اكثر من ا لدخول الى الجداول ,النماذج ,والتقارير فقط .
لقد رايت في هذا الفصل والسابق كيف كيف تتعامل مع البيانات من المصادر المختلفة ولتنفيذ
عمليات متقدمة عديدة مستعملا الكود الفيجولي .

لقد تكلمت كثيرا لحد الان عن خادم SQL-ثرثارة من يومك –ولكنك لم ترى اي مثال !!!.
الفصل القادم سوف يركز على بناء حلول الاكسس التي تستعمل خادم SQL كقاعدة بيانات .
سوف تتعلم ان شاء الله ان الاكسس له خصائص عديدة والتي تجعل العمل مع قواعد خادم SQL اسهل كثيرا .


مرفق الصور
مرفق المثال للفصل كاملا
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
29-11-2012, 07:42
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الاول من الفصل التاسع وعلى بركة الله وباسم الله نبدا


Building SQL ServerApplications with Access Projects
بناء تطبيقات خادم SQL مع مشاريع الاكسس

حتى الان كل الامثلة في هذا الكتاب تعاملت مع ملفات قاعدة البيانات الاكسس الاساسية (MDB files).
مشروع الاكسس ( (ADP fileهو نوع اخر من ملفات قواعد البيانات للاكسس والذي صمم خصيصا للعمل مع
قواعد البيانات الخاصة بخادم SQL .في هذا الفصل سوف تستكشف كيف تصنع وتدير قواعد البيانات لخادم SQL
مستعملا مشاريع الاكسس .وستتعلم باذن الله كيف تصنع مشاريع اكسسية جديدة من البداية وتستطلع كائنات
خادم SQLالمختلفة والتي تستطيع صنعها وادارتها من مشروع الاكسس ,مثل الجداول ,الاجراءات المخزنة
المناظر-صور- views ,الدوال .وسوف توسع ايضا قاعدة البيانات الاكسسية الموجودة لخادم SQL وتزود
توجيهات لحل اي مشكلة تحدث خلال التحول .
هذا الفصل يركز على استعمال مشاريع الاكسس للعمل مع الخصائص المحددة لخادم SQL لكن لا
يغطي النماذج والنمطيات .ستظل تكتب النماذج والنمطيات في مشاريع الاكسس كما عملت
في الفصول السابقة



Access Projects—Using Access as a Front End to SQL server
مشاريع الاكسس-استعمال الاكسس كواجهة لخادم SQL

كملخص سريع انت مدرك معرفة الان لملفات قواعد البيانات الاكسسية : ( MDB).
ملفات MDB عادة تستعمل بطريقة الاستقلال -وحيدا-وتعني ان كل الجداول والنماذج والنمطيات والماكروز والتقارير
للتطبيق تخزن داخل ملف واحد . في الفصل السابع تعلمت انه من الممكن ان تستعمل ماف الاكسس العادية MDB
في بيئة خادم/عميل بواسطة الربط مع جداول قواعد البيانات الخارجية مثل خادم SQL.
مثال لبناء خادم /عميل سظهر في الشكل 9.1 والذي يوضح حالة حيث واجهة المستخدم تكون في العميل والقاعدة تكون في الخادم .

عند ربط مع قاعدة بيانات خادم من قاعدة بيانات الاكسس العادية فانك تستطيع صوريا العمل فقط مع جداول خادم SQL
من بيئة الاكسس . لن تستطيع عرض ولا تعديل الاجراءات المخزنة ,الصور – views-والدوال من خلال بيئة الاكسس.
مشاريع الاكسس هي نوع خاص من ملفات الاكسس صممت للعمل خصيصا مع قواعد البيانات خادم SQL.
مشاريع الاكسس تزودك بادوات رسومية اضافية للتعديل على مختلف كائنات خادم SQL-ليس فقط الجداول .
عند تصميمك تطبيقات الخادم/العميل والتي تستخدم خادم SQL كقاعدة بيانات ,فانه يجب ان تستعمل
مشاريع الاكسس بدلا من قاعدة البيانات العادية للاكسس حتى تتمكن من الحصول على خصائص التصميم الاضافية هذه .
الجدول المرفق يوضح اين تخزن مختلف الكائنات التي تراها في مشاريع الاكسس



Setting Up SQL Server
اعداد خادم SQL

الان وانت تدرك انه يمكنك استعمال مشاريع الاكسس للعمل مع قواعد بيانات خادم SQL. فانني سوف اخذ لحظة لاغطي الاختلاف
بين نسخ خادم SQL وتوضيح كيف تنصب خادم SQL.
يجب ان تنصب واحدة من النسخ لخادم SQL لتنفيذ االامثلة المستخدمة في هذا الفصل .




SQL Server Versions
اصدارات-نسخ- خادم SQL

كما انه من المحتمل انك عارف الان ان خادم SQL هو نظام ادارة قواعد بيانات علائقية
لتخزين وتحليل وتقرير البيانات .حاليا سبع اصدارات من خادم SQL موجودة مع خادم SQL 2000
واصدارا نفسه اومشابه من المحتمل ان تكون موجودا عند اصدار خادم SQL2005 .
كل موصوف باختصار هنا


SQL Server 2000 Enterprise Edition-هذا الاصدار اكثر االاصدارات شمولية ويدعم كل خصائص
خادم SQL 2000 .وهذا الاصدار هو الاكثر مناسبة للشركات الكبيرة والتي تطلب ادارة كميات هائلة من البيانات بسرعة وفعالية .

SQL Server 2000 Standard Edition- هذا الاصدار يدعم كثيرا من الخصائص المنوفرة ,لكن لا يدعم الخصائص ادارة
كميات من البيانات الضخمة بسرعة وفعالية .هذا الاصدار هو اساسا للشركات الصغيرة او المتوسطة والتي لا يكون
لديها متطلبيات قواعد بيانات معقدة كالشركات الكبيرة .ويظل هذا الاصدار قوي جدا ويدعم تحاليل الخدمات
(باستثناءات قليلة ), تكرار , بحث نصي كامل ,خدمات تحويلات البيانات , الاستعلام الانجليزي
وخصائص اخرى متقدمة لخادم SQL



SQL Server 2000 Personal Edition – هذا الاصدار يدعم اساسا نفس الخصائص الاصدار العادي – Standard-
مع استثناء لعمليات التكرار . خدمات الاضافة و التحليل والبحث النصي الكامل متاحة فقط في بعض منصات
التشغيل المحددة مع هذه النسخة . هذه النسخة مناسبة في الاغلب المستخدمون الذين يريدون بيانات خادم SQL
على اجهزتهم المحلية بينما هم منفصلون عن الشبكة .مثال عام على ذلك المستخدمون المتجولون –اهلا تجوال-
مثل اعضاء فريق المبيعات الذين يحتاجون لبياناتهم بينما هم هم في الخارج في الميدان .
هذه النسخة تحصر عدد النشاطات المتزامنة –في الوقت الواحد - لقاعدة البيانات الممكن عملها فورا .
وهذا ببساطة يعني ان هذه النسخة لم تصمم لادارة مستخدمون او انشطة قاعدة بيانات كثيرة .


SQL Server 2000 Windows CE Edition –هذه النسخة تعمل على اجهزة متنقلة - Windows CE
هذه النسخة الصغيرة تسمح بقواعد بيانات علائقية لتخزن وتدار على اجهزة Windows CE لتزامن فيما بعد .
وزيادة تعطي المستخدمون القدرة لادارة قواعد بيانات خادم SQL عن بعد عبر الانترنيت من اجهزتهم CE.

SQL Server 2000 Developer Edition – نسخة المطورون تدعم كل الخصائص الموجودة (تماما مثل Enterprise)
بالاستثناء انها تمنع الانتشار على خوادم الانتاج .هذه النسخة صممت للمطورون ,الاستشاريون , ومزودي الحلول
للاستعمال خلال تطوير وفحص تطبيقاتهم .

SQL Server 2000 Evaluation Edition— - هذه النسخة تعمل بشكل كامل هي نسخة
Enterprise لكنها تتوقف عن العمل بعد 120 يوما .
وهي متاحة مجانا للتجريب لاعطاء المنظمات الشركات الفرصة لتجربة خادم SQL قبل الشراء.


SQL Server 2000 Desktop Engine (also called MSDE –هذه النسخة لمحرك قواعد بينات
خادم SQL مجانية ويمكن اعادة توزيعها . .وهذا يعني انك تستطيع تضمينه في عملية تنصيب برنامجك للتطبيقات
التي تستخدم خادم SQL لتخزين البيانات.
هذه النسخة لا تشمل اي ادوات رسومية لواجهة المستخدم .لذلك منتجات اخرى مثل الاكسس او
SQL Server 2000 APIs يجب استخدامها لادارة البيانات المخزنة في هذه النسخة .


SQL Server 2000 Desktop Engine (MSDE) ليس نفس النسخة ل SQL Server 7 Desktop Edition

The SQL Server 7 Desktop – اصبحت النسخة الشخصية SQL Server 2000.
SQL Server 2000 Desktop Engine كانت تسمى Microsoft Data Engine, or MSDE
في SQL Server 7


مرفق الصورة
مرفق الجدول
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
03-12-2012, 06:22
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل التاسع وعلى بركة الله وباسم الله نبدا


Obtaining and Installing SQL Server Desktop Engine
الحصول على محرك خادم SQL المكتبي وتنصيبه

ان لم يكن لديك نسخة منصبة من خادم SQL عليك بالحصول على نسخة .
لديك خيارين للحصولعليه والتشغيل .يمكنك تنزيله او طلبه نسخة تجريبية من ميكروسوفت .
الخيار الثاني تنصيب نسخة Desktop Engine (MSDE) SQL Server من خادم SQL وهي مجانية .
برنامج التنصيب للمحرك المكتبي هو على القرص الليزري في طاقم الاوفيس لميكروسوفت .


The Benefits of SQL Server Desktop Engine
فوائد محرك خادم SQL المكتبي

ربما تتساءل لماذا تعرض ميكروسوفت نسخا مجانية من خادم SQL .
هذا المحرك قدمته ميكروسوفت لجسر الهوة بين برنامج ميكروسوفت اكسس
وميكروسوفت خادم SQL .اجزاء واسعة من التطبيقات الموجودة تستخدم
الاكسس في كلا الواجهتين الامامية والخلفية لقاعدة البيانات .
وكلما زاد انتشار هذه التطبيقات فانها بدات بتكبير قدرات الاكسس .
كثير من الناس يجدوا انفسهم يعدلون على الكود لعمل منفذ-ربط- للتطبيقات
الى قواعد بيانات خادم SQL .وهذا من الممكن ان يكون مهمة بارزة في امثلة كثيرة
مع اختلاف انواع كثيرة من البيانات وصيغ SQL.
هذا المحرك المكتبي في الواقع هو نسخة صغيرة من خادم SQL: وله حد 2 جيجا
ولا يمكن زياد اكثر من 5 مستخدمون في نفس الوقت او عمليات تطرق القاعدة في نفس الوقت .
ان لم يكن تطبيقك لا يحتاج لادارة احجام قواعد بيانات كبيرة او مستخدمون كثر فان هذا المحلاك هو خيار جيد .
بعض الاستثناءات لقوانين اهذه الرخصة المجانية يمكن وجودها في الاتفاقية الرخصة والتي تصاحب هذا المحرك
واي نسخة اخرى من خادم SQL. مثال تحت هذه الاتفاقية ان كان هذا المحرك مربوطا الى قاعدة بيانات
خادم SQL اخرى ويعمل كزبون- client-فانه يجب عليك شراء رخصة سماحية للزبون للاتصالات مع
قاعدة البيانات الاخرى لخادم SQL.
هذا المحرك المكتبي يسمح للشركات بان تصنع اقراص ليزرية – CDs- كعينة لمنتجاتهم – demo-بسهولة اكبر .
في الماضي كان على الشركات ان تكتب نسخة دخول لتطبيقاتهم على خادم SQL للاضافة على عينة منتجاتهم
على القرص الليزري حتى لا يخترقوا الاتفاقية للرخصة لخادم SQL.
او بديلا فانهم يرفقون روابط او ملفات لتنزيل نسخ تجريبية لخادم SQL حتى تعمل عيناتهم .
ولان المحرك المكتبي هو توزيع مجاني لخادم SQL فانه يمكنك الان بسهولة ان تصنع عينات
باقراص ليزرية لهدف العرض بدون اعادة كتابة اي كود .

الفائدة الاكثر لاستعمال هذا المحرك هو انك لا تحتاج لعمل اي تعديل على كوداتك
(عبارات SQL, بناء الجداول ,وهكذا) وعند التوسع فيما بعد بسبب حجم القاعدة او المستخدمون بنفس الوقت .
فقط اشتري نسخة اقوى من الخادم واستورد قاعدة البيانات السابقة للتنصيب الجديد بدون تعديلات .
وبذلك وعندما تصبح تطبيقاتك مشهورة وتحتاج الى قوة للاعلى ونسخا غير مجانية للخادم فانك تكون جاهزا .




Installing SQL Server Desktop Engine
تنصيب المحرك المكتبي لخادم SQL
من الممكن الحصول على برنامج التنصيب للمحرك المكتبي MSDE من عدة مصادر .
من المحتمل ان افضل مكان هو القرص اليزري من طاقم الاوفيس لميكروسوفت .
ويمكن وجوده في الاستديو المرئي Visual Studioواقراص SQL Server .
المثال التالي يمشي معك خلال تنصيب MSDE من- 2003 CD Microsoft Office-.

1-حضر القرص الليزري لبرنامج تنصيب MSDE. ضع القرص في السواقة
واستعرض ما بداخلها حتى تصل الى مجلد تنصيب المحرك المكتبي وسيكون كالتالي
بفرض ان السواقة على الجزء D:( D:\MSDE2000\MSDE2ks3.exe)
من مجلد التنصيب انقر مزدوجا على البرنامج التنفيذي لتصيب البرنامج .ربما يسالك
لتحديث بعض الملفات على نظامك قبل اكمال العملية .ان كانت كذلك اسمح للتحديث بالملفات الضرورية
وهذه قد تتطلب اعادة التشغيل والعودة لاكمال التنصيب مرة اخرى .
2-شاشة التنصيب سوف تومض –غامزة-لثوان لتعرفك انه يتم التنصيب .بعد النقر المزدوج

على برنامج التنصيب setup program يجب اليا تنصيب المحرك المكتبي بكل الضبط الاساسي .
وان ظهر اي تساؤل- prompts- (اختبار خلال التنصيب : نعم لا ,غيرها) تابع التعليمات لاكمال التنصيب

3- اذهب قدما الى ابدا برنامج ادارة الخدمات والذي لتوه تم تنصيبه ويجب ان تجده في :
Start➪Programs➪Microsoft SQL Server➪Service Manager
. بعد تشغيل البرنامج سوف ترى ايقونة الخادم على الزاوية اليمنى السفلية لشريط المهام .
الان وقد نصبت المحرك المكتبي لخادم SQL خذ نظرة على ماذا حقا تم تنصيبه .



Understanding What Was Installed
فهم ما تم تنصيبه
ثلاثة خدمات تم تنصيبها مع المحرك المكتبي للخادم :

SQL Server Service Manager, SQL ServerAgent, and Distributed Transaction Coordinator

TheSQL Server Service Manager : هذه الخدمة يتم تنصيبها مع الخادم لتمكينك من ادارة هذه الخدمات الثلاث.
شاشة مدير خدمات الخادم الظاهرة في الشكل 9.2 تظهر الضبط للخادم , الخدمات ,وحالة الخدمة التي تم اختيارها .
حقول الخادم والخدمات لها قائمة منسدلة للسماح للاختيار المتوفرة من هذه .
لذلك مثال قائمة المنسدلة للخادم تحوي كل خوادم SQL التي يعرفها هذا الكمبيوتر .
قائمة الخدمات المنسدلة تحتوي على خيارات ل:
. SQL Server Agent, and Distributed Transaction Coordinator, SQL Server
الازرار : Start/Continue, Pause, and Stop ممكنة او غير ممكنة حسب الرغبة بالاعتماد
على الحالة الحالية .الشكل 9.3 يوضح حالة خدمات خادم SQL مع ازرار التريث – Pause-
والتوقف غير ممكنة -. disabled-.
ان اخترت الازرار بدء/ متابعة - Start/Continue- فان خدمات خادم SQL سوف تبدا تعمل
الشكل 9.4 .

خدمة خادم SQL هي لب –محور- المحرك المكتبي وكل النسخ الاخرى لخادم SQL
لهذا الامر فانها تتكون من محرك التخزين لخادم SQL ومعالج الاستعلام - query processor-

محرك التخزين مسؤلا عن قراءة وكتابة البيانات في قاعدة البيانات ,ومعالج الاستعلام
مسؤلا عن استقبال وتنفيذ عبارات SQL.
خدمة الخادم SQL يجب ان تكون مشتغلة حتى تسترجع البيانات ,اضافتها ,تحديثها
وحذفها من المحرك المكتبي .

التنصيب الاساسي للمحرك المكتبي يضبط هذه الخدمة الى العمل اليا عند بدء تشغيل الكمبيوتر .
خدمة خادم SQL الظاهرة في الشكل 9.4 تعمل على خادم اسمه- Goz_Tablet1100-.
وقاعدة البيانات تسمى- SQLDEV-.لاحظ كيف ان المؤشر الى التشغيل الالي
للخدمة عند بدا تشغيل نظام التشغيل قد تم تاشيره –علامة الصح-.
وهذا يعني ان خدمة خادم SQL سوف تبدا عند اي وقت يعمل النظام .
فكرة جيدة ان يكون هذا الضبط شغالا حتى تتمكن قاعدة البيانات من الاضافة والتحديث
والحذف والقراءة وغيرها اليا .تدخل المستخدم غير مطلوب للبدء اليدوي للخدمة كل مرة .


SQL Server Agent هذه خدمة اخرى مع المحرك المكتبي وهي خدمة تسمح لك
بجدولة المهام والتنبيهات لقاعدة بياناتك .مثالا افترض انك تريد ان تصنع مهمة
لتعمل كل ليلة وهي عمل النسخة الاحتياطية لقاعدة البيانات .
هذه الخدمة تمكنك من جدولة هذا العمل ليشتغل في الوقت المحدد .
طالما هذه الخدمة شغالة فانها تكون مسؤولة عن عن تشغيل المهام المجدولة او
الاعلام عن اي مشكلة تحدث تنفيذ هذه المهام .
هذه الخدمة غير مطلوبة لاستعمال قاعدة بيانات المحرك المكتبي ولكنها بالتاكيد مفيدة .

Distributed Transaction Coordinator (DTC) هذه الخدمة تسمح للعمليات
بان تمتد لاكثر من كمبيوتر عبر الشبكة مستعملا two-phase commit.
(DTC) هي خارج مجال هذا الفصل لكنها تستحق الذكر لتعلم بوجودها .
هذه الامثلة توضح كيف بسهوله ممكن ان تدير الخدمات الثلاث والتي تم تنصيبها مع المحرك المكتبي
بواسطة استعمال اداة مدير الخدمة لخادم SQL . والان وقد غطيت الاساس لضبط
المحرك المكتبي وبدء وتوقيف الخدمات .دعنا نرجع الى مناقشة استعمال مشاريع الاكسس
للعمل مع قواعد بيانات خادم SQL


مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
06-12-2012, 07:46
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل التاسع وعلى بركة الله وباسم الله نبدا


Creating Access Projects (ADPs
تصنيع مشاريع الاكسس

الان وقد نصبت خادم SQL فانك تستطيع ان ترجع الى مناقشة استعمال مشاريع الاكسس في
العمل مع قواعد البيانات لخادم SQL .لصنع مشروع جديد للاكسس لقاعدة بيانات SQL
اولا اختر ملف ثم جديد .ثم تستطيع الاختيار من خيارين عليهما دائرة !! –كما في الاصل - في الشكل 9.5-.
الاختيار: Project Using Existing Data سوف يسمح لك لصنع مشروع اكسس جديد
مستعملا قاعدة بيانات خادم SQL موجودة .
الاختيار : Using New Data Project سوف يصنع مشروع اكسس جديد وقاعدة بيانات
خادم SQL جديدة. سوف تنظر الان الى الى كل واحد من الخيارين بالتفصيل .


Using an Existing SQL Server Database
استعمال قاعدة بيانات خادم SQL موجودة

لاختيار مشروع اكسس جديد معتمدا على قاعدة بيانات خادم SQL موجودة , اختر
ملف ثم جديد ثم اختر الخيار : Project Using Existing Data.شاشة تشبه للتي في الشكل 9.6 ستظهر .
بعد تحديد اسم مشروع اكسس ,انقر زر تصنيع وسوف يتم سؤالك (كما في الشكل 9.7) لتحديد
التفاصيل الضرورية للاتصال بقاعدة بياناتك لخادم SQL.
في المثال في الشكل 9.7 قاعدة بيانات تسمى pubs على خادم goz_tablet1100\sqldev
هي المستعملة .الخيار لاستخدام الحماية المتكاملة للويندوز-الموجودة في الويندوز وهي اسم الحساب والرقم السري - هي
المؤشر عليها .لذلك لا داعي لتملء اسم مستخدم للخادم SQL او رقم سري .
ان وجدت مشكلة في الاتصال بين خادم SQL مستعملا حماية الويندوز حاول تحديد اسم المستخدم sa
ورقم سري خال والذي يمكن ان تكون قد وضعت في الاساس.
يمكنك نقر فحص الاتصال لفحص الاتصال للتاكد من عمله .ويمكنك ان تصنع مشروع اكسس جديد
معتمدا على قاعدة البيانات هذه بواسطة النقر على .OK مشروع اكسس الجديد سوف
يشابه لما في الشاشة الظاهرة في الشكل 9.8 .



. Using a New SQL Server Database
استعمال قاعدة بيانات خادم SQL جديدة

دعنا نلقي نظرة على كيف تصنع مشروع اكسس معتمدا على قاعدة بيانات خادم SQL جديدة .لراحتك ,انا ارفقت ملفا نصيا
والذي يحتوي الكود لكائنات خادم SQL المصنعة في الامثلة العملية التالية .-سارفقه في التالي ان شاء الله ابو يوسف-


Creating an Access Project Using a New SQL Server Database
تصنيع مشروع اكسس مستعملا قاعدة بيانات خادم SQL جديدة-تطبيق عملي -

1- اختر ملف ثم جديد ثم Project Using New Data .شاشة تشبه للشكل السابق 9.6 سوف تظهر
حيث يمكنك ان تحدد اسم مشروع الاكسس Ch9CodeExamples ثم انقر Create. شاشة
تشابه الظاهر في الشكل 9.9 سوف تظهر .
2- حدد اسم خادم SQL او اختر واحدا من القائمة .حدد فيما اذا تستعمل اتصال موثوق او
تحدد حساب دخول على خادم SQL ,معتمدا على ضبط حماية خادم SQL الخاص بك .

وايضا حدد الاسم لقاعدة بيانات خادم SQL كالتالي: Ch9CodeExamplesSQL.
3- شاشة تشبه ما في الشكل 9.10 سوف تظهر .انقر الزر انهاء لصنع قاعدة بيانات خادم SQL الجديدة


How It Works
كيف تعمل
المعالج سار معك خلال خطوات صنع مشروع اكسس جديد وقاعدة بيانات خادم SQL جديدة .
النتيجة النهائية للخطوات السابقة انك حصلت على مشروع اكسس ( Ch9CodeExamples.ADP).على قرصك الصلب .
وايضا حصلت على قاعدة جديدة تسمى Ch9CodeExamplesSQL في قاعدة بياناتك لخادم SQL.
عند هذه النقطة ,قاعدة بيانات خادم SQL ومشروع الاكسس كلاهما فارغا .
دعنا ننظر الى بعض الامثلة لكيف نعمل مع كائنات خادم SQL من خلال الاكسس حتى مشروعك لا يبقى فارغا
وهذا ما سوف تكمله ان شاء الله في اللقاء التالي بعون الله

مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
16-12-2012, 05:33
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل التاسع وعلى بركة الله وباسم الله نبدا


Working with SQL Server Objects from Access
العمل مع كائنات خادم SQL من الاكسس
الفائدة من استعمال مشروع تاتكسس للعمل مع خادم SQL هو انك يمكن ان تستعمل ادوات رسومية لتصاميم مختلفة
من خلال الاكسس للتعديل على كائنات خادم SQL. مثالا على ذلك تستطيع ان تعرض وتصنع جداول خادم SQL ,اجراءات مخزنة
مشاهد – views- ودوال.
سوف ترى كل واحدة من هذه في التفصيل في الاقسام التالية .

SQL Server Tables
جداول خادم SQL
تستطيع عرض وادارة جداول خادم SQL من نقطة الجداول لشاشة قاعدة البيانات في مشروع الاكسس .
الشكل 9.11 مثال لجدول خادم SQL فتح من خلال الاكسس.
من النظر الى البيانات في الشكل 9.11 لن نعرف ان هذا حقا موجودا في قاعدة بيانات SQL.
هذه الشاشة تبدو شديدة الشبه للشاشات الاخرى التي رايتها سابقا مع جداول اكسس المحلية .
الان اذا فتحت جدولا لخادم SQL في عرض التصميم ,فان شاشة للتي في الشكل 9.12 ستظهر .
مصمم الجدول قليلا يختلف عن الذي تعاملت معه سابقا .لاحظ كيف ان بعض الاعمدة اضافية للطول وتسمح
الفارغ بان تضاف. خادم SQL له بعض انواع البيانات تختلف عن جداول اكسس العادية .



Creating a New SQL Server Table
تصنيع جدول خادم SQL جديد –تطبيق عملي-

جاء دورك لتدرب يديك لصنع جدولا جديدا لخادم SQL
1- اصنع جدولا جديدا اسمة tblProducts. لعمل ذلك اختر نقطة الجداول من شاشة قاعدة البيانات ثم انقر اصنع جدولا في خيار عرض التصميم.
املء الجدول بالعناصر كما في الشكل 9.13
2- بعد اضافة كل اعمدة الجدول ونوع البيانات المناسبة ,اضبط حقل ProductId ليكون المفتاح الاساسي .لعمل المفتاح الاساسي
اختر حقل ProductId ثم انقر الزر الايمن واختر خيار المفتاح الاساسي من القائمة التي ظهرت .
4- الان اضف بعض البيانات للجدول مثل الظاهرة في الشكل 9.14 .




How It Works
كيف تعمل
المثال السابق يوضح كيف تصنع جدولا جديدا من مصمم جداول الاكسس والذي فيزيائيا – اي مكان وجوده-يوجد في قاعدة
بيانات خادم SQL. سوف تتعلم الان كيف تصنع اجراءات مخزنة .


SQL Server Stored Procedures
الاجراءات المخزنة لخادم SQL
الاجراءات المخزنة هي اجراءات تخزن في قاعدة البيانات لخادم SQL. الهدف منها لتمكينك من اخذ عبارات SQL
المستعملة مرارا وتحفظها للاستعمال مرة اخرى .ويمكتك بذلك من تنفيذ الاجراء المخزن عند الحاجة اليه .
الاجراء المخزن مشابه في المفهوم لاجراءات الكود الفيجولي وعبارات SQL والتي قمت بكتابتها حتى الان في هذا الكتاب .
على اي حال الاجراءات المخزنة (المخزنة في قاعدة بيانات خادم SQL ) اكثر فعالية من تمرير عبارات SQL
الى قاعدة البيانات في الحالة النشطة بسبب انها مترجمة مسبقا-precompiled -.
تستطيع عرض الاجراءات المخزنة من نقطة الاستعلامات في شاشة قاعدة البيانات . في الحقيقة نقطة الاستعلامات سوف تظهر كل الاجراءات
المخزنة ,المشاهد- views-,الدوال والتي تكون مخزنة في قاعدة بيانات خادم SQL.الشكل 9.15 يوضح اجراءات مخزنة عديدة , وايضا
مشهدا- view- مسمى titleview. عندما تفتح الاجراء المخزن byroyalty في الشكل 9 . 15 فان شاشة المصمم تشابه الموجودة في الشكل 9.16 ستظهر .

لاحظ كيف ان الجدول يظهر وكذلك الشبكة- grid- مظهرة الاعمدة التي تخرج-المخرجات- عند تنفيذ الاجراء المخزن .
تستطيع اظهار كود SQL للاجراء المخزن بواسطة اختيار عرض ثم عرض SQL ,شاشة كما في الشكل 9.17 ستظهر .
في المثال في الشكل 9.17 الاجراء المخزن يقبل المعلمة المسماه @percentage .عندما تستدعي الاجراء المخزن من الكود الفيجولي ,فانه يجب عليك ان تحدد
المعلمة .يمكنك ان تستدعي الاجراء مستعملا الكود التالي:




Dim cmdCommand As ADODB.Command
Dim prmPercent As ADODB.Parameter
'Create a new command object
Set cmdCommand = New ADODB.Command
cmdCommand.ActiveConnection = CurrentProject.ActiveConnection
'Specify the stored procedure to run
cmdCommand.CommandType = adCmdStoredProc
cmdCommand.CommandText = "byroyalty"
'Create the percentage parameter
Set prmPercent = cmdCommand.CreateParameter("@percentage", adInteger,
adParamInput)
prmPercent.Value = 100
cmdCommand.Parameters.Append prmPercent
'execute the Stored Procedure
cmdCommand.Execute


في المثال السابق لاحظ كيف كائن الامر ADO قد استعمل لتحديد تنفيذ الاجراء المخزن .كائن معلمة ADO قد استعمل لتحديد المعلمة التي يجب ان تمرر للاجراء المخزن . الطريق Execute لكائن Command بعدها يتم تنفيذه لتشغيل الاجراء المخزن .



Creating a New SQL Server Stored Procedure
تصنيع اجراء مخزن جديد في خادم SQL

دعنا نصنع اجراء مخزنا جديدا في مشروع الاكسس Ch9CodeExamples
1- من شاشة قاعدة البيانات اختر نقطة الاستعلامات واختر بعدها تصنيع اجراء مخزن من خيار المصمم.
2- اختر زر الاضافة على شاشة اضافة جدول لاضافة tblProducts .انقر زر الاغلاق.
3- املء الاعمدة والقيم كما في الشكل 9.18 .مخرجات الاجراء المخزن كلها لكن العمود discontinued المعتمد على المعيار ( discontinued = 1)
4- احفظ الاجراء المخزن وسمه spDiscontinuedProducts .
5- اختر عرض ثم عرض SQL لترى عبارة SQL للاجراء .شاشة تشبه لما في الشكل 9.19 سوف تظهر.

6- لتشغيل الاجراء المخزن ,اختر ايقونة عرض من شريط الادوات .شاشة تشبه لما في الشكل 9.20 سوف تظهر .



How It Works
كيف يعمل

في هذا المثال انت صنعت اجراء مخزنا جديدا مستعملا مصمم الاكسس لتحديد المعيار للاجراء .ثم عرضت عبارة SQL والتي صنعها الاكسس اليا من المعيار المحددة في المصمم.
يمكنك في جهة اخرى ان تبدا بعبارة SQL ثم اكسس يكون عناصر الجدول والشبكة اليا من عبارة SQL.سوف ترى كيف تصنع مشهدا- view- في هذه الطريقة بعد لحظات. -في الجزء القادم ان شاء الله -

مرفق الصور
والى لقاء اخر ان شاء الله قريبا

أبو يوسف1
20-12-2012, 07:36
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل التاسع وعلى بركة الله وباسم الله نبدا


SQL Server Views
مشاهد خادم SQL
المشاهد هي جداول افتراضية وتسمح لك-مشاهدة- عرض معلومات في طرق مختلفة لتراها في الجداول الداخلية.
هي حقيقة استعلامات وتم حفظها في قاعدة بيانات خادم SQL ويمكن الوصول اليها في نفس الطرق
للجدول –فقط حدد اسم المشهد بدلا عن اسم الجدول .
امكانية صنع جدولا افتراضيا ومسترجعا بسهولة من اكثر عبارات SQLالمستعملة هو احد الفوائد من استعمال المشاهد.
فائدة اخرى للمشاهد هي انها تزود المقدرة لتطوير حماية على مستوى الصف والعمود .
مستوى الحماية للصف تعني حصر القيم المراد باظهارها لمستخدم فردي حتى على مستوى السجل .
حماية مستوى العمود تعني حصر الحقول الممكن للمستخدم برؤيتها .
مثالا عاما لحماية مستوى الصف هي حالة الموظف يمكنه رؤية معلوماته الشخصية وليس اي اخر غيره.
مثالا عاما لحماية مستوى العمود في حالة لا احد من خارج قسم الموظفين يسمح له بالاطلاع على اي عمود
يحوي معلومات شخصية ,مثل الرواتب ,لكن الموظف يمكنه رؤية المعلومات غير الشخصية .مثل الوصف الوظيفي .
الشكل 9.21 يوضح عرض تصميم والذي يسترجع البيانات من جداول عدة في قاعدة البيانات .
لعرض كل الثلاث اجزاء من الشاشة الظاهرة في الشكل 9.21 يجب عليك اولا ان تفعل ايقونات
Diagram, Grid and SQL statementالموجودة على شريط الادوات .
وبعد صنع المشهد يمكنك ان ترجعه في كل الاماكن حيثما يمكنك من ناحية اخرى ان تستعمل الجدول .
مثالا يمكنك ان تحصل على مجموعة سجلات في الادو- ADO recordset -معتمدة على عبارة SQL كالتالي :


SELECT * FROM titleview

عبارة SQL السابقة تعمل على تشغيل SQL خلف المشهد (كما في الشكل 9.21 ) ويرجع الاعمدة
المختلفة المختارة .المشهد في الشكل 9.21 سيكون مشابها للشاشة الظاهرة في 9.22 اذا تم فتحه في نمط العرض من خلال الاكسس .


Creating a New View
تصنيع مشهد جديد –مثال عملي –
حان دورك لصتع مشهدا .
1- من شاشة قاعدة البيانات اختر استعلامات ثم اصنع مسهدا في عرض التصميم ثم انقر زر الاغلاق لاغلاق حوار اضافة الجداول .
اختر زر SQL من على شريط الادوات للتاكيد ان مشهد SQL ظاهر.اضف عبارة SQL التالية :


SELECT ProductName, ProductDesc, UnitPrice
FROM dbo.tblProducts



2- اختر زر حفظ من على شريط الادوات لحفظ المشهد بالاسم vwProductPrice
اغلق وارجع افتح المشهد في عرض التصميم .لاحظ من نتيجة طباعة عبارة SQLفان اكسس
قد قرر واظهر مخطط الجدول وشبكة الاعمدة والتي تقابل عبارة SQL كما في الشكل 9.23.
3- اختر زر الحفظ من على شريط الادوات لحفظ اسم المشهد vwProductPrice.
4- اختر زر عرض من على شريط الادوات لتنفيذ المشهد .شاشة تشابه الظاهرة في الشكل 9.24 سوف تظهر
لاظهار النتيجة من عمل عبارة SQLخلف المشهد .
لا تتشوش بين زر العرض الموجود على شريط الادوات مع مفهوم المشهد .
زر العرض على شريط الادوات يسمح لك لفتح كائنات كثيرة متضمنة الاجراءات المخزنة,الجداول ,والمشاهد
لرؤية البيانات .هذا مفهوم مختلف عن المشهد نفسه.


How It Works
كيف تعمل

في المثال السابق انت صنعت مشهدا بالبدء بعبارة SQL. ميكروسوفت اكسس بعدها حدث المصمم لعرض الجدول والشبكة
لتمثل بالرسم عبارة SQL.عبارة SQLاختارت الحقول:
ProductName,ProductDesc, andUnitPrice من جدول tblProducts

مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
21-12-2012, 07:37
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس وقبل الاخير من الفصل التاسع وعلى بركة الله وباسم الله نبدا


SQL Server Functions
دوال خادم SQL

خادم SQL ياتي معه دوال داخلية عديدة مثل : RTrim,GetDate وغيرها الكثير .
يمكنك ايضا ان تصنع دوال من عندك وتستدعيها كما انها دوال اصلية جاءت مع خادم SQL.
الدوال المصنعة يمكن ان ترجع قيمة واحدة مثل نتيجة عملية حساب ما, او يمكن ان ترجع نتائج جدولا كاملا .
من الممكن ان تتساءل عن كيف يختلف الدوال عن الاجراء المخزن .الدوال المصنعة لها الكثير من الامور المشتركة مع
الاجراءات المخزنة بسبب ان كلاهما عبارة عن عبارات SQLمخزنة في خادم SQL.
على اي حال الدوال المصنعة تختلف عن الاجراءات المخزنة اذ يمكنها التضمين من خلال عبارة SQL الاساسية كالتالي:




SELECT FormatDescription(ProductDesc) FROM tblProducts

في هذه الحالة الدالة سميت FormatDescriptionوسوف تستدعى من سجل مختار في عبارة SQL.
ان كان هذا الكود يحوي اجراء مخزنا فان دوران- حلقة تكرار – يجب ان ينفذ لاستدعاء الاجراء المخزن لكل سجل .
عندما تفتح المصمم من الاكسس لاضافة دالة فان صندوق حوار اضافة جدولا سوف يظهر كما في الشكل 9.25 .
في هذا المثال الدالة تعتمد على مشهد vwProductPrice الذي صنعته في المثال السابق.
المصمم يشابه المصممات الاخرى التي رايتها للان يظهر كما في الشكل 9.26 .
في هذا المثال الدالة سوف تختار المنتجات التي لها سعر الوحدة اكثر من 500 دولارا .
وعند تشغيل الدالة السابقة فان كل المنتجات التي اكثر من 500 دولارا سوف تظهر كما في الشكل 9.27 .

عند هذه النقطة لا يلزم ان تكون خبيرا لتقرر متى تستخدم الاجراءات المخزنة في خادم SQL او المشاهد
او الدوال .انه موضوع معقد وخارج مدى هذا الفصل التمهيدي .
على اي حال ان اردت ان ترى امثلة اضافية لكيف تستعمل الاجراءات المخزنة والمشاهد والدوال في تطبيقاتك رجاء
راجع دراسة الحالة الشاملة في الفصل 13 والتي تستخدم مشروع الاكسس مع قاعدة بيانات خادم SQL.

الان وعندك المعرفة الاساسية لمشاريع الاكسس تستطيع التقدم خلال خطوات عديدة تتضمن توسعة
قاعدة بيانات اكسس موجودة لمشروع الاكسس و قاعدة بيانات خادم SQL .




Migrating an Existing Access Database
to an Access Project
نقل قاعدة بيانات اكسس موجودة الى مشروع اكسس

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


Changes to an Existing Database
تغييرات لقاعدة بيانات موجودة
قبل نقل تطبيقك الاكسسي الموجود الى مشروع اكسس والذي يستخدم خادم SQL هنا بعض الارشادات
التي تجعل النقل اكثر سلاسة .

= اعتبر ازالة اي مسافات في اسماء الجداول وبالطبع ان غيرت الاسم ,ايضا غير في كل الاماكن التي ترجع فيها الى اسم الجدول .
وان لم تزلها –المسافات-سوف تجبر فيما بعد على استخدام الاقواس للرجوع الى جداول خادم SQL مع المسافات في الاسماء
مثالا(]اسم الجدول [).
= تاكد ان كل جدول له فهرس فريد –وحيد – ان انشات مفاتيح اساسية حتى تكون كافية .
= اعمل نسخة احتياطية لملف MDB تحسبا لحدوث اي خطا .
= افحص التواريخ في جداول الاكسس . اغلب المشاكل مع التوسعة تحدث عند تحويلات التاريخ .
مثالا الاكسس وخادم SQL لهما مدى للتاريخ مختلف للقبول .
خادم SQL يغطي الفترة من 1-1-1973 وحتى 31-12-9999 .
بينما الاكسس يسمح للتاريخ في مدى من 1-1-100 وحتى 31-12-9999 .
بهذه الارشادات في البال دعنا نخطو خلال استعمال معالج التوسيع لنرى كيف يعمل –وهذا في اللقاء التالي –

مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
23-12-2012, 08:02
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع والاخير من الفصل التاسع وعلى بركة الله وباسم الله نبدا


Using the Upsizing Wizard
استخدام معالج التوسعة

ملاحظة انا قد ترجمت كلمة upsize الى توسعة فان كان الامر صحيحا فالحمد لله والا يرجى التعديل .

كما تم ذكره سابقا,فانك تستطيع ان تستعمل معالج التوسعة لتحويل قاعدة البيانات الاكسسية الموجودة الى
مشروع اكسسي للعميل وخادم SQLلقاعدة البيانات .
ستخطو خطوات عدة في عملية توسعة العينة لقاعدة بيانات نورث وند الى قاعدة بيانات خادم SQL.
1- افتح قاعدة البيانات المراد توسعتها وفي هذا المثال قاعدة بيانات نورث وند في دليل العينات للاوفيس.
ثم لتفعل المعالج: اختر ادوات ثم Database Utilities ثم معالج التوسعة .شاشة كالتي في الشكل 9.28 ستظهر .
2- اختر الخيار اصنع قاعدة بيانات جديدة ثم انقر زر التالي .
3- شاشة تشابه الموجودة في الشكل 9.29 ستظهر. بعدها حدد خادم SQL الذي يجب ان يحتفظ بقاعدة البيانات الجديدة.
ايضا املء معلومات الحماية مثل فيما اذا اردت استعمال حماية موثوقة او حساب دخول ورقم سري .ثم
زود الاسم لقاعدة البيانات الجديدة لخادم SQL .انقر التالي .
4- كما يظهر في الشكل 9.30 يجب ان تحدد اي جداول سوف توسع .الشكل 9.30 قد اختار كل الجداول في قاعدة البيانات
وقد ظهرت في منطقة التصدير لخادم SQL من الشاشة . بعد اختيار الجداول للتوسعة انقر زر التالي .
5- شاشة تشابه لما في الشكل 9.31 ستظهر سامحة لك لتحديد اي صفة للجدول لتوسعته .
اختر الخيارات التي تريدها ثم انقر زر التالي.
6- شاشة مثل الظاهرة في الشكل 9.32 سوف تسمح لك لتحديد الاسم لملف مشروع اكسس الجديد
والذي يخزن واجهة المستخدم في العميل و طبقة المنطق بعد تحديد اسم ملف ADP انقر التالي.

7-الشاشة النهائية للمعالج تشاهد في الشكل 9.33 تسمح لك بتحديد فيما اذا فتح ملف ADP الجديد
او بقاء ملف MDB مفتوحا. بعد اختيار خيارك انقر زر انهاء .
8- معالج التوسعة بعدها يظهر مؤشر التقدم ويشغله في كل كائن في قاعدة البيانات والذي يجري تحويله .
وان ظهر اي خلل فان شاشة تشابه لما في الشكل 9.34 سوف تظهر .
9- في المثال الظاهر تحديدا في الشكل 9.34 فان خللا قد تك حدوثه عند تحويل صفحة بيانات مبيعات - Sales Data Access page-
بسبب مشكلة في تحويل نوع البيانات .
10-كما هو ظاهر في الشكل 9.35 التقرير يظهر عند انتهاء معالج التوسعة .التقرير يزود بتفاصيل عديدة دقيقة عن اي كائن تم توسعته
اي اخطاء حدثت وهكذا .
11- الشكل 9.36 يظهر مثالا عن جدول قد تم توسعته الى خادم SQLويوضح كيف نوع البيانات قد تغيرت من نوع بيانات اكسسية
الى المساوي بنوع البيانات في خادم SQL.
12- الشكل 9.37 يوضح الحقيقة بان الاستعلامات الموجودة قد تحولت الى اجراءات مخزنة ,دوال ,ومشاهد معتمدا على اهدافها.
13- الشكل 9.38 يوضح الاخطاء التي حدثت في توسعة استعلامين مختلفين .اي اخطاء تمنع الاكسس من توسعة عنصر معين
يجب ان يصحح باستعمال عبارة خادم SQL صحيحة . حتى ولو اكسس لم بوسع الاستعلام بشكل صحيح فانه يجب ان تراجع
الاستعلام للتاكد من التعديل لا يزال يخدم الاهداف المطلوبة
14- بعد انتهاء التوسعة فان مشروع اكسس سيظهر كما في الشكل 9.39 .في حالة لو اخترت الخيار الاحتفاظ بابقاء ملف
MDB مفتوحا فان قاعدة البيانات سوف تظهر بدلا عن الظاهر الان .
15- ان استعرضت الاستعلامات في شاشة قاعدة البيانات فانه يمكنك رؤية الاستعلامات السابقة قد توسعت
الى اجراءات مخزنة ومشاهد ودوال عديدة .وهذا موضح في الشكل 9.40 .
بعد توسعة قاعدة البيانات يجب ان تصحح اي خلل قد حدث وكذلك تعيد فحص امكانية العمل لقاعدة البيانات
للتاكد من ان الكائنات قد تحولت بشكل صحيح . بعد حل هذه الامور وفحص التطبيق فانك جاهز لجعل
المستخدم ان يعمل في تطبيق خادم SQL من مشروع الاكسس .


Summary
الخلاصة
في هذا الفصل لقد استكشفت استعمال مشاريع الاكسس للعمل مع قواعد بيانات خادم SQL.
خادم SQL اداة قواعد بيانات تجارية قوية جدا والتي يجب ان تستخدم في التطبيقات الاكثر تعقيدا .
يمكنك البدء بنسخ خادم SQL مجانية تدعى SQL Server Desktop Engine ان اردت كتابة تطبيقاتك الاكسسية
مستعملا خادم SQL للبدء به .وان عملت ذلك فانه لا يلزمك تعديلات كبيرة بعد وقت عندما تنجح تطبيقاتك
وتود ان ترحلها الى قاعدة بيانات اقوى من الاكسس . مشاريع اكسس تسمح لك بان تصنع تطبيقات خادم / عميل
بوجود الاكسس كواجهة وخادم SQL كقاعدة بيانات .
الاكسس يتضمن معالج توسعة للمساعدة في نقل قاعدة بيانات بالاكسس الى خادم SQL.
ان اردت معلوملت اضافية عن استعمال مشاريع الاكسس للعمل مع قواعد خادم SQL رجاء راجع دراسة الحالة في الفصل 13 .

في الفصول السابقة انت تعلمت كيف تصنع كودا في تطبيقات الفيجوال بيسك مثل الكود الذي يتم تنفيذه عند حدوث حدث معين .
وتعلمت كيف تسترجع وتصدر البيانات من قواعد البيانات في مختلف الاشكال .في هذا الفصل قد وسعت معرفتك بالعمل مع
مصادر بيانات اخرى بالتعلم عن مشاريع الاكسس وخادم SQL –البركة في محاضراتك يا دينيس-. في الفصل القادم سوف
اغطي بعض التقنيات المتقدمة لاستعمالها في تطبيقاتك الاكسسية ان شاء الله .


مرفق الصور - انتهى امكانية رفع الباقي -سارفعها في مشاركة تالية
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
23-12-2012, 08:04
اكمال رفع الصور

أبو يوسف1
26-12-2012, 09:33
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الاول من الفصل العاشر وعلى بركة الله وباسم الله نبدا


Advanced Access Programming
البرمجة المتقدمة في الاكسس
غطينا الكثير من الاساسيات –القواعد-في الفصول السابقة مستكشفين كيف نستعمل تطبيقات الفيجول بيسك في الاكسس.
هذا الفصل سوف يناقش بعض تقنيات البرمجة المتقدمة لكن لا يعني تزويدك تغطية كبيرة .هذا الفصل سيقدم التقنيات التالية :
= تصريح واستعمال DLLs العادي و الخارجي .
= استعمال الاتمتة للتحكم بالاكسل , الوورد .والاوتلوك من تطبيقاتك الاكسسية .
= اضافة متحكمات ActiveX الى نماذجك .
=تصنيع مكتبات الكود الخاصة ..
= استعمال الاضافات .
= ادخال العمليات في كوداتك .
ولراحتك ارفقت ملف قاعدة البيانات والكود المتولد خلال هذا الفصل من موقع التنزيل Wrox.com



Using Dynamic Link Libraries (DLLs)
استعمال مكتبات الربط الديناميكية

(DLLs)هي ببساطة مكتبات كود مترجمة . وانت استخدمت DLLعند اضافة مرجع الىمكتبة الادو ( الفصل5) حتى تتمكن من العمل
كائنات الادو , والانماط , والخصائص . والطرق والاحداث للكائن الذي تحتويه . في هذا القسم سوف تنظر الى مثالا اخر لكيف تستعمل
DLLالعادي فقط باضافة المرجع في مشروعك .وستنظر ايضا الى كيف تصرح يدويا DLL خارجي وتستعمله من خلال كودك
المرجع


Standard DLLs
DLLs العادي

يمكنك ان تفعل المكتبات مثل DLLs بواسطة الاختيار ادوات ثم مراجع من محرر الفيجول بيسك ومن ثم اختيار
المكتبة المحددة التي تود العمل بها . وبعد اضافة المكتبة فانك تستطيع التعامل مع المكتبة من خلال الكود الفيجولي .



Using the Microsoft Office Object Library to Create a Custom Command Bar
استعمال مكتبة كائنات ميكروسوفت الاوفيس لصنع شريط اوامر خاص –تطبيق عملي-

دعنا ننظر الى مثال لصنع شريط اوامر خاص لتطبيقك مستعملا مكتبة كائنات الاوفيس.
خاصية CommandBars للكائن Application تسمح لك بالوصول الى مجموعة CommandBars
هذه المجموعة تمكنك من التحكم وصنع شريط الادوات .شريط قوائم , وقوائم الاختصارات .

1- اصنع قاعدة بيانات جديدة باسم Ch10CodeExamples.
2-- اضبط المرجع Microsoft Office 11.0 Object Library في صندوق الحوار .ان لم توجد من محرر الفيجوال
اختر ادوات ثم مراجع وثم نزولا بالقائمة اختر Microsoft Office 11.0 Object Library
كما في الشكل 1.01 ثم اتقر الزر موافق لاضافة المكتبة .
3- اضف نمطية جديدة لقاعدة البيانات .
4- اضف الاجراء ات التالية للنمطية :



Sub CreateCommandBar ( )
Dim cbReport As CommandBar
Dim btnButton As CommandBarButton

'delete the command bar and if it does not exist, continue
On Error Resume Next
CommandBars("Wrox Report").Delete
On Error GoTo 0
'add the new command bar to the collection
Set cbReport = CommandBars.Add("Wrox Report", msoBarFloating)
'add Zoom button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Print Preview") -
Controls("Zoom").Id).
'add 2 pages button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Print Preview")
Controls("Two Pages").Id).
'add copy button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Database") -"
.Controls("Copy").Id)

'add a custom button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton)
btnButton.Caption = "Test Button"
btnButton.Style = msoButtonCaption
'list the name of the procedure to call when the button is clicked
btnButton.OnAction = "DisplayMessage"
'display the new command bar by setting visible
cbReport.Visible = True
End Sub
Sub DisplayMessage( )
MsgBox "The new button was clicked."
End Sub


5- من الشاشة الفورية ,نفذ الدالة CreateCommandBar بطباعة CreateCommandBar ثم نقر الزر ادخال
سيظهر شريط ادوات جديد كما في الشكل 10.2 .
6- انقر Test Button الموجود على شريط الادوات . يجب ان ترى شاشة مشابهة للموجودة في الشكل 10.3 .



How It Works
كيف يعمل

بعد اضافة المرجع Microsoft Office 11.0 Object Library انت صنعت اجراءان جديدان لاستعمال
الكائنات CommandBar و CommandBarButton الموجودان في المكتبة .
الاجراء CreateCommandBar يصنع شريط امر جديد عائم مسمى "Wrox Report"



Sub CreateCommandBar ( )
Dim cbReport As CommandBar
Dim btnButton As CommandBarButton
'delete the command bar and if it does not exist, continue
On Error Resume Next
CommandBars("Wrox Report").Delete
On Error GoTo 0
'add the new command bar to the collection
Set cbReport = CommandBars.Add("Wrox Report", msoBarFloating)

بعد تصنيع شريط اوامر جديد فانك تستطيع ان تضيف ازرار مختلفة باعمال معرفة مسبقا تتضمن ازرار تكبير ,صفحتان ,و نسخ .


'add Zoom button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Print Preview") -
Controls("Zoom").Id).
'add 2 pages button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Print Preview")
Controls("Two Pages").Id).
'add copy button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton , -
CommandBars("Database") -"
.Controls("Copy").Id)

وبعدها زر خاص يسمى "Test Button" قد تم اضافته والذي يستدعي الاجراء DisplayMessage عند النقر للزر .


'add a custom button to the toolbar
Set btnButton = cbReport.Controls.Add(msoControlButton)
btnButton.Caption = "Test Button"
btnButton.Style = msoButtonCaption
'list the name of the procedure to call when the button is clicked
btnButton.OnAction = "DisplayMessage"

شريط الامر الجديد سوف يظهر بضبط الخاصية Visible الى صحيح .


'display the new command bar by setting visible
cbReport.Visible = True
End Sub


الاجراء DisplayMessage تم صناعته ايضا وتم استدعاؤه عند النقر على الزر Test Button الجديد
لانه تم اسناده الخاصية OnAction لزر الفحص Test Button.



Sub DisplayMessage( )
MsgBox "The new button was clicked."
End Sub


وعند تشغيل اجراء DisplayMessage من الشاشة الفورية فان شريط الامر الخاص سيظهر .
وعند النقر على Test Button فان رسالة ستظهر ان الزر الجديد قد تم نقره .
وتستطيع على سبيل المثال ان تعين شريط اوامر لاظهار عند فتح التقرير بضبط خاصية الرؤية الى صحيح
في حدث عند الفتح –OnOpen- للتقرير المراد .

هذا فقط احد الامثلة العديدة لكيف يمكنك العمل بالاعمال في مختلف المكتبات .وسوف تنظر الى بعض الامثلة
الاضافية للعمل مع المكتبات العادية فيما بعد في هذا الفصل عند مناقشة الاتمتة .

مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
27-12-2012, 10:02
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل العاشر وعلى بركة الله وباسم الله نبدا


Using External DLLs
استخدام DLLs الخارجي


في القسم السابق انت نظرت الى كيف تضيف مرجعا لمكتبة موجودة وتستخدم الخواص الموجودة فيها من الكود الفيجولي .
بواسطة اضافة المرجع كما عملت سابقا فقد تمكنت من رؤية الخصائص, والطرق ,والاحداث الموجودة لكل كائن
هند طباعة الكود في شاشة الاكواد .
في اوقات ما على اي حال قد تحتاج الى مرجع DLLs خارجي من خلال الكود . DLLs الخارجية لا تزودك بالمساعدة لرؤية ما
هي الخصائص والطرق والاحداث المتوفرة . عليك ان تعرف الكائن وتعرف كيف التعامل معه .
لاستعمال DLL الخارجي يجب ان تصرح الدالة في الكود الفيجولي ,وتستدعي الدالة ,ثم تستعمل النتيجة .



Using an External DLL to Get System Information
استعمال DLL الخارجي للحصول على معلومات النظام

دعنا نستعرض مثالا لكيف ترجع DLL خارجي للحصول على معلومات عن نظامك .
1- اولا صرح DLL خارجي . لعمل ذلك اضف الكود التالي الى قسم التصريحات العامة في النمطية :


Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
2- تاليا اضف نوع التعريف SYSTEM_INFO الى قسم التصريحات العامة في النمطية :


Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
dwReserved As Long
End Type

3- اضف الاجراء التالي للنمطية :


Sub DisplaySystemInfo( )
Dim strMessage As String
Dim lpSysInfo As SYSTEM_INFO
'call the external function and populate the SYSINFO user defined type
'with the results
GetSystemInfo lpSysInfo
'use the results from the function to build a string
strMessage = "Number of processors: " & lpSysInfo.dwNumberOfProcessors & vbCrLf
strMessage = strMessage & "Processor type: " & lpSysInfo.dwProcessorType
'display the number of processors and processor type to the user
MsgBox strMessage
End Sub

4-من الشاشة الفورية نفذ الاجراء DisplaySystemInfo بطباعة DisplaySystemInfo ثم نقر الزر ادخال .
5- يجب ان ترى رسالة تشابه الموجودة في الشكل الظاهر 10.4 .



How It Works
كيف تعمل
اولا انت اضفت تصريحا من المكتبة الخارجية لقسم التصريحات العامة للنمطية .
التصريح حساس لنوع الحرف-صغير او كبير –ويجب طباعته تماما كما هو ظاهرا بالاسفل :


Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
بعدها اضفت نوع التصريح SYSTEM_INFO لقسم التصريحات العامة للنمطية .
نوع البيانات هذا يحوي معلمات بتمام الصيغة المتوقعة في المكتبة الخارجية GetSystemInfo.



Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
dwReserved As Long
End Type

ثم بعدها اضفت الاجراء DisplaySystemInfo لاستدعاء الاجراء الخارجي واستعمال النتيجة .

Sub DisplaySystemInfo( )
الاجراء اولا تم تصريحه كمتغير نصي لحفظ النتيجة لاستدعاء الدالة الخارجية

Dim strMessage As String
Dim lpSysInfo As SYSTEM_INFO

الدالة الخارجية بعدها تم استدعاءها ومررت المتغير المحلي لحفظ النتائج


'call the external function and populate the SYSINFO user defined type
'with the results
GetSystemInfo lpSysInfo

جزء من النتائج الراجعة من الدالة تم اضافتها الى للمتغير النصي


'use the results from the function to build a string
strMessage = "Number of processors: " & lpSysInfo.dwNumberOfProcessors & vbCrLf
strMessage = strMessage & "Processor type: " & lpSysInfo.dwProcessorType

دالة الرسالة بعدها يظهر محتويات المتغير النصي للمستخدم

'display the number of processors and processor type to the user
MsgBox strMessage
End Sub


حالما نفذت الاجراء DisplaySystemInfo من الشاشة الفورية فانك تكون قد استدعيت الدالة الخارجية والذي
يسترجع معلومات عن النظام الحالي ويظهر عدد البروسيسورات ونوع البروسيسور في النظام الحالي على شكل
رسالة على الشاشة .كما هو ظاهر فان العمل مع ال DLL’s الخارجية هو قليلا اصعب من اضافة مرجعا باستعمال
الادوات ثم خصائص مراجع .العمل في DLLs الخارجي يتطلب منك ان تكون دقيق جدا في الصيغ والا فان الدالة لن تعمل .

مرفق الصورة
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
03-01-2013, 06:55
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل العاشر وعلى بركة الله وباسم الله نبدا


Automation
الاتمتة
الاتمتة تعني القدرة على التحكم ببرنامج من خلال برنامج اخر . مثال يمكنك التحكم بالاكسل من خلال تطبيق الاكسس.في هذه الحالة الاكسس سيكون الاكسس عميل الاتمتة والاكسل خادم الاتمتة .
ومن اجل استخدام الاتمتة فانه يجب اولا ان تضيف مرجعا لكائن المكتبة المراد اتمتتها .
وكماتعلمت في السابق يمكنك ان إضافة مرجعا باستعمال الادوات ثم مراجع من محرر الفيجول بيسك .اذهب راسا واضف المراجع للاكسل والوورد والاوتلوك كما في الشكل 10.5. وستنظر الى مثال لكل منها في التالي

Workingwith Automation Objects
العمل مع كائنات الاتمتة
قبل ان تؤتمت تطبيقا خارجيافانه يلزمك ان تصرح كائن متغير .المثال التالي يوضح كيف تصرح كائن متغير للاكسل :



Dim objExcel As New Excel.Application




السطر التالي من الكود يصرح كائن جديد ويصنع نسخةمن الاكسل في سطر واحد من الكود .
ان اردت ان تتحكم بالنقطة عند صناعة نسخة الاكسل الجديدة فانك تستطيع ان تفصل التصريح والانشاء
الى سطرين في الكود كما يظهر تاليا :



Dim objExcel As Excel.Application
Set objExcel = New Excel.Application




بعد انشاء النسخة لكائن الاتمتة فانك تستطيع العمل بخصائص ,والطرق ,والاحداث للكائن.
لقد تعاملت مع الخصائص والطرق والاحداث في الكائنات الاخرى في الفصول الماضية .
التعامل مع الخصائص والطرق والاحداث لكائات الاتمتة لن يفرق .مثالا تستطيع ان تضبط
خاصية الرؤية لكائن objExcel الى صحيح حتى تكون مرئية كالتالي :

objExcel.Visible = True


المثال السابق يطور تقنية تسمى early binding.الربط المبكر - Early binding-يحدث عندما تصرح نوع الكائن
بوضوح من خلال الكود . محاسن كثيرة تنتج من استعمال الربط المبكر مثالا عند ترجمة كل اسطر الكود الراجعة-المتعلقة-بالكائن
في وقت الترجمة فان الكود يتنفذبطريقة اسرع , ويمكنك ان عرض الخصائص ,الطرق, والاحداث المتاحة للكائن حالما تطبع الكود.
لهذه الاسباب يجب ان تستعمل الربط المبكر كلما امكن .
على الرغم من ان الربط المبكر هوالمفضل لكن يمكنك ايضا استعمال تقنية الربط المتاخر .
الربط المتاخر يمكنك من انشاءالكائنات عند وقت التشغيل بدون ارجاع الكائنفي وقت التصميم .بطريقة اخرى
تطبيقك الفيجولي لا يعرف اي نوع للكائنات الذي تريد ولا ماذا تخطط لان تعمل بالكائن الا عند تشغيل الكود وعمله مع الكائن .
هنا مثالا عن استعمال الربط المتاخرمع الاكسل .








'declare a new generic object
Dim objExcel as Object
'instantiate the new object as anExcel object
Set objExcel =CreateObject("Excel.Application")
objExcel.Visible = True




لاحظ ان الطريق CreateObject قد استعمل لصنع نسخة جديدة من الاكسل .ان كان هناك نسخة مفتوحة من كائن الاكسل وتحتاجها للعمل بها , استعمل الطريق GetObject كما هو ظاهرفي الكود التالي:




Set objExcel = GetObject(,"Excel.Application")




والان وانت حسن الاطلاع على المستوى العالي لمفاهيم التصريح وانشاء النسخ الجديدة لكائنات الاتمتة ,دعنا نطبق
بعض الامثلة الحقيقية للتحكم بالاكسلوالوورد والاوتلوك من الاكسس .


ControllingMicrosoft Excel
التحكم بالاكسل
شاهدت للان امثلة قليلة لكيف تصرح وتنشيء كائنات اكسل . دعنا ننطلق حالا للتعلم كيف نتحكم بالاكسل من تطبيق الاكسس.
Controlling an ExcelSpreadsheet from Access
التحكم بصفحة الاكسلالمسطحة من الاكسس-مثال عملي-




في هذا المثال سوف تصنع صفحة اكسلجديدة وتملء بعض الخلايا بالبيانات
1. - اضف الكود التالي الى النمطية.




Sub ControlExcel( )
Dim objExcel As New Excel.Application
Dim objWorksheet As NewExcel.Worksheet
'add a new workbook to thespreadsheet
objExcel.Workbooks.Add
'point the worksheet variable at theactive sheet
Set objWorksheet =objExcel.ActiveSheet
'add various values to the cells
With objWorksheet
"Cells(1, 1).Value = "First Name.
".Cells(1, 2).Value = "Middle Initial
"Cells(1, 3).Value = "Last Name.
Cells(2, 1).Value = "John".
".Cells(2, 2).Value = "A.
Cells(2, 3).Value = "Doe".
Cells(3, 1).Value = "Jack".
".Cells(3, 2).Value = "D.
"Cells(3, 3).Value = "Smith.
End With
'show Excel to the user
objExcel.Visible = True
End Sub




2-شغل الاجراء ControlExcel من الشاشةالفورية بطباعة ControlExcel ثم نقر الزرادخال .
3- يجب ان ترى شاشة اكسل مشابهةللظاهرة في الشكل 10.6 .


How It Works
كيف تعمل
الاجراء ControlExcel يستعملالكائن ExcelApplication والكائن ExcelWorksheet






Sub ControlExcel ( )
Dim objExcel As New Excel.Application
Dim objWorksheet As NewExcel.Worksheet




بعد ان صرحت للكائنات فان صفحة جديدة–workbook- قد اضيفت الى كائن الاكسل



'add a new workbook to the spreadsheet


objExcel.Workbooks.Add




الصفحة الجديدة بعد ذلك قد اشارت الىالصفحة النشطة



'point the worksheet variable at the activesheet
Set objWorksheet =objExcel.ActiveSheet






مستعملا خصائص الخلايا لكائن الصفحة فانك قد اسندت قيما الى مختلف الخلايا .



'add various values to the cells
With objWorksheet
"Cells(1, 1).Value = "First Name.
".Cells(1, 2).Value = "Middle Initial
"Cells(1, 3).Value = "Last Name.
Cells(2, 1).Value = "John".
".Cells(2, 2).Value = "A.
Cells(2, 3).Value = "Doe".
Cells(3, 1).Value = "Jack".
".Cells(3, 2).Value = "D.
"Cells(3, 3).Value = "Smith.
End With




السطر الاخير من الكود يظهر نسخةالاكسل الى المستخدم



'show Excel to the user
objExcel.Visible = True
End Sub


مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
04-01-2013, 08:18
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل العاشر وعلى بركة الله وباسم الله نبدا
Controlling Microsoft Word
التحكم بالوورد
يمكنك التحكم بالوورد من الاكسس بنفس الطريقة التي تحكمت بها بالاكسل . بالطبع كائن الوورد يختلف بسبب انك تتعامل مع الوثائق بدلا من الصفحات المسطحة .هيا ننطلق لنعرف كيف تعمل:
Creating Word Letters from Access
تصنيع رسائل بالوورد من الاكسس –مثال عملي-
في هذاالمثال سوف تصنع جدول العناوين ومن ثم وثيقة وورد والتي تحتوي على الرسالة للارسال الى
كل من العناوين في الجدول .


1- في قاعدة البيانات Ch10CodeExamples اصنع جدولاجديدا كما في الشكل 10.7 .
2- بعدذلك اضف بعض عينات البيانات للجدول ,مثل البيانات الظاهرة في الشكل 10.8 .
3- اضف الاجراء ControlWord التالي الى النمطية الموجودة .




Sub ControlWord()
Dim objWord As NewWord.Application
Dim rsContacts As NewADODB.Recordset
Dim strLtrContent As String
rsContacts.ActiveConnection =CurrentProject.Connection
rsContacts.Open"tblContacts"
objWord.Documents.Add
'for each record in thetblContacts table, create a letter in Word
Do While Not rsContacts.EOF
strLtrContent =rsContacts("FirstName")&""&rsContacts("LastName")
strLtrContent = strLtrContent& vbCrLf & rsContacts("Address") & vbCrLf
strLtrContent = strLtrContent& rsContacts("City") & ", " & rsContacts("Region")
strLtrContent = strLtrContent& " " & rsContacts("PostalCode") & vbCrLf &vbCrLf
strLtrContent = strLtrContent& "Dear " & rsContacts("FirstName") & ""
strLtrContent = strLtrContent& rsContacts("LastName") & ":" & vbCrLf &vbCrLf
strLtrContent = strLtrContent& "Please note we have moved to a new
location."
strLtrContent = strLtrContent& "Our new address is 4 Somewhere, Avon ,
IN 46060 ."
strLtrContent = strLtrContent& vbCrLf & vbCrLf & "Sincerely," & vbCrLf
& vbCrLf
strLtrContent = strLtrContent& "Your Favorite Store"
'insert the content at theend of the document (which is the beginning
('if it is thefirst one
objWord.Selection.EndOf
objWord.Selection.Text =strLtrContent
'insert a page break
objWord.Selection.EndOf
objWord.Selection.InsertBreak
'get the next contact record
rsContacts.MoveNext
Loop
'show word in Print Previewmode
objWord.Visible = True
objWord.PrintPreview = True
End Sub



1- شغل الاجراء ControlWord من الشاشة الفورية بطباعة ControlWordثم نقر الزر ادخال .
شاشة تشابه لما في الشكل 10.9 ستظهر .
How It Works
كيف تعمل


اولا انت صنعت جدولا باسم tblContacts وتم اسكان الجدول ببعض السجلات , بعد ذلك انشات اجراء جديدا
والذي صنع وثيقة وورد وبعد ذلك اسكنت الوثيقة ببعض النصوص المحددة . الاجراء بدء بتصريح بكائن Application وورد جديد ومجموعة سجلات ادوية – من (الادو ADO ).



Sub ControlWord()
Dim objWord As NewWord.Application
Dim rsContacts As NewADODB.Recordset
Dim strLtrContent As String


مجموعةسجلات الادو تم فتحها واسكانها -ملء-بجدولtblContacts




rsContacts.ActiveConnection =CurrentProject.Connection
rsContacts.Open"tblContacts"




وثيقةجديدة بعد ذلك تم اضافتها لكائن Word




objWord.Documents.Add




لكل سجل عنوان في مجموعة السجلات الادوية فان نصا يحتوي على محتوى الرسالة تم اسكانه-ملؤه-.
كل نص يحتوي على محتويات الرسالة للعنوان المفرد.




'for each record in the tblContacts table, create a letter inWord
Do While Not rsContacts.EOF
strLtrContent =rsContacts("FirstName")&""&rsContacts("LastName")
strLtrContent = strLtrContent& vbCrLf & rsContacts("Address") & vbCrLf
strLtrContent = strLtrContent& rsContacts("City") & ", " &rsContacts("Region")
strLtrContent = strLtrContent& " " & rsContacts("PostalCode") & vbCrLf &vbCrLf
strLtrContent = strLtrContent& "Dear " & rsContacts("FirstName") & ""
strLtrContent = strLtrContent& rsContacts("LastName") & ":" & vbCrLf &vbCrLf
strLtrContent = strLtrContent& "Please note we have moved to a new
location."
strLtrContent = strLtrContent& "Our new address is 4 Somewhere, Avon ,
IN 46060 ."
strLtrContent = strLtrContent& vbCrLf & vbCrLf & "Sincerely," & vbCrLf
& vbCrLf
strLtrContent= strLtrContent & "Your Favorite Store"




المحتوياتبعد ذلك تم وضعها في نهاية وثيقة الوورد.




'insert the content at theend of the document (which is the beginning
('if it is thefirst one
objWord.Selection.EndOf
objWord.Selection.Text =strLtrContent




فاصل الصفحة تم بعد ذلك وضعه في وثيقة الوورد حتى يظهر الرسالة التالية في صفحة منفصلة




'insert a page break
objWord.Selection.EndOf
objWord.Selection.InsertBreak




السجل التالي في مجموعة السجلات بعد ذلك تم استرجاعه




'get the next contact record
rsContacts.MoveNext
Loop




بعدمعالجة كل السجلات في مجموعة السجلات فان الكود التالي سوف يظهر الوورد في عرض الطباعة




'show word in Print Preview mode
objWord.Visible = True
objWord.PrintPreview = True
End Sub




وعندتشغيل الاجراء من الشاشة الفورية فان عرض الطباعة للوثيقة الوليدة حديثا سوف تظهر ورسالةمعنونة
لكل عنوان اتصال من جدول tblContacts ستظهر .

مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
07-01-2013, 09:24
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل العاشر وعلى بركة الله وباسم الله نبدا
Controlling Microsoft Outlook
التحكم بالاوتلوك
تستطيع التحكم الاوتلوك بطرق مختلفة حتى تتمكن من معالجة العناوين , البريد الالكتروني,الرزنامات ,المواعيد .
في هذاالقسم سوف تنظر الى مثال لارسال بريد الكتروني من خلال الاوتلوك من الاكسس
Sending an Outlook E-mail from Access
ارسال بريد الكتروني اوتلوك من الاكسس
مستعملا جدول tblContacts الذي تم صنعه في المثال السابق يمكنك المضي الى كيف ترسل بريد اوتلوك من الاكسس .
1- عدل البيانات في جدول tblContacts بحيث ان سجلا واحدا فقط يظل موجودا , والسجل يشير الى عنوان بريدك
الالكتروني.وهذايؤكد انك لن ترسل بريدا الى اشخاص بالخطا معتمدا على البيانات الزائفة التي طبعتها في الجدول .
2- اضفالاجراء التالي الى النمطية



SubControlOutlook()
DimobjOutlook As New Outlook.Application
Dim objEmailAs Outlook.MailItem
DimstrLtrContent As String
DimrsContacts As New ADODB.Recordset
rsContacts.ActiveConnection= CurrentProject.Connection
rsContacts.Open"tblContacts"
'for eachrecord in the tblContacts table, send an email
Do While NotrsContacts.EOF
strLtrContent= "Dear " & rsContacts("FirstName") & " "
strLtrContent= strLtrContent & rsContacts("LastName") & ":"& vbCrLf & vbCrLf
strLtrContent= strLtrContent & "Please note we have moved to a new
location."
strLtrContent= strLtrContent & "Our new address is 4 Somewhere, Avon
IN 46060."
strLtrContent= strLtrContent & vbCrLf & vbCrLf & "Sincerely," &vbCrLf
& vbCrLf
strLtrContent= strLtrContent & "Your Favorite Store"
'create anemail regarding the new business location
Set objEmail= objOutlook.CreateItem(olMailItem)
objEmail.Recipients.AddrsContacts("Email")
objEmail.Subject= "Our address has changed."
objEmail.Body= strLtrContent
'send themessage
objEmail.Send
'move to thenext contacts record
rsContacts.MoveNext
Loop
End Sub




1- شغل الاجراء من الشاشة الفورية بطباعةControlOutlook ثم نقر الزر ادخال
يجب ان تستلم بريدا مشابه للظاهر في الصورة 10.10 في صندوق الوارد على حسابك المحدد في
حقل الايميل في الجدول tblContacts.


How It Works
كيف يعمل
اولا انت عدلت القيم في جدول tblContacts حتى تستقبل بريدا من تشغيل هذا الاجراء التجريبي .
ثم اضفت الاجراء ControlOutlook الى النمطية




SubControlOutlook()




الاجراءاستعمل كائن OutlookApplication وكائن OutlookMailItem لصنع ومعالجة رسالةالبريد




DimobjOutlook As New Outlook.Application
Dim objEmailAs Outlook.MailItem




تاليا مجموعة سجلات جديدة ادوية ( ADO)تم صنعها معتمدا على القيم في جدول tblContacts




DimstrLtrContent As String
DimrsContacts As New ADODB.Recordset
rsContacts.ActiveConnection= CurrentProject.Connection
rsContacts.Open"tblContacts"




لكل سجل في مجموعة السجلات رسالة نصية ثم توليدها مستعملا حقل البريد الالكتروني وبعض النصوص
والتي تشير الى ان الشركة قد ارتحلت الى مكان اخر وهذا عنوانها .




'for eachrecord in the tblContacts table, send an email
Do While NotrsContacts.EOF
strLtrContent= "Dear " & rsContacts("FirstName") & " "
strLtrContent= strLtrContent & rsContacts("LastName") & ":"& vbCrLf & vbCrLf
strLtrContent= strLtrContent & "Please note we have moved to a new
location."
strLtrContent= strLtrContent & "Our new address is 4 Somewhere, Avon
IN 46060."
strLtrContent= strLtrContent & vbCrLf & vbCrLf & "Sincerely," &vbCrLf
& vbCrLf
strLtrContent = strLtrContent & "YourFavorite Store"




بريد الكتروني ثم توليده وارسل الى عنوان البريد الالكتروني الموجود في السجل الحالي في
مجموعة السجلات .عنوان الموضوع للبريد الالكتروني تم تحديده والجسم-المحتوى-قد تم اسناده
الى الرسالة النصية المتكونةمن الكود التالي :


'create an email regarding the new businesslocation[/B]
Set objEmail= objOutlook.CreateItem(olMailItem)
objEmail.Recipients.AddrsContacts("Email")
objEmail.Subject= "Our address has changed."
objEmail.Body= strLtrContent

]


الطريق Send لكائن MailItem ارسل الرسالة للمستقبل




'send themessage
objEmail.Send




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




'move to thenext contacts record
rsContacts.MoveNext
Loop
End Sub




وعند تشغيل الاجراء من الشاشة الفورية فان بريدا الكترونيا سيرسل الى العنوان المحدد في حقل البريد الالكتروني
في جدول tblContacts . لو كان عنوانك هو المحدد فانك سوف تستلم بريدا في صندوق الواردمحتويا على
النص الظاهر في الشكل 10.10 والذي يشير ان الشركة لها عنوانا جديدا .


مرفق الصورة
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
09-01-2013, 04:16
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس من الفصل العاشر والذي شارف على الانتهاء وعلى بركة الله وباسم الله نبدا
ActiveX Controls
حاكمات الاكتف اكس
ActiveXcontrols هي حاكمات اضافية يمكنك من استعمالها في نماذج الاكسس لديك .وانت تعاملت
مع حاكمات مثل مربعات النصوص وكذلك ازار الاوامر . ماذا تعمل لو احتجت لحاكمة غيرموجودة في صندوق الادوات الاساسي ؟
حاكمات عديدة اضافية موجودة وجاهزة على كمبيوترك , من ميكروسوفت وغيرها من المصنعين .
تستطيع الاستفادة منها بواسطة اضافة المرجع للحاكمة مما يمكنك من استعمالها في تطبيقك .
على سبيل المثال لاستعمال Calendar control اصنع نموذجاجديدا, وبوجود النموذج وهو مفتوح اختر
Insert----ActiveX Control شاشة كالتي في الشكل 10.11 ستظهر .
لاضافةحاكمة الرزنامة او اي حاكمة مرغوبة ببساطة اخترها من قائمة الحاكمات ثم انقر الزرموافق.
عندالنقر على الزر موافق فان حاكمة الرزنامة سوف تاخذ مكانها اليا في النموذج الجديد كمافي الشكل 10.12 .
حاكمةالرزنامة لها خصائص واحداث تماما مثل اي حاكمات اخرى كما ترى في شاشة الخصائص الشكل 10.13 .
افترض انك تريد ان تستخدم القيمة للتاريخ المختار في الرزنامة ,وضع القيمة في حقل لكي تريح المستخدم
من طباعة التاريخ .افترض ان نموذجك يحوي مربع نص .

الكود التالي مثالا يوضح كيف تظهر التاريخ المختار من حاكمةالرزنامة في مربع النص , عندما


يفقد حاكمة الرزنامة التركيز ( مثل عند النقر فيمربع النص).




Private SubCalendar0_LostFocus()
'set thetext box value to the selected calendar value
txtSelectedDate= Calendar0.Value
End Sub





وعند تشغيل النموذج واختيار التاريخ في حاكمة الرزنامة فان القيمة في مربعالنص سوف تحدث .
وهذا موضح في الشكل 10.14 .
تستطيع ان تطبق هذه المفاهيم على اي حاكمة اكتف اكس اخرى والتي تريد العمل معها .
ببساطة اضف المرجع للحاكمة ثم اسحب وافلت الحاكمة الى النموذج اذا لم يعمل اكسس ذلك لك اليا .
بعدها يمكنك العمل بالحاكمة تماماكما تفعل باي حاكمة عادية .
مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
10-01-2013, 04:17
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع وقبل الاخير من الفصل العاشر وعلى بركة الله وباسم الله نبدا
Libraries
المكتبات
حتى الان فان كل الكودات التي كتبتها تعمل فقط في داخل قاعدة البيانات المصنوعة بداخلها.
يوجد اوقات تحتاج لاعادة استعمال الكود عبر عدة مشاريع اكسسية مثل عند تريد تنفيذمهمة مشتركة
والتي عدة قواعد بيانات تريد استعمالها .يمكنك ان تصنع مكتبات معتمدا على قواعد بيانات اكسسية محددة
والتي يمكن ان تجعلها مرجعية وتستعملها من قواعد بيانات اكسسية اخرى .
على اي حال من اجل ان تكون مرشحا جيدا للمكتبة ,فان المكتبة يجب ان تحوي فقط اجراءات ودوال اصلية
وليس مراجع محددة للنماذج او اي كائنات اخرى غير موجودة في التطبيقات الاخرى من التي فيها المكتبة الممكن استعمالها.
Creating and Using a Code Library
صنع واستعمال كود المكتبة –مثال عملي-
في هذاالمثال سوف تصنع قاعدة بيانات جديدة تحتوي على عينة لاجراء يتولى ادارة الاعطال والممكن اتاحته
لقواعدبيانات اكسسية اخرى .اجراء ادارة الاعطال تم وصفه في الفصل 2 .
سوف تضيف قاعدة بيانات جديدة كمكتبة ومن ثم تستعمل المكتبة من قاعدة بيانات اخرى
1- اصنع قاعدة بيانات جديدة وباسم ErrorHandlerLibrary ثم انقر الزر اصنع.
2- اضف نمطية لقاعدة البيانات هذه وباسم modError
3- اضف الاجراء التالي للنمطية modError:




Public SubGeneralErrorHandler(lngErrNumber As Long, strErrDesc As String,
strModuleSourceAs String, strProcedureSource As String)
DimstrMessage As String
'build theerror message string from the parameters passed in
strMessage ="An error has occurred in the application."
strMessage =strMessage & vbCrLf & "Error Number: " & lngErrNumber
strMessage =strMessage & vbCrLf & "Error Description: " & strErrDesc
strMessage =strMessage & vbCrLf & "Module Source: " & strModuleSource
strMessage =strMessage & vbCrLf & "Procedure Source: " &strProcedureSource
'display themessage to the user
MsgBoxstrMessage, vbCritical
End Sub




1- احفظ الاجراء بنقر الزر حفظ من شريط الادوات .
2- اختر Debug➪CompileErrorHandlerLibraryحتى تتاكد من عدم وجود خلل في الترجمة .
3- اغلق قاعدة البيانات ErrorHandlerLibrary.
4- اعدفتح قاعدة البيانات Ch10CodeExamples .ومن المحررالفيجولي اختر ادوات ثم مراجع
وانقرالزر استعراض .غير الملفات لنوع التصفية الى قواعد ميكروسوفت اكسس (*.mdb).استكشف
مكان قاعدة البيانات ErrorHandlerLibrary كما في الشكل10.15 ثم انقر الزر افتح .
5- يجب ان ترى ErrorHandlerLibrary الجديدة في قائمة المراجع المتاحة كما في الشكل 10.16.
انقرالزر موافق لاضافة المرجع لهذه المكتبة في قاعدة البيانات Ch10CodeExamples.
9-اضف الاجراء التالي الى النمطية الموجودة في قاعدةالبيانات Ch10CodeExamples .




Sub TestLibrary()
On Error GoTo HandleError
'declare variable to store result
Dim intResult As Integer
Dim intValue1 As Integer
Dim intValue2 As Integer
intValue1 = 5
intValue2 = 0
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2
Exit Sub
HandleError :
GeneralErrorHandler Err.Number, Err.Description, "module1","TestLibrary"
Exit Sub

End Sub


10- نفذالاجراء TestLibrary من الشاشة الفورية بطباعةTestLibrary ثم نقر الزر ادخال .
11-يجب ان ترى شاشة تشابه للظاهرة فيالشكل 10.17 .مظهرة رسالة الخطا .


How It Works
كيف تعمل
انت صنعت مكتبة جديدة بوضع اجراءادارة الخلل GeneralErrorHandlerالى قاعدة بيانات جديدة سميت
ErrorHandlerLibrary . الاجراء قبل بعض المعلمات متعلقة الاعطال , ومن ثم تستعمل المعلمات
لاظهار رسالة –ذات معنى - مفهومة الى المستخدم



Public SubGeneralErrorHandler(lngErrNumber As Long, strErrDesc As String,
strModuleSourceAs String, strProcedureSource As String)
DimstrMessage As String
'build theerror message string from the parameters passed in
strMessage ="An error has occurred in the application."
strMessage =strMessage & vbCrLf & "Error Number: " & lngErrNumber
strMessage =strMessage & vbCrLf & "Error Description: " & strErrDesc
strMessage =strMessage & vbCrLf & "Module Source: " & strModuleSource
strMessage =strMessage & vbCrLf & "Procedure Source: " &strProcedureSource
'display themessage to the user
MsgBox strMessage,vbCritical
End Sub



بعد صنع وحفظ الاجراء الجديد فانك اغلقت قاعدة البيانات ErrorHandlerLibrary . ومن ثم رجعت الى قاعدة
البيانات Ch10CodeExamples واضفت المرجع الى قاعدة البيانات ErrorHandlerLibrary .وبعد اضافة
المرجع الى المكتبة فانك قد اضفت الاجراء TestLibraryللاستفادة من الاجراء GeneralErrorHandler
الموجود في المكتبة .الاجراء TestLibrary ببساطة يسبب خلل القسمة على صفر حتى يتنفذ كود ادارة



الخلل.



Sub TestLibrary()
On Error GoTo HandleError
'declare variable to store result
Dim intResult As Integer
Dim intValue1 As Integer
Dim intValue2 As Integer
intValue1 = 5
intValue2 = 0
'calculate result by dividing first value by second value
intResult = intValue1 / intValue2
Exit Sub



كود ادارة الخلل والذي ياتي تاليا يسمى الاجراء GeneralErrorHandler الموجود في
قاعدة البيانات الاكسسية ErrorHandlerLibrary المنفصلة والتي اضفتها كمكتبة .



HandleError :
GeneralErrorHandler Err.Number, Err.Description, "module1","TestLibrary"
Exit Sub
End Sub




وهذا كل الموجود لصنع كود مكتبةجديدة واستعمال المكتبة من قاعدة بيانات اكسس اخرى !
يمكنك ان تزيد المثال اعلاه باضافةاجراءات اضافية لادارة الخلل للمكتبة .
ربما تود صنع اجراء تسجيل الاعطال والذي يسجل كل او بعض الاعطال لقاعدة البيانات .
وربما تود ان تصنع اجراء لارسال بريد الى مدير النظام عند حدوث خلل معين .
هذه الاجراءات هي تتجاوز مدى هذا الفصل لكنني –دينيس –اودان اعطيك بعض
الافكار الاضافية لكيف توسع ErrorHandlerLibrary لاستعمالها في مشاريعك الاخرى
وهذا ما سوف يتم ذكره في الجزء التالي والاخير من هذاالفصل باذن الله


مرفق الصور
والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
12-01-2013, 06:57
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثامن والاخير من الفصل العاشر وعلى بركة الله وباسم الله نبدا

Add-ins
الاضافات
الاضافات هي ادوات تزودك بعمليات اضافية ولكنها ليست جزء من منتج ميكروسوفت اكسس العادي
وهذه الاضافات اما مزودة بالاكسس محصلة من اطراف ثالثة او انها صممت خصيصا .
اضافات كثيرة تاتي مع الاكسس مثل :
the Performance Analyzer, Linked Table Manager, control wizards
محلل الانجاز , مدير جداول الربط , ومعالجات التحكم وغيرها .
ثلاثة انواع من الاضافات هي : menu add-ins, wizards, and builders

الاولى –اضافات القائمة يمكنك الوصول اليها بواسطة : من الادوات اختر خيار الاضافات وتعمل
عموما على الاكسس نفسه او عدة مشاريع . يمكنك استعمال اضافات القائمة الموجودة مثل مجزء قاعدة
البيانات او تصنيع اضافاتك الخاصة بك .
الثانية –اضافات المعالج تتكون من مجموعة صناديق حوار والتي تسير بك خطوة بخطوة خلال
عملبة مفردة .لا مجال للشك في استعمال المعالجات في الاكسس قبل تنفيذ مختلف المهام .
في الفصل9 انت استعملت معالج التوسعة لتكبير قاعدة بيانات نورث ويند الى خادم SQL .
ويمكنك ايضا من تصنيع معالجاتك الخاصة بك.

الثالثة –المنشيئات وهي تساعد المستخدم في بناء عناصر بيانات مثل عبارات SQL.
ومرة اخرى يمكنك من تصنيع منشيئاتك الخاصة بك او استعمال الموجودة .
بعد ان تصنع واحدة من هذه الانواع من الاضافات , بعدها سجل الاضافات حتى يستعملها تطبيقك .
احدى الطرق للتسجيل هو استعمال مدير الاضافات في الاكسس .
طريقة اخرى هي الحصول على برنامج تنصيب لتسجيل الاضافات اليا .
بقيت طريقة اخرى وهي تسجيل الاضافات مباشرة مستعملا المسجل العام في الويندوز .


Transactions
التعاملات

هذا القسم يفصل ما هو التعامل وكيف تنجز التعامل من الكود الفيجولي .التعامل ينجز سلسلة من
التغييرات في دفعة واحدة –batch-. دفعة التغييرات كاملة اما ان تنجح واما ان تفشل كمجموعة .
هنا مثالا سهلا .افترض انك تريد عمل سلسلة من التحديثات الى قاعدة البيانات .انت تحدث
سجلا لشخص بسبب تغييرات في الاسم والعنوان بسبب الزواج.
ربما تحتاج الى تحديث جدولين او اكثر بالمعلومات الجديدة .وان فشل واحدا او اكثر من التحديثات
فانك تريد ان يفشل مجموعة التحديثات بكاملها كوحدة واحدة .والا فسوف تحصل على مجموعة
بيانات ناقصة في قاعدة البيانات .
كائن ADOConnection يمكنك من انجاز التعاملات . الطريق BeginTrans لكائن Connection
يبدئ التعامل بينما الطريق CommitTrans يتعهد لانجاز التعامل حتى يجعل التغييرات نهائية .
وان فشل التعامل فان الطريق RollbackTrans لكائن Connection يتراجع عن كل التغييرات
في البيانات الداخلية التي حدثت كجزء من التعامل .
هنا مثالا لبعض الكود يمكنك من استعماله لانجاز التعامل :


Sub TestTransaction()
Dim cnConnection As New ADODB.Connection
Dim cmdCommand As New ADODB.Command
'set the connection and command objects to the current connection
Set cnConnection = CurrentProject.Connection
cmdCommand.ActiveConnection = cnConnection

On Error GoTo HandleError
'begin the transaction
cnConnection.BeginTrans
'specify the first SQL Statement to execute that should not cause an error
cmdCommand.CommandText = _
"UPDATE tblContacts SET FirstName = 'Test' WHERE ContactId = 1"
'execute the first SQL Statement which should not cause an error
cmdCommand.Execute
'specify the second SQL Statement to execute that will cause an error
cmdCommand.CommandText = _
"UPDATE tblContacts SET ContactId = 'A' WHERE ContactId = 1"
'execute the second SQL Statement which should cause an error
cmdCommand.Execute
'commit the transaction if both updates were successful
cnConnection.CommitTrans
Exit Sub
HandleError :
'rollback the transaction so all updates fail
cnConnection.RollbackTrans
MsgBox "An error occurred: " & Err.Description
End Sub


المثال السابق استعمل ADOCommand و كائن Connection لتنفيذ سلسلة من عبارات SQL على قاعدة البيانات
الطريق BeginTrans يشير الى بداية التعامل , والطريق CommitTrans يشير الى ان التعامل جاري بدون اعطال
لذلك كل التغييرات يجب ان يتعهد بانجازها في مصدر البيانات الداخلي .الطريق RollbackTrans هو يدير الاعطال
وسوف يتراجع عن كل التغييرات في حالة وجود اعطال ,لذلك كل التحديثات تفشل معا .في المثال السابق عبارة SQL الاولى
تم تنفيذها بنجاح . بينما الثانية عملت خللا . النتيجة ان التغييرات الناجحة الاولى تم التراجع عنها بسبب فشل الثانية .

Summary
الخلاصة

هذا الفصل قدم مواضيع كثيرة متقدمة ,متضمنة تصريحا واستعمالا DLLs العادي والخارجي
استعمال الاتمتة للتحكم بالتطبيقات الاخرى ,واضافة حاكمات ActiveX للنماذج .
وغطيت ايضا كيف تصنع كود مكتبات خاصة ,كيف تستعمل الاضافات وكيف تتعامل
مع التعاملات في كودك .كل من هذه المواضيع يمكنها ان تضمن فصلا كاملا .
لمعلومات اضافية عن هذه المواضيع رجاء راجع( Access 2003 VBA Programmer’s Reference(Wiley, 2004
في هذا الفصل ,انا اردت فقط ان ازودك ببعض الافكار للمميزات المتقدمة المتوفرة لتطبيقاتك الاكسسية بدون اعطاءك
تعليما مفصلا لكيف تتعامل مع كل منها .
عند هذه النقطة فانت جاهز للتقدم الى الفصل 11 , والذي يغطي خطوات شتى يجب عليك اتخاذها لانهاء تطبيقك الاكسسي
متضمنة تحسين الاداء واعتبارات وجود اكثر من مستخدم ,اضافة حماية للتطبيق ,وتوزيع التطبيق .
بعدها سوف انهي الكتاب بدراستين شاملتين والتي تورد كل المفاهيم التي نوقشت خلال هذا الكتاب مع تطبيقين حقيقين .

والى لقاء اخر مع الفصل القادم ان شاء الله قريبا

أبو يوسف1
18-01-2013, 02:27
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الاول من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا


Finishing the Application
انهاء التطبيق
بعد العمل بجهد كبير لتطوير تطبيق اكسسي مستعملا تطبيقات الفيجول بيسك فان من المهم ان التطبيق قادر على
العمل بشكل جيد ويقدر على تحمل عدد المستخدمون المتوقع . وتريد التاكد من ان المستخدم النهائي لا يمكنه ان يعدل على مصدر الكود لقاعدة البيانات والتصميم بدون الاذن المسموح . بعد الضبط ,والحماية وفحص التطبيق ,فانك جاهز لطرح التطبيق بتوزيعه للمستخدمين النهائيين , على اي حال بعد توزيع التطبيق على المستخدمين النهائيين فان مهمتك لم تنته .تطبيقات اكسس تحتاج الى عمل نسخ احتياطية وضغطها دوريا للتاكيد على انها ما تزال تعمل بشكل منتظم
ويمكن استرجاعها من النسخ الاحتياطية ان حدث اي خلل او حذف .

هذا الفصل يغطي :
= كتابة تطبيقات لادارة مستخدمون كثر .
= تحسين الاداء الحقيقي والظاهري للتطبيق .
= استعمال محلل الاداء للمساعدة في تحسين الاداء .
= اضافة حماية لمنع الممنوعين من الدخول او الاضافة .
= توزيع التطبيق الى المستخدمين النهائيين .
= عمل نسخة , ضغط , واصلاح التطبيقات .


Multi-User Considerations
اعتبارات عدة مستخدمون

مداخل مختلفة للكودنة يمكنها ان تؤثر في كيفية ادارة تطبيقك لعدة مستخدمين .على سبيل المثال
نوع قفل السجل الموضوع للسجلات المسترجعة من قاعدة البيانات سوف يؤثر على ما يحدث عندما يحاول اكثر من مستخدم الوصول الى نفس السجل . عندما لا يستطيع التطبيق ادارة هذا السيناريو بشكل صحيح فان تضاربا في التحديث يمكن حدوثه بسبب ان مستخدما قد غير على تغييرات مستخدما اخر .
فان كان تطبيقك استعمل النوع المناسب من القفل للسجل ويسيطر على التضارب في التحديث ,فانه
قادر اكثر على دعم عدة مستخدمين .طريقة اخرى لتساعد تطبيقك في ادارة عدة مستخدمين هو فصل جداول البيانات من الكائنات اخرى باستخدام ملفين لقاعدة البيانات الاكسسية .كلا هذين الاليتين سوف تناقش في الاقسام فيما بعد .


Record Locking and Update Conflicts
قفل السجل وتضارب التحديثات

قبل قراءة الكتاب هذا ,من المحتمل انك تعاملت مع النماذج المرتبطة في تطبيقات الاكسس .
النماذج المرتبطة تتصل مباشرة بالجدول وتحفظ الاتصال المفتوح مع قاعدة البيانات حتى كل
التغييرات تحدث عند تلك اللحظة –فورا-.ومن ثم في الفصل 5 تعلمت كيف تملء مجموعة السجلات الادوية ADO بالبيانات من قاعدة البيانات وكيف تظهر السجلات من مجموعة السجلات على كلا النموذجين المرتبط والمنفصل .
دعنا نرى كيف يتم ادارة قفل السجل على كلا النماذج المرتبطة والمنفصلة والطرق التي تمكن من
من التعديل على ضبط قفل السجلات لادارة افضل لعدة مستخدمين .



Record Locking on Bound Forms
قفل السجل في النماذج المرتبطة
نوع قفل السجل المستعمل للنماذج المرتبطة يتم تحديده من ضبط الخيارات .
لتعديل خيارات قفل السجل للنماذج المرتيطة اختر ادوات ثم خيارات ثم اعداد متقدم صندوق حوار سوف يظهر كما في الشكل 11.1 .
Tools➪Options➪Advanced


الخيارات ال 3 الاساسية لقفل السجل هي : No Locks, All Records, and Edited Record
اذا تم اختيار No Locks-لا يوجد قفل – فانه لا يقفل على اي سجل وكل المستخدمون لهم امكانية التحرير –edits-.
وهذا يسبب في ان مستخدما سوف يغير-يعدل- ما كتبه مستخدما اخر
ان تم اختيار All Records-كل السجلات- فان كل السجلات في الجدول الداخلي للنموذج الذي تحرره سوف يتم قفله .هذا الخيار ليس جيدا عموما بوجود تطبيق لعدة مستخدمين ما عدا بعض الحالات الخاصة حينما تريد ابعاد الكل بينما مستخدما واحدا له فتح الجدول .
الخيار الثالث Edited Record هذا الخيار يقفل فقط السجل المحدد والذي المستخدم يحرره-يعمل عليه- وهذا هو الضبط المفضل لاغلب حالات وجود عدة مستخدمين .

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

والى لقاء اخر قريبا ان شاء الله

أبو يوسف1
24-01-2013, 09:52
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Record Locking on Unbound Forms
قفل السجل للنماذج المنفصلة
مع النماذج المنفصلة نوع القفل المستعمل يعتمد على قفل المصدر حيثما البيانات تات منه .
على سبيل المثال اذا كان نموذجك يعتمد على مجموعة السجلات الادوية ( (ADO , فان نوع القفل لمجموعة السجلات هوالذي يحدد الاغلاق . وكما تذكر من الفصل ال 5 فان خاصية LockType لكائن Recordset يمكن ان يكون احدى الاربع :





الايضاحات


القيمة




مجموعةالسجلات للقراءة فقط ولا يمكن التغيير


adLockReadOnly


السجل في مجموعة السجلات يتم غلقه حالما يبدا التحرير
adLockPessimistic




السجل في مجوعة السجلات يتم غلقه عندما يصدر الطريق Update


adLockOptimistic




السجلات لا يتم غلقها الا بعد تنفيذ عملية دفعة التحديثات للسجلات كلها


adLockBatchOptimistic




مثال للصيغة العامة لهذه الخاصية كالتالي:




rsRecordset.LockType= adLockReadOnly




قفل القراءة فقط يجب ان يستعمل كلما لا يريد المستخدم ان يحدث البيانات بسبب انها اسرع ولا تغلق السجلات بدون ضرورة .
للتطبيقات المخصصة لعدة مستخدمين خيارات pessimistic andoptimistic هي الافضل عند وجود ضرورةلتحديث البيانات .
بقفل pessimistic السجل في مجموعة السجلات يقفل حالما يبدا التحرير وهذا يمنع اي مستخدم اخر من تغيير السجل حتى ينتهي المستخدم الاول من من التحرير للسجل .
بقفل optimistic فان السجل لا يقفل الا حتى قبيل لحظةعملية امر التحديث .هذا الخيار يسمح للمستخدم من للتفاعل مع نفس السجل حتى لو ان واحدا اخر فتحه .على اي حال قفل optimistic يمثل المشكلة الكامنة –الممكنة لحدوث تضارب في التحديث .

.


Update Conflicts
تضاربات التحديث
تضارب التحديث يمكن حدوثه عندما يقدم اول مستخدم على تحديث سجلا ما بينما المستخدم الاخر ما
يزال امامه على الشاشة البيانات القديمة- قبل التحديث الاخير- .وعندما يحفظ المستخدما لثاني التغييرات لقاعدة البيانات فان بعض البيانات التي تم تحديثها هي بيانات قديمة وهي تعدل التغييرات التي تم عملها من المستخدم الاول .
ان اردت استخدام قفل optimistic يجب ان تكتب كودا يدير تضاربات التحديث . انت تعمل ذلك من اجل منع امكانية مستخدم ان يعدل على تغييرات مستخدم اخر .احدى الطرق لادارة تضاربات التحديث في الكود الفيجولي هو اضافة ختم زمني او رقم نسخة لكل جدول حتى تستطع اعلام متى اخر مرة تم تحديث السجل فيها .
اذا استخدمت هذا المدخل فانك يجب ان تحفظ مسار القيمة الاصلية لرقم النسخةاو الختم الزمني عندما
يفتح السجل اول مرة , وبعد ذلك قبل التحديث لقاعدة البيانات يجب ان تتاكد –تفحص- لترى ان تغير رقم النسخة او الختم الزمني .طريقة اخرى لادارةتضارب التحديثات هو فحص على اساس كل حقل لوحده وينبه المستخدم بدقة عن الحقول التي تغيرت حتى يقررالمستخدم فيما اذا اراد تحديث السجل .
موضوع تضارب التحديثات يمكن ان ياخذ فصلا باكمله ,لكن يجب عليك على الاقل ان تدرك ماذا تعني
وبعض الطرق لادارته , ويمكنك ان تحصل على معلومات عن تضارب التحدبثات بالبحث عن مقالات
في الموقع msdn.microsoft.com . دعنا نحول انتباهنا الى اعتبارات اخرى لتحسين التطبيقات لعدة مستخدمين .
Multi-UserArchitecture Considerations
اعتبارات معمارية لعدةمستخدمين
احدى الطرق لتحسين امكاتية لعدةمستخدمين للعمل مع تطبيقات الاكسسية هو فصل جداول البيانات من مظهر واجهة المستخدم .
فاذا وضعت قاعدة بيانات واحدة والتي تحتوي على كامل التطبيق على ملف خادم وتسمح لعدة مستخدمين للوصول اليه في نفس الوقت فانك تكون كانك تطلب مشكلة . حل افضل هو ان تفصل واجهة المستخدم عن جداول البيانات حتى يحصل كل مستخدم على نسخته الخاصة من واجهة المستخدم .جداول البيانات يمكن ان تخزن في ملف قاعدة بيانات منفصل على خادم ويمكن الوصول اليه من كل نسخة من واجهة المستخدم .هذاالمدخل موضح في الشكل 11.2 .
لاحظ وجود قاعدة بيانات واحدة مركزية لجداول البيانات , وكل المستخدمون عندهم نسخة من واجهة المستخدم بالكائنات/الاكواد على اجهزتهم . قاعدة بيانات واجهة المستخدم بعد ذلك تربط مع قاعدة البيانات التي تحتوي على الجداول .
هذا المدخل ايضا يحسن الاداء للتطبيق , كما ساناقش في قسم الاداء تاليا في هذا الفصل .
نموذجيا ,يجب عليك ان تصمم قاعدةبياناتك تتبع هذا المدخل من اول البداية.ببساطة اصنع قاعدة بيانات تحتوي على الجداول في قاعدة بيانات لوحدها واصنع قاعدة بيانات تحتوي على كائنات واجهة المستخدم في قاعدة اخرى وبعد ذلك اربط اربطها الى قاعدةالبيانات التي تحتوي على الجداول .
حتى تربط مع قاعدة البيانات التي تحتوي على الجداول اختر ملف ثم احصل على بيانات خارجية ومن ثم خيار ربط الجداول
File➪Get External Data and then theLink Tables option
راجع الفصل 7 لمعلومات اضافية للربط مع قاعدة بيانات اخرى مستعملا الكود الفيجولي .
خيار اخر هو بناء التطبيق في قاعدةبيانات واحدة اولا ثم اعمل على التجزئة يدويا او مستخدما المجزء لقاعدة البيانات .
لعمل ذلك يدويا ببساطة اعمل تصديرلجداول البيانات الى قاعدة بيانات اخرى , احذف الجداول من قاعدة البيانات الاصلية حتى تكون الجدول المرتبطة هي المتبقية, واضف الرابط الى قاعدة البيانات الخارجية تلك . في اللقاء القادم سوف ننظر الى كيف تستعمل مجزء قاعدة البيانات ان شاء الله .

13666

أبو يوسف1
25-01-2013, 12:59
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل الحادي عشر وعلىبركة الله وباسم الله نبدا
Using the Database Splitter to Separate Database
Tables from theUser Interface
استعمال مجزء القاعدة لتجزئة جداول القاعدة عن واجهة المستخدم –مثال عملي-
باستعمال مجزء القاعدة , فانه يمكنك بسهولة من فصل قاعدة البيانات الاكسسية الموجودة الى ملفي قواعد بيانات احداهمايحتوي على الجداول والاخر لواجهة المستخدم . دعنا ننطلق لمثال لكيف نعمل ذلك.
1- افتح قاعدة البيانات المراد تجزئتها . افتح قاعدة البيانات Northwind.mdb ان وجدتها على جهازك ,ان لم تكن افتح واحدة من القواعد التي صنعتها سابقا .الخطوات نفسها في كلا الحالتين .
من باب النصيحة اعمل نسخة احتياطية للقاعدة قبل الاستمرار
2- اختر ادوات ثم ادوات القواعد ثم مجزءالقاعدة Tools➪Database Utilities➪Database Splitter كما في الشكل 11.3
3- شاشة كالظاهرة في الشكل 11.4 ستظهر ,اختر زر تجزئة القاعدة .
4- صندوق حوار لتصنيع الجزء الخلفي لقاعدة البيانات سوف يظهر كما في الشكل 11.5 , حدد اسم ومكان القاعدة التي تريد تخزين جداول البيانات فيها .ان كنت تجزء النورث ويند , حدد الاسم Northwind_be.mdb ومن ثم انقرالزر جزء Split
5- بعد تجزئة البيانات الى قاعدتين منفصلتين فانك فانك سوف تستلم رسالة تؤكد التجزئة بنجاج . انقر الزرموافق في صندوق الحوار
6- وبعدها سوف ترجع الى قاعدة البيانات الاصلية والتي في هذه الحالة Northwind.mdb كما في الشكل 11.6 , فانك سترى
ان الجداول قد ربطت الىقاعدة البيانات الوليدة Northwind_ be.mdb




How It Works
كيف تعمل
مجزءقاعدة البيانات يسمح لك بان تحول قاعدة بيانات واحدة الى قاعدتين منفصلتين :الاولى بواجهة المستخدم والاخرىبجداول البيانات . وبعد تشغيل مجزء قاعدة البيانات فان جداول البيانات سوف تنتقل الى قاعدة بيانات جديدة ورابط سوف يضاف الى قاعدة البيانات الاصلية ليشير الى الجداول في قاعدة البيانات الجديدة.بعدانتهاء التجزئة , فانك تستطيع نسخ قاعدة البيانات الجديدة بالجداول الى ملف خادم او اي مكان حيث اجهزةمضيفةعديدةيمكنها الوصول اليه .ومن ثم انسخ قاعدة واجهة المستخدم الى كل مستخدم في محطة العمل . تاكد من الروابط الذي تم صنعها سوف تعمل من كل جهاز تريد ان تحمل عليه واجهة المستخدم . مثلا ان كانت الجداولربطت على درايف سي , فان نفس المكان سوف يختلف بحرف الدرايف على مختلف الاجهزة المضيفة.فان كان هذه الحالة فانه مطلوب ان تعدل الروابط من الكمبيوتر الثاني حتى تجد البيانات .
الان وعندك بعض الافكار لكيف تحسن قدرات تطبيقك لعدة مستخدمين , دعنا نتوجه الى طرق مختلفة لكيف تكمل تطبيقك .وهذا ماسيكون في اللقاء التالي ان شاء الله
13671136721367313674

omar19-3
26-01-2013, 03:47
الله يجزيك كل خير

أبو يوسف1
26-01-2013, 05:49
حياك الله اخي العزيز عمر وبارك فيك
واياك جزى الله وبارك
سائلا المولى ان تكون دائما في موفور الصحة والعافية يا رب

ســـاري
29-01-2013, 06:33
الله يكثر من امثالك وتحياتي لك

أبو يوسف1
30-01-2013, 09:25
الله يكثر من امثالك وتحياتي لك
حياك الله وبارك الله فيك.






الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الرابع من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Optimizing Your Applications
اكمال التطبيق
الاكمال هنا المقصود به الكمال وعلى احسن وجه
كجزء من عملية الفحص , يجب ان تضبط بدقة التطبيق لجعله يعمل بشكل اسرع وافضل . يمكنك ان تمارس تقنيات مختلفة لتحسينالسرعة الحقيقية ,وايضا لذلك السرعة التي يشعر بها المستخدمين .
Improving Actual Performance
تحسين الاداء الحقيقي
السرعةالتي يتنفذ فيها التطبيق فعلا يمكن انتتحسن بواسطة بعض الارشادات العامة , تقنية الكودنة , تقنيات الوصول للبيانات وسوف تنظر الى كل واحد منهم بالدور
General DesignGuidelines
ارشادات عامة للتصميم
هنا ارشادات عامةعديدة للمساعدة في تحسين الاداء الحقيقي لتطبيقاتك :
= قلل الكود والكائنات في النموذج .انقل الكودالى النمطية العامة , كلما تعقد النموذج –كثرما فيه- كلما طال وقت تحميله .
= قلل استعمال النماذج الفرعية بسبب وجود نموذجين في الذاكرة .
= اكتب نمطيات مكررة الاستعمال حتى لا تعيد كتابةنفس الكود بطرق مختلفة قليلا ومرات متعددة . هذا يقلل حجم الكودفي تطبيقك ويساعد في تحسين السرعة . على سبيل المثال بدلا من وجود اجراء واحداوالذي يمكن كل عناصر التحكم في نموذج واحد , اعمل اجراء اخر والذي يمنع كل عناصر التحكم في النموذج الاخر, واخران حتى يمنعا التحكم في كل من هؤلاء النماذج المتشابهة .اكتب نمطية اصلية والتي تمكن او تمنع كل التحكم على نموذج محدد معتمدا على فيما اذا علم التمكين او المنع يمرر كمتغير .
=ازالةالكود غير المستعمل .
= تاكدمن ان تطبيقك قد تم ترجمته-compiled-.وايضا خذ في الاعتبار ان ترجمة تطبيقك الى ملف MDE
كما سوف يوصف فيما بعد في هذا الفصل .
=ان كان كل كائنات واجهة المستخدم في قاعدةبيانات واحدة وبيانات الجداول في قاعدة اخرى (اكسس او غيره)
افتح قاعدة البيانات المحتوية واجهة المستخدم حصريا لاداء اسرع . من قائمةملف في صندوق الحوار
يمكنك تحديد ضبط فتح حصريا لفتح قاعدة البيانات , كما في الشكل 11.7 .
والان دعنا ننظر الى بعض الطرق لتحسين الاداء بواسطة كتابة الكود الفيجولي بطريقة افضل .



Optimizing VBA Code
اكمال الكود الفيجولي
عندك طرقا مختلفة لانجاز نفس المهمة مستعملا الكود الفيجولي , بعضها اسرع من الاخر .هنا بعض الامثلة :
=== استعمل With...End With عند التعامل مع اكثر من ضبط لنفس الكائن والا فان العملية سوف تكون بطيئة لان الكائن يجب ان يتوضح مكانه كل مرة . فالافضل ان تستعمل :





WithtxtName
".Text = "Hello
.Visible = True
.Enabled = True
EndWith





افضل من التالي :




txtName.Text= "Hello”
txtName.Visible= True
txtName.Enabled= True




=== استعمل نوع البيانات الصحيح واعمله على قدر حاجتك الفعلية .على سبيل المثال اذا احتجت integer فلا تستخدم double
قلل من استخدام المتنوعات - variants -لانها الابطا , لانها تحتاج لوقت حتى تحددنوع البيانات بسبب لان واحدا لم يصنف بوضوح .
=== عندما كنت تعمل بالاتمتة , كما تم الوصف في الفصل 10 , استعمل الربط المبكر حتى تتحول المراجع عند وقت الترجمة بدلا من
عند وقت التنفيذ . على سبيل المثال الربط المبكرللاكسل كالتالي :




DimobjExcel As Excel.Application
SetobjExcel = New Excel.Application


افضل من الربط المتاخر للاكسل كالتالي:



‘declare a new generic object
DimobjExcel as Object
‘instantiate the new object as anExcel object
SetobjExcel = CreateObject("Excel.Application”)




=== If...Then...Else هي اسرع من عبارات ( ) IIF
بدلا منفحص متغيرات البوليان Boolean عند الصحيح Trueاستعمل القيمة الصحيحة .على سبيل المثال استعمل


IfblnValue Then


بدلا من :

If blnValue = True Then


Improving Data Access
تحسين الوصول للبيانات
اداءتطبيقات الاكسس يمكن ان يقل بسبب وصول غير مناسب للبيانات . لجعل التطبيقات تعمل باسرع ضع الارشادات التالية في البال :
== قلل عدد اتصالات قاعدة البيانات المفتوحة .مثال ان استعملت النموذج المرتبط فانه سوف يحافظ على اتصال دائم لقاعدة البيانات .
خذ في الاعتبار الانتقال الى النموذج المنفصل والذي يتصل بقاعدة البيانات لاسترجاع البيانات , ينفصل , ويعيد الاتصال عند الحاجة
الى تحديث البيانات .انظر الفصل 5 عن الادو ADO لمعلومات اكثر .
==استعمل الاستعلام كمصدر للنموذج , التحكم , او مجموعة السجلات ADO والتي ترجع فقط السجلات المطلوب العمل بهابدلا من فتح كامل الجدول .
== تاكدان الاستعلام قد تم كتابته بشكل صحيح .على سبيل المثال ان تسترجع فقط الاعمدة قيدالاستخدام .وتاكد منانك تستخدم النوع الصحيح للربط .
== تاكدمن نوع المشيرة المستعملة لا تستخدم اكثرمن حاجتك الفعلية .مثال ان لم تكن ترغب بالتعديل للبيانات استعمل مشيرة القراءة فقط .
==استعمل فهارس مناسبة في الجداول لتقليل عدد مسحات-البحث- الجداول .اضف فهارس الى الحقول والتي تستعمل لربط الجداول معا وكذلك التي كثيرا ما تستخدم لاستعادة البيانات . هذا سوف يوفر على الاكسس من تنفيذ البحث عن كامل قاعدةالبيانات لايجاد السجل المطلوب . على اي حال لا تضيف فهارس لكل حقل في قاعدةالبيانات .هذا في الواقع سوف يقلل من الاداء اكثر من عدم وجود فهارس على الاطلاق .

13777

أبو يوسف1
01-02-2013, 03:34
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الخامس من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Improving Perceived Performance
تحسين الاداء الظاهر
القسم السابق ركز على كيف تحسن الاداء الفعلي لتطبيقك وفي هذا القسم سوف تنظر الى طرق قليلة لتحسين الاداء كمايراه المستخدمون النهائيون .في كلمات اخرى , فانك حقيقة لا تسرع التطبيق بالاستعانة بهذه الخصائص ,لكنك تعمل المستخدم بان يشعر بان التطبيق يعمل بسرعة او ان التقدم قد تم .
==استخدم الساعة الرملية للاشارة الى ان التطبيق في مهمة قد تاخذ برهة .الساعة الرملية يمكن تشغيلها او اطفاؤها على التوالي بهذا الكود :



DoCmd.HourglassTrue
DoCmd.HourglassFalse




==اخفي النماذج المراد اعادة فتحها فيما بعد . بدلا من الاستمرار من فتح واغلاق نفس النموذج ,خذ في الاعتبارفتح النموذج مرة واحدة واخفاءه حتى تحتاجه مرة اخرى . النماذج الباقية في الذاكرة اسرع من النماذج من النماذج المعاد تحميلها مرارا , على الرغم من ان كلاهما يستهلكوا الذاكرة .استعمل الخاصية مرئي -Visible- للنموذج لاخفاء واعادةاظهار النموذج .مثال الكود التالي يخفي النموذج :





frmName.Visible= False




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




DimintCounter As Integer
DimintResult As Integer
DimintPause As Long
intResult= SysCmd(acSysCmdInitMeter, "Copying 2000 files", 2000)
ForintCounter=1To2000
intResult= SysCmd(acSysCmdUpdateMeter, intCounter)
‘Createpause so user can see progress bar
ForintPause=1To20000
NextintPause
NextintCounter
intResult= SysCmd(acSysCmdRemoveMeter)




Running the Performance Analyzer
تشغيل محلل الاداء
الاكسس ياتي مع اداة محلل الاداء والتي سوف تحلل الكائنات المختارة وتعمل اقتراحات لتحسين السرعة .
Using the Performance Analyzer
استعمال محلل الاداء –مثال عملي –
دعناننطلق الى مثال لاستعمال محلل الاداء لتحليل كل الكائنات في قاعدة نورث ويند للطرق المقترحة لتحسين السرعة .
1- اختر ادوات –تحليل ---الاداء - Tools➪Analyze➪Performance- . شاشة كالظاهرة في الشكل 11.18 ستظهر .
2- اختر خانة انواع كل الكائنات كما في الشكل 11.18.انقر زر اختيار الكل ومن ثم انقر الزر موافق .هذا سوف يختار كل الكائنات في قاعدة البيانات للتحليل .المحلل يبدا بالعمل وشاشة مشابهة للظاهر في الشكل11.19 . سوف تظهر والتي تعمل اقتراحات مختلفة عن الطرق لتحسين الاداء للتطبيق .
How It Works
كيف تعمل
محلل الاداء هو معالج تستطبع استعماله لجعل الاكسس يزودك ببعض الاقتراحات عن كيف تحسن الاداء لتطبيقك .في المثال انت شغلت المعالج في قاعدة بيانات نورث ويند واكتشفت ان بعض التحسينات الاضافية ما زال يمكن عملها لجعل تطبيقك يعمل بشكل اسرع


1378713788

عارف حسان
01-02-2013, 04:55
أسأل الله أن يرضى عنك وعن والديك.
أتابع عملك بكل الحب والود .. جزاك الله خيراً أخي الحبيب أبا يوسف.

أبو يوسف1
02-02-2013, 05:38
اخي واستاذي العزيز الدكتور عارف حسان
السلام عليكم ورحمة الله وبركاته
اشكركم على متابعتكم الكريمة ودعمكم الكبير لهذا العمل فجزاكم الله كل الخير وبارك فيكم
ولكم بما دعوتم واكثر يا رب
وتقبل دائما خالص تحياتي وتقديري العميقين اخي واستاذي العزيز ابا محمد

أبو يوسف1
03-02-2013, 08:19
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس من الفصل الحادي عشروالذي شارف على الانتهاء وعلى بركة الله وباسم الله نبدا

Securing Your Application
حماية تطبيقك

عندك طرقا مختلفة لاضافة حماية الى تطبيقك .تستطيع تطبيق واحدة او اكثر من هذه التقنيات بالاعتماد على نوع الحماية المطلوب لتطبيقك .مثالا يمكنك تعيين كلمة مرور الى قاعدة البيانات و / او الى الكود, بمكنك تشفير قاعدة البيانات وايضا اضافةحسابات مستخدمين لصلاحيات محددة .دعنا ننظر الى كل من هذه المفاهيم بتفصيل اكثر .

Adding a Database Password
اضافة كلمة مرور للقاعدة

احدى الطرق لاضافة حماية للقاعدة هو الطلب من المستخدم لادخال كلمة مرور قبل فتح القاعدة وهذا يسمى حماية على مستوى الملف . بعد فتح القاعدة بكلمة المرور الصحيحة يستطيع المستخدم ان يعمل اي شيء للقاعدة الا اذا كان هناك حمايةاخرى قد وضعت .
عندك على الاقل طريقان لضبط كلمة مرور للقاعدة .
احدهماان تختار من ادوات حماية ثم ضع خيار حماية للقاعدة
Tools➪Security➪SetDatabase Password option
سوف يطلب منك كلمة مرور لقاعدة البيانات .طريقةاخرى لضبط كلمة مرور ببقاعدة هو برمجيا باستعمال الكودالفيجولي . مثالا تستطيع تنفيذ عبارة SQL على القاعدة لضبط , تغيير , وازالة كلمة مرور القاعدة .
هنا مثالا لعبارات SQL لكل من هذه الخيارات .



(‘SQLstatement for setting password for first time (from NULL to some value
strSQL= "ALTER DATABASE PASSWORD [newpassword] NULL”
‘SQLstatement for changing the database password
strSQL= "ALTER DATABASE PASSWORD [anotherpassword] [newpassword]”
(‘SQL statement for settingpassword back to NULL (no password
strSQL= "ALTER DATABASE PASSWORD NULL [anotherpassword]”


'For any of these statements, would also need code to execute the SQL
statement
‘againstthe database. For example, could use ADOto execute these statements
‘againstthe database.









بعد تعيين كلمة مرور , كلما حاول اي مستخدم ان يفتح قاعدة البيانات , فان حوارا يشابه للظاهر في الشكل 11.10
سوف يظهر . قبل امكانية فتح القاعدة فان المستخدم يجب ان يحدد كلمة مرور صحيحة

Adding a Password for VBA Code
اضافة كلمة مرور للكود الفيجولي

اضافةكلمة المرور لقاعدة البيانات كما تم وصفه في القسم السابق لا يمنع المستخدم من مشاهدة الكود المصدري -source code-.
منذاكسس 2000 يجب عليك ان تحمى الكود الفيجولي المصدري لوحده بواسطة قفل المشروع من المشاهدة وتزيد كلمة مرور .
لاضافةكلمة مرور الى الكود الفيجولي , افتح المحرر الفيجولي , بعدها اختر من ادوات اختر خصائص اسم المشروع
واخترخانة الحماية كما في الشكل 11.11 . Tools➪ProjectNameProperties. Select the Protection tab.
حدد قفل المشروع لخيار المشاهدة واملء كلمة المرور المحددة من اجل اظهار الكود . بعد نقر موافق فان كلمة المرور المحددة تكون مطلوبة في المستقبل قبل ان تشاهد او تعدل الكود المصدري .
طريقةاخرى لتحسين الحماية من خلال مميزات حمايةالملف المختلفة تتضمن صنع ملف MDE.
رجاءانظر الجزء الاخير في هذا الفصل والذي يناقش ملفات MDE.

أبو يوسف1
06-02-2013, 05:01
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع وقبل الاخير من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Adding Users, Groups, and Permissions
اضافة مستخدمين , مجموعات وصلاحيات
بالاضافةالى حماية على مستوى الملف , فان الاكسس يزودك القدرة على تطوير حماية على مستوى المستخدم .هذه الميزة تسمح لك بان ان تضيف عدة مستخدمين لكل واحد منهم مجموعة صلاحيات . مثلا بعض المستخدمين اداريون ويحتاجون الى الوصول الى كل شيء , بينما غيرهم لربما يحتاجون الى مشاهدة او تعديل اجزاء معينة من التطبيق .احدى الطرق لاضافة مستخدمين ,مجموعات , وصلاحيات لقاعدة البيانات هو ان تستعمل معالج الحماية
وتستطيع الوصول الى هذا المعالج باختيار من الادوات اختر حماية ثم خيار معالج الحماية
Tools➪Security➪UserLevel Security Wizard option
المعالج يسير بك خلال سلسلة تساؤلات لضبط حسابات المستخدم والمجموعات .
طريقةاخرى لعمل الحماية على مستوى المستخدم هو استعمال الكود الفيجولي.رجاء راجع الفصل 5 لامثلة لكيف تستخدم مكتبة الادوكس –ADOX- لاضافةمستخدمين جدد ومجموعات بالكود الفيجولي .
ملف مجموعة عمل بامتداد (mdw.)تخزن كل معلومات الصلاحيات لقاعدةالبيانات .ملف مجموعة العمل الاساسي يدعى system.mdw
لكن اسماء اخرى ممكنة .فقط ملف واحد لمجموعةالعمل يمكن ان يصاحب قاعدة البيانات في جلسة مفردة –session-. لتعديلالكائنات فان المستخدمون يسمح لهم بالوصول وذلك بان تختار من ادوات حماية ثم صلاحيات المستخدم والمجموعات كما في الشكل 11.12 , وتستطيع ان
تعدل ضبط الحماية لكل كائن لكل مستخدم .
Encrypting a Database
تشفير قاعدة البيانات
حتى بعداضافة مظاهر الحمايةالتي تمت مناقشتها للان لتطبيقك فان تطبيقك لا يكون محميا بشكل كامل.شخص ما ما يزال عنده الامكانية لرؤية محتويات قاعدة البيانات بادوات يمكنها ان تظهر الاجزاء على القرص الصلب ويكتشف البيانات . ان كنت قلقا من ان شخصا سوف يمكنه ان يكشف البيانات من اداة للقرص الصلب فيجب ان تاخذ في الاعتبار التشفير لقاعدةالبيانات .لعمل ذلك اختر من ادوات اختر حماية ثم ترميز / فك ترميز قاعدة البيانات
Tools➪Security➪Encode/DecodeDatabase
الاكسس بعد ذلك يسال عن تحديد اسم الملف والمكان لقاعدة البيانات للتشفير .ثم عند النقرعلى موافق فان كامل قاعدة البيانات سوف تشفر .
ومن اجل ان تستعمل التطبيق بعد تشفيره فان الاكسس يجب ان يفك التشفير المعلومات .وهذا يعني ان تشفير القاعدة سوف يبطيء الاداء حتى حوالي 20 بالمئة .فان كان البطء في الاداءهو مشكلة لتطبيقك فان الفك ليس خيارا جيدا .
Distributing Your Application
توزيع تطبيقك
الان وقد فحصت وكملت تطبيقك فانك جاهز لترجمة وتوزيع التطبيق للمستخدمين النهائيين .يوجد عندك خياراتتوزيع متعددة مثل توزيع قاعدةالبيانات للمستخدمين مع نسخة كاملة من الاكسس , توزيع التطبيق باستعمال Access runtime, وتوزيع ملفات MDE. كل واحدة من هذه سوف يناقش .
قبل ان توزع تطبيقك يجب اولا ان تترجم التطبيق .انت لا تريدالمستخدم النهائي لان يتعامل مع اخطاء الترجمة والواجب تجنبها بالترجمة قبل النشر . الترجمة سوف تساعد ايضا التطبيق ليعمل بشكل اسرع .احدىالطرق لترجمة التطبيق هو من المحرر الفيجولي باختيار Debug➪Compileoption
Distributing the Application to Users with the Full

Version of Access
توزيع تطبيقك للمستخدم مع نسخة كاملة من الاكسس
في بعض الحالات من الممكن ان توزع التطبيق للمستخدمين اللذين عندهم نسخة كاملة من الاكسس منصبة على جهازهم .غير عمل ملف او ملفات MDBقابلة للوصول من كل مستخدم فانك لا يلزمك اي خطوات اخرى من اجل نشر تطبيقك لهولاءالمستخدمين .

أبو يوسف1
07-02-2013, 08:39
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثامن والاخير من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Distributing the Application with the Access Runtime
توزيع التطبيق مع Access Runtime
ان كان لديك مستخدمين نهائيون لا يوجد الاكسس على اجهزتهم فانك تستطيع توزيع تطبيقك اليهم مستعملا Access Runtime.
AccessRuntime هو نسخة محدودة الخصائص لاكسس والتي تضم الحدود التالية :
== انت لا تستطيع تعديل او اظهار تصاميم الكائنات .
== شاشةقاعدة البيانات مخفية .
==اشرطة ادوات للاكسس وبعض مواد القوائم غير مدعومة , لذلك يجب عليك ان تضم قوائمك الخاصة في تطبيقك .
== بعض المفاتيح غير مفعلة .
تستطيع ان تصنع برنامج تثبيت setup program مستعملا معالج التحزيم والذي يمكنك من ان تنشر برنامجك مع Access Runtime.
من اجل استعمال معالج التحزيم فاولا يجب ان يكون مثبتةعلى جهازك Office Access2003 Developer Extensions
بعد تثبيت نسخة developer extensions على الجهازيجب عليك ان تحمل معالج التحزيم الى مشروعك .
من المحرر الفيجولي Add-Ins➪Add-In Manager➪Packaging Wizard ثم اختر صندوق Loaded/Unloaded
ثم انقرموافق . المعالج يجب ان يظهر تحت قائمة Add-In.
بعدها تثبيتها على الجهاز فانه يمكنك ان تستعمل المعالج لمساعدتك لبناء حلول للتوزيع معتمدا على Access Runtime.

ان اردت ان تفحص تطبيقك كيف يبدو في Access Runtime , فانك يمكن ان تفتح قاعدةالبيانات مستعملا مفتاح runtime كما في الكود التالي



msaccess.exec:\temp\northwind.mdb /runtime





Distributing an Execute-Only Application
توزيع فقط الملف التنفيذي
ملف MDE هو ملف مترجم ومضغوط وبدون كل الكود المصدري القابل للتعديل .لمشاريع اكسس التي تستخدم خادم SQL فان الملف ADE .
وبسبب ان الكود المصدري تم نزعه فان حماية اضافية قد تم تزويدها لتطبيقك . وايضا بسبب ان الكود المصدري قد تم ازالته فان حجم التطبيق اصبح اقل وبذلك فان الاداء سيكون افضل . وبسبب محدوديةملفات MDE فانه يجب ان تحتفظ بقاعدة البيانات الاصلية مع الكود المصدري حتى تتمكن من اجراءالتعديلات فيما بعد .
لصنع ملفMDE , افتح قاعدة البيانات المراد عمل ملف MDE لها ثم من ادوات اختر Database Utilities➪Make MDE File
حددالاسم لملف MDEفي صندوق الحوار الذي يظهر ومن ثم انقر موافق .
Maintaining the Application
المحافظة على التطبيق
نشرتطبيقك للمستخدم النهائي لا يعني ان عملك قد انتهى .من المهم ان تضغط قاعدة البيانات دوريا لتحافظ عليه لان يعمل في حالة جيدة وكذلك حافظ على عمل نسخا دوريةاحتياطية .
Compacting and Repairing the Database
ضغط واصلاح القاعدة
يمكنك ان تضغط وتصلح قاعدة بيانات الاكسس لتقليل حجم المساحة التي تاخذها القاعدة وكذلك لاصلاح مشاكل ان اكشف الاكسس اي منها . ولان قواعد الاكسس هي تعتمد على الملفات ,فان السجلات يتم حذفها واضافتها الى النظام طوال الوقت .مساحة كبيرة يمكن ان تؤخذ بالعمليات التي انتهت او سجلات القاعدة التي تم حذفها .ضغط قاعدة البيانات سوف يسترجع المساحة ويقلل حجم الملف .
لضغط واصلاح قاعدة بيانات الاكسس اختر من ادواتDatabaseTools➪Database Utilities➪Compactand Repair
ان كانت قاعدة البيانات مفتوحة واردت ان تضغطها فان اختيار هذا الخيار سوف يضغط اليا هذه القاعدة ان لم تكن قاعدة بيانات مفتوحة سوف يتم سؤالك لتحديد اسم ومكان القاعدة المراد ضغطها .
Making Backup Copies of the Database
ان كنت كاغلب الناس ,فمن المحتمل انك فقدت بيانات من بعض البرامج سابقا .كانت من المؤكد محبطة ان تفقد بيانات وتعيد صناعتهامرة اخرى .نفس المفهوم يصح على تطبيقات الاكسس .قواعد بيانات الاكسس هي نظام ملفات,والذي يعني ان كثيرامن البيانات موجودة في ملف MDB واحد .وبسبب وجود الكثير في ملف واحد وبسبب ان يكون من السهل للمستخدم حذف ملف قاعدة البيانات من الشبكة , فان من بالغ الاهمية ان تعمل نسخا احتياطية دورية لكل من كلا جداول القاعدة وواجهة المستخدم.مفهوم الاحتياط هام لاي تطبيق, لكنه مطلوب خاصة للتطبيقات المعتمدة على نظام الملفات مثل الاكسس .
لعمل نسخة احتياطية لقاعدة بيانات الاكسس اختر من ادوات :
Tools➪DatabaseUtilities➪Backup Database
سوف يتم سؤالك لتحديد اسم الملف والمسارالمراد حفظ النسخة الاحتياطية فيه . انقر موافق
وسوف يتم عمل بذلك النسخة الاحتياطية .
Summary
الخلاصة
في هذاالفصل , ناقشت تقنيات عديدة والتي تساعد في تقوية تطبيقك الاكسسي في دعمه لعدة مستخدمين
وان يعمل بشكل حسن . وقد استكشفت طرقا عديدة لتحسين وحماية وفحص التطبيق الاكسسي .
ونظرت الى خيارات متعددة للتطوير وكذلك ايضا ارشادات للصيانة والتي يجب ان تعمل لتاكيدان عملك المضني في بناء التطبيق لن يضيع . هذه المفاهيم التي تمت تغطيتها للان وضحت الاساسيات لبناءالتطبيقات وجهزتك الى الفصلين النهائيين .الفصلان 12و 13 هما دراسة حالات عملية وتسمح لك بان تبني تطبيقات واقعية وتدعم المفاهيم التي تم تغطيتها في الفصول السابقة .


واخيرا

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

محمود الصومالي
14-02-2013, 02:15
بارك الله فيك في الدنيا و الآخرة .
و حشرك مع النبيين و الصديقين و الشهداء و الصالحين و حسن أولئك رفيقا.

أبو يوسف1
14-02-2013, 06:14
اخي العزيز محمود الصومالي
السلام عليكم ورحمة الله وبركاته
امين ....امين .....امين ...يا رب العالمين
ما اجمل دعواتك الرائعات وهذا غاية المنى يا رب الاستجابة والقبول
بارك الله فيك وجزاك الله كل الخير
ولك بما دعوت مرات ومرات يا رب

ياسري المملكة
17-02-2013, 07:48
استاذنا الغالي ابو يوسف1 الله لايحرمنا من شخصكم الكريم يارب سائلين المولى عز وجل ان يمن عليك بالصحة والعافية والخيرالكثير يارب لك ولجميع افراد عالتك الكريمة يارب

أبو يوسف1
17-02-2013, 05:08
اخي العزيز ياسري المملكة
السلام عليكم ورحمة الله وبركاته
حياك الله وبارك الله فيك
سائلا المولى ان يمتعك ومن تحب بموفور الصحة والعافية دائما يا رب
حفظك الله ورعاك وسدد على دروب الخير خطاك ان شاء الله

omar19-3
23-02-2013, 07:15
جزاك الله عنا خيراً أستاذنا الكريم .... أبو يوسف1

أبو يوسف1
23-02-2013, 04:35
اخي العزيز عمر
السلام عليكم ورحمة الله وبركاته*
حياك الله وبارك الله فيك*
واياك الله جزى ووفق ان شاء الله*

محمود الصومالي
23-02-2013, 06:07
بسم الله الرحمن الرحيم

بارك الله فيك أستاذي العزيز

ننتظر الكتاب بفارغ الصبر

و يا ليت أحد الأخوة يعملها فيديو

14005

أبو يوسف1
23-02-2013, 07:37
اخي العزيز محمود الصومالي
السلام عليكم ورحمة الله وبركاته
اشكرك كثيرا على الشهادة الرائعة والجميلة بارك الله فيك , لم افعل شيئا يذكر : فقط كلمات بجانب كلمات والجهد الحقيقي لدينيس .مايقدمه الاساتذة والاخوة الاعزاء يفوق اضعافا مضاعفة بجانب ما سردت من كلمات او رفع الصور .جزاهم الله خيرا وبارك فيهم .وانت قدمت للمملكة برامج ومناقشات اجدها اهم كثيرا مما صففت من كلمات , فجزاك الله الخير كله
فكرت في التركيز والبدء على خادم الاس كيو ال وكذلك الفيجوال ستوديو واي لغات البرمجة الاجمل والافضل
الصحيح انني متردد كثيرا امام مثات الصفحات وقد تصل الالاف : بايهم ابدا وكلما فتحت موضوعا وجدت غيره اجمل واروع واكتشفت كلما قرات او مررت على صفحة عظيم جهلي وقلة ما اعرف ,لذلك تشعبت افكاري وتشوشت كثيرا ومررت اليوم على الجزء ال12 من الكتاب وترددت في الترجمة .والله المستعان .
اسال الله العظيم ان ييسر الامور وان اتابع الترجمة قريبا ان شاء الله .
جزاك الله خيرا وبارك الله فيك دائما

أبو يوسف1
02-03-2013, 08:23
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
عدنا - جميعا - للمرحلة الثانية والعود احمد
نتابع معا الجزء الاول من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا
Case Study 1: ProjectTracker Application
الدراسية الاولى : تطبيق متابعة المشاريع
لقد تعلمت حتى الان طرقا مختلفة لاستعمال الكود الفيجولي لتحسين مشروعاتك الاكسسية . هذا الفصل هو اول الدراستين والتي ستوضح كل المفاهيم التي تم تغطيتها للان في مثال شامل وحقيقي . انه يشتمل على تطبيق تقصي المشاريع والذي
يمكن المستخدمون من تقصي مشاريعهم والعناوين والوثائق ذات العلاقة . سوف تعمل :
=مراجعة مواصفات التصاميم الهامة .
= فصل الكود الى طبقات فيزيائية مختلفة .
= استعمال ملفين قواعد بيانات اكسسية منفصلين للتطبيق : الاول لواجهة المستخدم والاخرللبيانات .
= التزود بالكائنات الخاصة-المصنعة – ( custom objects ) مستعملا نمطيات الفئة .
= اطرح ملفا خارجيا او برنامجا من تطبيقك .
= ابعث بريدا الكترونيا من تطبيقك .
= اشتغل مع مجموعات سجلات منفصلة لتقليل الاتصالات بقاعدة البيانات لتحسين قدرات عدةمستخدمين .
= تعلم كيف تدير الاخطاء
في هذاالفصل مهمتك هي صنع تطبيق متابعة المشاريع من البداية للنهاية .سوف اخطو معك في كل خطوة , وفي النهاية فان كثيرا من المفاهيم المغطاة في الفصول السابقة سوف تدركها اكثر.ولراحتك فسوف اشمل ملفات القاعدتين مع الكود المصدري ومعمارية الجداول متاحة للتنزيل من Wrox.com .
على اي حال انا اوصي ان تعمل طوال الفصل بنفسك –على الاقل في البدايات –قبل استعمال الكودالمصدري الذي زودته .
افضل طريقة لتعلم الاكسس هو العمل بيديك
Design Specifications
مواصفات التصميم
دعنا نتحول راسا الى مهمة تعلم المتطلبات لتطبيق متابعة المشاريع .كما ناقشنا في الفصل الاول , قبل ان تفكر بكتابة سطر واحد من الكود يجب ان تعمل تخطيطا دقيقا لتطبيقك على الورق . ابداعملية هذا التصميم بتحديد ما الذي يجب ان يعمله التطبيق بالضبط , ومن الذي سوف يستخدمه , ومنالذين ستخدمونه حاليا .اذهب في مهمة البحث عن الحقائق لتحديد ما الحاجات المفروض ان يلبيها هذا التطبيق .
عدة تطبيقات مصيرها الفشل بسبب ان الكودنة قد تم عملها مبكرا جدا وكان من الصعب ان يعاد صياغتها لتلبية التغييرات .
ربماتذكر خطوات بناء البيت : ان انتظرت حتى يكتمل تشييد الطابقين الاوليين لتخبر البنناء انك تريد بناء تسوية فانك سوف تدفع كثيرا للحصول على ذلك الطلب في هذه المرحلة .نفس المفهوم ينطبق في عالم البرمجة .كلما خططت جيدا للبداية كانت النهاية افضل.في الدراسة الحالية , انت تحدثت الى المستخدمين وحددت حاجة كل شخص لطريقة متابعتة لمشاريعه الشخصية .
الانظمةالمتعاونة -الشركات - تدير , تفوتر –تعمل فواتير -, تباشر مشاريع للشركة .على اي حال فان المستخدمون يطلبون طريقة اسهل لمتابعةمهماتهم الخاصة الصغيرة بطريقة مترابطة .هذا النظام لا يعني ان يكون بديلا عن النظام الموجود . سيظلالمستخدمون محافظين على المشاريع في النظام الرئيسي . على اي حال التفاصيل الشخصية للعمل اليومي لكل مستخدم لا داعي لابقائها في النظام الرئيسي ,ولا ترغب الادارة في المقابل ان تبقيها في اذهانهم , انت تحدد ان التطبيق سيسمح على الاقل للمستخدمين من متابعة التفاصيل البسيطة عن مشاريعهم , وايضا تخزين معلومات الاتصال المتعلقة بكل مشروع .
واجهةالمستخدم يجب ان تمكن المستخدم من تصفح السجلات واحدا كل مرة . من المفضل ان تظهر على الشاشة المشاريع المفتوحة فقط عندفتح التطبيق , لكن يجب ان يكون للمستخدمين طريقة ما لمشاهدة كل المشاريع متضمنة المشاريع المغلقة .
استعمال مخططات دراسة الحالة –التطبيق- ظاهرة في الشكل 12.1 يوضح هذه المتطلبات الاساسية .
ثمانيةحالات استخدام ظاهرة في الشكل 12.1 . يمكن للمستخدمين من فتح تطبيق مشروع المتابعة بعرض السجلات غيرالمغلقة فقط (U.C. 1.1) لكن لهم الخيار لرؤية كل سجلات المشروع (U.C. 1.2) .
الازارتسمح بالتنقل خلال السجلات (U.C. 1.3). بالاضافة الى ان التطبيق يمكن المستخدمون من تحديث الموجود (U.C. 1.4) واضافةجديد (U.C. 1.5), وحذف موجود (U.C. 1.6) للسجلات .
من شاشةمتابعة المشروع فان المستخدم يمكنه فتح شاشة العناوين –الاتصالات- لرؤية التفاصيل للعناوين لكل عنوان على حده والمصاحب للمشروع (U.C. 1.7) . يمكن للمستخدم من فتح شاشة العناوين وادارةالعناوين الموجودة (U.C. 1.8)
ويضيف /يصاحب –يربط- العنوان المعين مع المشروع الحالي .

أبو يوسف1
08-03-2013, 08:34
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثاني من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
من شاشةالعناوين , يمكنك ان تحدد ان للمستخدم القدرة على عرض وادارة العناوين في طريقة تشابه الطريقة التي يعمل بها شاشة متابع المشاريع بوجودامكانية استعراض للسجلات وتحديثها .بالاضافة الى ان المستخدم يحتاج الى خيار ان يربط عنوان معين مع مشروع حالي مفتوح .

الشكل 2-12يظهر هذه المميزات متمثلة في مخطط استعمال الحالة - Use Casediagram-.
مرة اخرى فان المستخدم يمكنه فتح سجلات العناوين -(U.C. 2.1)- وتحديث (U.C.2.2) واضافة جديد (U.C. 2.3) وحذف (U.C. 2.4) لسجلات العناوين . استعراض العناوين موجود في (U.C. 2.5)لتمكين عرض واصلاح العناوين .
واضافةاخرى فان المستخدم يمكنه ان-يربط- يرافق سجل العنوان مع المشروع المفتوح حاليا في تموذج المشروع (U.C. 2.6). ويمكنك ان تحدد ذلك - وعلى الرغم انه غير مطلوب- ,فانه سيكون مرغوبا ان تضيف خصائص محسنة مثل القدرة على صنع بريدا الكترونيا جديدا لارسال للعنوان المختار من سجلات المشروع .ويريدالمستخدمون ايضا ارفاق ملفات خارجية مثل الوثاثق ذات العلاقة والصفحات المسطحة مع سجل المشروع . ومن الممكن ان تقرر ان تشمل هذه المميزات في التطبيق بسبب انها تضيف قيمة كبيرةللمستخدمين وللادارة التي وافقت على هذا المدخل .
وكما ناقشت في الفصل الاول فعندك طرقا اخرى كثيرة لتوثيق التطبيق شاملة مخططات النشاطات ,ومخططات التدفق-flow charts-
ومخططات الشبكة , محططات الكائنات , وهكذا . تماما ما تعمله غير هام جدا طالما وصلت الى تصميم مترابط على الورق قبل البدء بكتابة التطبيق .
في الاكسس انا عادة اولد الشاشات الاولية باستعمال نماذج الاكسس بسبب ان اعمال الرسم للنماذج يمكن ان يعاد استعمالها عندالبدء الحقيقي بكودنة النماذج . انااستعمل احيانا Visioلتوليد الشاشات الاولية ايضا .على اي حال عندما تحلل المتطلبات التي نوقشت سابقا , فانك ربما تقرر ان شاشتان رئيستان تكفي : شاشة متابعة المشروع و شاشة العناوين .
شاشة متابعة المشروع يمكن ان يقسم فيما بعدالى السنة -tabs- مثل اول لسان للملاحظات / المهام , اللسان الثاني للعناوين ذات العلاقة , اللسان الثالث للمرفقات .هذا التصميم موضح في الشكل 12.3 و 12.4 و12.5 .

الشكل12.3 يظهر المعلومات العامة للمشروع وايضا لسان الملاحظات حيث يمكن للمستخدم ان يدخل المهام اوالملاحظات للمشروع . فيمكن للمستخدم ان يدخل ملاحظات-تعليق- او مهمة في الحقل النصي للمهمة /الملاحظة ومن ثم نقر زراضافة الملاحظة لاضافتها الى المشروع . ولانك تخطط للعمل على سناريو مجموعة السجلات المنفصلة كماهو موضح بالتفصيل في الفصل الخامس في ADO,فانك حقيقة لن تحفظ التغييرات الى قاعدةالبيانات الداخلية حتى ينقر المستخدم زر حفظالتغييرات .زر حذف الملاحظات يزيل الملاحظة من القائمة التي على النموذج ولكنه لا يزيل الملاحظة من قاعدةالبيانات
الا بعداختيار زر حفظ التغييرات فيما بعد .

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

الشكل12.5 يتضمن لسان ارفاق الملفات حيث يمكنللمستخدم ان يرفق ملفات منفصلة مع المشروع الحالي .زرالمعاينة الى اليمين من القائمة سوف يسمح للمستخدم فتح ملف مرفق في شاشة منفصلة في تطبيقة العادي-برنامجهالاصلي- .
زر فتح الملف يسمح للمستخدم من البحث عن نظام الملف للمرفق ويشمل اي اسم ملف تم اختياره في حقل اسم الملف حتى يتم اضافته للمشروع . وبعد ان يملء المستخدم وصف الملف واسم الملف ويختار زر اضافة ملف مرفق , فان الملف سوف يضاف الى القائمة .

الشكل 12.6 هو شاشة اولية للعناوين . لاحظ كيف تم شمل عناصر بيانات مختلفة تتعلق بالعنوان, وايضا ازار استعراض وازرارحفظ تغييرات للسجلات .زر اضافة العنوان الحالي للمشروع يسمح للمستخدم باعادة وضع العنوان الحالي على المشروع
من المشروع المفتوح حاليا .الان وعندك تخطيطا مكتوبا يفصل ما الذي تريد ان يعمله التطبيق فقد حان الوقت لتغمس يديك بتصنيع قاعدة البيانات والكود .

وذلك ماسيكون في اللقاء التالي ان شاء الله –خليك على وضوء -

أبو يوسف1
12-03-2013, 09:07
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا
Building the Database
بناء قاعدة البيانات
في هذاالجزء سوف تبني قاعدة بيانات في ملف اكسسي منفصلا عن واجهة المستخدم . ولقد تعلمت في الفصل العاشر
انه من الممكن ادراك تحسن الاداء بفصل واجهة المستخدم عن طبقة البيانات الداخلية . قاعدةالبيانات التي تحوي
جداول البيانات يمكن وضعها على نفس جهاز الكمبيوتر او جهازا اخر عن الموجود فيه واجهة المستخدم .
ان كان لديك مستخدما وحيدا فان وجود الملفان على نفس الكمبيوتر سيكون جيدا . ان كان يوجداخرون ويجب
ان يشاركوك في التطبيق فان وضع قاعدة البيانات بجداول البيانات على ملف خادم-سيرفر- وواجهة المستخدم على كل محطة عمل فانه الافضل
Building the ProjectTrackerDb Database
بناء قاعدة بيانات متابعة المشاريع Db
دعناالان نبني قاعدة البيانات التي تخزن جداول البيانات .
1- اصنع قاعدة بيانات جديدة باختيار من قائمة ملف جديد ثم قاعدة بيانات فارغة .حدد اسمها ProjectTrackerDb ومن ثمانقر الزر تصنيع .
2- الجداول لهذه القاعدة ظاهرة في الشكل 12.7 وحتى الشكل 12.11 ولاحظ من اجل راحتك ان في كل جدول فان حجم الحقل قد تم وصفه في شرح الحقل . وتحتاج الى اضافة مفاتيح اساسية كما هو مبين في كل جدول بالايقونة .
3- اضف الجدول tblProjects كما في الشكل 12.7 . وهذاالجدول هو جدول المشروع الرئيسي لتخزين معلومات المشروع .
لاحظ ان الحقول في خريطة هذا الجدول للحقول على الشاشة الاولية ليست على الالسنة –tabs-.
4- اضف الجدول tblContacts كما في الشكل12.8 هذا الجدول يوضح الحقول في نموذج العناوين الاولي .
5- اضف الجدول tblProjectsComments كما في الشكل12.9 . هذا الجدول يستعمل لتخزين عدة ملاحطات والتي يمكن ادخالها للمشروع المعطى .هذا الجدول يوضح اللسان الاول في الشاشة الاوليةلمتابعة المشاريع .السبب لاستعمال الجداول المنفصلة في الالسنة هو لامكانية اشتمال عدة ادخالات.لا يمكنك ببساطة وضع الحقل في الجدول الرئيسي والذي يحمل عدة عناوين .
في عالم تصميم قواعد البيانات , انت توضح هذه العلاقات ( واحد لمتعدد , متعدد لمتعدد ,وهكذا ) في جداول منفصلة لاسباب مختلفة .
6- اضف الجدول tblProjectsContacts كما في الشكل12.10 . وهذا الجدول يوضح اللسان الثاني في الشاشة الاولية لمتابعة المشاريع .
7- اضف الجدول tblProjectsFileAttachments كما في الشكل 12.11 .وهذاالجدول يوضح اللسان الثالث في الشاشة الاولية لمتابعة المشاريع .
8- حتى هذه النقطة فان تطبيقك يجب ان يشبه الظاهر في الشكل 12.12 .
How It Works
كيف يعمل
انت صنعت خمس جداول والتي تخزن البيانات لتطبيق متابعة المشاريع .هذه الجداول تم صناعتها في قاعدة بيانات منفصلة عن قاعدة بيانات
واجهةالمستخدم لتزود دعما افضل لعدة مستخدمين .
الجدول tblContacts يخزن البيانات لكل عنوان فردي .
الجدول tblProjects يخزن البيانات لكل سجل للمشروع .
الجداولtblProjectsFileAttachments & tblProjectsComments,tblProjectsContacts, يمكن ان تخزن
عدةسجلات لكل سجل للمشروع فردي .

طالب المزيد
23-03-2013, 04:46
بارك الله فيك يا ابو يوسف

بصراحة جهد جبار لا يقدره سوى الراغبين في العلم و التعلم

ولو بمقدوري لحفرت كلماتك بالذهب في هذا المنتدى

لأجل أن تقرا إلي ما شاء الله

وأسال الله أن يكتب لكم الأجر ،، وأن ينفع الله بعلمكم

تقبل فائق احترامي و تقديري لشخصكم الكريم
وإعجابي الكبير بما سطرته لنا في هذا المنتدى

أخوك
طالب المزيد

طالب المزيد
23-03-2013, 04:50
ملاحظة بسيطة يا أبو يوسف

يقال أن " آفة العلم كتمه "

وأعتقد بأنك لمست هذا الشي فأنت المستفيد الأول في وضع هذه الشروحات :)

أبو يوسف1
23-03-2013, 07:51
اخي العزيز طالب المزيد
السلام عليكم ورحمة الله وبركاته
اشكرك على مشاعرك النبيلة والكلمات الرقيقة تجاهي فبارك الله فيك وجزاك الله خيرا .
لا شك انني استفدت كثيرا من التجوال والحمد لله ولولا توفيق من الله ومن ثم التجوال لما قرات كتاب دينيس كاملا ابدا-للان انا معكم بما فيه لا تزيد معلوماتي على معلوماتكم الا بصفحة او صفحتين فقط -.

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

اسال الله ان يكتب لي ولكل من دعم واحب وقرا واستفاد وتعلم من التجوال الاجر العظيم ان شاء الله

أبو يوسف1
25-03-2013, 08:03
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
احب ان اذكر انني سوف ارفع الكودات الطويلة والجداول كذلك على تنسيق ملفات pdf او صورة لانها اسهل لي واسرع
نتابع معا الجزء الرابع من الفصل الحادي عشر وعلى بركة الله وباسم الله نبدا

Building the User Interface
بناء واجهة المستخدم

الان وقد اتممت صناعة جداولك , فقد حان الوقت للتقدم نحو صنع النماذج الفارغة لواجهةالمستخدمومن ثم يمكنك ان تكتب الكود في نمطيات الفئة والنمطيات العادية , ومن ثم الانهاء بان تضيف الكود لكل نموذج لاستدعاء النمطيات الفئة والعادية .
المثال في هذا الفصل يستعمل الادو للربط بين قاعدة البياناتProjectTrackerDb,ولكن يمكنكاستعمال بديل او اضافي بان تضيف رابطا واضحا للقاعدة المنفصلة حتى يمكنك رؤية الجداول من خلال مشروعك لواجهة المستخدم

Building the frmProjects and frmContacts Forms
بناء نماذج المشاريع ونماذج العناوين

الان دعنا نصنع ملف قاعدة بيانات منفصل والذي يخزن كائنات واجهة المستخدم
1- اختر من قائمة ملف ثم جديد ومن ثم فارغ وحددالاسم ProjectTrackerUI للقاعدة , ثم الزر اصنع

2- اصنع نموذجا وسمه frmProjects. اولا افتح النموذج في عرض التصميم .من صندوق الادوات اسحب وافلت لسان تحكم على النموذج .اختر اللسان واضغط الزرالايمن حتى يمكنك ان تضيف اللسان الثالث ان كان واحدا غير موجود .
اضف السنة/ صفحات كما هو موضح في الشكل 12.13 .

3- بعد ذلك اسحب وافلت حاكمات عديدة الىالنموذج وصفحة 1 من اللسان كما في الشكل12.14
4- الجدول الاول سوف يساعدك للتاكدمن وضع كل الكائنات بالشكل الصحيح على النموذج .اعد تسمية الحاكمات وغير الخصائص الاخرى لكل كائن كما في الجدول 1
5- بعد ذلك اختر الصفحة 2 من اللسان وافلت الحاكمات الاضافية الى اللسان كما في الشكل 12.15
6- الجدول 2 سوف يساعدك للتاكد من وجود كل الكائنات الصحيحة في الصفحة 2 على اللسان على frmProjects.
اعد تسمية الحاكمات وغيرالخصائص الاخرى لكل كائن كما في الجدول 3
7- بعد ذلك اختر الصفحة 3 من اللسان واسحب حاكمات جديدة الى اللسان كما في الشكل 12.16 .
8- الجدول 4 سوف يساعدك على التاكد من وجود كل الكائنات الصحيحة على الصفحة 3 من اللسان على frmProjects
مرة اخرى اعد تسمية الحاكمات وغير الخصائص الاخرى لكل كائن كما في الجدول 4
-9 تحقق من كل حاكمة على frmProjects انها تحمل الاسم الصحيح وضبط الخصائص كما في الجدوال السابقة .
ان كان هناك اي خطا في الكتابةفان الكود- فيما بعد- المتعلق بهم سوف ينتج اخطاء وتحتاج الى اصلاح النموذج يجب ان يكون الانمشابها لما في الاشكال 12.17-12.19 .
10- تاكد من حفظ كل التغييراتعلى frmProjects.
11- اصنع نموذجا جديداواسمه frmContacts اسحب وافلت الحاكمات الى النموذج كما في الشكل 12.20 .
12- الجدول 5 سوف يساعدك للتاكد من وجود كل الكائنات علىالنموذج .اعد تسمية الحاكمات وغير الخصائص الاخرى لكل كائن كما في الجدول 5 .
13- بعد ضبط كل الخصائص فان frmContacts يجب ان يكون كما في الشكل12.21 .
14- احفظ كل التغييرات على frmContacts.
15- شاشة قاعدة البيانات مظهرةقاعدة بيانات ProjectTrackerUI يجب انتكون حتى هذه النقطة موضحة كما في الشكل12.22 .

How It Works
كيف تعمل

النموذج frmProjects سوف يستعمل لاظهارسجلات المشروع .
انت اضفت حاكمات –عناصر تحكم-الى هذا النموذج متضمنة مربعات نص عديدة وحاكمات اخرى والتي سوف تستعمل لعرض البيانات واستقبال المدخلات من المستخدم .البيانات الاولية للنموذج frmProjects سوف تاتي من جدول tblProjects
البيانات الاضافية للالسنة سوف تاتي من جداول tblProjectsComments,tblProjectsContacts,andtblProj ectsFileAttachments
النموذج frmContacts سوف يستعمل لاظهار سجلاتالعناوين لكل العناوين او للعنوان المختار .وايضا اضفت حاكمات متعددة الى هذا
النموذج والتي تستخدم لعرض بيانات العنوان واستقبال الادخالات من المستخدم . البيانات للنموذج frmContactsسوف تاتي من الجدول tblContacts.

أبو يوسف1
25-03-2013, 08:09
تابع الملحقات لانني لم استطع رفعها في المشاركة السابقة

الصورة الثانية تمثل الجدول الثاني

أبوحسين
28-03-2013, 02:16
شكر الله لك ابا يوسف وبارك فيك وجزاك الله خيرا

أبو يوسف1
28-03-2013, 06:41
اخي العزيز ابا حسين
السلام عليكم ورحمة الله وبركاته
حياك الله في مملكتنا العزيزة راجيا ان تجد دائما ما يسرك ان شاء الله
ولك بما دعوت اضعافا عديدة ان شاء الله

أبو يوسف1
28-03-2013, 06:53
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
ملاحظة : وردت كلمة الفصل 11 في العنوان بدلا من 12 في بعض المشاركات التي تخص هذا الفصل 12 فيرجي التصحيح
نتابع معا الجزء الخامس من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا


Building the Class Modules for the Objects
بناء نمطيات الفئة للكائنات

لقد تعلمت من خلال هذا الكتاب ان الكودالفيجولي يمكن ان يكتب في امكنة مختلفة مثل نمطيات الفئة والتي هي مستقلةاو مصاحبة للنموذج وايضا كما في النمطيات لعادية . بعد ذلك وجهت انتباهك الى كتابة الكود والذي سوف يستعمل الخصائص المرغوبةفي تطبيق مشروع المتابعة .وسوف تصنع نمطيات الفئة الخاصة اولا ومن ثم النمطيات القياسية , واخيرا الكود للنماذج لاستدعاءالنمطيات الاخرى .مثالا لكيف يبدو مستعرض المشاريع في المحرر الفيجوالي عندما تنهي ظاهرا في الشكل 12.23 .
الفصل الرابع قدم فكرة تصنيع الفئات الخاصة .في التطبيق الحالي , فانك سوف تصنع 2 نمطية خاصة منطقية .الاولى فئة لكائن Project والتي سوف تمثل المشروع الحالي في الذاكرة على شاشة مشروع المتابعة .والاخرى سوف تكون لكائن Contact والتي تمثل اي عنوان حالي في الذاكرة من شاشة العناوين .

The Project Class
فئة Project

مخطط الكائن موضح في الشكل 12.24 لفئة Project.
* ****فئة Contact سوف يتم توضيحها فيما بعد في هذا الفصل ان شاء الله . *****
الخصائص متمثلة في الجزء العلوي للمخطط , والطرق ظاهرة في الجزء السفلي .
وهذه تمثل عناصر البيانات على النموذج للجزء الاكبر , ما عدا ان الالسنة بالسجلات العديدة غيرمدرجة هنا . الطرق تمثل احداث متعددة والواجب حدوثها للكائن . سوف تكتب ايضااجراءات اخرى عديدة غيرالموجودة في نمطية الفئة , كما سوف ترى فيما بعد ان شاء الله .

Building the clsProjects Class
بناء نمطية clsProjectsclass
دعنا نبدا في بناء نمطية clsProjects والتي تستعمل الكائن الموضح في الشكل 12.24.

1- اضف نمطية فئة جديدة باسم clsProjects .في قسم التصريحات العامة للفئة اضف الكود في النقطة 1 من المرفق .
2- اضف الاجراءات المختلفة الظاهرة في الكود في النقطة 2 من المرفق الى نمطية الفئة clsProjects .
3- اضف الدالة RetrieveProjects الظاهرة في الكود النقطة 3 من المرفق الى نمطية الفئة clsProjects.
4- اضف الدالة RetrieveComments الظاهرة في النقطة 4 في المرفق للنمطية clsProjects.
5- اضف الدالة RetrieveContacts الظاهرة في النقطة 5 من المرفق للنمطية clsProjects.
6- اضف الدالة RetrieveAttachments الظاهرة في النقطة6 من المرفق للنمطية clsProjects.
7- اضف الاجراء PopulatePropertiesFromRecordset الظاهر في النقطة 7 من المرفق لنفس النمطية .
8- اضف الاجراء PopulatePropertiesFromForm الظاهر في النقطة 8 من المرفق لنفس النمطية .
9- اضف الاجراء ClearObject الظاهر في النقطة 9 من المرفق لنفس النمطية .
10- اضف الاجراء Delete الظاهر في النقطة 10 من المرفق لنفس النمطية .
11- اضف الاجراء Save الظاهر في النقطة 11 من المرفق لنفس النمطية .

أبو يوسف1
30-03-2013, 11:01
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السادس من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا

لبناء نمطية clsProjects والتي تحقق الكائن الموضح في الشكل 12.24 , فانك اولا اضفت الكود الى قسم التصريحات العامة للفئة الجديدة .على سبيل المثال انت صرحت متغيرات محلية مختلفة لحفظ القيمةالحالية لكل خاصية .


How It Works
كيف تعمل

لبناءنمطية clsProjects والتي تحقق الكائن الموضح في الشكل 12.24 , فانك اولا اضفت الكود الى قسم التصريحات العامة للفئة الجديدة .على سبيل المثال انت صرحت متغيرات محلية مختلفة لحفظ القيمةالحالية لكل خاصية .



DimintProjectIdVal As Integer
DimstrProjectTitleVal As String
DimstrProjectDescriptionVal As String
DimstrPriorityVal As String
DimstrReferenceNumVal As String
DimcurMoneyBudgetVal As Currency
DimcurMoneyToDateVal As Currency
DimintHoursBudgetVal As Integer
DimintHoursToDateVal As Integer
DimdtDateDueVal As Date
DimstrStatusVal As String




وبعد ذلك انت اضفت اجراءات الخاصيتين Get و Let والتي تسمح لاستعادة وضبط القيم في كل خاصية بعض من اجراءات هذه الخصائص ظاهر مرة اخرى في الكود التالي




PublicProperty Get ProjectId() As Integer
OnError Resume Next
ProjectId= intProjectIdVal
EndProperty
PublicProperty Let ProjectId(ByVal Value As Integer)
OnError Resume Next
intProjectIdVal= Value
EndProperty
PublicProperty Get ProjectTitle() As String
OnError Resume Next
ProjectTitle= strProjectTitleVal
EndProperty
PublicProperty Let ProjectTitle(ByVal Value As String)
OnError Resume Next
strProjectTitleVal= Value

End Property





بعداضافة الخصائص لنمطية الفئة الاولى , فانك قد اضفت اجراءات فرعية عديدة ودوال حتى تعمل كطرقا للنمطية .على سبيل المثال فان الدالة RetrieveProjects تستعمللاسترجاع سجلات المشروع من القاعدة والتي سوف تظهر على النموذج frmProjects .




FunctionRetrieveProjects(blnAllRecords As Boolean) As ADODB.Recordset
OnError GoTo HandleError
DimstrSQLStatement As String
DimrsProj As New ADODB.Recordset
‘buildthe SQL statement to retrieve data
strSQLStatement= BuildSQLSelectProjects(blnAllRecords)
‘generatethe recordset
SetrsProj = ProcessRecordset(strSQLStatement)
‘returnthe populated recordset
SetRetrieveProjects = rsProj
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS, -
"RetrieveProjects"
ExitFunction

End Function


الدوال ايضا تم اضافتها لاسترجاع سجلات الملاحظات, العناوين , والمرفقات والمتعلقة بالمشروع المعني من الجداول
tblProjectsComments,tblProjectsContacts,and tblProjectsFileAttachments
على سبيل المثال فان الدالة RetrieveComments تصرح مجموعة سجلات جديدة لحفظ النتائج من القاعدة .
ان تم تحديد عبارة SQL هي الواجب استخدامها لاسترجاع السجلات للمشروع الواحد وتنادي الدالة ProcessRecord
والذي في الواقع سوف يملء مجموعة السجلات بتنفيذ عبارة SQL على القاعدة .
الدوال RetrieveContacts و RetrieveAttachments تعمل بنفس الطريقة






FunctionRetrieveComments(intId As Integer) As ADODB.Recordset
OnError GoTo HandleError
DimrsComments As New ADODB.Recordset
DimstrSQL As String
strSQL= "SELECT txtComment FROM tblProjectsComments WHERE intProjectId=”& -
intId
‘retrievethe comments for tab 1 from the database
SetrsComments = ProcessRecordset(strSQL)
SetRetrieveComments = rsComments
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS , -
"RetrieveComments"
ExitFunction

End Function

بعد ذلك انت اضفت اجراءين والذين سوف يملأن الخصائص للفئة .
الاجراءالاول PopulatePropertiesFromRecordsetسوف يملء الخصائص للفئة من القيم في مجموعة السجلات rsProj . وبعدملء مجموعة السجلات بسجلات المشروع فان القيم للمشروع الحالي يجب ان تحمل الى كائن clsProject وتظهر اخيرا على النموذج للمستخدم .





SubPopulatePropertiesFromRecordset(rsProj As ADODB.Recordset)
OnError GoTo HandleError
‘Populatethe object with the current record in the
‘recordset
Me.ProjectId= rsProj!intProjectId
Me.ProjectTitle= rsProj!txtProjectTitle
Me.ProjectDescription= rsProj!txtProjectDescription
Me.Priority= rsProj!txtPriority
Me.ReferenceNum= rsProj!txtReferenceNum
Me.MoneyBudget= rsProj!curMoneyBudget
Me.MoneyToDate= rsProj!curMoneyToDate
Me.HoursBudget= rsProj!intHoursBudget
Me.HoursToDate= rsProj!intHoursToDate
Me.DateDue= rsProj!dtDateDue
Me.Status= rsProj!txtStatus
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS , -
"PopulatePropertiesFromRecordset"
ExitSub

End Sub




بنفس الطريقة فان الاجراء PopulatePropertiesFromForm يملء الخصائص للكائن بالقيمة
الحاليةفي الحاكمات على النموذج .لتجنب خلل تحويل البيانات , فان بعض العبارات اولا تفحص للتاكد ان الحقل على النموذج غير خال قبل تعيين القيمة .






SubPopulatePropertiesFromForm()
OnError GoTo HandleError
‘Populatethe object with the current record in the
‘form
IfForms("frmProjects")!txtProjectId <> "" Then
Me.ProjectId= CInt(Forms("frmProjects")!txtProjectId)
EndIf
Me.ProjectTitle= Forms("frmProjects")!txtProjectTitle
Me.ProjectDescription= Forms("frmProjects")!txtProjectDesc
Me.Priority= Forms("frmProjects")!cboPriority
Me.ReferenceNum= Forms("frmProjects")!txtReferenceNum
IfForms("frmProjects")!txtMoneyBudget <> "" Then
Me.MoneyBudget= CCur(Forms("frmProjects")!txtMoneyBudget)
EndIf
IfForms("frmProjects")!txtMoneyToDate <> "" Then
Me.MoneyToDate= CCur(Forms("frmProjects")!txtMoneyToDate)
EndIf
IfForms("frmProjects")!txtHoursBudget <> "" Then
Me.HoursBudget= CInt(Forms("frmProjects")!txtHoursBudget)
EndIf
IfForms("frmProjects")!txtHoursToDate <> "" Then
Me.HoursToDate= CInt(Forms("frmProjects")!txtHoursToDate)
EndIf
IfForms("frmProjects")!txtDateDue <> "" Then
Me.DateDue= CDate(Forms("frmProjects")!txtDateDue)
EndIf
Me.Status= Forms("frmProjects")!cboStatus
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS , -
"PopulatePropertiesFromForm"
ExitSub

End Sub



بالاضافة الى اضافة الاجراءات والتي تملء الكائن , فانك اضفت اجراء يفرغ كل القيم في الكائن .
الاجراءClearObject يغير كل القيم في الكائن الى قيم البدايات حتى يمكن ان يعاد استعمال الكائن لسجل اخر للمشروع .






SubClearObject()
OnError GoTo HandleError
‘clearthe values in the projects object
Me.ProjectId = 0
Me.ProjectTitle = ” ”
Me.ProjectDescription=” ”
Me.Priority= 0
Me.ReferenceNum=” ”
Me.MoneyBudget = 0
Me.MoneyToDate = 0
Me.HoursBudget = 0
Me.HoursToDate = 0
Me.DateDue= "01-01-1900”
Me.Status= 0
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS, "ClearObject”
ExitSub

End Sub



الاجراءين الاخيرين الذين اضفتهما للفئة clsProjects تتضمن الاجراءين Delete and Save
الاجراءDelete مسؤولا عن حذف سجل مشروع فردي من القاعدة بعد تاكيد رغبة المستخدم بالمتابعة –الحذف-.




SubDelete(intCurProjId As Integer, blnAddMode As Boolean, rsProj As _
ADODB.Recordset)
OnError GoTo HandleError
DimstrSQLStatement As String
DimintResponse As Integer
‘makesure delete should be processed
IfNot ProceedWithDelete(blnAddMode) Then
ExitSub
EndIf
‘buildthe SQL statement to delete the project
strSQLStatement= BuildSQLDeleteProjects(intCurProjId)
‘performthe delete
CallProcessUpdate(strSQLStatement, rsProj)
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS, "Delete”
ExitSub
EndSub





الاجراء Save هو مسؤول عن حفظ السجلات الجديدة او تحديث الموجودة في قاعدة البيانات





SubSave(blnAddMode As Boolean, rsProj As ADODB.Recordset)
OnError GoTo HandleError
DimstrSQLStatement As String



ان كان هناك اضافة لسجل جديد فان عبارة SQL مناسبة للادخال سوف تتكون




‘ifadding a new record
IfblnAddMode = True Then
strSQLStatement= BuildSQLInsertProjects(Me)

Else



ان كان هناك تحديثا لسجل موجود فان عبارة SQL مناسبة للتحديث سوف تتكون




‘ifupdating a record
strSQLStatement= BuildSQLUpdateProjects(Me)

End If
الاجراء ProcessUpdate سوف يتم تنفيذه حتى عبارة SQL للادخال او التحديث سوف تنفذ في القاعدة



‘performthe insert or update
CallProcessUpdate(strSQLStatement, rsProj)
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_PROJECTS, "Save”
ExitSub
EndSub

أبو يوسف1
01-04-2013, 09:37
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء السابع من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا

The Contact Class
فئة العناوين

مخطط الكائن لفئة Contacts ظاهرا في الشكل 12.25 . الفئة Contacts لها الخصائص والتي تمثل عناصر البيانات مثل اولئك الظاهرين في نموذج Contacts, وايضا بعض الطرق والتي يمكن تنفيذها عليها.

Building the clsContacts Class
بناء الفئة
clsContacts
دعنانبدا في بناء نمطية الفئة clsContacts والتي سوف تستخدم الكائنات الموضحة في الشكل 12.25 .

1- اصنع نمطية الفئة الجديدة واسمها clsContacts .اضف الكود في النقطة 1 من المرفق الى قسم التصريحات العامة للفئة .
2-اضف اجراءات الخصائص الظاهرة في النقطة 2من المرفق الى النمطية clsProjects.
3- اضف الدالة RetrieveContacts الظاهرة في النقطة 3 من المرفق الى النمطية clsProjects.
4- اضف الاجراء PopulatePropertiesFromRecordset الظاهر في النقطة 4 من المرفق لنفس النمطية.
5- اضف الاجراء PopulatePropertiesFromForm الظاهر في النقطة 5 من المرفق لنفس النمطية .
6- اضف الاجراء ClearObject الظاهر في النقطة 6 من المرفق لنفس النمطية .
7- اضف الاجراء Delete الظاهر في النقطة 7 من المرفق لنفس النمطية .
8- اضف الاجراء Save الظاهر في النقطة 8 من المرفق لنفس النمطية .
9- تاكدمن المحافظة على حفظ التغييرات باستمرار حتى لا تفقدها .

أبو يوسف1
04-04-2013, 06:52
السلام عليكم ورحمة الله وبركاته
نتابعمعاالجزء الثامن من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا

How It Works
كيف تعمل

التصميم للنمطية clsContactsهو مشابه للتصميم للنمطيةclsProjects . انت اولا اضفت متغيرات محلية مختلفة الى قسمالتصريحات العامة للنمطية لتخزين قيم مختلفة للخصائص .




DimintContactIdVal As Integer
DimstrLastNameVal As String
DimstrFirstNameVal As String
DimstrMiddleNameVal As String
DimstrCompanyVal As String
DimstrAddress1Val As String
DimstrAddress2Val As String
DimstrCityVal As String
DimstrRegionVal As String
DimstrPostalCodeVal As String
DimstrWorkPhoneVal As String
DimstrHomePhoneVal As String
DimstrCellPhoneVal As String

Dim strEmailVal As String
بعدها انت اضفت اجراءاتالخصائص Get و Let واللتان تستخدمان لاسترجاع واسناد القيم الى الخصائص للنمطية



PublicProperty Get ContactId() As Integer
OnError Resume Next
ContactId= intContactIdVal
EndProperty
PublicProperty Let ContactId(ByVal Value As Integer)
OnError Resume Next
intContactIdVal= Value
EndProperty
PublicProperty Get LastName() As String
OnError Resume Next
LastName= strLastNameVal
EndProperty
PublicProperty Let LastName(ByVal Value As String)
OnError Resume Next
strLastNameVal= Value

End Property


بعد ذلك اجراءات فرعية ودوال مختلفة تم اضافتها للعمل كطرقا للكائن .على سبيل المثال الدالة RetrieveContacts
تسترجع سجلات العناوين من القاعدة




FunctionRetrieveContacts() As ADODB.Recordset
OnError GoTo HandleError
DimstrSQLStatement As String
DimrsCont As New ADODB.Recordset
‘buildthe SQL statement to retrieve data
strSQLStatement= BuildSQLSelectContacts
‘generatethe recordset
SetrsCont = ProcessRecordset(strSQLStatement)
‘returnthe populated recordset
SetRetrieveContacts = rsCont
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS , -
"RetrieveContacts"
ExitFunction

End Function


الاجراءPopulatePropertiesFromRecordset يملء الخصائص للكائن من القيم في مجموعة rsCont




SubPopulatePropertiesFromRecordset(rsCont As ADODB.Recordset)
OnError GoTo HandleError
‘Populatethe object with the current record in the
‘recordset
Me.ContactId= rsCont!intContactId
Me.LastName= rsCont!txtLastName
Me.FirstName= rsCont!txtFirstName
Me.MiddleName= rsCont!txtMiddleName
Me.Company= rsCont!txtCompany
Me.Address1= rsCont!txtAddress1
Me.Address2= rsCont!txtAddress2
Me.City= rsCont!txtCity
Me.Region= rsCont!txtRegion
Me.PostalCode= rsCont!txtPostalCode
Me.WorkPhone= rsCont!txtWorkPhone
Me.HomePhone= rsCont!txtHomePhone
Me.CellPhone= rsCont!txtCellPhone
Me.Email= rsCont!txtEmail
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS , -
"PopulatePropertiesFromRecordset"
ExitSub

End Sub



نفس الامر مع الاجراء PopulatePropertiesFromForm يملء الكائن contact بالقيمالظاهرة فيالحاكمات على النموذج في الوقت الحالي –الجاري-.




SubPopulatePropertiesFromForm()
OnError GoTo HandleError
‘Populatethe object with the current record in the
‘form
Me.LastName= Forms("frmContacts")!txtLName
Me.FirstName= Forms("frmContacts")!txtFName
Me.MiddleName= Forms("frmContacts")!txtMName
Me.Company= Forms("frmContacts")!txtCompany
Me.Address1= Forms("frmContacts")!txtAddress1
Me.Address2= Forms("frmContacts")!txtAddress2
Me.City= Forms("frmContacts")!txtCity
Me.Region= Forms("frmContacts")!txtRegion
Me.PostalCode= Forms("frmContacts")!txtPostalCode
Me.WorkPhone= Forms("frmContacts")!txtWorkPhone
Me.HomePhone= Forms("frmContacts")!txtHomePhone
Me.CellPhone= Forms("frmContacts")!txtCellPhone
Me.Email= Forms("frmContacts")!txtEmail
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS , -
"PopulatePropertiesFromForm"
ExitSub
EndSub




الاجراءClearObject تم اضافته لتصفير القيم في الكائن الى القيم الابتدائية حتى يتمكن من تخزين السجل الجديد في الكائن




SubClearObject()
OnError GoTo HandleError
‘clearthe values in the contacts object
Me.ContactId= 0
Me.LastName=””
Me.FirstName=””
Me.MiddleName=””
Me.Company=””
Me.Address1=””
Me.Address2=””
Me.City=””
Me.Region=””
Me.PostalCode=””
Me.WorkPhone=””
Me.HomePhone=””
Me.CellPhone=””
Me.Email=””
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS , -
"ClearObject"
ExitSub

End Sub




اخيرافان الاجراءين Delete و Save تم اضافتهما حتى يتمكن المستخدم من حذف وحفظ سجلات العناوين من قاعدة البيانات . الاجراء Delete اولا يؤكد ان المستخدم يرغب في المضي بالحذف وبعد اخذ التاكيد فانه يتابع الحذف .




SubDelete(intCurContId As Integer, blnAddMode As Boolean, rsCont As -
ADODB.Recordset)
OnError GoTo HandleError
DimstrSQLStatement As String
DimintResponse As Integer
'make sure deleteshould be processed
IfNot ProceedWithDelete(blnAddMode) Then
ExitSub
EndIf
‘buildthe SQL statement to delete the contact
strSQLStatement= BuildSQLDeleteContacts(intCurContId)
‘performthe delete
CallProcessUpdate(strSQLStatement, rsCont)
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS, "Delete”
ExitSub

End Sub



الاجراءSave يفحص اولا ليرى ان كان هناك سجلا قد تم اضافته فان كان الامر كذلك فانه يولد عبارة الSQL المناسبة للاضافة.فان كان الامر تحديثا لسجل موجود فان عبارة SQL مناسبة للتحديث سوف تتولد .




SubSave(blnAddMode As Boolean, rsCont As ADODB.Recordset)
OnError GoTo HandleError
DimstrSQLStatement As String
‘ifadding a new record
IfblnAddMode = True Then
strSQLStatement= BuildSQLInsertContacts(MeElse)
‘ifupdating a record
strSQLStatement= BuildSQLUpdateContacts(Me)

End If




الاجراء ProcessUpdate بعد ذلك يتم استدعائه مما يمكن عبارة SQL للادخال او التحديث من التنفيذ في القاعدة



performthe insert or update
CallProcessUpdate(strSQLStatement, rsContExit Sub)
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CLS_CONTACTS, "SaveExit Sub”

End Sub

أبو يوسف1
07-04-2013, 07:06
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء التاسع من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا
Building the Standard Modules
بناء النمطيات العادية-القياسية –
في الاقسام السابقة , انت صنعت الخصائص والطرق للكائنات Project و Contact .
في هذاالقسم , انت بدات في كتابة الكود في النمطيات القياسية والتي تدير كثيرا من معالم طبقة المنطق والوصول للبيانات للتطبيق . دعنا نبدا ببناءالنمطيات القياسية .
Building themodBusinessLogic and modDatabaseLogic Modules
بناء النمطيتين modBusinessLogic وmodDatabaseLogic
النمطيةmodBusinessLogic هي احدى النمطيتين واللتين سوف تصنعهما .والثانية modDatabaseLogic
والتي سوف تحوي الاستدعاءات المخصصة لقاعدة البيانات ,النمطية modBusinessLogic لن تحوي اي استدعاءات للوصول للقاعدة بسبب انك تريد – هذه ارادتك دينيس- ان تبقي كود الوصول للبيانات في نمطية منفصلةمن اجل سهولة الصيانة والنمو-الاضافة- في المستقبل . سوف تتجه الى مهمة صنع هذه النمطيات وعلى بركة الله .

1- اضف نمطية قياسية جديدة وسمها modBusinessLogic.اضف الكود في النقطة 1 من المرفق الى قسم التصريحاتالعامة للنمطية .
2- اضف الاجراءOpenFileAttachment في النقطة 2 من المرفق في النمطية .
3- اضف الدالة GetFileNameBrowse في النقطة 3من المرفق للنمطية .
4- اضف اجراءات الاستعراض لمجموعةالسجلات الاربع في النقطة 4 من المرفق للنمطية .
5- اضف الدالة ProceedWithDeleteفي النقطة 5 من المرفق للنمطية .
6- اضف الاجراء GeneralErrorHandler في النقطة 6الى النمطية . هذه النمطية سوف تدير كل الاخطاء في التطبيق وسوف يكون لها مرجعا في كل اجراءاو دالة .
7- احفظ التغييرات في النمطية .
8- اضف نمطية قياسية جديدة باسم modDatabaseLogic .اضف الكودفي النقطة 8 من المرفق في
قسم التصريحات العامة للنمطية .
9- اضف الاجراء ExecuteSQLCommand في النقطة 9 من المرفق للنمطية modDatabaseLogic.
10- اضف الاجراء التالي للنمطية .سوف تحتاج الى تعديل نص strConnection , الظاهر في الكود التالي للاشارة الى المسار على جهازك الكمبيوتر الموجود فيه ProjectTrackerDb والتي صنعتها في بداية الفصل .
11- اضف الاجراء RequeryRecordset في النقطة 11 من المرفق الى النمطية .
12- اضف الاجراءات في النقطة 12 من المرفق الى النمطية .هذه الاجراءات تبني عبارات SQL والتي تستخدم لعمل التحديثات في الجدول tblContacts.
13- اضف الاجراء في النقطة 13 من المرفق للنمطية .هذه الاجراءات تبني عبارة SQL والتي تستخدم لعمل التحديثات في الجدول tblProjects .
14- اضف الاجراء ProcessRecordset في النقطة 14 من المرفق الى النمطية .
15- اضف الاجراء ProcessUpdate في النقطة 15 من المرفق للنمطية .
16- اضف الاجراءات في النقطة 16 من المرفق الى النمطية , والتي تدير حذف سجلات من جداول ضمن شروط معينة والتي تحوي على الملاحظات , العناوين وملفات مرفقة لكل مشروع .
17- اضف الاجراءات في النقطة 17 الى النمطية والتي تدير اضافة سجلات الى الجداول ضمن شروط معينة والتي تخزن ملاحظات عناوين, ملفات مرفقة لكل مشروع .
18-احفظ كل التغييرات في النمطية .

أبو يوسف1
12-04-2013, 08:33
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء العاشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا
How It Works
كيف تعمل
انت صنعت نمطية modBusinessLogic لمعالجة طبقة المنطق للتطبيق , والنمطية modDatabaseLogic
للاتصالات مع قاعدة البيانات .لقد اضفت في قسم التصريحات العامة لنمطية modBusinessLogic بعض التصريحات لدوال خارجية .
الدالةالخارجية GetOpenFileName تستعمل لاظهار صندوق حوار فتح الملف والذي يسمح لك باستعراض ملفات النظام لاختيار الملف المطلوب . هذه الدالة تستدعى فيما بعد في الكود لفتح صندوق الحوار لاختيار المرفقات لمصاحبة سجل مشروع مفرد



PrivateDeclare Function GetOpenFileName Lib "comdlg32.dll" Alias -
“GetOpenFileNameA"(pOpenfilename As OPENFILENAME) As Long
PrivateType OPENFILENAME
lStructSizeAs Long
hwndOwnerAs Long
hInstanceAs Long
lpstrFilterAs String
lpstrCustomFilterAs String
nMaxCustFilterAs Long
nFilterIndexAs Long
lpstrFileAs String
nMaxFileAs Long
lpstrFileTitleAs String
nMaxFileTitleAs Long
lpstrInitialDirAs String
lpstrTitleAs String
flagsAs Long
nFileOffsetAs Integer
nFileExtensionAs Integer
lpstrDefExtAs String
lCustDataAs Long
lpfnHookAs Long
lpTemplateNameAs String

End Type



الدالةالخارجية ShellExecute تستعمل لاحضار برنامج خارجي




PublicDeclare Function ShellExecute -
Lib"shell32.dll” -
Alias"ShellExecuteA “ ( -
ByValhwnd As Long, -
ByVallpOperation As String, -
ByVallpFile As String, -
ByVallpParameters As String, -
ByVallpDirectory As String, -
ByValnShowCmd As Long) -
AsLong




الاجراءOpenFileAttachment يستدعي الدالة الخارجية ShellExecute من اجل معاينة ملحقامفردا في تطبيقه الاصلي .




SubOpenFileAttachment(strFile As String)
OnError GoTo HandleError
DimstrAction As String
DimlngErr As Long
‘open the file attachment
strAction= "OPEN”
lngErr= ShellExecute(0, strAction, strFile, "", "", 1)
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, BUS_LOGIC, -
"OpenFileAttachment"
ExitSub

End Sub


وكماذكرت سابقا فان الدالة الخارجية GetOpenFileName تستعمل لفتح صندوق حوار مستعرض الملفات .
هذه الدالة تستدعي من الدالة GetFileNameBrowse للسماح للمستخدم من لاستعراض ملف مرفق مصاحب للمشروع




FunctionGetFileNameBrowse() As String
OnError GoTo HandleError
DimOpenFile As OPENFILENAME
DimlReturn As Long
DimsFilter As String
OpenFile.lStructSize= Len(OpenFile)
OpenFile.hwndOwner= Forms("frmProjects").hwnd
‘OpenFile.hInstance = hInstance
sFilter= "All Files (*.*)" & Chr(0) & "*.*" & Chr(0)
OpenFile.lpstrFilter= sFilter
OpenFile.nFilterIndex= 1
OpenFile.lpstrFile= String(257, 0)
OpenFile.nMaxFile= Len(OpenFile.lpstrFile) - 1
OpenFile.lpstrFileTitle= OpenFile.lpstrFile
OpenFile.nMaxFileTitle= OpenFile.nMaxFile
OpenFile.lpstrInitialDir= "C:\”
OpenFile.lpstrTitle= "Browse for an attachment”
OpenFile.flags= 0
lReturn= GetOpenFileName(OpenFile)
IflReturn = 0 Then
GetFileNameBrowse= “”
Else
‘return the selected filename
GetFileNameBrowse= Trim(OpenFile.lpstrFile)
EndIf
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, BUS_LOGIC,
"GetFileNameBrowse"
ExitFunction

End Function




الكودلهذه الدوال الخارجية معقد قليلا . ليس مشكلة ان لم تفهم تماما كيف يعمل . انا فقط احببت ان اضيف هذه الفاعلية لاظهر لك امكانية قوة التطبيق الاكسسي .
بعد ذلك انت اضفت اربعة اجراءات لاستعراض مجموعة السجلات الى النمطية .مثالا الاجراء MoveToFirstRecord مسؤلا عن الى
الانتقال الى السجل الاول في مجموعة السجلات المحلية المنفصلة .




SubMoveToFirstRecord(intRecCounter As Integer, rsRecordset As ADODB.Recordset, -
objObjectAs Object, blnAddMode As Boolean)
OnError GoTo HandleError
‘moveto the first record in the local disconnected recordset
IfNot rsRecordset.BOF And Not rsRecordset.EOF Then
rsRecordset.MoveFirst

intRecCounter = 1



حالما تغير مكان السجل فان السجل يمتلء بالسجل الحالي الجديد





‘add code to populate object withnew current record
objObject.PopulatePropertiesFromRecordsetrsRecords et
blnAddMode= False
EndIf
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, BUS_LOGIC, -
"MoveToFirstRecord"
ExitSub

End Sub



الدالة ProceedWithDelete تسال المستخدم لتاكيد انها ترغب في متابعة عملية الحذف , مثل حذف سجل مشروع
من frmProjects او حذف سجل عناوين من frmContacts.




FunctionProceedWithDelete(blnAddMode As Boolean) As Boolean
OnError GoTo HandleError
DimblnProceed As Boolean
DimintResponse As Integer

blnProceed = True

ان كان المستخدمفي طور الاضافة , فان المستخدملا يستطيع ان يصدر امر الحذف بسبب ان السجل لم تتم اضافته بعد



‘don't let the user issue adelete command if in add mode
IfblnAddMode = True Then
blnProceed= False
ProceedWithDelete= blnProceed
ExitFunction

End If


بعد ذلك فانها تسال المستخدم ان كانت يرغب في متابعة عملية الحذف




‘confirmthat user really wants to delete record

intResponse =MsgBox("Are you sure you want to delete this record?", vbYesNo)


القيمة العائدة من صندوق الرسالة يتم تدقيقها لتحدد فيما اذا المستخدم اختار الخيار لمتابعةالحذف .



‘ifthe user cancels delete, then exit this procedure
IfintResponse = vbNo Then
blnProceed= False
ProceedWithDelete= blnProceed
ExitFunction
EndIf
ProceedWithDelete= blnProceed
ExitFunction
HandleError:
ProceedWithDelete= False
GeneralErrorHandlerErr.Number, Err.Description, BUS_LOGIC,
"ProceedWithDelete"
ExitFunction

End Function


الاجراءالاخير المضاف الى النمطية modBusinessLogic هو الاجراء GeneralErrorHandler وهذا يدير كل الاعطال
للتطبيق وله مرجع في كل اجراء او دالة كما ربما لاحظت للان .




PublicSub GeneralErrorHandler(lngErrNumber As Long, strErrDesc As String, -
strModuleSourceAs String, strProcedureSource As String)
OnError Resume Next
DimstrMessage As String
‘build the error message stringfrom the parameters passed in
strMessage= "An error has occurred in the application.”
strMessage= strMessage & vbCrLf & "Error Number: " & lngErrNumber
strMessage= strMessage & vbCrLf & "Error Description: " &strErrDesc
strMessage= strMessage & vbCrLf & "Module Source: " &strModuleSource
strMessage= strMessage & vbCrLf & "Procedure Source: " &strProcedureSource
‘display the message to the user
MsgBoxstrMessage, vbCritical
ExitSub

End Sub

أبو يوسف1
13-04-2013, 09:12
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الحادي عشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا

بعد ذلك انت صنعت النمطية القياسية modDatabaseLogic . وقد اضفت اجراءات متعددة الى النمطية للتفاعل مع قاعدة البيانات .مثالا الاجراء ExecuteSQLCommand هو مسؤول عن تنفيذ عبارة SQL على القاعدة والتي لا ترجع اي صفوف . امثلة على هذه من العبارات يتضمن عبارات اضافة , تحديث , وحذف .


SubExecuteSQLCommand(strSQL As String)
OnError GoTo HandleError
‘thepurpose of this procedure is to execute
‘aSQL statement that does not return any
‘rows against the database.
DimcmdCommand As ADODB.Command
SetcmdCommand = New ADODB.Command
‘set the comand to the currentconnection
SetcmdCommand.ActiveConnection = cnConn
‘set the SQL statement to thecommand text
cmdCommand.CommandText= strSQL
‘execute the command against thedatabase
cmdCommand.Execute
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC, -

"ExecuteSQLCommand"
ExitSub
EndSub





بعد ذلك اضفت الاجراءين OpenDbConnection و CloseDbConnectionلفتح واغلاق الاتصال بالقاعدة .ربما تود في اجراء OpenDbConnection ان تعدل في strConnection النصي للاشارة الى المسارفي مكان ProjectTrackerDb, والتي صنعتهافي بداية الفصل .




SubOpenDbConnection()
OnError GoTo HandleError
strConnection= "Provider=Microsoft.Jet.OLEDB.4.0; “ & -
“Data Source=" &CurrentProject.Path &
”\ProjectTrackerDb.mdb;”
‘create a new connection instanceand open it using the connection string
SetcnConn = New ADODB.Connection
cnConn.OpenstrConnection
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC,

"OpenDbConnection”
ExitSub
EndSub





الاجراء RequeryRecordset بعد ذلك تم اضافته الى النمطية modDatabaseLogic لملء القيم في مجموعة السجلات بالقيم الحالية في القاعدة الداخلية .




SubRequeryRecordset(rsRecordset As ADODB.Recordset)
OnError GoTo HandleError
‘repopulatethe recordset to make sure it contains
‘themost current values from the database. also
‘disconnect the recordset
SetrsRecordset.ActiveConnection = cnConn
rsRecordset.Requery
SetrsRecordset.ActiveConnection = Nothing
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC,

"RequeryRecordset”
ExitSub
EndSub




بعد ذلك انت اضفت اجراءات مختلفة لصنع عبارات SQL للاضافة , التحديث , للحذف, واختيار سجلات من الجدول tblContacts. مثالا الاجراء BuildSQLInsertContacts يصنع عبارة SQL من القيم في الكائن objCurrContact




FunctionBuildSQLInsertContacts(objCurrContact As clsContacts) As String
OnError GoTo HandleError
DimstrSQLInsert As String
‘create SQL to insert a newrecord into the database
‘containing the values in theContacts object
strSQLInsert= "INSERT INTO tblContacts(“ & -
& -"”txtLastName, txtFirstName, txtMiddleName,
& -"”txtCompany, txtAddress1, txtAddress2,
& -"”txtCity, txtRegion, txtPostalCode,
& -"”txtWorkPhone, txtHomePhone, txtCellPhone,
& -"”txtEmail) VALUE (
’ , “ & -" & objCurrContact.LastName & “ ‘”
’ , “ & -"& objCurrContact.FirstName& “ ‘”
’ , “ & -"& objCurrContact.MiddleName& “ ‘”
’ , “ & -"& objCurrContact.Company& “ ‘”
’ , “ & -"& objCurrContact.Address1& “ ‘”
’ , “ & -"& objCurrContact.Address2& “ ‘”
’ , “ & -"& objCurrContact.City & “ ‘”
’ , “ & -"& objCurrContact.Region& “ ‘”
’ , “ & -"& objCurrContact.PostalCode& “ ‘”
’ , “ & -"& objCurrContact.WorkPhone& “ ‘”
’ , “ & -"& objCurrContact.HomePhone& “ ‘”
’ , “ & -"& objCurrContact.CellPhone& “ ‘”
’ )”"& objCurrContact.Email & “ ‘”
BuildSQLInsertContacts= strSQLInsert
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC, -

"BuildSQLInsertContacts"
ExitFunction
EndFunction




نفس الامر انت اضفت اجراءات مختلفة لصنع عبارات SQL . انت صنعت اجراءات لاضافة, تحديث , وحذف سجلات المشروع , ولاختيار سجلات المشروع غير المغلقة , ولاختيار كل سجلات المشروع . مثالا الاجراء BuildSQLInsertProjects يصنع عبارة SQL من القيم في الكائنobjCurrProject





FunctionBuildSQLInsertProjects(objCurrProject As clsProjects) As String
OnError GoTo HandleError
DimstrSQLInsert As String
‘create SQL to insert a newrecord into the database
‘containing the values in theProjects object
strSQLInsert= "INSERT INTO tblProjects( “ & -
”txtProjectTitle, txtProjectDescription,txtPriority, “ & -
”txtReferenceNum, curMoneyBudget,curMoneyToDate, “ & -
”intHoursBudget, intHoursToDate, dtDateDue, ”& -
”txtStatus) VALUES ( “ & -
“ ‘ , “ & -&objCurrProject.ProjectTitle& “ ‘”
“ ‘ , “ & -&objCurrProject.ProjectDescription& “ ‘”
“ ‘ , “ & -&objCurrProject.Priority& “ ‘”
“ ‘ , “ & -&objCurrProject.ReferenceNum& “ ‘”
objCurrProject.MoneyBudget“ ‘ , “ & - & “ ‘”
objCurrProject.MoneyToDate“ ‘ , “ & - & “ ‘”
“ ‘ , “ & -&objCurrProject.HoursBudget& “ ‘”
“ ‘ , “ & -&objCurrProject.HoursToDate& “ ‘”
“ ‘ , “ & -&objCurrProject.DateDue& “ ‘”
“ ‘ , ) “&objCurrProject.Status& “ ‘”
BuildSQLInsertProjects= strSQLInsert
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC, -

"BuildSQLInsertProjects"
ExitFunction
EndFunction





الاجراءProcessRecordset يقبل عبارة SQL كمعلمة وينفذها على القاعدة . الاتصال مع القاعدة كان مفتوحا , فان عبارة SQL تم تنفيذها , وبعدها يغلق الاتصال مع القاعدة .مجموعة السجلات تكون قد ملئت من النتائج لعبارة SQL التي رجعت الى الدالةالداعية .




FunctionProcessRecordset(strSQLStatement As String) As ADODB.Recordset
OnError GoTo HandleError
‘openthe connection to the database
CallOpenDbConnection
‘create a new instance of arecordset
DimrsCont As New ADODB.Recordset
‘set various properties of therecordset
WithrsCont
‘specify a cursortype and locktype that will allow updates
.CursorType = adOpenKeyset
.CursorLocation= adUseClient
.LockType = adLockBatchOptimistic
‘populate the recordset based onSQL statement
.Open strSQLStatement, cnConn
‘disconnect the recordset
.ActiveConnection= Nothing
EndWith
‘close the connection to thedatabase
CallCloseDbConnection
‘return the recordset
SetProcessRecordset = rsCont
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC,

"ProcessRecordset”
ExitFunction
EndFunction




بعد ذلك فان الاجراء ProcessUpdate تم اضافته الى النمطية لمعالجة مختلف التحديثات على القاعدة . هذا الاجراء مشابه ProcessRecordset لكنه لا يرجع اي قيم بعد تنفيذ عبارة SQL .




SubProcessUpdate(strSQLStatement As String, Optional rsRecordset As
ADODB.Recordset)
OnError GoTo HandleError
‘This procedure is used to handleupdates to the database
‘open the connection to thedatabase
CallOpenDbConnection
‘execute the command against thedatabase
CallExecuteSQLCommand(strSQLStatement)
IfNot rsRecordset Is Nothing Then
‘repopulate the recordset withmost current data
CallRequeryRecordset(rsRecordset)
EndIf
‘closethe connection to the database
CallCloseDbConnection
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC,

"ProcessUpdate”
ExitSub
EndSub


بعد ذلك دوال مختلفة تم اضافتها لادارة حذف السجلات من الجداول والتي تخزن الملاحظات , العناوين , والملفات المرفقة لكل مشروع . مثالا الدالة BuildSQLDeleteProjectsComments مسؤلة عن صنع عبارة SQL والتي تستعمل لحذف الملاحظات للمشروع المعطى .





FunctionBuildSQLDeleteProjectsComments(intProjectI d As Integer) As String
‘build SQL statement for deletion
OnError GoTo HandleError
DimstrSQLStatement As String
strSQLStatement= "DELETE FROM tblProjectsComments WHERE intProjectId = “ & -
intProjectId
BuildSQLDeleteProjectsComments= strSQLStatement
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC, -

"BuildSQLDeleteProjectsComments"
ExitFunction
EndFunction




اجراءات مختلفة ايضا تم اضافتها لادارة اضافة سجلات الى الجداول والتي تخزن الملاحظات ,العناوين , والملفات المرفقة لكل مشروع . مثالا الدالة BuildSQLInsertProjectComments مسؤلة عن صنع عبارة SQL والتي تضيف ملاحظة جديدة الى الجدول tblProjectsComments في القاعدة .




FunctionBuildSQLInsertProjectsComments(intProjectI d As Integer, strComment -
AsString) As String
‘build SQLstatement for insertion
OnError GoTo HandleError
DimstrSQLStatement As String
strSQLStatement= "INSERT INTO tblProjectsComments(intProjectId, txtComment) “ & -
”VALUES(" & intProjectId &", '" & strComment & “’)”
BuildSQLInsertProjectsComments= strSQLStatement
ExitFunction
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, DB_LOGIC, -

"BuildSQLInsertProjectsComments"
ExitFunction
EndFunction


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

أبو يوسف1
15-04-2013, 07:51
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معاالجزء الثاني عشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا

Connecting the User Interface to the Code
ربط واجهة المستخدم بالكود

حتى الان , فان تطبيقك من المحتمل ان لا يتم ترجمته بسبب انه لم تكتب بعد بعض الخصائص المستعملة في الكود .
على اي حال انت تقريبا اقتربت من النهايةللتطبيق .انت الان جاهز لربط كل شيء معا باضافة الكود الفيجولي الى نماذج متابع المشروع والعناوين .
غالبية هذا الكود ستكون اجراءات والتي تقدح على سبيل المثال عند نقر بعض الازرار . بعض الكود سيكون اجراءات محلية في النموذج الذي يتعامل مع بعض الخصائص في واجهة المستخدم والتي لا يعقل ان توضع في نمطية قياسية او نمطية فئة
The Projects Form
نموذج المشاريع
مثال على نموذج متابعة المشاريع , سمي frmProjects وظاهر في الشكل 12.26. فيه عينة لبعض البيانات .سوف تزور هذا النموذج مرة اخرى وبتفصيل اكثر عند نهاية هذا الفصل حيثما سوف تستعرض خصائصة الكول –cool-.
للان عليك ان ان تحفظ هذا النموذج في ذهنك حتى تفهم الهدف من الكود والذي على وشك ان تكتبه (والمكتوب)

Writing Code for the frmProjects Form
كتابة الكود لنموذج frmProjects

كما تم ذكره سابقا , انت جاهز لكتابة الكود الفيجولي والذي سينهي التطبيق .
سوف تبدا بالنموذج frmProjects وستنهي بالنموذج frmContacts.

1- افتح النموذج frmProjects واختر حدث التحميل Form_Load حتى يحضر المحرر الفيجولي .اضف الكود في النقطة 1 من المرفق
2- اضف الكود في النقطة 2 من المرفق الى قسم التصريحات العامة للنموذج .
3- اضف اجراء حدث النقر Click في النقطة 3من المرفق للنموذج لعمل التحديثات للبيانات .
4- اضف اجراء حدث النقر Click في النقطة 4 من المرفق للنموذج لعمل الاستعراض للبيانات .
5- اضف اجراء حدث النقر Click في النقطة 5 من المرفق للنموذج لادارة العناوين المرفقة للمشروع.
6- اضف اجراء حدث النقر في النقطة 6 من المرفق للنموذج لادارة الملاحظات المرفقة للمشروع .
7- اضف اجراء حدث النقر في النقطة 7 من المرفق للنموذج لادارة الملفات المرفقة للمشروع .
8- اضف الاجراء AddEmptyProject في النقطة 8 من المرفق .
9- اضف الاجراء PopulateProjectsControls في النقطة 9 من المرفق .
10- اضف الاجراء ClearProjectControls في النقطة 10 من المرفق .
11- اضف الاجراء PopulateComboBoxes في النقطة 11 من المرفق .
12- اضف الاجراء PopulateListFromRecordset في النقطة 12 من المرفق .
13- اضف الاجراء Form_Unload في النقطة 13 من المرفق للنموذج frmProjects.
14- اضف الاجراء LoadRecords.
15- اضف الاجراءات في النقطة 15 من المرفق للتعاملمع زر التنقل والذي يسمح للمستخدم من التنقل من النماذج غير المغلقة لكل المشاريع.
16- اضف الاجراءات في النقطة 16 من المرفق والتي تتعامل مع حفظ السجلات الظاهرة في الالسنة على النموذج للقاعدة .
17- اضف الاجراء RefreshContacts في النقطة17 من المرفق الى النموذج frmProjects.هذا الاجراء يتم استدعاؤه كلما نقر المستخدم
لاضافة عنوان للمشروع الحالي .

أبو يوسف1
21-04-2013, 08:57
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معا الجزء الثالث عشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا
How It Works
كيف يعمل
اولا انت اضفت الكود الى النموذج frmProjects لربطه مع بقية الكود الذي تم صنعه سابقا في هذاالفصل . وكما تعلمت من خلال هذا الكتاب , فانك تربط واجهة المستخدم الى بقية الكود من خلال احداث اجراءات مختلفة على النموذج .
في حدث التحميل للنموذج -Form_Load- للنموذج frmProjects فانك اضفت بعض الاعدادات للبدايات مثل اغلاق حقل ProjectId
لمنع التعديل ولتحميل سجل المشروع على النموذج .




PrivateSub Form_Load()
OnError GoTo HandleError
SetobjProjects = New clsProjects
SetrsProjects = New ADODB.Recordset
(.’load non-closed projects as default (open, onhold, etc
blnAllRecords= False
‘make sure unclosed is enabled bydefault so only unclosed records load first
togShowUnclosed.Value= True
togShowAll.Value= False
(‘lock project id field so no edits allowed (primarykey assigned by database
txtProjectId.Locked= True
‘load the records in therecordset and display the first one on the form
CallLoadRecords
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, "Form_Load”
ExitSub
EndSub

\


بعد ذلك انت اضفت تصريحات مختلفة الى قسم التصريحات العامة للنموذج , من اجل ان تصرح مجموعات سجلات مختلفة والتي تخزن سجلات المشروع وتوابعه .وبعد ذلك انت اضفت احداث نقر للازار cmdAddNew,cmdSave,andcmdDelete
والتي سوف يتم قدحها عندما يختار المستخدم الزر المطلوب على النموذج .مثال اجراء حدث cmdAddNew_Click
يستدعي الاجراء الذي يضيف سجل مشروع فارغ للسماح للمستخدم لبدء اضافة بيانات لسجل للمشروع جديد .




PrivateSub cmdAddNew_Click()
OnError GoTo HandleError
‘lear the current controls toenable adding a new
‘Project record
CallAddEmptyProjectRecord
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdAddNew_Click"
ExitSub
EndSub




حدثالنقر cmdSave_Click يحفظ الجديد او يعدل السجل على القاعدة . عندما تضغط على الزر cmdSave فان هوية ID
للسجل الحالي تكون قد خزنت ان كان الطور هو طورالتحديث .




PrivateSub cmdSave_Click()
OnError GoTo HandleError
DimintCurProject As Integer
‘save the id of the currentrecord if in update mode
IfNot blnAddMode Then
intCurProject= objProjects.ProjectId
Else
intCurProject= 0
EndIf




حدثالنقر cmdSave_Click يحفظ الجديداو يعدل السجل على القاعدة . عندما تضغط على الزر cmdSave فان هوية ID
للسجل الحالي تكون قد خزنت ان كان الطور هو طورالتحديث .




PrivateSub cmdSave_Click()
OnError GoTo HandleError
DimintCurProject As Integer
‘save the id of the currentrecord if in update mode
IfNot blnAddMode Then
intCurProject= objProjects.ProjectId
Else
intCurProject= 0
EndIf




الكائن objProjects ( الذي تم صنعه معتمدا على clsProject والذي تم صنعه سابقا ) بعد ذلك يتم ملؤه بالقيم التي على النموذج




‘populateobject with current info on form
objProjects.PopulatePropertiesFromForm




التغييرات على السجل الحالي بعد ذلك يتم حفظها الى قاعدة البيانات .




‘saveall changes to current record
objProjects.SaveblnAddMode, rsProjects
‘save changes in list boxes intabs 1-3
CallSaveComments
CallSaveContacts
CallSaveAttachments




ان تم تحديث سجلا موجودا , فان السجل المحدث يوضع في مكان السجل الحالي . ان كان طور الاضافة نشطا , فان السجل الاول سيصبح السجل الحالي .




‘moveback to the project that was current before the requery
IfintCurProject > 0 Then
‘move back to the project thatwas just updated
rsProjects.Find"[intProjectId]="&intCurProject
Else
‘if just added new record, moveto the beginning of
‘the recordset
CallMoveToFirstRecord(intCurrProjectRecord, rsProjects, objProjects, -
blnAddMode)
EndIf
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdSave_Click"
ExitSub
EndSub




احداث نقر Click مختلفة تم اضافتها الى كل زر امر ليستعمل لاستعراض السجلات .مثالا الاجراء cmdMoveFirst_Click يستدعي
اجراء للانتقال الى السجل الاول ومن ثم يملءالحاكمات التي على النموذج بالبيانات للسجل الجديد الحالي




PrivateSub cmdMoveFirst_Click()
OnError GoTo HandleError
‘move to the first record in thelocal disconnected recordset
CallMoveToFirstRecord(intCurrProjectRecord, rsProjects, objProjects, -
blnAddMode)
‘populate the controls on theform with the current record
CallPopulateProjectsControls
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdMoveFirst_Click"
ExitSub
EndSub




بعد ذلك فانه تم اضافة اجراءات عديدة الى النموذج لادارة العناوين .مثالا الاجراء cmdDeleteContacts_Click يحذف العنوان المختار
من مربع القائمة على النموذج




PrivateSub cmdDeleteContact_Click()
OnError GoTo HandleError
(‘delete the selected contact from the list (not thedatabase, just the screen
IflstContacts.ListIndex >= 0 Then
lstContacts.RemoveItem(lstContacts.ListIndex)
EndIf
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdDeleteContact_Click"
ExitSub
EndSub




الاجراءحدث cmdManageContacts_Click يفتح النموذج frmContacts للمستخدم حتى يتمكن من اضافة عنوان للمشروع .




PrivateSub cmdManageContacts_Click()
OnError GoTo HandleError
‘store the current projectid so acontact can be added
intContactProjectAdd= objProjects.ProjectId
‘open contacts form so user canadd contact to existing project
DoCmd.OpenForm"frmContacts”
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdManageContacts_Click"
ExitSub
EndSub




اجراءحدث cmdEmailContact_Clickينفذ الطريق SendObject لكائن DoCmdلتوليد بريد الكتروني فارغ للعنوان المختار .




PrivateSub cmdEmailContact_Click()
OnError GoTo HandleError
‘create a new email to theselected contact using the email column
DoCmd.SendObjectacSendNoObject, , , lstContacts.Column(5) , , , , ,
True,False
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdEmailContact_Click"
ExitSub
EndSub




الحدث cmdViewContact_Click يفتح النموذج frmContacts ويظهر سجل العنوان الذي تم اختياره.






PrivateSub cmdViewContact_Click()
OnError GoTo HandleError
‘if there is a selected record inthe list
IflstContacts.ListIndex <> -1 Then
‘store the current projectid so acontact can be added
intContactProjectAdd= objProjects.ProjectId
‘store the current contact so itcan be retrieved
‘from the contacts form
intContactProjectLookup= lstContacts.Column(6)
DoCmd.OpenForm"frmContacts”
intContactProjectLookup= 0
EndIf
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdViewContact_Click"
ExitSub
EndSub






بعد ذلك فان اجراء الحدث Click تم صنعه لاضافة وحذف الملاحظات من الملاحظة الاولى في مربع القائمة . اجراءات الاحداث تم بعد ذلك اضافتها لادارة الملفات المرفقة المصاحبة للمشروع ..مثالا حدث cmdAddAttachment_Click
تم اضافتها الى القيمة للحقول txtFileDesc و txtFileNameالى اول ملف مرفق في مربع القائمة .




PrivateSub cmdAddAttachment_Click()
OnError GoTo HandleError
'add fileattachment to list box
lstFileAttachments.AddItem(txtFileDesc & ";" & txtFileName)
‘clear text boxes since info wasadded to list
txtFileDesc=”“
txtFileName=“ “
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdAddAttachment_Click"
ExitSub
EndSub

\


الحدث cmdFileBrowse_Click يستدعي الدالة GetFileNameBrowse والتي بعد ذلك تستدعي دالة خارجية لفتح صندوق حوار مستعرض ملف




PrivateSub cmdFileBrowse_Click()
OnError GoTo HandleError
‘show the open dialog and load
‘selected file name in text box
txtFileName= GetFileNameBrowse
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, -
"cmdFileBrowse_Click"
ExitSub
EndSub

أبو يوسف1
24-04-2013, 07:36
الاخوة الاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معاالجزء الرابع عشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا
الحدث cmdOpenFile_Click يمكنالمستخدم من ان يعاين المرفق في تطبيقه الاصلي .فان اختار المستخدم من القائمة فان الاجراء OpenFileAttachment يتم تنفيذه لاستدعاء دالة خارجية لفتح برنامجااخر مصاحب للمرفق .



Private Sub cmdOpenFile_Click()
On Error GoTo HandleError
Dim RetVal As Variant
Dim strFile As String
'if the user selected a value
If lstFileAttachments.ListIndex >= 0 Then
'retrieve the file name from the list box
strFile = lstFileAttachments.Column(1)
'open the selected file
Call OpenFileAttachment(strFile)
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"cmdOpenFile_Click"
Exit Sub
End Sub



اجراء AddEmptyProjectRecord تم اضافته لمسح القيم في الكائن



Sub AddEmptyProjectRecord()
On Error GoTo HandleError
'set add mode to true
blnAddMode = True
'clear the current values in the Projects object
objProjects.ClearObject
'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearProjectsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"AddEmptyProjectRecord"
Exit Sub
End Sub

الاجراء PopulateProjectsControls يملءالحاكمات على النموذج frmProjectsبالقيم للسجل الحالي في كائن objProjects

Sub PopulateProjectsControls()
On Error GoTo HandleError
'Populate the controls on the Projects form with the values of the
'current record in the Projects object.
If Not rsProjects.BOF And Not rsProjects.EOF Then
Me.txtProjectId = objProjects.ProjectId
Me.txtProjectTitle = objProjects.ProjectTitle
Me.txtProjectDesc = objProjects.ProjectDescription
Me.cboPriority = objProjects.Priority
Me.txtReferenceNum = objProjects.ReferenceNum
Me.txtMoneyBudget = objProjects.MoneyBudget
Me.txtMoneyToDate = objProjects.MoneyToDate
Me.txtHoursBudget = objProjects.HoursBudget
Me.txtHoursToDate = objProjects.HoursToDate
If objProjects.DateDue = "1/1/1900" Then
Me.txtDateDue = ""
Else
Me.txtDateDue = objProjects.DateDue
End If
Me.cboStatus = objProjects.Status




بعد ملءالكائن فان حاكمات اللسان تكون قد ملئت بالقيم المسترجعة من قاعدة البيانات .


'populate the recordset for tab 1
Set rsComments = New ADODB.Recordset
Set rsComments = objProjects.RetrieveComments(objProjects.ProjectId )
PopulateListFromRecordset Me.lstComments, rsComments, 1
rsComments.Close
'populate the recordset for tab 2
Set rsContacts = New ADODB.Recordset
Set rsContacts = objProjects.RetrieveContacts(objProjects.ProjectId )
PopulateListFromRecordset Me.lstContacts, rsContacts, 7
rsContacts.Close

'populate the recordset for tab 3
Set rsAttachments = New ADODB.Recordset
Set rsAttachments = _
objProjects.RetrieveAttachments(objProjects.Projec tId)
PopulateListFromRecordset Me.lstFileAttachments, rsAttachments, 2
rsAttachments.Close




عداد السجل كان قد ظهر ايضا , حتى يتمكن المستخدم من رؤية عدد السجلات المتوفرة للعرض والتحديث


'display the record count on the form
lblRecordNum.Caption = "Record " & intCurrProjectRecord & " Of " & _
rsProjects.RecordCount

ان كان السجل الحالي غير موجودا بسبب ان مجموعة السجلات في البداية او النهاية , فانك سوف تنقل الى سجل اخر .


lseIf rsProjects.BOF Then
'past beginning of recordset so move to first record
Call MoveToFirstRecord(intCurrProjectRecord, rsProjects, _
objProjects, blnAddMode)
ElseIf rsProjects.EOF Then
'past end of recordset so move back to last record
Call MoveToLastRecord(intCurrProjectRecord, rsProjects, _
objProjects, blnAddMode)
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"PopulateProjectsControls"
Exit Sub
End Sub





الاجراءClearProjectControls تم اضافته الى النموذج frmProjects .هذا الاجراءيفرغ الحاكمات المختلفة على النموذج .




Sub ClearProjectsControls()
On Error GoTo HandleError
'clear the values in the controls on the form
Me.txtProjectId = ""
Me.txtProjectTitle = ""
Me.txtProjectDesc = ""
Me.cboPriority = 0
Me.txtReferenceNum = ""
Me.txtMoneyBudget = ""
Me.txtMoneyToDate = ""
Me.txtHoursBudget = ""
Me.txtHoursToDate = ""
Me.txtDateDue = ""
Me.cboStatus = 0


'clear the values in the text box controls on the tab control pages
Me.txtAddComment = ""
Me.txtFileName = ""
Me.txtFileDesc = ""
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"ClearProjectsControls"
Exit Sub
End Sub



الاجراءPopulateComboBoxes تم اضافته لملء القيم في مربع التحرير السرد cboPriority و cboStatus على النموذج



Sub PopulateComboBoxes()
On Error GoTo HandleError
'populate the priority combo box
cboPriority.RowSource = ""
cboPriority.LimitToList = True
cboPriority.ColumnCount = 1
cboPriority.RowSourceType = "Value List"
cboPriority.AddItem ("Normal")
cboPriority.AddItem ("High")
cboPriority.AddItem ("Low")
'populate the status combo box
cboStatus.RowSource = ""
cboStatus.LimitToList = True
cboStatus.ColumnCount = 1
cboStatus.RowSourceType = "Value List"
cboStatus.AddItem ("Open")
cboStatus.AddItem ("Closed")
cboStatus.AddItem ("On Hold")
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"PopulateComboBoxes"
Exit Sub
End Sub


الاجراءPopulateListFromRecordsetيملء مربع القائمة بالقيم في مجموعة السجلات . هذا الاجراء كان قداستعمل لملء مربعات القائمة على حاكمات اللسان بالقيم من قاعدة البيانات ( مثالا , الملاحظات , العناوين ,والمرفقات ).



Sub PopulateListFromRecordset(lstList As ListBox, rsRecordset As _
ADODB.Recordset, intNumCols As Integer)

On Error GoTo HandleError
Dim intCounter As Integer
Dim strItem As String
With lstList
.RowSource = ""
.ColumnCount = intNumCols
.RowSourceType = "Value List"
End With
'add all of the values in the recordset to the list box
Do Until rsRecordset.EOF
'for each item in the current record, build string
For intCounter=0TointNumCols - 1
strItem = strItem & rsRecordset(intCounter).Value & ";"
Next intCounter
lstList.AddItem (strItem)
strItem = ""
rsRecordset.MoveNext
Loop
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"PopulateListFromRecordset"
Exit Sub
End Sub





الاجراءForm_Unload للنموذج frmProjects يغلق مجموعة السجلات ويحررالذاكرة المصاحبة للمجموعة .



Private Sub Form_Unload(Cancel As Integer)
On Error GoTo HandleError
'close the recordset and free the memory
rsProjects.Close
Set rsProjects = Nothing
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, "Form_Unload"
Exit Sub
End Su



بعد ذلك انت اضفت الاجراء LoadRecordsوهو المسؤول عن استرجاع سجلات المشروع من القاعدة واظهار السجل على النموذج



Sub LoadRecords()
On Error GoTo HandleError
intCurrProjectRecord = 0
blnAddMode = False
'populate the main recordset
Set rsProjects = objProjects.RetrieveProjects(blnAllRecords)
'if the recordset is empty
If rsProjects.BOF And rsProjects.EOF Then
Exit Sub
Else
'populate the status and priority combo boxes
Call PopulateComboBoxes
'populate the object with values in the recordset
objProjects.PopulatePropertiesFromRecordset rsProjects
Call MoveToFirstRecord(intCurrProjectRecord, rsProjects, objProjects, _
blnAddMode)
'populate the controls on the form with the current record
Call PopulateProjectsControls
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"LoadRecords"
Exit Sub
End Sub



تم اضافة اجراءين لادارة خاصية التنقل والتي تمكن المستخدم من الانتقال من اظهارالمشاريع غير المغلقة لكل المشاريع .مثالا حدث togShowAll_Click
يضبط علم blnAllRecords الى Trueبسبب ان المستخدم بين انه يريد رؤية كل السجلات . لذلك فان السجلات تم تحميلهابالاعتماد على الخيار المتخذ .



Private Sub togShowAll_Click()
On Error GoTo HandleError
If togShowAll.Value = True Then
blnAllRecords = True
'make sure Show Unclosed is not checked any more
togShowUnclosed.Value = False
'now, populate the form with all projects records
LoadRecords
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, PROJECTS_FORM, _
"togShowAll_Click"
Exit Sub
End Sub



اجراءات مختلفة بعد ذلك تم اضافتها للتعامل مع حفظ سجلات الملاحظات , العناوين ,والمرفقات الظاهرة على الالسنة للنماذج لقاعدة البيانات
مثالا الاجراء SaveComments مسؤولا عن ازالة كل الملاحظات الحالية في القاعدةللمشروع الحالي ومن ثم حفظ كل الملاحظات في القائمة الى القاعدة .الحذف والاضافة تنفذ لان استعمال هذه الاجراءات هو اسهل من البقاء متابعا لاي سجل ملاحظة قد تغير . اي سجل تم اضافته واي سجل تم حذفه .مثل عمليات الحذف او اعادة الاضافة غير ملائمة في كل الظروف . على اي حال في الوضع الحالي تعمل بشكل جيد .




SubSaveComments()
OnError GoTo HandleError
DimstrSQLStatement As String
DimintId As Integer
DimstrComment As String
DimintCounter
'remove allcurrent comments in database for this project
strSQLStatement= BuildSQLDeleteProjectsComments(objProjects.Project Id)
ProcessUpdate(strSQLStatement)
'add back allcomments based on current list (easier than tracking
'changes, inserts,and deletes)
ForintCounter=0TolstComments.ListCount - 1
intId= objProjects.ProjectId
strComment= lstComments.Column(0, intCounter)
strSQLStatement= BuildSQLInsertProjectsComments(intId, strComment)
ProcessUpdate(strSQLStatement)
NextintCounter
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, _
"SaveComments"
ExitSub
EndSub





للانتهاءمن كود النموذج frmProjects فقد اضفنا الاجراء RefreshContacts والذي يتم استدعاؤه كلماتقر المستخدم زرا لاضافةعنوانا للمشروع الحالي . هذه الخاصيةتؤكد ان لسان العنوان يتم ملؤه بالمعلومات المنقحة للعنوان .






SubRefreshContacts()
OnError GoTo HandleError
'populate therecordset for tab 2
SetrsContacts = New ADODB.Recordset
SetrsContacts = objProjects.RetrieveContacts(objProjects.ProjectId )
PopulateListFromRecordsetMe.lstContacts, rsContacts, 7
rsContacts.Close
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, PROJECTS_FORM, _
"RefreshContacts"
ExitSub
EndSub

أبو يوسف1
25-04-2013, 07:25
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معاالجزء الخامس عشر من الفصل الثاني عشر وعلى بركة الله وباسم الله نبدا


The Contacts Form
نموذج العناوين

نموذج العناوين اسمه frmContacts ظاهر في الشكل 12.27 حتى تنشط ذاكرتك لاظهار كيف يبدو .ستقوم باضافة الكود حتى تعمل الوظائف على هذاالنموذج.
Writing Code for thefrmContacts Form
كتابة الكود للنموذج frmContacts

انت الان في البيت ومتسطح .هذا هو القسم الاخير من التطبيق. ستقوم بكتابة الكود خلف النموذج frmContacts لانهاء هذا التطبيق


1- افتح النموذج frmContacts واختر حدث التحميل للنموذج حتى تحضر المحرر الفيجولي .اضف الكود التالي للنموذج





PrivateSub Form_Load()
OnError GoTo HandleError
SetobjContacts = New clsContacts
SetrsContacts = New ADODB.Recordset
'not in add mode
blnAddMode= False
intCurrContactRecord= 0
SetrsContacts = objContacts.RetrieveContacts
'if the recordsetis empty
IfrsContacts.BOF And rsContacts.EOF Then
ExitSub
Else
'populate theobject with values in the recordset
objContacts.PopulatePropertiesFromRecordsetrsConta cts
CallMoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts,blnAddMode)
'populate thecontrols on the form with the current record
CallPopulateContactsControls
EndIf
ExitSub
HandleError:
GeneralErrorHandlerErr.Number, Err.Description, CONTACTS_FORM, "Form_Load"
ExitSub
EndSub





2 -اضف التالي الى قسم التصريحات العامة للنموذج frmContacts





OptionCompare Database
OptionExplicit
DimblnAddMode As Boolean
DimrsContacts As ADODB.Recordset
DimobjContacts As clsContacts
ConstCONTACTS_FORM = "frmContacts"
DimintCurrContactRecord As Integer





3 -اضف اجراء الحدث التالي للنموذج frmContacts





Private Sub cmdAddToProject_Click()
On Error GoTo HandleError
Dim strSQLStatement As String
'build the SQL statement to insert a new contact for the current
'project on frmProjects
strSQLStatement = BuildSQLInsertProjectsContacts(objContacts.Conta
intContactProjectAdd)
'insert the record into the database
ProcessUpdate (strSQLStatement)
Call Forms("frmProjects").RefreshContacts
'close the Contacts form to return the user to the Project streen
DoCmd.Close acForm, "frmContacts"
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdAddToProject_Click"
Exit Sub
End Sub

4- اضف اجراء الحدث التالي للنموذج frmContacts لاتاحة التعديل على السجلات


Private Sub cmdAddNew_Click()
On Error GoTo HandleError
'clear the current controls to enable adding a new
'contact record
Call AddEmptyContactRecord
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdAddNew_Click"
Exit Sub
End Sub
Private Sub cmdSave_Click()
On Error GoTo HandleError

Dim intCurContact As Integer
'save the id of the current record if in update mode
If Not blnAddMode Then
intCurContact = objContacts.ContactId
Else
intCurContact = 0
End If
'populate object with current info on form
objContacts.PopulatePropertiesFromForm
'save all changes to current record
objContacts.Save blnAddMode, rsContacts
'move back to the contact that was current before the requery
If intCurContact > 0 Then
'move back to the contact that was just updated
rsContacts.Find "[intContactId]="&intCurContact
Else
'if just added new record, move to the beginning of
'the recordset
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM,
"cmdSave_Click"
Exit Sub
End Sub
Private Sub cmdDelete_Click()
On Error GoTo HandleError
'delete the current record from the local disconnected recordset
objContacts.Delete objContacts.ContactId, blnAddMode, rsContacts
'move to the first record in the recordset after the delete
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, objContacts, _
blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdDelete_Click"
Exit Sub
End Sub



5- - اضف اجراء الحدث التالي للنموذج frmContacts للاستعراض خلال السجلات


Private Sub cmdMoveFirst_Click()
On Error GoTo HandleError
'move to the first record in the local disconnected recordset
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdMoveFirst_Click"
Exit Sub
End Sub
Private Sub cmdMoveLast_Click()
On Error GoTo HandleError
'move to the last record in the local disconnected recordset
Call MoveToLastRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdMoveLast_Click"
Exit Sub
End Sub
Private Sub cmdMoveNext_Click()
On Error GoTo HandleError
'move to the next record in the local disconnected recordset
Call MoveToNextRecord(intCurrContactRecord, rsContacts, objContacts, _
blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub

HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdMoveNext_Click"
Exit Sub
End Sub
Private Sub cmdMovePrevious_Click()
On Error GoTo HandleError
'move to the previous record in the local disconnected recordset
Call MoveToPreviousRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdMovePrevious_Click"
Exit Sub
End Sub

6- اضف الاجراء AddEmptyContactRecordالتالي الى نفس النموذج



Sub AddEmptyContactRecord()
On Error GoTo HandleError
'set add mode to true
blnAddMode = True
'clear the current values in the contacts object
objContacts.ClearObject
'clear the current controls on the form so the
'user can fill in values for the new record
Call ClearContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"AddEmptyContactRecord"
Exit Sub
End Sub

7- اضف الاجراء PopulateContactsControls التالي الى نفس النموذج .
Sub PopulateContactsControls()
On Error GoTo HandleError
'Populate the controls on the Contacts form with the values of the
'current record in the contacts object.
If Not rsContacts.BOF And Not rsContacts.EOF Then
Me.txtLName = objContacts.LastName
Me.txtFName = objContacts.FirstName
Me.txtMName = objContacts.MiddleName
Me.txtCompany = objContacts.Company
Me.txtAddress1 = objContacts.Address1
Me.txtAddress2 = objContacts.Address2
Me.txtCity = objContacts.City
Me.txtRegion = objContacts.Region
Me.txtPostalCode = objContacts.PostalCode
Me.txtWorkPhone = objContacts.WorkPhone
Me.txtHomePhone = objContacts.HomePhone
Me.txtCellPhone = objContacts.CellPhone
Me.txtEmail = objContacts.Email
'display the record count on the form
lblRecordNum.Caption = "Record " & intCurrContactRecord & " Of " & _
rsContacts.RecordCount
ElseIf rsContacts.BOF Then
'past beginning of recordset so move to first record
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
ElseIf rsContacts.EOF Then
'past end of recordset so move back to last record
Call MoveToLastRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"PopulateContactsControls"
Exit Sub
End Sub

8 - اضف الاجراءClearContactsControls التالي الى نفس النموذج


Sub ClearContactsControls()
On Error GoTo HandleError
'clear the values in the controls on the form
Me.txtLName = ""
Me.txtFName = ""
Me.txtMName = ""

Me.txtCompany = ""
Me.txtAddress1 = ""
Me.txtAddress2 = ""
Me.txtCity = ""
Me.txtRegion = ""
Me.txtPostalCode = ""
Me.txtWorkPhone = ""
Me.txtHomePhone = ""
Me.txtCellPhone = ""
Me.txtEmail = ""
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"ClearContactsControls"
Exit Sub
End Sub

9- - اضف الحدث Form_Unload التالي الى نفس النموذج

Private Sub Form_Unload(Cancel As Integer)
On Error GoTo HandleError
'close the recordset and free the memory
rsContacts.Close
Set rsContacts = Nothing
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"Form_Unload"
Exit Sub
End Sub

-10- مبروك – هذا كل الكود ! الان خذ وقتا لحل اي اخطاء طباعية , ان لم تعمل للان .القسم التالي –الجزء الاخير من هذا الفصل - سيكون رحلة الى اكثر الخصائص متعة للتطبيق .

أبو يوسف1
26-04-2013, 03:52
الاخوةالاعزاء
السلام عليكم ورحمة الله وبركاته
نتابع معاالجزء السادس عشر من الفصل الثاني عشر وقبل الاخير وعلى بركة الله وباسم الله نبدا


How It Works
كيف يعمل

اخرمجموعة للكود انت اضفتها الى المشروع في نموذج العناوين frmContacts . في حدث التحميل Form_Load انت اضفت كودا من اجل الابتداء للنموذج , مثالا ملء مجموعة السجلات للعناوين بواحد او كل سجلات العناوين .







Private Sub Form_Load()
On Error GoTo HandleError

Set objContacts = New clsContacts
Set rsContacts = New ADODB.Recordset
'not in add mode
blnAddMode = False
intCurrContactRecord = 0
Set rsContacts = objContacts.RetrieveContacts
'if the recordset is empty
If rsContacts.BOF And rsContacts.EOF Then
Exit Sub
Else
'populate the object with values in the recordset
objContacts.PopulatePropertiesFromRecordset rsContacts
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, "Form_Load"
Exit Sub
End Sub


انت ايضا اضفت حدث cmdAddToProject_Click والمسؤول عن اضافة العنوان المختار الى سجل المشروع الحالي*




Private Sub cmdAddToProject_Click()
On Error GoTo HandleError
Dim strSQLStatement As String
'build the SQL statement to insert a new contact for the current
'project on frmProjects
strSQLStatement = BuildSQLInsertProjectsContacts(objContacts.Contact Id, _
intContactProjectAdd)
'insert the record into the database
ProcessUpdate (strSQLStatement)
Call Forms("frmProjects").RefreshContacts
'close the Contacts form to return the user to the Project streen
DoCmd.Close acForm, "frmContacts"
Exit Sub

HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdAddToProject_Click"
Exit Sub



End Sub


نفس الامر الذي عملته في frmProjects انت ايضا اضفت اجراءات احداث للازرار : اضف جديدا , حفظ , حذف .مثالا انت اضفت حدث
cmdAddNew_Click لوضع النموذج في طور السماح للمستخدم باضافة عنوانا جديدا- سجلا- الى قاعدة البيانات .





Private Sub cmdAddNew_Click()
On Error GoTo HandleError
'clear the current controls to enable adding a new
'contact record
Call AddEmptyContactRecord
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdAddNew_Click"
Exit Sub
End Sub










وكماعملت في frmProjects انت ايضا اضفت اجراءات احداث للاستعراض خلال السجلات .مثالا حدث cmdMoveFirst_Click ينتقل الى اول سجل في مجموعة السجلات المحلية المنفصلة ويملء الحاكمات على النموذج بالسجل الحالي .





Private Sub cmdMoveFirst_Click()
On Error GoTo HandleError
'move to the first record in the local disconnected recordset
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
'populate the controls on the form with the current record
Call PopulateContactsControls
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"cmdMoveFirst_Click"
Exit Sub
End Sub








انت ايضا صنعت اجراءات لاضافة سجل عنوان فارغ و لتفريغ حاكمات العناوين على النموذج . نفس الامر انت اضفت اجراء يدعى
PopulateContactsControls لملء الحاكمات على النموذج frmContacts بالقيم من السجل الحالي في كائن objContacts.






Sub PopulateContactsControls()
On Error GoTo HandleError
'Populate the controls on the Contacts form with the values of th
'current record in the contacts object.
If Not rsContacts.BOF And Not rsContacts.EOF Then
Me.txtLName = objContacts.LastName
Me.txtFName = objContacts.FirstName
Me.txtMName = objContacts.MiddleName
Me.txtCompany = objContacts.Company
Me.txtAddress1 = objContacts.Address1
Me.txtAddress2 = objContacts.Address2
Me.txtCity = objContacts.City
Me.txtRegion = objContacts.Region
Me.txtPostalCode = objContacts.PostalCode
Me.txtWorkPhone = objContacts.WorkPhone
Me.txtHomePhone = objContacts.HomePhone
Me.txtCellPhone = objContacts.CellPhone
Me.txtEmail = objContacts.Email
'display the record count on the form
lblRecordNum.Caption = "Record " & intCurrContactRecord & " Of
rsContacts.RecordCount
ElseIf rsContacts.BOF Then
'past beginning of recordset so move to first record
Call MoveToFirstRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
ElseIf rsContacts.EOF Then
'past end of recordset so move back to last record
Call MoveToLastRecord(intCurrContactRecord, rsContacts, _
objContacts, blnAddMode)
End If
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, _
"PopulateContactsControls"
Exit Sub
End Sub




اخيرا حدث Form_Unload تم اضافته الى النموذج frmContacts لاغلاق مجموعة السجلات rsContacts ولتحرير الذاكرة المحجوزة
من مجموعة السجلات




Private Sub Form_Unload(Cancel As Integer)
On Error GoTo HandleError

'close the recordset and free the memory
rsContacts.Close
Set rsContacts = Nothing
Exit Sub
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CONTACTS_FORM, "Form_Unload"
Exit Sub
End Sub

احمد بنان
26-04-2013, 06:59
يا جماعة الموضوع اللي امامكم عمل عظيم

والاخ ابويوسف يستحق عليه اكبر تحية

ابويوسف يقوم بجهد كبير للغاية ويحسد عليه

الراجل بيشتغل بالموضوع منذ 8 اشهر (ما شاء الله )

هذا العمل هو اضائة حقيقية وتنوير لالف ممن يريدون تعلم لغة Vba Access

ربنا يكرمك يا ابويوسف

أبو يوسف1
27-04-2013, 06:39
حياك الله اخي العزيز احمد
اهلا وسهلا بك في مملكتنا العزيزة وان شاء الله تجد دائما ما يسرك
حقيقة جهود كبيرة وعظيمة من الاخوة الاساتذة الكبار- بارك الله فيهم وفي جهودهم الدائمة - انى ذهبت في ارجاء مملكتنا الرائعة وهذا من اقلها - محاولة ترجمة فقط -
بارك الله فيك وجزاك كل الخير .

برفان
27-04-2013, 06:55
شكرا لكم

بارك الله فيكم....

أبو يوسف1
27-04-2013, 09:20
حياك الله دائما وابدا وبارك الله فيك اخي العزيز برفان

محمد رفعت
20-07-2013, 07:08
السلام عليكم ورحمه الله وبركاته

مجهود اكثر كم رائع

جعله الله في موازين حسناتك

ورمضان كريم

احمد خيرى
21-07-2013, 02:23
شرح سهل و مبسط

أبو يوسف1
24-07-2013, 10:31
محمد رفعت (http://www.accesswordkingdome.com/forum/member.php?u=16052)

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

مجهود اكثر كم رائع

جعله الله في موازين حسناتك

ورمضان كريم

\
وعليكم السلام ورحمة الله وبركاته
حياك الله اخي العزيز محمد وبارك الله فيك
وتقبل الله منكم الطاعات , وجزاك الله عني كل الخير يا رب
وكل عام وانتم بالف الف خير يا رب



احمد خيرى (http://www.accesswordkingdome.com/forum/member.php?u=49563)
شرح سهل و مبسط


حياك الله اخي العزيز احمد وبارك الله فيك
سهل الله لك الامور كلها وسهل ايضا لك طريقا للجنة يا رب .
وكل عام وانتم بالف الف خير يا رب

محمد1244
21-04-2014, 03:34
بارك الله فيكم