اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

zahrah2016

عضوية شرفية
  • Posts

    95
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل منشورات العضو zahrah2016

  1. مشروعك الأول لإحتراف الاكسيس اعزائي الكرام السلام عليكم ورحمة الله وبركاته سنأخذكم في رحلة شيقة لعمل مشروع متكامل بالاكسيس ابتداء من الصفر وحتى اخر خطوة بطريقة ميسرة وسهلة وسيتناول المشروع جميع الاجراءات من انشاء جداول الى انشاء علاقات بين تلك الجدوال وعمل الاستعلامات وتصميم النماذج والتقارير مرورا بالتعبيرات والاحداث والوحدات النمطية ولكن قبل ان نبدأ هناك مفاهيم وخطوات أساسية لا بد وأن نتعلمها قبل الشروع في المشروع وهي كما يلي : خطوات تنفيذ المشروع يمر أي مشروع عند إنشاءه بمجموعة من الخطوات التي يجب وأن نكون على دراية كافية بها كما في الشكل مرحلة التحليل : Strategy and Analysis وفيها يتم تحديد الغرض من المشروع ثم تحليله بشيء من التفصيل، فمثلاً نريد عمل مشروع يتضمن بيانات الإدارات والعاملين بإحدى الشركات، لكون هذا المشروع أكثر تطبيقات قواعد البيانات انتشاراً في المجال العملي إضافة إلى سهولة فهمه وتطبيقه بالنسبة لأي مبتدأ. مرحلة التصميم : Design في هذه المرحلة يتم تصميم النظام في ضوء معلومات خلال المرحلة السابقة، بحيث يتم تحديد العناصر والمكونات التي يتم إنشاؤها وكذلك العلاقة بينها. مرحلة التنفيذ والتطوير: Developing وفيها يتم الإنشاء الفعلي لما تم تصميمه في المرحلة السابقة، من حيث الجداول، الاستعلامات، النماذج والعلاقات المختلفة بين الكائنات... وهكذا. مرحلة الاختبار: Testing وهي المرحلة الخاصة باختبار النظام بعد إنشاءه وقبل خروجه إلى الاستخدام العملي مباشرة وعادة ما يقوم بها أخصائيو الدعم الفني . مرحلة الإنتاج : Producing وهي مرحلة الإنتاج الفعلي للنظام وخروجه للبيع أو الاستخدام العملي بعد تضافر وتكامل جميع العناصر السابقة. المشروع والآن هب أننا نقوم بإنشاء المشروع الأول بالأكسيس والذي سنطبق فيه ما تعلمنا قدر المستطاع، فنحن بصدد القيام بمشروع قاعدة بيانات للعاملين بشركة ( زهره للصناعات الهندسية ) والتي تحتوي على مجموعة من الإدارات، مجموعة من الموظفين العاملين بتخصصاتهم المختلفة، والموظف القائم على سجلات شؤون الموظفين يجد صعوبة بالغة في استدعاء بيانات معينة عن أي موظف نظراً لزيادة عدد الموظفين وتخصصاتهم المختلفة، الشيء الذي دفعه لتعلم أكسيس لتحويل الوثائق والمستندات إلى قاعدة بيانات أي تحويل النظام المستندي إلى نظام إلكتروني وخاصة بعد أن علم أنه لا يشترط وأن يكون مبرمجاً محترفاً لتعليم أكسيس فتوصل إلى التالي : انشاء جدول الادارات وجد ذلك الموظف أن الشركة تحتوي على عدة إدارات أو أقسام وهي قسم الإدارة، وهو المسؤول عن إدارة الشركة وموظفيها والذي يتكون من رئيس مجلس الإدارة والمديرين التابعين له في مختلف الاختصاصات، وقسم الحسابات المختص بإدارة حسابات الشركة وتتبعها داخلياً وخارجياً، وقسم الدعم الفني والمسؤول عن تقديم المساعدة الفنية لأي عميل وقسم خدمة العملاء والمسؤول عن توجيههم وتقديم المساعدة ما أمكن، وقسم المبيعات المختص ببيع منتجات الشركة، وكذلك هناك قسم التسويق والذي يتولى تسويق منتجات الشركة داخلياً وخارجياً، وقسم السكرتاريا الخاص بالقيام بالأعمال المكتبية، وقسم الأمن والخاص بحراسة منشآت الشركة، فوجد هذا الموظف أن هذه الإدارات على اختلاف تخصصاتها تشترك في بيانات موحدة ألا وهي : رقم الإدارة: فلكل إدارة رقم ( ويجب ألا تشترك إدارتان في نفس الرقم ) وذلك لمنع ازدواج البيانات. اسم الإدارة : فلكل إدارة اسم خاص بها . موقع الإدارة : حيث أن كل إدارة تقع في منطقة جغرافية معينة. ملاحظات : بعض الإدارات يحتاج إلى كتابة بعض الملاحظات عليها. وعلى هذا فلا بد من إنشاء جدول الإدارات والذي يحمل الاسم Departs والذي يحتوي على الحقول التالية والموضحة بأنواع البيانات فيها وفقاً للجدول التالي للتوضيح رمز الادارة : D_ID نوعه رقم وحجمه 5 حروف وهو مفتاح اساسي ولا يمكن ان يترك فارغا . اسم الادارة : D_NAME نوعه نص وحجمه 30 حرف موقع الادارة : D_LOC نوعه نص وحجمه 25 حرف ملاحظات : D_NOTES نوعه مذكره ويمكن ان يترك فارغا والذي سيتم التصميم على ضوئه كما يلي : فتح برنامج أكسيس وإنشاء قاعدة بيانات جديدة باسم COMP وحفظها تحت المجلد COMP أيضاً والذي أنشئ لحفظ قاعدة البيانات فيه لتظهر قاعدة البيانات COMP فارغة. بعد ذلك اتجه إلى القسم الخاص بالجداول واختار انشاء جدول في عرض التصميم CRATE TABLE IN DESIGN VIEW فتظهر لك شاشة خاصة بإنشاء الجدول في وضع التصميم، نفذ الجدول كما اتفقنا عالياً مع مراعاة أن يكون الحقل الخاص برقم الإدارة D_ID مفتاحاً أساسياً PRIMARY KEY ثم اختر من قائمة file اختر SAVE فسيظهر لك صندوق الحوار والذي يطلب منك اسم الجدول والذي سنجعله هنا DEPARTS بعد ذلك أغلق النافذة الخاصة بالجدول في حيز التصميم فستجد الجدول DEPARTS موجود ضمن قاعدة البيانات COMP إنشاء جدول للموظفين : كما وجد هذا الموظف أن الشركة تحتوي على موظفين يعملون لدى الإدارات المختلفة والسابق إنشاء جدول لهم، الشيء الذي يحتم بدوره إنشاء جدول للموظفين ويشمل الحقول التالية : رقم تسلسلي : D_ID وهو رقم خاص بكل موظف ويجب ألا يشترك فيه إثنان من الموظفين لمنع ازدواج البيانات. رقم الموظف : EMPNO من الملاحظ وجوب إنشاء مفتاح أساسي للحقل الخاص برقم الموظف لمنع الازدواج. اسم الموظف : ENAME فلكل موظف اسم. المهنة : EJOB وهي التخصص الذي يعمل به الموظف لدى الشركة. المرتب : SALARY وهو الأجر الشهري لهذا الموظف. بإمكانك اضافته للجدول العمولة : COMM في حالة وجود عمولة يستحقها الموظف. التليفون : PHONEوهو رقم الخط الشخصي الخاص بهذا الموظف. تاريخ التعيين : E_DATE وهو تاريخ التحاق الموظف بالشركة. ولتنفيذ ذلك الجدول يتم بالطريقة التي صممنا بها الجدول السابق وتتضح بيانات ذلك الجدول كما يلي : لاحظ هنا أن حقل التليفون في جدول الموظفين قد تم اختياره من النوع TEXT وليس من النوع NUMBER وذلك لسببين أساسيين : الأول : أننا لن نقوم بإجراء أية عمليات حسابية على هذا الحقل . الثاني : أن قاعدة البيانات لن تعترف بأي صفر على يسار الرقم ولذلك فلن نستطيع كتابة كود المحافظة في أي رقم وبعد إنشاء الجدول يظهر جنباً إلى جنب بجوار الجدول السابق إنشاؤه . إنشاء العلاقة : RELATION بعد الانتهاء من إنشاء الجدول لا بد من ربط الجدولين السابقين ببعضهما ، وستكون هذه العلاقة من نوع ONE TO MANY أو واحد إلى كثير. حيث يعمل كل موظف بالشركة لدى إدارة معينة وكل إدارة تحتوي على مجموعة من الموظفين وذلك عن طريق ربط الحقل D_ID الموجود بجدول الإدارات بالحقل D_ID الموجود بالجدول EMP فهو مفتاح أساسي في الجدول الأول ومفتاح فرعي بالجدول الثاني، وتتضح العلاقة كما هو موضح بالشكل معنى ذلك أننا لا نستطيع إدراج رقم أي إدارة بجدول الموظفين إلا إذا كانت موجودة أصلاً في جدول الإدارات. إدخال البيانات لكي نتمكن من السير في باقي خطوات المشروع لا بد لنا من إدخال بعض البيانات التجريبية بالجدولين جدول الأقسام DEPARTS:TABLE وجدول العاملين EMP:TABLE إنشاء الاستعلامات بعد ذلك وجد هذا الموظف القائم على صنع قاعدة البيانات أنه في حاجة لأن يصنع بعض الاستعلامات، وسأل نفسه ما هي أكثر البيانات استخداماً كمعيار بحث؟ بمعنى آخر ما هي البيانات التي يتم الاستعلام عن الموظف بدلالتها بصفة مستمرة فوجد أن الاسم والرقم، المرتب، وكذلك العمولة، ورقم الإدارة، أي معظم بيانات الجدول يتم الاستعلام بدلالتها، فمعنى ذلك أنه لا بد من إنشاء مجموعة استعلامات بعدد الحقول الموجودة بالجدول وعدد الموظفين... بالطبع لا، لهذا توصل إلى أحد أنواع الاستعلامات التي تستخدم مصطلحاً معيناً مع لغة SQL للقيام بالاستعلام عند وقت التنفيذ كما يلي : العبارة : LIKE إذا افترضنا أننا نريد استعلام عن جميع الموظفين الذين يحملون الاسم " محمد " من جدول الموظفين، فيمكن أن نكتب الاستعلام بواسطة جملة SQL هكذا. SELECT * FROM EMP WHERE ENAME=[محمد]; ولكن ماذا لو كنا نريد عمل جملة استعلام عامة تأخذ معيار البحث "اسم الموظف المراد" في وقت التنفيذ مباشرة، في هذه الحالة ستكون جملة الاستعلام كما يلي : SELECT * FROM EMP WHERE ENAME LIKE[من فضلك ادخل الاسم ]; ولفهم ذلك بجدارة سنفعل كما فعل هذا الموظف بالدخول إلى القسم الخاص بالاستعلامات في قاعدة البيانات QUERIES ثم اختيارانشاء استعلام في وضع التصميم CREATE QUERY IN DESIGN VIEW فتظهر لنا لوحة تطلب من قاعدة البيانات أن نختار الجداول التي سنستخدمها داخل الاستعلام، وبما أن الجدولين هنا قد تم ربطهما ببعضهما أي هناك علاقة بينهما كما تم ذكره سابقاً فسنختار الجدولين معاً . تابع
  2. مشاركة قواعد البيانات اكسيس على الشبكة مع التقدم الكبير الذي حدث في منتصف القرن الميلادي المنصرم وإزدياد المعلومات في كل التخصصات اشتددت الحاجة إلى قواعد وادوات تنظم هذا السيل من البيانات وكان للحاسوب الدور الرئيسي في ذلك ، فالوظيفة الرئسية لقواعد البيانات هي جمع البيانات على شكل معلومات عن كائن أو حدث ما ثم صياغة هذه البيانات بطريقة منظمة ومتقدمة على نحو يمكن الإنتفاع به في صنع القرار ، ويوجد كثير من قواعد البيانات التي تلبي متطلبات العمل ومنها البرنامج الشهير أكسيس Access ، ومن مميزاته العديدة أنه قادر على العمل على شبكة بنفس الكفاءة . السماح بالمشاركة في العديد من الشركات الصغيرة والمؤسسات تكون الحاجة ماسة للمشاركة في البيانات والوصول السريع وفي نفس الوقت للبيانات ، وتوجد إمكانية عمل ذلك في برنامج Access ، ولكن قبل بداية العمل يجب الإختيار بين اثنين من الخيارات المتاحه امامك للمشاركة في البيانات : الخيار الاول : وضع كامل قاعدة البيانات على الخادم الخيار الثاني : وضع بيانات مشاركة على الخادم طبعاً الخيار الاول واضح من اسمه ، كل قاعدة البيانات الـ mdb تكون على الخادم كل الكائنات من نماذج وتقارير ووحدات مايكرو وجداول تكون بنفس الصيغ للجميع وأي تغير على عنصر من العناصر يكون مشاهد من الجميع في نفس الوقت ، وأي عبث بالكائنات مثل المايكرو يكون الخلل على القاعدة الاساسية الموجودة على الخادم ، وطبعا هذه الطريقة بها من المخاطرة نوعاً ما . والطريقة الثانية وهي وضع البيانات مشاركة فهي تتمثل في وضع الجداول فقط على الخادم ثم القيام بنسخ جميع الكائنات على جميع محطات العمل ، وهذا الاسلوب فيه ميزتين : 1. تقليل الضغط على الشبكة فالبيانات هي التي تنتقل عبر الشبكة فقط وباقي االكائنات تكون موجودة على القرص محلي . 2. عند التعديل من أي مستخدم على عنصر من العناصر مثل المايكرو يكون التغير السلبي أو الإيجابي على جهاز المستخدم نفسه ولا يشاهد هذا التغير بقية أعضاء الشبكة . كيف نفصل الجداول عن باقي الكائنات ؟ يعتبر الفصل بين الجداول والكائنات في الاكسس عملية سهلة لوجود معالج يقوم بالفصل بين الجداول ووضعها في قاعدة بيانات منفصلة والكائنات في قاعدتها الاصلية ،سنقوم الآن بالتجربة على قاعدة البيانات C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb الموجودة مع طاقم الاكسس . بداية خذ نسخة من قاعدة البيانات التي ترغب بتقسيمها وذلك لتتمكن من إرجاعها عند حدوث كارثة لاسمح الله . أفتح القاعدة في وضع التصميم ثم اختر من أدوات Tools أدوات مساعدة لقواعد البيانات Database Utilities تقسيم قاعدة البيانات Database Splitter ثم من النافذة نختار تقسيم قاعدة البيانات Split Database يطلب منك إختياراسم جديد للقاعدة ومكان الحفظ ، وتأكد أن مسار الحفظ هو مسار محرك الاقراص للخادم فهذه القاعدة ستكون بها الجداول فقط وستكون مرتبطة بصورة آلية مع كل قواعد البيانات الموجودة على باقي محطات العمل ، إذا تمت مراحل التقسيم بنجاح ستشاهد رسالة مثل التالية : الآن افتح قاعدة البيانات الاصلية ستشاهد أمام كل جدول رمز جديد يشبه السهم وهذا يدل على وجود إرتباط مع قاعدة بيانات ثانية ، ولو فتحت القاعدة الجديد لن تجد إلا الجداول فقط ، يمكن أن تضع نسخة من القاعدة الاصلية على محطات العمل الموجدة على الشبكة وستكون مرتبطة مع الجداول الموجودة على الخادم بصورة آلية . بداية العمل مع البيانات عند العمل على شبكة فمن الممكن حدوث تعارضات عن إدخال المستخدمين البيانات في نفس السجلات ، ويعالج البرنامج اكسس هذه المشكلة بطريقة تإمين السجلات ، Record Locks ، وعند إختيار الخاصية سجل محرر Edited Record ففي هذه الحالة عندما يفتح المستخدم النموذج يكون بجانب السجل الاول رمز مثل القلم وهذا يدل على أن النموذج حر ويمكن استخدامه ، وفي نفس الوقت لو فتح أحد المستخدمين هذا النموذج سيجد رمز القفل وهذا يدل على أن النموذج الآن قيد الاستخدام ولا يمكن إستخدامه في هذا الوقت . حتى يقوم المستخدم الاول بحفظ العمل ، كما نشاهد في الشكل تأمين السجلات في خصائص النموذج . ملاحظة يأخذ اكسس تقريباً 60 ثانية حتى يقوم بعرض العلامة ويمكن تغير هذه الفترة الزمنية من أدوات Tools خيارات Options خيارات متقدمة Advanced ثم من تحديث الفاصل الزمنى Refresh Interval ثم تغير الزمن من 60 ثانية إلى الوقت المناسب ، ولو كان مثلا 5 يكون أفضل عندما تكون قاعدة البيانات متوسطة الحجم ، ومن نافذة خيارات متقدمة Advanced ، يمكن أن تحدد كثير من الخصائص المتعلقة بتحديث البيانات عند الاستخدام المشترك وتستطيع أن تجرب عدد من التجارب إلى أن تصل إلى أفضل المستويات الممكنة ، الى هنا انتهينا من الشرح ولكن بقية نقطه هامه ؟ السؤال : ماذا لو تم تغيير مسار قاعدة البيانات المنفصلة (أي التي تحمل الجداول) فهل هناك من طريقة لتغيير المسار المسجل في القاعدة التي تحوي العناصر الأخرى ؟ الاجابه : في هذه الحالة سنقع في مشكلة كبيرة جدا وهي عدم التعرف على موقع الجداول ولكن برنامج الاكسيس لا يعجز عن الحلول طالما انه في ايدي خبراء ومحترفين 1. افتح قاعدة البيانات التي بها كائنات قاعدة البيانات عدى الجداول لان الجداول في قاعدة بيانات اخرى وفي موقع تم تحديده مسبقا بعد التقسيم 2. حاول تقريب الماوس من الجدول المرتبط وستظهر لك Tip تخبرك بمكان القاعدة . 3. الان اذهب الى القاعدة التي بها الجدول او الجداول المنفصله وقم بتغيير موقعها مثلا الى محرك الاقراص D او حتى ضعها في مجلد جديد المهم تغيير موقعها . 4. عد الى القاعدة التي بها الكائنات والجدول او الجداول المرتبطه واضغط على الجدول المرتبط لمحاولة فتحه ستظهر لك رسالة تحذير تخبرك ان مسار القاعدة التي بها الجداول غير صحيح وهذا هو المطلوب قم بالضعط على موافق سنقوم بالتغلب على هذه المشكلة من خلال الذهاب الى ادوات ادوات مساعدة لقواعد البيانات ادارة الجداول المرتبطه وسيظهر معالج الجداول المرتبطه الان قم بالتحديد الكلي للجداول ومن ثم اختيار موافق وسيظهر لك مربع حوار الملفات الذي ستختار منه اين وضعت القاعده التي بها الجداول المنفصله ليتم تحديث المسار الجديد للجداول المرتبطه . ابحث عن المسار الخاص بالقاعدة التي يكون ملحق مع اسمها الحرفين be ثم اختر فتح . وستظهرك لك رسالة بنجاح الارتباط ... مبررررررررررررروك عليك وبالهنا والشفا . اضغط موافق ثم اضغط اغلاق وأذهب للتأكد من الجداول المرتبطه . ملاحظه : كل هذه الخطوات لا تأخذ سوى ثواني معدوده وهذا مثال لقاعدة بيانات للتطبيق عليه اختكم زهره EMP.rar
  3. اعزائي الكرام السلام عليكم ورحمة الله وبركاته من المعلوم ان اي حقل في الاكسيس يتسع فقط لعدد 256 حرف فقط ولكن الوضع هنا يختلف مع مفكرة زهره عموما هذا البرنامج يقوم بعمل حساب لعدد الاحرف المدخله والتي تحددها له انت في الحقول مثلا ضع في الحقل الاول 400 حرف او اكثر على حسب رغبتك علما ان العدد الاقصى هو 6400 حرف ثم قم بالكتابه في خانة المفكرة وسترى ان الارقام بدأت بالعد بمجرد ادخال الحروف ففي الحقل الثاني يوضح كم عدد المرات التي تم فيها ضغط مفتاح الادخال Enter وفي الخانة الثالثة توضح مجموع الحروف المطبوعة اما الخانة الاخيره فهي تبين مجموع الحروف المدخلة . اذا رغبت في التأكد من ذلك اذهب الى الجدول وانظر الكلمات المكتوبه . يوجد نسختين متشابهتين الاولى على الاكسيس 2003 والثانية للاكسيس 2000 اختكم زهره Count_Memo2003.rar CountMemo2000.rar
  4. عامودي الى افقي : Vertical to Horizontal تخيل ان لديك قاعدة بيانات إحصائيات شخصية مع جدولين ( الجدول 1-14 ) والجدول 1-15 ) لاحظ ان للجدول (1-15) صف واحد لكل احصاء . وهكذا فإن البيانات المتعلقة بشخص معين مرتبة عاموديا . ولاحظ ايضا ان بعض البيانات ناقصة على سبيل المثال لا يوجد بيانات من اجل " زهــره " . نريد الان عرض البيانات افقيا كما في الجدول (1-16) الحل : Solution تقدم لنا عبارة SQL التالية حلا لهذه المسألة : SELECT DISTINCT Employees.EmpID, Name, (SELECT Value FROM EmployeesData AS T2 WHERE (T2.StatType 'Age') And (T2.EmpID = Employees.EmpID)) As Age, (SELECT Value FROM EmployeesData AS T2 WHERE (T2.StatType Height) And (T2.EmpID = Employees.EmpID)) As Height, (SELECT Value FROM EmployeesData AS T2 WHERE (T2.StatType Weight) And (T2.EmpID = Employees.EmpID)) As Weight, FROM (Employees INNER JOIN EmployeesData ON Employees.EmpID= EmployeesData.EmpID لدينا هنا عدة عبارات استعلام فرعي Select ضمن عبارة Select الرئيسية . وتقوم العبارة التالية : (Select Value From EmployeesData As T2 WHERE (T2.StatType='Age') And (T2.EmpID= Employees.EmpID)) As Age بتحديد العمر للشخص المحدد في ظرف أو عبارة Select الرئيسية . وكلما ازداد عدد الاحصائيات تصبح عبارة SQL اكثر تعقيدا . يعرض المثال ( 1-16 ) حلا بديلا بإستخدامADO ولا يتطلب تعديل لدى ازدياد الإحصائيات . المثال ( 1-16 ) مثال : Vertical to Horizontal Private Sub VerticalToHorizontal2( ) Dim db As Database Set db = CurrentDb Dim rsEmp As Recordset Dim rsData As Recordset Dim rsHor As Recordset Set rsEmp = db.OpenRecordset("Employees") Set rsHor = db. OpenRecordset("EmployeesOutput") Do While Not rsEmp.EOF Set rsData = db.OpenRecordset( _ "SELECT * FROM EmployeesData WHERE EmpID = " & rsEmp!EmpID) rsHor.AddNew rsHor!EmpID = rsEmp!EmpID rsHor!Name = rsEmp!Name Do While Not rsData.EOF rsHor.Fields(rsData!StatType).Value = rsData!Value rsData.MoveNext Loop rsHor.Update rsEmp.MoveNext Loop rsEmp.Close rsData.Close rsHor.Close End Sub مسألة تطابق : A Matching Problem يتضمن الجدول ( 1-17 ) مبرمجين ولغات البرمجمة التي يستخدمونها . أما الجدول ( 1-18 ) فيحدد متطلبات اللغة من اجل اعمال مختلفة . نريد هنا عرض قائمة بالاعمال والمبرمجين المؤهلين للقيام بها . الحل : Solution تقدم لنا عبارة SQL التالية أحد الحلول : SELECT ProgrammingJobs.JobID, Programmers.Name FROM Programmers INNER JOIN ProgrammingJobs ON Programmers.Language = ProgrammingJobs.Language GROUP BY ProgrammingJobs.JobID, Programmers.Name HAVING Count(Programmers.Language)= (SELECT Count([Language]) FROM ProgrammingJobs AS pj WHERE pj.JobID= ProgrammingJobs.JobID) نبدأ بربط داخلي Inner Join للجدولين بإستخدام حقل Language ومن أجل كل زوج Programmer/Job تنشئ علاقة الربط الداخلي مجموعة من السجلات كما في الشكل JobID X Language1-ProgrammerName Y JobID X Language2-ProgrammerName Y JobID X Language3-ProgrammerName Y حيث يتطلب العمل للغة والمبرمج مهارة بتلك اللغة . نحتاج الان ان نضمن لكل زوج عمل / مبرمج بأن يكون عدد من هذه السجلات هو نفس عدد اللغات المطلوبة لذلك العمل . ويتم ذلك عن طريق تحميع السجلات وفق الازواج عمل / مبرمج ومن ثم استخدام ظرف Having الذي يقارن عدد هذه السجلات مع عدد اللغات لذلك العمل .والنتيجة هي ما يتضمنه الجدول الجدول (1-19) تساوي المجموعات : Equality of Sets من المسائل الشائعة تعيين متى تتساوى مجموعتان أي متى يكون لهما نفس العناصر . لنأخذ الجدول ( 1-20 ) الذي يعرض خمس مجموعات وعناصرها . لاختصار المسألة وتبسيطها نقوم بترقيم المجموعات ونفترض انها تتضمن ارقاما بحد ذاتها . ونريد الحصول على قائمة بالمجموعات المتساوية . الحل : Solution لهذه المسألة حل أنيق بإستخدام عبارة SQL وحيدة . بينما لا يسمح SQL بشكل عام بمقارنة مجموعتين مباشرة كما في العبارة : (Select Members From Equality Where Set=1)= (Select Members From Equality Where Set=2) لكنه يقبل كثل هذه العبارة اذا كانت عبارات Select تعيد قيمة وحيدة . لنأخذ الان عبارة SQL التالية : SELECt Equality.Set, E2.Set FROM Equality INNER JOIN Equality AS E2 ON (Equality.Member = E2.Member) And (Equality.Set < E2.Set) GROUP BY Equality.Set, E2.Set HAVING ((SELECT Count(Member) FROM Equality As E3 WHERE E3.Set=Equality.Set) = (SELECT Count(Member)FROM Equality As E3 WHERE E3.Set=E2.Set)) AND (Count(Equality.Set) = (SELECT Count(Member) FROM Equality As E3 WHERE E3.Set=E2.Set)) ان علاقة الربط الداخلي Inner Join هي : (Equality.Member = E2.Member) And (Equality.Set < E2.Set) ان الجزء الهام في هذه العبارة هو الجزء الاول . انه يفترض بأننا نريد جميع ازواج المجموعات التي لها عضو مشترك . ويمنع الجزء الثاني من العبارة اعادة ازواج متكررة . على سبيل المثال اذا تضمنت المجموعتان 1 و 2 العضو 3 فإننا لا نريد استرجاع الزوج ( 1-2 ) والزوج ( 2-1 ) . ولبيان ذلك بشكل اوضح بما ان العضو 3 مجوجود في المجموعات 1 ، 2 ، 3 ، 4 فإن السجلات المستعادة للعضو 3 هي على النحو التالي : ( 2-1 ) ( من العضو 3 ) ( 3-1 ) ( من العضو 3 ) ( 4-1 ) ( من العضو 3 ) ( 3-2 ) ( من العضو 3 ) ( 4-2 ) ( من العضو 3 ) ( 4-3 ) ( من العضو 3 ) واذا لم يكن الجزء Equality.Set < E2.Set موجودا فإننا كنا سنحصل على ( 1-1 ) و ( 2-2 ) ..... ( 4-4 ) بالاضافة الى ( 1-2 ) و ( 1-3 ) وهكذا . يمكننا الان ان نطرح السؤال التالي : كم مره سيظهر زوج مجموعة ما ؟ ان زوج المجموعة ( 2-1 ) مثلا سيظهر بعدد المرات التي يوجد فيها عناصر مشتركة بين المجموعتين . أي انه سيظهر بعدد مرات يكافئ حجم التقاطع بين المجموعتين . لذلك اذا قمنا بالتجميع حسب ازواج المجموعات ( Group By ) نستطيع فحص التقاطعات وتحديد حجم النتائج المسترجعة بإستخدام ظرف Having . ان هذا الظرف يقول بأن المجموعتين متساويتين . ولكن تتساوى المجموعتان A و B اذا كان حجمهما وتقاطعهما هو نفسه ان العبارة : (Select Count(Member) From Equality As E3 WHERE E3.Set=Equality.Set)= Select Count(Member) From Equality As E3 WHERE E3.Set=E2.Set) تقول انه من اجل زوج مجموعات معين ( Equality.Set , E2.Set ) من العبارة الرئيسية Select فإن حجم Equality.Set مساوي لحجم E2.Set . اما العبارة : Count(Equality.Set)= (Select Count(Member) From Equality As E3 WHERE E3.Set=E2.Set) فتقول بأن حجم تقاطع Equality.Set و E2.Set هو نفسه ومماثل لحجم E2.Set وهذا هو المطلوب . في الختام اعزائي الكرام اسأل الله العلي القدير ان يوفقنا واياكم لما يحبه ويرضاه واتمنى من الجميع بعد قراءة هذا الموضوع العمل على تطبيقه عمليا بحيث تأخذ كل مثال وتحاول تطبيقه على قاعدة بيانات لمعرفة كيفية الاستفادة من الحلول المقترحه وقد تخرج بفكره جديده لم تطرح وبهذا تكون قد اصطدت عصفورين بحجر واحد منها الاستفادة ومنها التطبيق . اختكم زهـره المصدر من كتاب : Some Common Data Manipulation Problems
  5. زمن الإنجاز : Time to Completion سنعرض هنا مشكله بسيطه حول تحديد الزمن الكلي لإنجاز مهمه ما . يعرض الجدول ( 1- 8) حالة إنتاج سلعه في الشركه التي تعمل بها . يقوم العمال في المراحل المختلفه لعملية الإنتاج بإدخال سجل في الجدول للاشاره الى الزمن المتبقي لإنها السلعه . نريد تحديد السلع التي لم تنته بعد . الحل : Solution ان عبارة SQL التاليه ستقوم بالعمل المطلوب . لاحظ استخدام نموذج Not In في الاستعلام الفرعي . SELECT DISTINCT WidgeID FROM Widgets As W1 WHERE 0 NOT IN (SELECT TimeToCompletion FROM Widgets As W2 WHERE W2.WidgetID = W1.WidgetID) زمن الانجاز2 : Time To Completion2 دعنا نقوم بتعقيد مشكلة الانجاز قليلا . تخيل ثانية أنك تتابع حالة إنتاج السلع في الشركة . تتألف كل سلعة من أربعة أجزاء , يتم تجميع كل منها على حدة . يتضمن الجدول (9-1) عينة من البيانات . سنحاول هنا تعيين أو تحديد السلع التي يكون فيها الجزء الأول (Module 1 ) هو الجزء الوحيد الكامل – أي أن قيمة Time To Completion تساوي الصفر من أجل الجزء الأول , ولكن مختلفة عن الصفر من أجل الأجزاء الأخرى في السلعة . الحل : Solution لنأخذ عبارة SQL التالية : SELECT WidgetID FROM Widgets AS W1 WHERE (TimeToCompletion = 0) AND 0 NOT IN (SELECT TimeToCompletion FROM Widgets AS W2 WHERE (W2.WidgetID=W1.WidgetID) AND (W2.ModuleID < > 1)) يحدد الاستعلام الفرعي من أجل سلعة معينة , جميع قيم Time To Completion لجميع الأجزاء باستثناء الجزء الأول . تستطيع بعد ذلك إجراء اختبار لرؤية فيما إذا كانت تلك المجموعة من أزمنة الانجاز Time To Completion تتضمن القيمة صفر . ويتضمن المثال (1-5) الكود الكامل . المثال (1-5) : مثال Time To Completion Private Sub TimeToCompletion( ) Dim db As Database Set db = CurrentDb Dim qry1 As QueryDef Dim sSQL1 As String On Error Resume Next db.QueryDefs.Delete "temp1" On Error GoTo 0 sSQL1 = "SELECT widgetID FROM widgets As W1" &_ " WHERE (TimeToCompletion = 0) AND" & _ " 0 NOT IN" & _ " (SELECT TimeToCompletion FROM Widgets AS W2" & _ "WHERE (W2.WidgetID=W1.WidgetID) AND (W2.ModuleID <> 1) )" Set qry1 = db.CreateQueryDef("temp1", Ssql1) DoCmd.OpenQuery qry1.Name End Sub زمن الانجاز III مسألة الحد الأعظم والحد الأدنى : Time To Completion III a MaxMin Problem دعنا نضيف مزيداً من التعقيد على مسألة زمن الانجاز . لنفترض أن كل جزء مؤلف من عدة أقسام . وسيقوم العمال المكلفين بقسم معين بإدخال قيد في جدول قاعدة البيانات وبشكل دوري , وذلك كما هو مبين في الجدول (1-10) . ونرغب هنا بحساب زمن انجاز كل قسم , وجزء وسلعة . لاحظ أنه يمكن أن يكون هناك عدة قيود من أجل قسم معين . وزمن الانجاز اللازم لقسم معين هو الحد الأدنى للأزمنة في هذه الصفوف . الحل الاول : Solution1 دعنا نعتمد طريقة تقوم على مبدأ الخطوة خطوة . وتستطيع لاحقاً عرض حل أكثر أناقة ولكنه أكثر صعوبة للفهم والقراءة . نقوم أولا بإنشاء عبارة SQL تعيد فقط صفوف الجدول لكل سلعة / جزء التي لها أصغر زمن انجاز للقسم Time To Completion . ونستطيع القيام بذلك على مرحلتين . تقوم أول عبارة SQL بتحديد حقل Time To Completion لجميع السجلات في المجموعة Widgets والتي لها قيم معينة لكل من Widget ID , Module ID , Part ID . ' Time to completion for given WidgetID/Modul*ID/PartID sSQL1 = "SELECT TimeToCompletion FROM Widgets2 As W2" & _ " WHERE (W2.WidgetID = W1. WidgetID)" & _ " And (W2.ModuleID = W1.ModuleID)" & _ " And (W2.PartID = W1.PartID)" أما عبارة SQL الثانية فتعيد جميع السجلات التي يكون فيها Time To Completion أصغر أو مساوٍ لجميع السجلات التي تمت إعادتها في عبارة SQL الأولى , أي جميع السجلات المتعلقة بقيم معينة Widget ID , Module ID , Part ID . ' Those records that have minimum time to completion for each part sSQL2 = "SELECT WidgetID, ModuleID, PartID," & _ " TimeToCompletion AS TimeToFinishPart FROM Widget2 AS W1" & _ " WHERE TimeToCompletion <= ALL (" &sSQL1&")" هناك طريقة أخرى تقوم على استخدام عبارة Select متشابكة وحيدة : sSQL2 = "SELECT WidgetID, ModuleID, PartID," & _ " (SELECT MIN(TimeToCompletion)" & _ " FROM Widgets2 as W2 WHERE" & _ " (W2.WidgetID = W1.WidgetID) And" & _ " (W2.ModuleID = W1.ModuleID) And" & _ " (W2.PartID = W1.PartID)" & _ " AS TimeToFinishPart" & _ " FROM Widgets2 AS W1 بتنفيذ هذا الاستعلام : Set qry1=db.CreateQueryDef("temp1", sSQL2) DoCmd.OpenQuery qry1.Name سنحصل على الجدول (1-11) . وباستخدام الاستعلام التالي يصبح من السهل الحصول على زمن الانجاز لكل جزء . ' Time to finish each module sSQL3 = "SELECT WidgetID, ModuleID," & _ " Max(TimeToFinishPart) AS TimeToFinishModule FROM " & qry1.Name & _ " GROUP BY WidgetID, ModuleID" Set qry2 = db.CreateQueryDef("temp2", sSQL3) ' Show it DoCmd.OpenQuery qry2.Name يتضمن الجدول (1-12) نتائج تنفيذ هذا الاستعلام . أخيراً نستطيع حساب زمن الانجاز لكل سلعة : ' Time to finish each Widget sSQL4 = "SELECT WidgetID," & _ " Max(TimeToFinishModule) AS TimeToFinishWidget FROM " & _ qry2.Name & " GROUP BY WidgetID" Set qry3 = db.CreateQueryDef("temp3", sSQL4) والنتائج مبينة في الجدول (1-13) . الحل الثاني : Solution2 من الممكن الحصول على زمن الانجاز باستخدام عبارة SQL وحيدة , رغم أننا لا ننصح بذلك . قد تكون النتائج أكثر أناقة , ولكنها صعبة القراءة . سيكون لدينا مثلاً من أجل الأجزاء (Modules) : sSQL1 = "SELECT DISTINCT WidgetID, ModuleID, " & _ " TimeToCompletion FROM Widgets2 AS W1" & _ " WHERE TimeToCompletion = " & _ " (SELECT MAX(TimeToCompletion) FROM Widgets2 As W2" & _ " WHERE TimeToCompletion = " & _ " (SELECT MIN(TimeToCompletion) FROM Widgets2 As W3" & _ " WHERE (W3.WidgetID = W2.WidgetID) " & _ " And (W3.ModuleID = W2.ModuleID) " & _ " And (W3.PartID = W2.PartID)" & _ " Group BY W3.WidgeetID, W3.ModuleID, W3.PartID)" & _ " AND (W2.WidgetID = W1.WidgetID)And(W2.ModuleID = _ " W1.ModuleID)" & GROUP BY W2.WidgetID, W2.ModuleID)" إن هضم عبارة SQL هذه سيكون صعباً ويتطلب وقتاً أطول , ونرجو أنها ستجعلك تعيد النظر باستخدام مثل هذه العبارات في تطبيقاتك المستقبلية . يتبع
  6. المجالات المتقاطعه Overlapping Intervals II : II تستخدم شركه عمالاً ومشرفين ، وخلال يوم عمل عادي ، يعمل كل عامل وكل مشرف ورديه واحده أو ورديتين ، تتألف من ساعات عمل متعاقبه ، يعرض الجدول ( 4-1 ) يوماً تقليدياً من الساعه 12 ظهراً وحتى الساعه 12 في منتصف الليل . نريد هنا حساب العدد الآعظمي للعمال الذين يشرف عليهم مشرف واحد في وقت معين . الحل : Solution يمكن معالجة هذه المشكله بإجراء مؤلف من مرحلتين ، نقوم اولاً بحساب عدد العمال في كل ساعه ونأخذ عبارة SQL التاليه : SELECT Hours.Hour, (SELECT Count(EmpType) FROM SuperLoad WHERE (Starthour <= Hours.Hour) And (Hours.Hour < EndHour) And (EmpType='Worker')) AS CountOfWorkers FROM Hours لاحظ هنا اننا نستخدم استعلاماً فرعياً يعيد سجلاً وحيداً يعطي عدد العمال الذين يعملون في ساعه معينه . بإستخدام عبارة SQL هذه نقوم بإنشاء استعلام اسمه qry1 بحيث يمكن استخدامه في المرحله الثانيه . انظر الجدول ( 1-5) من اجل نتائج هذا الإستعلام . الخطوه التاليه هي حساب تحميل المشرف على انه العدد الآعظمي للعمال في كل ورديه للمشرف ، نقوم بذلك باستخدام اسم الآستعلام من المرحله السابقه في عبارة SQL التاليه : sSQL = "SELECT SuperLoad.EmpID, SuperLoad.EmpType," & _ " (SELECT Max(CountOfWorkers) AS WorkerLoad" & _ " FROM [" & qry1.Name & "]" & _ " WHERE((Hours.Hour >= StartHour) And(Hours.Hour< Endhour)))" & _ " FROM SuperLoad " & _ " WHERE SuperLoad.EmpType = 'Super' " والنتائج مبينه في الجدول ( 1-6) والكود الكامل لهذا الحل مبينه في المثال ( 1-3) المثال ( 1-3) : حساب العدد الآعظمي للعمال من اجل كل مشرف . Private Sub SupervisorLoad( ) Dim db As Database Set db = CurrentDb Dim qry1 As QueryDef Dim qry2 As QueryDef Dim sSQL1 As String Dim sSQL2 As String On Error Resume Next db.QueryDefs.Delete "temp1" db.QueryDefs.Delete "temp2" On Error GoTo 0 sSQL = "SELECT Hours.Hour, " & _ " (SELECT Count(Emptype) FROM SuperLoad" & _ " WHERE(StartHour <= Hours.Hour) And (Hours.Hour < EndHour)" & _ " And (Emptype='Worker'))" & _ " AS CountOfWorkers" & _ " FROM Hours" Set qry1 = db.CreateQueryDef("temp1", sSQL1) ' Uncomment to see how this step looks ' DoCmd.OpenQuery qry1.Name sSQL = "SELECT SuperLoad.EmpID, SuperLoad.EmpType," & _ " (SELECT Max(CountOfWorkers) AS WorkerLoad" & _ " FROM [" & qry1.Name & "]" & _ " WHERE((Hours.Hour >= StartHour) And (Hours.Hour< Endhour)))" & _ " FROM SuperLoad " & _ " WHERE SuperLoad.EmpType = 'Super' " Set qry2 = db.CreateQueryDef("temp2", sSQL2) DoCmd.OpenQuery qry2.Name End Sub إجراءات عمليات الإسناد باستخدام القيمه الافتراضية : Assignment With Default Making تخيل وجود مؤتمر، ومهمتك فيه توزيع الحضور على قاعات المحاضرات ، يعرض الجدول ( 1-7) الحضور المسجل مع ارقام الغرف الموافقه . لاحظ ان الجدول يتضمن عدة خيارات افتراضيه ( Default ) وإذا لم يكن شخص موجوداً في الجدول ، فإنك تريد تخصيصه بغرفه من الغرف الآفتراضيه ، بالإضافه الى ذلك ، ولتجنب الازدحام في الغرف ، تريد تخصيص ارقام الغرف الافتراضيه بشكل عشوائي ، فكيف نقوم بذلك . الحل : Solution يمكن حل هذه المشكله بعدة طرق ، تقوم إحداها على استخدام الاستعلامات الفرعيه مع عبارةUNION لنأخذ اولا عبارة SQL التاليه : sSQL1="SELECT ROOM From Assignment WHERE (Name=[Enter Name])" نذكر بأن استخدام عبارة (Enter Narme ) هو عبارة عن وسيط . وعند تشغيل الاستعلام ، يتم الطلب من المستخدم إدخال اسم يتم استبداله بالوسيط المذكور ، ستعيد هذه العباره السجل الموافق لاسم معين إذا كان موجوداً ، وإلا فإنها ستعيد مجموعة سجلات فارغه . لتأخذ الآن عبارة SQL التاليه : يتظمن المثال ( 1-4 ) الكود الكامل لتنفيذ الحل المطلوب . معالجة توزيع الغرف الافتراضية والمحجوزة مسبقا . sSQL2 = "SELECT Room FROM Assignment" & _ "WHERE (Name = '_default') AND ([Enter Name] NOT IN (SELECT Name FROM Assignment))" إن عبارة [Enter Name] NOT IN (SELECT Name FROM Assignment) ستعيد القيمه True إذا وفقط إذا كان الاسم الذي ادخله المستخدم غير موجود في الجدول وبالتالي فإن عبارة sSQL2 يمكن ان تكتب من جديد استناداً الى حالتين : 1.الاسم في الجدول sSQL2 = "SELECT Room FROM Assignment WHERE (Name = '_default') AND False" 2. الاسم ليس في الجدول sSQL1 = "SELECT Room FROM Assignment WHERE (Name = '_default') AND True" ويمكن اختصار العباره من اجل حالة الاسم في الجدول لتصبح : sSQL2 = "SELECT Room FROM Assignment WHERE FALSE والعبارة من اجل حالة الاسم ليس في الجدول : sSQL1 = "SELECT Room FROM Assignment WHERE (Name = '_default')" وهكذا فإن العباره ستعيد مجموعة سجلات فارغه اذا كان الاسم في الجدول والسجلات الافتراضيه اذا لم يكن الاسم في الجدول . سنأخذ الآن دمج أو توحيد العبارتين : sSQL3=sSQL1 & "UNION" & sSQL2 ستعيد هذه العباره رقم الغرفه من اجل اسم اذا كان الاسم في الجدول وإلا فإنها ستعيد السجلات الافتراضيه ان كل ماتحتاجه الان هو استرجاع سجل عشوائي . لاحظ ان ذلك يمكن ان يعمل في كلا الحالتين ، لانه اذا كان الاسم في الجدول ، فهناك سجل واحد وبالتالي فإن الخيار العشوائي هو ذلك السجل . يتضمن الكود التالي الشيفرة الكاملة للحل المطلوب معالجة توزيع الغرف الافتراضية والمحجوزة مسبقا . Private Sub AssignmentWithDefault( ) Dim db As Database Set db = CurrentDb Dim sName As String Dim qry1 As QueryDef Dim rs As Recordset Dim sSQL1 As String Dim sSQL2 As String Dim sSQL3 As String Dim lRandom As Long Dim lcRecords As Long On Error Resume Next db.QueryDefs.Delete "temp1" On Error GoTo 0 sSQL1 = "SELECT Room FROM Assignment" & _ "WHERE (Name = [Enter Name])" sSQL2 = "SELECT Room FROM Assignment" & _ "WHERE (Name = '_default') AND ([Enter Name] NOT IN (SELECT Name FROM Assignment))" sSQL3 = sSQL1 & " UNION " & sSQL2 Set qry1 = db.CreateQueryDef("temp", sSQL3) sName = InputBox("Enter name") qry1.Parameters(0) = sName ' لمشاهدة النتائج ' 'DoCmd.OpenQuery qry1.Name Set rs = qry1.OpenRecordset ' Populate and get recordCount rs.MoveLast lcRecords = rs.RecordCount ' Random record Randomize Timer ' lRandom is between 0 and lcRecords-1 lRandom = Int(lcRecords * Rnd) rs.MoveFirst rs.Move lRandom MsgBox "Room for " & sName & " is " & rs!Room End Sub يتبع
  7. قواعد البيانات بين النظرية والتطبيق اعزائي الكرام السلام عليكم ورحمة الله وبركاته سنناقش في هذاالموضوع عدداً من المشاكل التي قد تصادفكم لدى تعاملكم مع البيانات , وسنعرض الحلول الممكنه لها. واقترح أن تحاولوا إيجاد حل قبل قراءة الحل المعطى في النص . وعلينا أن نشير هنا إلي أن هناك عدة طرق لحل مشكلة معينة . في الحقيقه قد نتمكن من الحصول على حل أكثر فعاليه من الحل المقترح هنا إن الهدف الأساسي من هذه المشاكل والحلول هي إعطاؤكم غذاء فكريا نافعا . قبل البدء, دعونا نشير إلي أن الكثير من الحلول المقترحة يعتمد على استخدام الاستعلامات الفرعيه . يسمح Access SQL بأستخدام عبارات SeIectضمن عبارات SeIect أخرى (كما هي الحال في عبارات أخرى مثل عبارات (INSERT INTO) . تدعى عبارة SeIect الداخليه أو المتشابكه بالاستعلام الفرعي. لاحظ أنه يمكن أن تضمن عبارة SeIect داخليه ضمن عبارة SeIect أساسية فقط إذا كانت عبارة SeIect الداخلية تعيد سجلا واحدا على الأغلب ولبيان ذلك لنأخذ عبارة SQL الأساسية التالية: SELECT HOUR, (Select Count(Interval) From StartTimes WHERE (StartTime <=Hour)) FROM HOURS تعيد عبارة Select الداخلية : Select Count(Interval) From StartTimes WHERE (StartTime <=Hour) على الأغلب سجلاً واحدا لأنها تعيد عدد (Count) لاحظ أيضاً أن ظرف WHEREفي عبارة SeIect الداخليه يشير إلى حقل HOUR الذي هو جزء من عبارة SQL الرئيسية , وبالتالي فانه يقوم بربط القيمه المسترجعه للعبارة الداخلية إلى السجل الحالي في جدول HOURS المجاميع الجارية : Running Sums يعتبر حساب المجاميع الجارية من العمليات الشائعه ولبيان هذا المفهوم سنأخذ الجدول ( 1-1) الذي يتضمن المدد الزمنيه ( محسوبة بالساعة ) لعدة أحداث . ونريد أن نحسب لكل حدث مجموع المدد الزمنية للآحداث التي تسبقه يدعي هذا المجموع بالمجموع الجاري . الحل : Solution إن إحدى طرق الحل هي بإجراء الجداء السلمي للجدول مع نفسه نستطيع بهذه الطريقه الوصول إلي جميع السجلات التي يسبق رقم حدثها ( Event ) رقم سجل (أوحدث) معين . على سبيل المثال ,من أجل السجل الخامس ، نحتاج الي الوصول إلي السجلات التي تتضمن الاحداث رقم 1 وحتى 4 . أن الجداء السلمي يعطينا هذه السجلات . إليك عبارة SQL التي تقوم بهذا العمل : SELECT Running.Event, Sum(RunningCopy.Duration) AS StartTime FROM Running, Running AS RunningCopy WHERE (RunningCopy.Event < Running.Event) GROUP BY Running.Event يقوم ظرف FORM بإنشاء الجداء السلمي للجدول مع نفسه . أما ظرف WHERE فيحدد السجلات التي تحقق المعيار Running Copy.Event < Running. Event أي ان السجلات التي ستقدم المعلوكات حول السجلات التي تسبق كل سجل في الجدول ( 1-1 ). أخيرا ، نقوم بتجميع النتائج حسب الحدث ( Group By Event ) وحساب مجموع المدد الزمنية . ان المشكلة هي ان الجداء السلمي غير فعال ويستخدم حجما كبيرا من الموارد ( إذا كان عدد سجلات الجدول ( 1-1 ) 100000 سجل فإن الجداء السلمي سينفذ عملية ضرب على 100000 × 100000 سجل أي 10.000.000.000 سجل . ان الحل الاكثر فعالية هو استخدام عبارة Select متشابكة ( داخلية ) أي استخدام عبارة Select ضمن عبارة Select اساسية . نعود لنذكر هنا بأن Access SQL يسمح بذلك اذا كانت العبارة الداخلية تعيد على الغالب سجلا واحدا . لاحظ استخدمنا لألقاب ( نسخ ) للجدول في عبارة Select التالية ونحتاج الى هذه الالقاب لاننا سنشير الى الجدول ( 1-1 ) في سياقين Select R1.Event (Select Sum(R2.Duration) From Running As R2 Where R2.Event <R1.Event) As StartTime FROM Running As R1 ان عبارة SQL الداخلية : Select Sum(R2.Duration) From Running As R2 Where R2.Event <R1.Event تعيد مجموع المدة لجميع الاحداث التي تسبق الحدث الحالي ، والذي نشير إليه بالعبارة R1.Event يعرض المثال ( 1-1 ) اجرائية VBA لتنفيذ عبارة SQL السابقة . ويستخدم الكائن DoCmd في VBA لتشغيل اجراء Access وبالتالي فأن السطر البرمجي : DoCmd.OpenQuery يقوم بفتح استعلام في Access المثال ( 1-1 ) : حساب المجموع الجاري بإستخدام عبارة SQL Private Sub RunningSumSQL () Dim db As ADO.Database Set db = CurrentDb Dim qry As ADO.QueryDef Dim sSQL As String On Error Resume Next db.QueryDefs.Delete "temp" On Error GoTo 0 sSQL = "SELECT R1.Event," & _ " (SELECT SUM(R2.Duration)" & _ "FROM Running As R2" & _ "WHERE R2.Event < R1.Event)" & _ "AS StartTime" & _ " FROM Running As R1" Set qry = db.CreateQueryDef("temp", sSQL) DoCmd.OpenQuery qry.Nqme End Sub هناك طريقة أخرى تقوم على استخدام ADO الذي يؤمن طريق أو حل بسيط في هذه الحالة فهو ينشئ جدول نتائج دائم في حين ان الحل السابق يقوم بإنشاء استعلام تحديد ويعرض المثال ( 1-2 ) شفرة ADO التي تنفذ نفس العمل Private Sub RunningSumDAO( ) Dim db As Database Dim rs As Recordset Dim lRunningSum As Long Set db = CurrentDb lRunningSum = 0 Set rs = db.OpenRecordset("SELECT * FROM Running ORDER BY Event") Do While Not rs.EOF rs.Edit rs!RunningSum = lRunningSum rs.Update lRunningSum = lRunningSum + rs!Duration rs.MoveNext Loop rs.Close End Sub المجالات المتقاطعة : Overlapping Interavl تشير الصفوف في الجدول ( 1-2 ) الى مجالات زمنية ، المشكلة هي تعيين من أجل كل ساعة من اليوم ، عدد المجالات التي تتضمن هذه الساعة . ولحل هذه المشكلة نستخدم جدول HOURS المبين في الجدول ( 1-3 ) الحل : Solution يمكن حل هذه المشكلة بإستخدام عبارة Select متشابكة ( أي بإستخدام استعلام فرعي ) والكود التالي يقوم بالعمل المطلوب : Private Sub OverlappingIntervals( ) Dim db As Database Set db = CurrentDb Dim qry As QueryDef Dim sSQL As String On Error Resume Next db.QueryDefs.Delete "temp" On Error GoTo 0 sSQL = "SELECT Hours.Hour, " & _ " (SELECT Count(Interval) AS CountOfIntervals" & _ " FROM Overlap" & _ " WHERE (StartTime <= Hours.Hour) And" & _ " (Hours.Hour < EndTime))" & _ " FROM Hours" Set qry = db.CreateQueryDef("temp", sSQL) DoCmd.OpenQuery qry.Name End Sub يتبع
  8. اعزائي الكرام السلام عليكم ورحمة الله وبركاته كما وعدناكم اهديكم هذا العمل الجميل لتعلموا قوة برنامج الاكسيس من الناحيتن الجمالية والعملية فهذه مفكرة مواعيد تم عملها ببرنامج الاكسيس ثنائية اللغه عربي / انجليزي تستطيع الاختيار بينهما لترى الواجهة والقاعدة تتحول مباشرة الى الوضع المطلوب سواء عربي او انجليزي . يوجد بالبرنامج عدة افكار جميلة وغاية في الروعة لمحبي الاكسيس ومنها : 1. تقويم عربي و انجليزي 2. بحث متطور 3. ارسال بريد 4. امكانية استخدام التعبيرات في المواعيد 5. امكانية ادخال المواعيد بالعربية او الانجليزية 6. معاينة التقارير وطباعتها وهناك الكثير الكثير واترككم تستمتعون بها ودراسة الاكواد . اختكم زهره Access_Diary_Daily.rar
  9. اخي الكريم شاهر السلام عليكم ورحمة الله وبركاته يوجد عدة حلول لهذه المشكلة وخاصة مع ويندوز XP وسأقوم بشرحها اولا : الطريقة اليدويه . عن طريق تعطيل مدير المهام Disable Task Manager حسب الطريقة التالية : 1. ابدأ 2. تشغيل 3. اكتب التالي gpedit.msc ثم موافق 4. سيظهر لك لوحة Group Policy 5. ستجد اسفل نهج الكمبيوتر المحلي اختيارين هما *. تكوين الكمبيوتر *. تكوين المستخدم اختر تكوين المستخدم واختر منها قوالب الادارة ثم اختر منها System ثم اختر منها Ctrl+Alt+Del Options ستظهر لك في الجهة المقابلة اربعة اختيارات اختر منها الاولى وهي Remove Task Manager . وقم بالضغط عليها بالماوس الايمن واختر خصائص . سيظهر لك ثلاثة اختيارات *. غير ممكن *. ممكن *. معطل اختر منها رقم 2 ( ممكن ) ثم موافق وقم بإغلاق كل شيء . 6. الان جرب استخدام الضغط على المفاتيح Ctrl+Alt+Del دفعة واحدة لن تستطيع الدخول على مدير المهام وهذا هو المطلوب . الطريقة الثانية عن طريق الريجستري الخاص بالويندوز xp تحذير : ان اي خلل او عبث في ملف الريجستري سيوقف نظام الويندوز نهائيا ولن تستطيع تشغيلها الا عن طريق اعادة تحميلها من جديد . كما ترى اخي شاهر وجميع الاخوان انني لم ارغب في التطرق لهذا الموضوع الا لفئة قليلة جدا من محترفي الويندوز والاكسيس والذين يعرفون كيفية التعامل مع اخطاء الريجستري الخاص بالويندوز والسبب انه في حال تعطل الريجستري فلا يوجد لها حلول يمكن تقديمها لك لان ملف الريجستري يوجد لديك انت فقط ولكل جهاز اعداداته الخاصه به مع ان هناك برامج تقوم بعملية الاصلاح ولهذا نتجنب العبث بهذا الملف حتى لا يتم التدمير الكامل للويندوز وفقد كافة البرامج الخاصة بك . سأورد لك بعض الامثلة البسيطة انت وجميع الاخوان تستطيعون تجربتها بحيث لا تأثر على ملف الريجستري وتستطيعون حذفها برمجيا ايضا عن طريق الاكسيس. الدالة () SaveSetting هذه الدالة تستخدم مع برنامج الاكسيس وتقوم بكتابة وتخزين بعض القيم في محرر الريجستري الخاص بالويندوز . مثال عملي : سنقوم بإدراج الكلمات الخاصة سواء عربية او انجليزية داخل محرر الريجستري بواسطة برنامج الاكسيس حسب الكود التالي : 1. انشئ زر امر على نموذج ومن ثم اختر حدث عند النقر وضع هذا الكود SaveSetting appname := "officena", section := "zahrah", _ key := "za", setting :=1 الان اغلق الاكسيس ومن ثم اذهب الى محرر الريجستري حسب الطريقة التالية 1. ابدأ 2. تشغيل واكتب في المستطيل regedit 3. سيظهر لك محرر الريجستري انتقل الى تحرير واختر بحث 4. اكتب officena ثم موافق 5. سيقوم المحرر بالبحث عن هذه القيمه الجديده 6. اضغط من لوحة المفاتيح F3 حتى تظهر لك القيمه officena وتحتها القيمة ZAHRAH ومقابلها ZA وقيمتها 1 الان نرغب في استدعاء هذه القيمه لاستدعاء هذه الدالة نستخدم الدالة ()GetSetting حسب الكود GetSetting appname := "officena", section := "zahrah", _ key := "za", setting :=1 ولالغاء هذه القيمه نستخدم الدالة DeleteSetting حسب الكود التالي DeleteSetting "officena", "zahrah" يفضل وضع كل امر في زر امر خاص به لمشاهدة النتيجه في محرر الريجستري . كمت رأيتم انه يمكن كتابة قيم وتحريرها وحذفها من خلال الكود في الاكسيس . الان سوف نقوم بالبحث عن مدير المهام Task Manager في الريجستري بالطريقة العادية . الان اغلق الاكسيس ومن ثم اذهب الى محرر الريجستري حسب الطريقة التالية 1. ابدأ 2. تشغيل واكتب في المستطيل regedit 3. سيظهر لك محرر الريجستري انتقل الى تحرير واختر بحث 4. اكتب DisableTaskMgr ثم موافق 5. سيقوم المحرر بالبحث عن هذه القيمه الجديده 6. اضغط من لوحة المفاتيح F3 حتى تظهر لك القيمه وستظهر هذه القيمة في HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System بعد ان عرفنا موقعها في محرر الريجستري نرغب في تمكينها او تعطيلها من خلال الكود في الاكسيس . تحذير : ان اي خلل في هذه العملية سيوقف نظام الويندوز اذا لم تكن لديك الخلفية القوية عن كيفية التعامل مع محرر الريجستري فدع العبث به وقم بإستخدام الطريقة اليدوية . SaveSetting appname := "HKEY_CURRENT_USER", section := "Software\Microsoft\Windows\CurrentVersion\Policies\System", _ key := "DisableTaskMgr", setting :=1 ملاحظة القيمة 0 ( صفر ) تمكين القيمة 1 ( واحد ) عدم التمكين الان اخرج من الريجستري وقم بعملية اعادة تشغيل الويندوز لتفعيل القيمة المدرجة الجديده لإيقاف هذه العملية وتمكين مدير المهام مره اخرى قم بوضع الكود التالي في زر امر SaveSetting appname := "HKEY_CURRENT_USER", section := "Software\Microsoft\Windows\CurrentVersion\Policies\System", _ key := "DisableTaskMgr", setting :=0 وبهذا نكون قد انتهينا من هذه المشكلة برمجيا بواسطة الاكسيس اختكم زهره
  10. اختي الغالية ليـــــــــــــنا حداد السلام عليكم ورحمة الله وبركاته البرنامج مفتوح المصدر وليس به اي حماية كل ما هنالك انه تم اختيار وضع النموذج يعمل في البدية من خلال قوائم الاكسيس ومن ثم اختيار ادوات ثم بدء التشغيل ثم اختيار النموذج المطلوب . ولعرض البرنامج في الوضع العادي لإظهار اطار قاعدة البيانات قومي بعمل التالي : 1. قبل فتح قاعدة البيانات قومي بضغط مفتاح الشفت Shift من لوحة المفاتيح ثم افتحي البرنامج ستجدين ان اطار قاعدة البيانات ظهر . 2. من قوائم الاكسيس اختاري ادوات ثم بدء التشغيل ثم ضعي علامة صح على اطار قاعدة البيانات .
  11. الطريقة الثانية لتعطيل مفاتيح لوحة المفاتيح كما لاحظتم اعزائي الكرام من الطريقة الاولى انه تم استخدام رقم المفتاح ورقم الشفت الخاص به . اما في هذه الطريقة التي نحن بصدد شرحها فتختلف قليلا لاننا سوف نستخدم اسم المفتاح مباشرة في الكود والان دعونا نتعرف على اسماء المفاتيح وكيفية استخدامها مفتاح Control vbKeyControl مفتاح Alt vbkeymenu مفتاح الادخال Enter vbKeyReturn مفتاح Back Space vbKeyBack مفتاح Tab vbKeyTab مفتاح Shift vbKeyShift مفتاح Caps Lock vbKeyCapital مفتاح Esc vbKeyEscape مفتاح Space Bar vbKeySpace مفتاح Page Up vbKeyPageUp مفتاح Page Down vbKeyPageDown مفتاح End vbKeyEnd مفتاح Home vbKeyHome مفتاح Left arrow vbKeyLeft مفتاح Up arrow vbKeyUp مفتاح Right Arrow vbKeyRight مفتاح Down Arrow vbKeyDown مفتاح Print Screen vbKeyPrint مفتاح Pause vbKeyPause مفتاح Insert vbKeyInsert مفتاح Delete vbKeyDelete مفتاح Help vbKeyHelp مفتاح Numlock vbKeyNumlock مفتاح F1 vbKeyF1 مفتاح F2 vbKeyF2 مفتاح F3 vbKeyF3 مفتاح F4 vbKeyF4 مفتاح F5 vbKeyF5 مفتاح F6 vbKeyF6 مفتاح F7 vbKeyF7 مفتاح F8 vbKeyF8 مفتاح F9 vbKeyF9 مفتاح F10 vbKeyF10 مفتاح F11 vbKeyF11 مفتاح F12 vbKeyF12 مفتاح A vbKeya ينطبق هذا على مفاتيح جميع الاحرف حتى مفتاح Z vbKeyz مفاتيح الارقام التي في الجهة اليمنى من لوحة المفاتيح وينطبق عليها ما ينطبق على مفتاح الرقم صفر vbKey0 vbKey1 vbKey2 vbKey3 vbKey4 vbKey5 vbKey6 vbKey7 vbKey8 vbKey9 طريقة الاستخدام هذه الطريقة لا تحتاج الى مفتاح تغيير ( shift ) وانما يوضع فقط اسم المفتاح ومثال ذلك على المفاتيح Control و Alt و Delete ملاحظة : هذا الكود يعمل مع ويندوز 98 و ME و 2000 اما ويندوز XP فالطريقة تختلف وسنوردها في الطريقة الثالثة . Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Dim CTRL_1 As Boolean Dim CTRL_2 As Boolean Dim CTRL_3 As Boolean CTRL_1 = vbKeyControl CTRL_2 = vbKeyMenu CTRL_3 = vbKeyDelete On Error Resume Next Select Case KeyCode Case vbKeyControl CTRL_1 = True Case vbKeyMenu CTRL_2 = True Case vbKeyDelete CTRL_3 = True End Select If CTRL_1 And CTRL_2 And CTRL_3 Then CTRL_1 = False CTRL_2 = False CTRL_3 = False End If End Sub وهذا مثال مرفق Disable_Key_In_Form.rar
  12. اعزائي الكرام جميعا اخي ابو شاهر السلام عليكم ورحمة الله وبركاته سأورد لكم ثلاث طرق للحل تستطيعون تطبيقها لحل هذه المشكلة اما الطريقتين الاولى والثانية فهي سهلة وسأقوم بشرحها والتطبيق عليها بأمثلة اما الطريقة الثالثة فهي متقدمة جدا وتحتاج الى ذوي خبره عالية في برنامج الاكسيس وفي نفس الوقت خطره لمن لا يعرف طريقة تطبيقها وسأوردها بعد ان نحترف الطريقتين الاولى والثانية وأعلم ان الجميع يرغب في معرفة الطريقة الثالثة وعموما هي ( اعطاء قيم من خلال برنامج الاكسيس الى محرر الريجستري الخاص بالويندوز ) ولهذا اقول انها متقدمة جدا وخطره في نفس الوقت لمن لا يعرف الطريقة لان اي خطأ في كتابة الكود وارساله للريجستري سيؤدي مباشرة الى توقف الويندوز مباشرة لهذا سندعها في الوقت الراهن ونبدأ بشرح الطريقتين الاولى والثانية . الطريقة الاولى : كما يعلم الجميع ان اي مفتاح في لوحة المفاتيح Keyboard يحمل رقم خاص به ( KeyCode ) ورقم تغيير ( ShiftCode ) دعونا نرى على سبيل المثال مفتاحي PageUP و PageDown فلهم القيم التالية : PageUP رقم المفتاح 33 رقم الشفت 0 PageDown رقم المفتاح 34 رقم الشفت 0 وطريقة استخدامها مع برنامج الاكسيس سهلة جدا من خلال اختيار حدث عند ضغط المفتاح للاسفل واختيار مفتاح العرض التمهيدي على نعم KeyPreview: Yes كالتالي : Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 33, 34 KeyCode = 0 End Select End Sub كما نرى من خلال الكود ان الارقام 33 و 34 هي ارقام محجوزه لمفتاحي الصفحة لأعلى والصفحة لأسفل ورقم الشفت الخاص بهما هو صفر ومهمة رقم الشفت هو تعطيل المفتاح عن العمل لحظة الضغط عليه وهذا ينطبق على بقية مفاتيح لوحة المفاتيح . ستجد مثال يمكن الاستفادة منه في معرفة رقم اي مفتاح على لوحة المفاتيح كل ما عليك هو الضغط على المفتاح وسيظهر لك مباشرة رقم المفتاح ورقم الشفت الخاص به ومن ثم تستطيع استخدام الكود السابق لايقاف عمل المفتاح . بعض من ارقام لوحة المفاتيح : مفتاح Shift رقم المفتاح 16 رقم الشفت 1 مفتاح Control رقم المفتاح 17 رقم الشفت 1 مفتاح Alt رقم المفتاح 18 رقم الشفت 4 مفتاح Win رقم المفتاح 91 رقم الشفت 0 مفتاح Delete رقم المفتاح 46 رقم الشفت 0 مفتاح الحرف D رقم المفتاح 68 رقم الشفت 0 مفتاح F1 رقم المفتاح 112 رقم الشفت 0 مفتاح F2 رقم المفتاح 113 رقم الشفت 0 مفتاح F3 رقم المفتاح 114 رقم الشفت 0 مفتاح F4 رقم المفتاح 115 رقم الشفت 0 مفتاح F5 رقم المفتاح 116 رقم الشفت 0 مفتاح F6 رقم المفتاح 117 رقم الشفت 0 مفتاح F7 رقم المفتاح 118 رقم الشفت 0 مفتاح الهروب Esc رقم المفتاح 27 رقم الشفت 0 تستطيعون اكمال الباقي واستخراج بقية المفاتيح بواسطة المثال المرفق . تطبيق عملي على استخدام تعطيل مفتاح Home Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 36 KeyCode = 0 End Select End Sub تطبيق عملي مع مثال مرفق على تعطيل عدة مفاتيح دفعة واحدة ( مفاتيح المساعدة ) من F1 الى F12 لهم نفس رقم الشفت Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 112,113,114,115,116,117,118,119,120,121,122,123 KeyCode = 0 End Select End Sub تطبيق عملي على تعطيل عدة مفاتيح دفعة واحدة لهم ارقام شفت مختلفه مفتاح Esc ومفتاح Shift ومفتاح Alt Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 27 KeyCode = 0 Case 16 KeyCode = 1 Case 18 KeyCode = 4 End Select End Sub نلاحظ من الاكواد السابقة انه اذا كان مفتاح التغيير ( الشفت ) لمجموعة مفتاح يحمل نفس القيمه فيكتفى بوضعه لمرة واحده فقط كما في كود تعطيل مفاتيح المساعدة F1 - F12 واذا اختلف مفتاح التغيير ( الشفت ) للمفاتيح فيوضع كل مفتاح على حده كما في الكود الاخير . لا تنسى اختيار مفتاح العرض التمهيدي ووضعه على نعم KeyPreview: Yes تابع معنا الطريقة الثانية لتعطيل مفاتيح لوحة المفتايح اختكم زهره KeyCode.rar NoHelp.rar
  13. جزاكم الله خيرا على هذا الاطراء انتظروا مفاجأة برنامج الاكسيس والذي تعتبر من اروع واجمل ما تم عمله بواسطة الاكسيس من حيث تسخير الاكواد النادره والقويه ولن يقدر تلك الاكواد الا محترفي برنامج الاكسيس . قريبا ........ الهدية الرائعة الثانية اختكم زهره
  14. اعزائي الكرام السلام عليكم ورحمة الله وبركاته اهديكم هذا العمل ببرنامج الاكسيس وهو عبارة عن دليل هاتف شخصي به امكانية الحفظ والتعديل والبحث بثلاثة طرق والاتصال بالهاتف او الارسال للفاكس مع امكانية استخدام الـ skin كل ما عليكم مشاهدة ما يمكن عمله بالاكسيس . اختكم زهره For_ALL.rar
  15. اخي الفاضل ابو هادي السلام عليكم ورحمة الله وبركاته لا يسعني الا ان اتقدم لك بالشكر الجزيل وفعلا هذا هو المطلوب عمله بالاستعلام فسلمت يداك وحرمهما الله من النار . لقد استبعدت فكرة الاستعلامات نهائيا وكنت افكر بطريقه اخرى قد تكون معقدة بعض الشيئ . ختاما لك مني كل الشكر والتقدير . بالمناسبة لكم عندي هديتين سأضعهما في المنتدى لك ولكل الاعضاء اختكم زهره
  16. بارك الله فيك اخي ابو هادي فكرة التعديل سليمة جدا ولكن لا زالت المشكلة في الصفحات البيضاء . عموما حاول من طرفك وانا ايضا سأحاول
  17. السلام عليكم ورحمة الله وبركاته وحياكم الله جميعا واعلم انني مقصرة بحق المنتدى نظرا لانشغالنا وكثرة الطلبات في منتدى الاكسيس في الفريق العربي عموما سنحاول بقدر المستطاع المشاركه الجاده ان شاء الله تعالى عما قريب . اخي ابو هادي هذا السؤال اخي ابوهادي نشف مخي فقد قمت ببرمجة الكود على اساس انه يطبع فقط الصفحات المحتوية على بيانات والتي ستظهر اثناء اختيارها سواء كانت فرديه او زوجيه وتمت التجربه وكان كل شيئ يسير على ما يرام ولكن ظهرت مشكلة ان برنامج الاكسيس عندما يصل الى العدد 100 يبدأ في خربطة الكود والصفحات فيقوم بطباعة الزوجية والفرديه معا فقد تمت التجربة على 115 صفحة من التقرير وعندما رأيت ان الوضع لا يمكن تقبله استغنيت عن هذه الفكره وجعلت الكود يطبع فقط الصفحات الفرديه او الزوجيه حسب الاختيار مع ظهور صفحات بيضاء سواء كانت فرديه او زوجيه وقد اوحت لي هذه الصفحات الخالية بفكرة ان المستخدم ربما يريد معرفة ما هي الصفحات الفرديه او الزوجيه المطبوعة فقط ويستطيع التمييز بواسطة الصفحات البيضاء التي لا تحتوي على بيانات ولو رغب في طباعة الصفحات الزوجية فلديه الورق الخارج من الطابهة نظيف يمكن استخدامه مرة اخرى . لقد جربت هذه الطريقه اخي ابو هادي ولكن اعترضني الكود الموجود في النموذج فهو يحمل نفس القيمة وعند القيام بما تفضلتم به يصبح تعارض في الكود وقد حاولت ايضا وضع ما هو موجود في الماكرو في وحدة نمطية جديده ولكن المشكلة لا يمكن استدعاؤها لانه لابد ان يكون اثناء الاختيار النموذج مفتوح ولهذا حاول ان تفتح التقرير بدون فتح النموذج سيعترض عليك الكود برسالة من الاكسيس لوجود شرط في النموذج من خلال خانة الاختيار Me.PrintPage واذا كان لديك اي حلول او اقتراحات فأهلا ومرحبا ويمكن التعديل لما هو افضل . ختاما لكم مني كل الشكر والتقدير اختكم زهره
  18. اعزائي الكرام السلام عليكم ورحمة الله وبركاته قد تكون الفكرة جديده من حيث رسم جدول في التقرير برمجيا كما في جداول الوورد والاكسيل فإليكم هذا البرنامج الصغير وتجدون الشرح الكامل على الكود في التقرير المرسوم برمجيا ويمكن استخدام هذه الفكره في الفواتير او عند التحكم الكامل بخطوط التقرير . Draw_Table_In_Report.rar
  19. اعزائي الكرام السلام عليكم ورحمة الله وبركاته اليكم برنامج معاينة وطباعة الصفحات الفردية او الزوجية في التقارير من خلال نموذج سهل الاستخدام وطريقة عمله من خلال الكود انه بعد اختيارك لنوع الصفحات سواء فردية او زوجيه تستطيع معاينتها او طباعتها zahrah_Report.rar
  20. الاخ جمال فايز السلام عليكم ورحمة الله وبركاته يمكن عمل ذلك بالاكسيس في التقرير من خلال الطريقة التالية : 1. انشئ جدول وضع به كل الحقول المطلوبه من حقل الاسم والرقم وغيره من الحقول وبالتأكيد انك سوف تدرج ايضا حقل نعم / لا لاحد الحقول . 2. انشئ تقرير مبني على الجدول السابق بنفس الحقول جميعا بما فيها حقل نعم / لا 3. اثناء فتح التقرير سيظهر لك الحقل الذي اخترت له علامة نعم / لا عبارة عن مربع اسود وبداخله علامة الصح او يكون فارغ 4. الان تريد ازالة المربع والابقاء على علامة الصح فقط 5. قم بفتح التقرير في وضع التصميم وقم بحذف المربع مع علامة الصح ( تأكد من اسم المربع الذي سوف تحذفه ) 6. قم بإدراج مربع نص غير منظم وضعه مكان مربع النص الذي حذفته واعطه نفس الاسم ومصدر عنصر التحكم كما هو من الجدول مثلا لو انك وضعت في الجدول خانة الوظيفه Job عندها ( نعم / لا ) فإحرص ان يكون مربع النص الغير منظم له نفس البيانات 7. اختر خصائص مربع النص الغير منظم واذهب الى تبويب تنسيق وضع في التنسيق التالي : * . اختر خط Wingdings ثم اكتب فاصلة منقوطة ثم سلاش مائل جهة اليمين ثم اضغط على مفتاح Alt في لوحة المفاتيح ولا ترفع يدك عن المفتاح ثم من لوحة الارقام التي في جهة اليمبن من لوحة المفاتيح اكتب الرقم 0252 حسب الطريقة من اليسار لليمين ;\ü *. الان ارفع يدك عن مفتاح Alt وقم بعرض التقرير ستجد علامة الصح فقط تستطيع تلوين الخط وتكبيره حسب احتياجاتك وهذا مثال مرفق اختكم زهره Check_boxes_in_reports.rar
×
×
  • اضف...

Important Information