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

مذكرات حول تصمبم قواعد البيانات وتطبيقاتها

مثبّترائج
بدأه أحمد مبارك الحيقي في 16 أبريل 2009 · 363 رد · 126,620 مشاهدة · في قسم أرشيف الاكسيس التعليمي
مشاركة: واتساب X فيسبوك تيليجرام
#276

أخى الكريم أبو عارف

أهلا بك وسهلاً ومرحباً بيننا ..

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

تم تعديل هذه المشاركة بواسطة ايهاب عثمان في 30 أغسطس 2009 في 10:32

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#277

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

اخي أبو عارف مرحباً بك..

بعد اذنك وبعد اذن الأخ الكريم /محمد ندا

فقد قمت بحذف وتعديل بعض المشاركات التي لا داعي لوجودها...

أخ أبو عارف..

احب ان انوه أن المنتدى ليس عبارة عن حوار مباشر كما بالمسنجر بمعنى أنك تضع سؤالك هنا وخلال أقرب وقت تجد الاجابة عليه...

بانتظار سؤالك :D

طبتم واهتديتم :)

===================================

إقرأ معي

رابط متجدد لكتاب أقرؤه فشاركني فيه

======

فضائح الرافضة ومخازيهم حين يكتب عنها أحد خصومهم فهذا شيء متوقع ،فإن كتب عنها أحدهم فهو شيء غير مألوف ، وإن كان الكاتب أحد مراجعهم وأخص خواصهم فهذا شيء متناهي الغرابة ، وإن علمت أن الكاتب قد قتل بعد نشر الكتاب فقد حان وقت قراءة الكتاب

الكتاب :

حسين الموسوي - لله تم للتاريخ ، كشف الأسرار وتبرئة الأئمة الأطهار

اضغط على الصورة لتحميل الكتاب

%E1%E1%E5%20%CB%E3%20%E1%E1%CA%C7%D1%ED%CE.jpg

-----------

كتب سابقة

سعد الدين الشاذلي - مذكرات حرب أكنتوبر

#278

الأخ الكريم (أبو عارف)..

أهلاً بك وسهلاً، ويا مرحباً بك في هذا الشهر المبارك... ولكن مهلاً مهلاً، كلماتك كبيرة علي، وقد لاحظت أنك لست بغريب على اليمن:

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

بارك الله فيك، وجعلني عند حسن ظنك...

الأستاذ الفاضل إيهاب...

على الرغم من أنني لست على علم بما كان من مشاركات استحقت التعديل، لكنني على يقين بحسن إدارتك، والحمد لله على وجودك بيننا مشرفاً وموجهاً... شكراً جزيلاً.

#279

اللهم وفقك وبارك فى عملك ليصبح خالصاً لوجهه الكريم فى شهر تتضاعف فيه الحسنات ..

وزادنا الله جميعا علما نافعا

اللهم آآآآمين

#280

أستاذنا الفاضل إيهاب عثمان .. طبعاً لك كل الحق.

جزاك الله خيراً ووزادك من نعمه.

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

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 30 أغسطس 2009 في 18:48

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#281

السلام عليكم

اشكركم كل اخواني

ايهاب عثمان شهر كريم

اخواني انا اسف اذا صدر مني شي غير محبوب ولا مرغوب فيه

المهم اتمناء منكم السموحه

بس عندي سؤال في الاكسس

انا لست بخبير انما هاوي اكسس

عندي مشكله لم اجد لها حل

حاولت سهرت قرات كل مشاركات المنتدى ولم اوصل الى حل ؟

السؤال .... كيف استطيع ان اكون حساب داخل حساب داخل حساب داخل حساب ؟

#282

أخى الكريم أبو عارف

لا اعتذار ولا حاجة ... وأهلا بك وسهلاً

ولكن هذا موضوع يخرج عن موضوع هذه السلسلة وليس ضمن فروعها .. استخدم البحث وستجد ما تريد تماماً.

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

ويمكنك عمل بحث سريع عن كلمة شجرة فقد فعلت ذلك للتجربة ووجدت فيه إحدى عشر موضوعاً عن شجرة الحسابات.

وةالتالى أحد أروع هذه المشاركات لأستاذنا الرائع كمال النحال .. وقد طالعته وأعتقد أنه ما تبحث عنه (حساب داخل حساب إلى ما لا نهاية)

/index.php?showtopic=160204

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 30 أغسطس 2009 في 23:57

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#283

الأخ (أبو عارف).. أرجو أن يكون رد الأستاذ محمد ندا كافياً (كالعادة)، ومرة أخرى، أهلاً بك بين إخوانك في المنتدى...

رقم الحلقة (31)

تصفية السجلات

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

ما هي فكرة التصفية؟

التصفية هي استبعاد غير المرغوب. وهذا يعني انتقاء أو اختيار المرغوب. عندما تنتقي شخصاً ما لوظيفة تقدم إليها، فإن هناك على الأقل خاصية واحدة تختبرها لتنظر هل تحقق معياراً ما أم لا. مثلاً، أنت تنظر في خاصية آخر مؤهل، والشرط: هل هو جامعي أم لا؟ من الممكن أن يكون الشرط هو: هل هو فوق المستوى الثانوي؟ من الممكن أيضاً أن تنظر في خاصية أخرى وشرط آخر؛ مثلاً، الخبرة العملية: هل هي على الأقل سنتان؟ خاصية ثالثة؟ العمر؟ ممكن، أن يكون بين 25 و45 مثلاً.

الخصائص التي نملكها عند الحديث عن سجلات جدول هي الأعمدة، ولذلك، ستنظر عند تصفية السجلات في قيمة عمود أو أكثر، وتختبرها، هل تحقق شرطاً أو أكثر. الشروط في مجملها، كما هو الحال في المثال السابق، مقارنات من نوع أو آخر. قد تقارن قيمة حقل لتنظر هل (يساوي) قيمة محددة (في المثال السابق، هل المؤهل هو جامعي؟)، أم تقع ضمن مجال محدد من القيم (في المثال السابق، مجال العمر). المقارنات تمتد لتشمل أكثر من مجرد المقارنات الرياضية (=، >، <، =>، =<، <>)، إلى اختبار مطابقة قيمة ما لنمط معين pattern، بل حتى مقارنة قيمة حقل مع قائمة من القيم. لا تقلق، سنرى بإذن الله أمثلة بعد قليل.

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

في مقطع WHERE، أنت تستخدم كلمات خاصة محجوزة في اللغة لتجري هذه المقارنات مع عمود أو أكثر من الجدول. ولذلك، تسمى هذه الكلمات (عوامل مقارنة comparison operators). كما أشرت في الفقرة السابقة، عوامل المقارنة على أنواع. دعنا الآن نمر سريعاً على أهم هذه العوامل، لنرى كيف يمكن استخدامها في SQL.

المقارنات الرياضية

العوامل الرياضية مألوفة جداً للجميع، وإذا رجعنا إلى جدولنا المثال في الحلقة السابقة، فإن بإمكانك أن تطبق الأمثلة التالية التي توضح كيفية استخدام المقطع WHERE:

post-70171-1251732151_thumb.jpg

SELECT * FROM tblEmployee WHERE EmpNo = 7934

هذه العبارة تستعيد السجل الأخير فقط (بكل حقوله). لاحظ أننا استخدمنا المفتاح الأساسي، وهو رقم الموظف، لتحديد سجل واحد فقط. طبعاً، شرط المساواة قد يعيد أكثر من سجل، مثل الاستعلام التالي:

SELECT * FROM tblEmployee WHERE EmpDept = 30

ويعيد التالي:

post-70171-1251732163_thumb.jpg

مثال آخر:

SELECT EmpNo, EmpName, EmpSal FROM tblEmployee WHERE EmpSal <= 2000

الناتج من هذه العبارة هو:

post-70171-1251732171_thumb.jpg

وهذا يستخلص السجلات التي تحقق الشرط التالي: الراتب أصغر أو يساوي 2000 (دولار؟ ريال؟ جنيه؟ بإمكانك أن تحلم!).

والآن، انظر كيف نكتب الشروط الخاصة بالنصوص والتواريخ في الأكسس:

SELECT * FROM tblEmployee WHERE empHireDate > #15/12/1981#

الناتج هو:

post-70171-1251732179_thumb.jpg

لاحظ كيف يحاط التاريخ بين علامتي الهاش #. طبعاً الاستعلام أعلاه يعيد كل حقول السجلات التي تحقق الشرط: تاريخ التعيين أكبر من 15/12/1981 (لماذا هذا الاستعلام؟ لست أدري، ربما كانوا يريدون معرفة كل من تم توظيفه بعد سنة من افتتاح الشركة).

إذا أردت أن تعرف الرقم الوظيفي لمدير SCOTT، فيمكنك كتابة الاستعلام التالي:

SELECT EmpManager FROM tblEmployee WHERE EmpName = "SCOTT"

لاحظ من فضلك علامتي التنصيص حول القيمة النصية.

مقارنات المجال

ربما كانت القيم التي تريدها في حقل ما تقع في مجال محدد، مثلاً، لا تريد الموظفين الذين تم توظيفهم بعد تاريخ محدد، ولكن تريد الموظفين الذين تم توظيفهم في فترة محددة بين تاريخين (ربما فترة المدير السابق ). أو تريد استعادة الموظفين الذين تقع رواتبهم بين قيمتين. من أجل ذلك، تقدم SQL المعامل BETWEEN… AND…، وهو يستخدم كالتالي:

SELECT * FROM tblEmployee WHERE EmpSal BETWEEN 2000 AND 3000

الناتج هو:

post-70171-1251732187_thumb.jpg

لاحظ أن القيمتين 2000 و3000 تدخلان في المجال المطلوب.

المقارنات مع قائمة من القيم

من الممكن أن تختبر القيم في حقل ما لتنظر هل هي واحدة من قائمة من القيم. هذه القائمة من الممكن أن تكتبها بنفسك في الاستعلام، لكن ستعلم فيما بعد أنك من الممكن أن تجلب قائمة من القيم عبر عبارة استعلام كاملة من جدول آخر. العامل المستخدم هنا هو IN، واسمه معبر جداً. في هذه المرحلة، دعنا نفترض أنك تريد بيانات ثلاثة من الموظفين: SMITH وJONES و MILLER:

SELECT * FROM tblEmployee WHERE EmpName IN ("SMITH", "JONES", "MILLER")

المقارنات مع الأنماط Pattern Matching

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

ما هي الـ wildcard characters؟

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

post-70171-1251732196_thumb.jpg

والآن، ما الذي يعنيه هذا؟

انظر إلى الكلمة التالية، ثم انظر إلى بعض الطرق التي يمكن أن تصفها بها باستخدام wildcard characters:

SMITH

?MITH

SM?TH

SMIT?

SMITH*

SMITH

*SMITH

SM*

S*

SMIT*

SM*TH

S*H

[s-Z]MITH

[sXZ]MITH

SMIT[!A-G]

والآن، دعنا نفترض بعض الحالات... مثلاً، أنت تريد بيانات الموظف (سكوت)، ولا تذكر رقمه، ولست متأكداً من أن اسمه ينتهي بحرف T واحد أو اثنين، لكنك تعلم أنه يبدأ بت(SCOT)، بدلاً من أن تنفذ الاستعلام مرتين (وتسمح للناس بأن يعيّروك بأنك لا تعرف الـ wildcard characters!)، من الممكن أن تكتب التالي:

SELECT * FROM tblEmployee WHERE EmpName LIKE "scot*"

لاحظ شيئين: الأول أنني تعمدت أن أكتب بحروف صغيرة حتى تعلم أنه لا فرق، والثاني أننا وضعنا النمط بين علامتي تنصيص لأن النمط يعامل كنص، حتى لو كنا نقارنه بأرقام كالتالي:

SELECT * FROM tblEmployee WHERE EmpNo LIKE "756#"

هنا، أنت تعلم أن رقم الموظف المطلوب يبدأ بـ(756)، لكنك نسيت الرقم الأخير. سيحضر الاستعلام بيانات الموظف JONES.

تمرين: جرب استخدام هذه الرموز في الاستعلام عن بيانات الموظف الذي تم تعيينه في سنة 1982.

اختبار القيم الخالية

من الأمور التي ينبغي أن تعيرها انتباهاً مفهوم القيمة الخالية. الكلمة المحجوزة NULL تعبر عن هذا المفهوم. هذه القيمة تستخدم في أي حقل من أي نوع لتدل على أن الحقل لم يستقبل أي إدخال بعد، أو أنه استقبل إدخالاً خاصاً بالقيمة الخالية NULL. لماذا تم ابتكار هذه القيمة؟ ألسنا نملك الصفر، والنص الفارغ ""؟ بلى، ولكن الصفر قيمة قد يكون لها دلالة معينة في الحقل، غير أن هذا الحقل فارغ. مثلاً، قيمة الخصم قد تكون صفراً بصورة متعمدة للدلالة على أن الخصم (مقداره) صفر، وهذا يعني ن الحقل ليس فارغ، ولكن قيمته صفر. أما القيمة الخالية فلها دلالات أخرى من أجلها تك ابتكار هذا المفهوم؛ هذه الدلالات هي:

  • القيمة غير معروفة (مثلاً، لسنا نعلم هل للموظف رقم هاتف).
  • القيمة مفقودة (مثلاً، للموظف هاتف، لكننا لا نعرف رقمه حالياً).
  • القيمة غير قابلة للتطبيق (مثلاً، ليس للموظف هاتف أصلاً).

كل هذا التنظير القصد منه أن القيمة NULL هي قيمة مستقلة تختلف عن الصفر وعن السلسلة النصية الفارغة ("")، ولها دلالة خاصة. ما يهمنا هنا، أنه يحدث كثيراً أنك تحب أن تستبعد في استعلاماتك السجلات التي تحوي هذه القيمة الخالية في حقل ما، أو بالعكس، قد ترغب بشكل خاص باستعادة السجلات التي تحوي بعض حقولها هذه القيمة الخاصة (مثلاً، ما هي الأصناف التي ليس لها أرقام رف).

تقدم SQL العاملين IS NULL و IS NOT NULL من أجل هذه المهمة. وكمثال على استخدامهما، لنفرض أننا نود الاستعلام عن الموظفين الذين يملكون هواتف في مكاتبهم. العبارة التالية تقوم بالغرض:

SELECT * FROM tblEmployee WHERE EmpPhone IS NOT NULL

الناتج من هذا الاستعلام هو:

post-70171-1251732205_thumb.jpg

لاحظ كيف أن الموظف TURNER قد ظهر في النتيجة بسبب أن حقل رقم هاتفه يحوي الحرف (0) بالخطأ. إذا أردت أن تعرف المدير من بين هؤلاء الموظفين، فابحث عن الموظف الذي لا مدير له! أي أن قيمة الحقل EmpManager هي القيمة الخالية:

SELECT * FROM tblEmployee WHERE EmpManager IS NULL

من الذي سيعيده هذا الاستعلام؟

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

(يتبع إن شاء الله)...

تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 31 أغسطس 2009 في 18:31

#284

أخى أحمد .. وأفخر أن أقولها خبيرنا المعتمد أحمد مبارك الحيقى

ألف مليون مبروك للترقية التى تستحقها عن جدارة وهى لقب يصفك ويرادف عطاءك الفياض ,,

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

وكنت أتمنى أن أكون أول من يرى خبر الترقية ويهنئك عليه .. ولكن سبقنى كثير من الإخوان وهم بطبعهم سباقون للخير

وعفواً لعدم متابعتى خلال اليوم أو الأصح أن نقول أمس .. فقد عدت إلى منزلى الآن فقط وهى تقترب من الثانية صباحاً.

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

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 1 سبتمبر 2009 في 02:34

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#285

جزاك الله خير الجزاء على هذه الحلقة

وزادك من فضله وعلمه

اللهم آمين

ودمت بخير وصحة وسلام

#286

ما شاء الله تبارك الله

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

المرة دى رسمى يا باشا

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

وألف مبروك

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

(اللى هيقرب من المشاركة بتاعتى مش هاقول لكم هاعمل ايه)

:)

{العلم قبل العمل} ... مذكرات حول قواعد تصميم البيانات .

خير الناس أنفعهم للناس

#287

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

تحية شكر وتقدير وإجلال

التحية أولاً لمشرفي هذا الصرح العظيم وكل سنة وأنتم جميعاً يامشرفينا بألف خير

والتحية الثانية لصاحب الموضوع الذي أبدع بالفكرة ونفذها وأقتطع جزءً من وقته ليعلمنا

حقيقة ياأستاذ أحمد دورتك هذه كان ينتظرها الملايين " ليست مبالغة00 "

فما نجده في مشاركات المنتديات فيما يخص sql لايعدو عن تقديم سمكة بينما أنت تعلمنا كيف نصيد

فأنظر أي الأمرين أفيد

وأنا على يقين أن أمثالك هم من يأخذوا بأيدى المتعلمين العرب في علم البرمجة إلى بر الأمان وتعليمهم طريق التعلم

فلك مني أخلص تحية وتقدير

أخوك أحمد

#288

الف مبروك استاذي احمد على الترقية تستحقها واكثر الله يبارك فيك وزيدك من فضله وعلمه

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

وجزاك الله خير عن كثير من المساعدات الي تقدمها لاعضاء المنتدى

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

#289

ما شاء الله لا قوة إلا بالله

أكثر من رائع (خبيرنا) المتواضع.. زادك الله رفعة فى الدنيا والأخرة

إزدادت الحلقات قيمة وجمالا بإضافة التطبيقات العملية عليها . فجزاك الله خيرا.

#290

رقم الحلقة (32)

في البدء، أحب أن أنبه إلى أن المثال عن استخدام wildcard characters في الحلقة السابقة لم يكن دقيقاً بسبب اتجاه الكتابة العربي؛ للأسف، باءت محاولاتي لتنسيقه بالفشل...

والآن، نعود إلى تصفية السجلات...

العوامل المنطقية

ربما لاحظت أن أمثلة التصفية السابقة كانت تحوي مقارنة لحقل واحد مع قيمة واحدة، أو مع مجال من القيم، أو قائمة من القيم، أو

مع نمط نصي باستخدام wildcard characters... لكن هناك دائماً شرط واحد فقط. يحدث في كثير من الأحيان أن تحتاج إلى اختبار شرطين أو أكثر، ربما لنفس الحقل أو لأكثر من حقل، من أجل تصفية السجلات المعادة. مثال على ذلك، ربما كنت تريد معرفة الموظفين الذين تم توظيفهم قبل العام 1982، لكن راتبهم مازال تحت 1500. هذا الاختبار يحوي شرطين، وكل شرط يفحص حقلاً، واحد رقمي، والآخر حقل تاريخ. من أجل دمج أكثر من شرط في مقطع WHERE واحد، تقدم SQL العامل المنطقي AND، والعامل OR.

عوامل منطقية...! وهل بقية العوامل غير منطقية؟!

أخذت هذه العوامل نسبتها من علم المنطق، حين كان الناس بمزاج رائق لاختبار أمور مفروغ منها، على صعيد محاولة تأسيس طريقة رسمية للتفكير والاستنتاج. مثلاً، لنفرض أن كل عبارة لها قيمتان فقط: إما صحيحة وإما خاطئة. إذا كان لدينا عبارتين، فما قيمة العبارة الناتجة عنهما معاً؟ هذا يختلف حسب طريقة الجمع بينهما، وحسب قيمة العبارتين. على سبيل المثال، لنفترض أنك بدين، ولكي لا تنزعج، فلنفرض أنك وسيم أيضاً. عبارة مثل (أنت نحيف) هي خاطئة، لكن عبارة مثل (أنت نحيف أو وسيم) هي صحيحة، لأن الرابط (أو) يضمن أنك لن تخرج من المولد بلا حمص مادام هناك مولد أو حمص، أقصد أن الناتج هو صحيح مادام أحد الفرضين صحيح.. نحن نستفيد من هذا الهراء في الحاسوب في تطبيقات كثيرة، مثل التصميم المنطقي للدوائر، وهومبني على الجبر البولي Boolean Algebra، الذي يرتب الناتج من مثل هذه العمليات في جداول تسمى (جداول الحقيقة!) truth tables، حيث لكل عامل جدول يحدد الاحتمالات المختلفة لقيم الفرضيتين اللتين تدخل في الاختبار، والناتج من كل احتمال. نستفيد من هذه الجداول في عبارات SQL، وفي العبارات الشرطية في لغات البرمجة أيضاً.

دعنا الآن من كل هذا (المنطق)، ولنر واحداً من هذه الجداول، لواحد من هذه العوامل، حتى نستطيع أن نمسك شيئاً في أيدينا. سأعبر عن هذا الجدول بكلمات تعبر عن موضوعنا. أفترض أن الشرط قيمته (صحيح) إذا تحقق، وقيمته (خطأ) إذا لم يتحقق. لننظر أولاً إلى العامل AND:

post-70171-1251916473_thumb.jpg

العامل AND يختبر تحقق الشرطين معاً في نفس الوقت. الشرط الناتج لن يكون محققاً إلا إذا كان كلاً من الشرطين محققاً. مثلاً، هل أنت نحيف؟ لا. هل أنت وسيم؟ نعم. هل أنت نحيف (و) ووسيم؟ لا. فقط إن كنت نحيفاً ووسيماً في نفس الوقت، فإن الناتج هو نعم.

كيف نستفيد من هذا في تصفية السجلات؟ في المثال السابق، أنت تريد أن يتحقق شرطان معاً: الموظف تم توظيفه قبل عام 1982، (و) راتبه أقل من 1500. يمكن اعتبار الناتج من هذين الشرطين شرطاً كبيراً لن يتحقق إلا إذا تحقق كلا الشرطان. إذا كان الموظف لا يحقق واحداً من الشرطين، فأنت لا تريد استعادة سجله، ولذلك استخدمت العامل (و) AND.

ولكن، لنفرض أنك تود معرفة الموظفين المرشحين لنيل زيادة في الراتب. أنت تبحث الآن عن أي موظف تم توظيفه قبل عام 1982، (أو) راتبه أقل من 1500: تحقق واحد من الشرطين يكفي لاستعادة السجل. في هذه الحالة تستخدم العامل OR، الذي يبدو جدول صحته كالتالي:

post-70171-1251916483_thumb.jpg

لاحظ أن هذا العامل مرن جداً: مادام واحد من الشرطين الداخلين في الاختبار صحيحاً (محققاً)، فإن الشرط الناتج هو محقق أيضاً. أنت تستطيع استخدام هذين العاملين لجمع عدد من الشروط في عبارة واحدة.

قبل الأمثلة، لا أريد أن أنسى أن هناك عاملاً منطقياً ثالثاً، هو عامل النفي: NOT. هذا العامل يستخدم للتأكد من أن شرطاً ما (ليس محققاً). أو إن شئت قل: يستخدم للتأكد من تحقق شرط بعدم صحة شرط ما (منطق، هه؟). مثلاً، أنت تريد أن تستعلم عن الموظفين الذين لا يبدأ اسمهم بالحرف S. لا أدري، ربما هو نوع من الحساسية من بعض الحروف. ربما كان أول مدرس رياضيات في حياتك يبدأ اسمه بهذا الحرف!

والآن، إلى الأمثلة (الجدول كاملاً مرة أخرى من أجل سهولة الرجوع إليه):

post-70171-1251916494_thumb.jpg

الموظفون الذين تم توظيفهم قبل عام 1982، وراتبهم أقل من 1500:

SELECT * FROM tblEmployee WHERE EmpHireDate< #1/1/1982# AND EmpSal < 1500

الناتج هو:

post-70171-1251916503_thumb.jpg

الموظفون الذين تم تعيينهم في عام 1981، ويعملون في القسم رقم 30، ولكن ليس مديرهم هو BLAKE ذي الرقم 7698:

SELECT * FROM tblEmployee WHERE (EmpHireDate Like '*1981') AND (EmpDept = 30) AND (EmpManager <> 7698)

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

الموظفون الذين إما تم تعيينهم قبل العام 1982، وإما يقل راتبهم عن 1500:

SELECT * FROM tblEmployee WHERE (EmpHireDate < #1/1/1982#) OR (EmpSal < 1500)

قارن الناتج مع عبارة AND السابقة:

post-70171-1251916514_thumb.jpg

عبارة OR أكثر مرونة، وقد أعادت كل الموظفين عدا SCOTT الذي تم توظيفه عام 1987 وراتبه 3000 (أرزاق!).

إذا كنت تريد تكره الحرف S خصوصاً، ولا تريد أي موظف يحوي اسمه هذا الحرف، فتستطيع أن تشفي غليلك بهذا الاستعلام:

SELECT * FROM tblEmployee WHERE EmpName Not Like "*s*"

هذا يستبعد كلاًمن Smith، Jones، Scott، Adams، James.

بعض المحاذير

لنفترض أنك تريد المطلوب التالي: كل الموظفين الذين يحققون الشرطين التاليين:

1. تم توظيفهم قبل العام 1982

2. راتبهم أقل من 1000 أو أنهم من القسم رقم 20 (قسم ممتاز يستحق الترقية).

لديك مبرمج قرأ الجزء السابق من الحلقة، ولم يكمل حتى هذا الجزء، فقام بكتابة التالي:

SELECT * FROM tblEmployee WHERE EmpHireDate < #01/01/1982# AND EmpSal < 1000 OR EmpDept =20

حاول أن تستنتج الناتج، يجب أن يكون تخمينك التالي (طبعاً، من الممكن أن تنفذ العبارة في الأكسس، لكن الأفضل أن تتدرب على آلية الاستعلام بنفسك):

post-70171-1251916522_thumb.jpg

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

الصحيح هو العبارة التالية:

SELECT * FROM tblEmployee WHERE EmpHireDate < #01/01/1982# AND (EmpSal < 1000 OR EmpDept =20)

وتعيد التالي:

post-70171-1251916531_thumb.jpg

حاول أن تتأمل في الفرق من ناحية المعنى. الاختلاف في العبارة هو فقط في وضع الأقواس بعد AND، بحيث يتم أولاً اختبار الـOR، ثم يتم اختبار الناتج بـ AND مع الشرط الأول (شرط التاريخ). في العبارة الأولى كان يتم تجاهل شرط التاريخ لأن شرط القسم يتحقق، والعبارات كلها مرتبطة بـ OR. حاول أن تفك طلاسم هذا المنطق، وإن لم تستطع، فيمكنك أن تضع ملحوظة صغيرة بعد الحلقة.

السبب في هذا اللبس كما رأينا هو ترتيب اختبار الشروط. بدون أقواس، يتم تنفيذ الاختبار بالترتيب من اليسار إلى اليمين، لكن باستخدام الأقواس، تستطيع إجبار الأكسس على اختبار شرط أولاً حتى لو لم يكن يقع في البداية (مثل اختبار الـ OR في المثال السابق بين شرط الراتب والقسم، قبل اختبار الـ AND بين شرط التاريخ وشرط الراتب). العبرة: انتبه لترتيب شروطك، واستخدم الأقواس بالشكل المناسب.

هل انتهينا من تصفية السجلات؟ ربما، لكننا لم ننته بعد من الإمكانيات الأخرى لتحديد وتقييد عدد السجلات المعادة... لكن هذا هو موضوع الحلقة القادمة بإذن الله... حتى ذلك الحين: هل من سؤال؟

(يتبع إن شاء الله)...

تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 2 سبتمبر 2009 في 21:48

#291

خبيرنا العزيز وأخونا الكريم الأستاذ/أحمد

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

محمد ندا

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#292

أستاذ / أحمد

جزاك الله خيراً على كل ما تقدمه لنا من معلومات قيمة فى هذه الدورة

وألف مبروك على الترقية إلى خبير معتمد

وكذلك أحب أن أهنئ الأخ / محمد ندا كذلك على لقب الأعضاء المجتهدين

بالتوفيق للجميع

وكل عام و أنتم بخير

مذكرات حول تصمبم قواعد البيانات وتطبيقاتها » بقلم الأستاذ / أحمد مبارك الحيقي

#293

أخى al m3tasem

مرحباً بك وألف شكر على تهنئتك .. وأرجو أن أكون عند حسن ظنكم بى .. هذا طبعاً عن نفسى فقط.

أما خبيرنا أحمد فهو ما شاء الله تخطى حسن الظن .....

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 4 سبتمبر 2009 في 00:46

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#294

رقم الحلقة (33)

رأينا كيف أنك تستخدم المقطع WHERE من أجل تقييد عدد السجلات المستعادة عبر تصفية السجلات. هذه التصفية تعني اختبار قيم حقل أو أكثر: هل تحقق شرطاً أو أكثر؟ هناك وسيلة أخرى لتقييد عدد السجلات المسترجعة، وذلك بمنع القيم المكررة، وباختيار عدد محدد من السجلات بغض النظر عن تحقق شرط ما غير أن تقع هذه السجلات في بداية أو نهاية مجموعة السجلات المعادة. نستخدم من أجل ذلك كلمات محجوزة تسنى Predicates، في مقطع SELECT قبل قائمة الحقول المختارة. فيما يلي توضيح لهذه الطريقة.

لا تذكرها مرتين (DISTINCT)

لفترض أن المدير الجديد يريد أن يأخذ فكرة عن أنواع الرواتب التي تصرف للموظفين، وطلب منك استعلاماً يعيد فقط أرقام الرواتب التي تصرف، وانسحبت أنت من عند المدير وأنت ترسم أمارات الجدية على وجهك، وفي داخلك ترتسم ابتسامة واسعة من الثقة؛ إنه استعلام تافه:

SELECT EmpSal FROM tblEmployee

أعاد الاستعلام التالي:

post-70171-1252172017_thumb.jpg

وكعادتنا دائماً في البداية، لم تراجع نتيجة استعلامك، وسحبتها مباشرة إلى المدير، وعوضاً عن كلمات الثناء، أشار المدير بأصبعه إلى عدد من الأرقام، وهو يقول: ولكن، لماذا هذه مذكورة مرتين؟

كان المدير يشير إلى أرقام مثل 1250، و3000. ومن حسن حظك أن الموظفين هم فقط 14، فلو كان عدد الموظفين 100 مثلاً، فإن المدير سيطالع 100 رقم أغلبها مكرر، وربما لن يشير عندها إلى الورقة، بل سيشير إليك وهو يهز أصبعه متوعداً.

لو كنت قرأت هذا المثال قبل أن تستعجل بإخراج النتيجة للمدير، لاستخدمت الكلمة المحجوزة DISTINCT قبل اسم الحقل EmpSal من أجل استبعاد القيم المكررة في هذا الحقل:

SELECT DISTINCT EmpSal FROM tblEmployee

النتيجة هي 12 سجلاً بدلاً من الـ14 سجلاً السابقة (1250 و3000 موجودتان مرة واحدة فقط لكل منهما).

تمرين: حاول أن تغير الاستعلام السابق إلى التالي، وتنفذه:

SELECT DISTINCT EmpSal, EmpNO FROM tblEmployee

ماذا كانت النتيجة؟ ما الذي تستنتجه؟

الترتيب أولاً ORDER BY Clause

بعد يومين، نسي المدير الطيب حكاية الرواتب، وطلب منك أن تستخرج له آخر ثلاثة موظفين تعييناً. هذه المرة، تعمدت أن تطلع على المثال هنا قبل أن تنفذ الاستعلام، لكنك كنت تتساءل في نفسك باستمرار: الموضوع هنا ليس مسألة تقييد عدد سجلات... الموضوع فيه ترتيب! أنت على حق كالعادة، ولذلك دعنا نر أولاً كيف ترتب SQL مجموعة السجلات المعادة...

من أجل ترتيب مجموعة من السجلات، يجب أن تحدد الحقل (أو مجموعة الحقول) التي سيتم الترتيب على أساسها. تستطيع أن ترتب الموظفين مثلاً حسب حقل الراتب. في حالة تشابه الرواتب لبعض الموظفين، فيمكن بعدها ترتيب سجلات الموظفين النتشابهين في الراتب حسب الاسم. دعنا نر كيف يمكنك ترتيب الموظفين حسب تواريخ تعيينهم من أجل طلب المدير:

SELECT * FROM tblEmployee ORDER BY EmpHireDate

فقط، بكل بساطة! أضف المقطع ORDER BY (رتّب حسب) إلى الأمر SELECT، وحدد الحقل أو الحقول التي تنوي أن ترتب مجموعة السجلات بحسبها، مع مراعاة ترتيب ذكر الحقول، لأن ترتيب السجلات سيتم بناءً على الحقل الأول، ثم حسب الحقل التالي في حالة تساوي قيمة الحقل الأول، وهكذا.

النتيجة من الاستعلام السابق هي:

post-70171-1252172029_thumb.jpg

ربما لا تبدو هذه النتيجة مريحة بالنسبة لك، لأن التواريخ الأقدم مذكورة أولاً، وأنت تنبهني في كياسة إلى أن المدير يتوقع أن يجد أحدث التواريخ أولاً. لقد فكروا في هذا طبعاً عندما صمموا SQL، أليس كذلك؟ أنت تسأل. والحق أن نباهتك هذه الأيام مرتفعة بشكل ملحوظ (أهو نقص السكر في رمضان؟ ولكن، كيف؟)، والحق أن SQL تقدم الكلمتين المحجوزتين ASC وDESC اللتين تستخدمهما بعد كل حقل في المقطع ORDER BY لتحدد نوع الترتيب المطلوب: تصاعدي من الأدنى إلى الأعلى (ASC)، أو تنازلي من الأعلى إلى الأدنى (DESC). طبعاً، من الواضح أنك تحتاج إلى الطريقة الثانية تحديداً، وعلى هذا، فإن العبارة تصبح:

SELECT * FROM tblEmployee ORDER BY EmpHireDate DESC

والناتج هو:

post-70171-1252172044_thumb.jpg

والآن، لنعد إلى طلب المدير، فإنه لن ينتظر طويلاً...

أريد فقط الأول (TOP)

أنت الآن تفكر كيف يمكن استخلاص ثلاثة سجلات فقط من بداية النتيجة السابقة؟ من الممكن طبعاً أن تستخدم المقطع WHERE، وتحدد شرطاً على حقل التاريخ، ليكون أكبر أويساوي 23/01/1982. هذه الطريقة تفترض أنك تعلم قيمة أصغر ثلاثة تواريخ نعيين سلفاً، وهي جامدة بطريقة رهيبة، بحيث لو وقف المدير على رأسك الآن وفكر فجأة (بعد ما أعجب بكفاءتك) أن يستعلم عن أعلى ثلاثة رواتب، فإنك ستكون مضطراً لترتب أولاً الموظفين حسب رواتبهم تنازلياً، لتعرف أعلى ثلاثة رواتب، ثم تضيف مقطع WHERE لتكنب الشرط بناءً على أكبر ثالث راتب مثلاً. إذا كانت لدى المدير أدنى فكرة عن SQL (ربما مر على هذه الحلقة بينما كان يتصفح المنتدى بعد التراويح)، فإنه سيعيد النظر في مدى كفاءتك، ولربما نصحك بمطالعة هذه الدورة في تأنيب، وأنت طبعاً ستقول: ولكنه لم يكن قد وصل إلى تلك النقطة بعد، لقد خُدعت!

على كل حال، هكذا تستخدم الكلمة المحجوزة TOP أجل استعادة أول ثلاثة سجلات:

SELECT TOP 3 * FROM tblEmployee ORDER BY EmpHireDate DESC

فقط؟ نعم، فقط. أضف كلمة TOP بعد SELECT، ثم حدد عدد السجلات التي تريدها (أي عدد صحيح، في حالة كان العدد أكبر من عدد السجلات كلها، فإن كل السجلات يتم استرجاعها). نتيجة هذا الاستعلام هي:

post-70171-1252172055_thumb.jpg

لاحظ من فضلك أن نتيجة استخدام TOP تعتمد على ترتيب السجلات في المقام الأول، ثم على طريقة الترتيب. في حالة ترتيب الرواتب مثلاً تنازلياً، فإن TOP 5 تسترجع أعلى خمسة رواتب، أما في حالة ترتيب السجلات حسب الراتب تصاعدياً، فإن TOP 5 تسترجع أصغر خمسة رواتب. في حالة عدم استخدام المقطع ORDER BY، فإن TOP 4 على سبيل المثال ستعطيك أي أربعة سجلات عشوائياً حسب ملفات مساعدة أكسس، وإن كنت ستلاحظ عملياً أن الترتيب يتبع ترتيب إدخال السجلات (لا تعتمد على هذا).

هناك تنويع آخر للكلمة TOP، وهو أن تستخدمها مع الكلمة PERCENT (نسبة مئوية). وعلى هذا، فإن العدد المحدد بعد TOP يعني نسبة مئوية من العدد الكلي للسجلات. دعنا نر مثالاً على ذلك:

SELECT TOP 50 PERCENT * FROM tblEmployee ORDER BY EmpNo

كم عدد السجلات التي تتوقع أن يعيدها هذا الاستعلام؟ أنا شخصياً أتوقع أن تعيد التالي:

post-70171-1252172066_thumb.jpg

الترتيب حسب رقم الموظف مفهوم، لكن لماذا كان عدد السجلات المسترجعة 7 بالتحديد؟ ذلك لأن 50 (كما في العبارة) تعني 50%، وذلك يعني النصف، ونصف 14 هو 7.

هذا كل شيء عن تحديد عدد السجلات. والآن: هل من سؤال؟

ملحوظة: بسبب قلة (وإن شئت قل: انعدام الاستفادة من هذه الدورة، كما يبدو من نوعية التفاعل)، بدأت أفكر في أن اختيار رمضان للدورة كان خطأً منذ البداية، وبدأت تراودني خواطر عن التوقف عن الدورة... لكنني لست من النوع الذي يستسلم للخواطر بسهولة!

(يتبع إن شاء الله)....(؟)

#295

أخى الكريم والعزيز أحمد

مرحباً بك

اقتباس
ملحوظة: بسبب قلة (وإن شئت قل: انعدام الاستفادة من هذه الدورة، كما يبدو من نوعية التفاعل)، بدأت أفكر في أن اختيار رمضان للدورة كان خطأً منذ البداية، وبدأت تراودني خواطر عن التوقف عن الدورة... لكنني لست من النوع الذي يستسلم للخواطر بسهولة!

(يتبع إن شاء الله)....(؟)

ربما تسبب فى ذلك عاملين من وجهة نظرى:

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

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

عموماً إذا كنت ترى أن يتم التأجيل إلى ما بعد رمضان فالرأى لك فى النهاية ولا نرغب أن نثقل عليك فى هذه الأيام المباركة فكفانا ما نفعله فيما عداها.

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 5 سبتمبر 2009 في 20:59

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#296

الأستاذ / أحمد

جزاك الله خيراً وجعله الله فى ميزان حسانتك إن شاء الله

بالنسبة لقلة التفاعل فى موضوع الـ SQL هو لقلة خبرتنا بها كما أشار الأخ محمد ندا

فعن نفسى حين أجد موضوع عن SQL لا أدخله ظناً منى أنه عالم أخر

لكن بفضل الله تعالى تعلمنا من خلال هذه الدورة (السليسلة :D ) بعض أساسيات اللغة وكيفية إسترجاع بعض السجلات وفقاً لشرط معين

جزاك الله خيراً وبارك الله فيك

مذكرات حول تصمبم قواعد البيانات وتطبيقاتها » بقلم الأستاذ / أحمد مبارك الحيقي

#297

بارك الله فيك

واتمنى أن لا تحبطك قلت المشاركات

ربما نحن نقراء ونطبق

ولكن لا يوجد استفسارات

والمطلوب والأهم هو الفهم والإستفادة

وتقبل الله صيامك وقيامك

ودمت بخير وصحة وسلام

#298

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

أحببت فقط أن أطمئنكم على أخينا أحمد مبارك الحيقى ،، حتى لا يتسرب إليكم قلق عليه أو على السلسلة ،، فهو والحمد لله بخير ويتابع المنتدى.

ولكن لديه ما يشغله الآن عن المشاركة ،، وسيتابع إن شاء الله فى وقت قريب ،،

فكلكم يعلم ما فى رمضان من مشاغل وارتباطات ،، خاصة أنه قارب على الفراق (أقصد رمضان).

تحياتى

محمد ندا

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#299

إخوانى الكرام ..

كل عام وأنتم بخير بمانسبة عيد الفطر المبارك أعاده الله علينا وعليكم بكل الخير والبركة

وتقبل الله منا ومنكم صالح الأعمال .

post-29007-1253279549_thumb.gif

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

post-29007-1253279562_thumb.gif

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

post-29007-1253279572_thumb.gif

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

تحياتى

محمد ندا

تم تعديل هذه المشاركة بواسطة Mohamed Nada في 18 سبتمبر 2009 في 16:26

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

#300

تقبل الله منا ومنكم الصيام والقيام، وصالح العمل، إنه سميع عليم.

شكراً أخي على التهنئة... دائماً سبّاق!

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

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

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

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

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