المتابعون للمدونة

الأربعاء، 28 سبتمبر 2016

بلوك


* يا اللي انتي عاملالي Block
أنا لسة باصص في الـ Clock
خليني بس آخد لي Look
وعد ف كلامي أنا مش هلوكّ

محمد حمدي غانم، ٢٠١٦

 

طرد إلى السعودية


منذ يومين أرسلت طردا إلى صديق سعودي، وهو في الطريق الآن، وبإذن الله يصل بالسلامة ‏J.. يمكنكم تتبع رحلة الطرد برقمه المسلسل cp600110926eg من خلال موقع البريد المصري:

أو موقع البريد السعودي:

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

لطلب مجموعة كتب VB.NET:

لطلب مجموعة كتب C#:

الثلاثاء، 27 سبتمبر 2016

يا زائر الرحمن


يا زائرَ الرحمنِ يا عمّي رءوفْ = لبَّى رجاءَكَ ربُّنا البَرُّ الرؤوف

فانعمْ وزوجُكَ في ضيافةِ بيتِهِ = لا تَنسَنا بِدعاكَ حينَ بِه تَطوفْ

واشهدْ على عرفاتَ آلافَ الوَرَى = مِن كافّةِ البلدانِ جاءوا للوقوفْ

لبّيكَ ربَّ البيتِ ما أحييتَنا = لَبّيكَ حمدًا لا تُحيطُ به الحروفْ

محمد حمدي غانم، 2016

 

إنشاء الإجراءات المخزنة في Access


إنشاء الإجراءات المخزنة في قواعد بيانات Access:

على عكس ما يظنه الكثيرون، يمكن استخدام الإجراءات المخزنة مع قواعد بيانات آكسيس.. لكن المشكلة أنك لن تجد طريقة لإنشائها في آكسيس نفسه (في الإصدارات السابقة لأكسيس 2010)، كما أنك لا تستطيع إنشائها في متصفح الخوادم Server Explorer في دوت نت، رغم أنك ستجد عنصرا اسمه Stored Procedures ضمن عناصر قاعدة بيانات الكتب Books.mdb!

فما هو حل هذا اللغز العجيب يا ترى؟

الحل هو تنفيذ الجملة التي تنشئ الإجراء المخزن من خلال كود فيجيوال بيزيك في أحد برامجك لمرة واحدة، وبهذا يتم إنشاء الإجراء المخزن في قاعدة بيانات آكسيس، ويظهر في متصفح الخوادم تحت العنصر Stored Procedures.. طبعا لا نستطيع فعل هذا الآن، لهذا سنؤجله إلى فصل لاحق.. لكن علينا هنا أن نوضح بعض الاختلافات الجوهرية بين الإجراء المخزن الخاص بآكسيس والإجراء المخزن الخاص بسيكويل سيرفر:

1- يستخدم آكسيس التعبير CREATE PROC بدلا من التعبير CREATE PROCEDURE.

2- الإجراء المخزن في آكسيس يتكون من جملة SQL واحدة فقط، لأن آكسيس لا يقبل تنفيذ أكثر من جملة مفصولة بالعلامة ;.

3- لا يمكن تعريف متغيرات في الإجراء المخزن في آكسيس ولا يمكن استخدام جمل الشرط.. السبب ببساطة أن آكسيس لا يتعامل مع T-SQL.

4- لا توضع العلامة @ قبل أسماء المعاملات الخاصة بالإجراء المخزن في آكسيس.. وطبعا أنواع هذه المعاملات هي الأنواع الخاصة بآكسيس.

5-  لا ينتهي الإجراء المخزن في آكسيس بالكلمة RETURN.

باختصار: الإجراء المخزن في آكسيس، هو مجرد استعلام SQL مخزن!

هكذا مثلا سيكون الإجراء المخزن الذي يحذف من جدول المؤلفين، المؤلف الذي ترسل اسمه إليه:

CREATE PROC DeleteAuthor(

                            AuthorName VARCHAR(20) )

AS

DELETE FROM Authors

             WHERE (Authors.Author = AuthorName);

ولكي تضيف هذا الإجراء إلى قاعدة بيانات الكتب، افتح المشروع AccessStoredProcedure، وشغل البرنامج، واضغط الزر "DeleteAuthor".. كما يمكنك إنشاء إجراء مخزن للحصول على كتب أحد المؤلفين، بضغط الزر "GetAuhorBooks".

لاحظ أن هذا البرنامج يفترض وجود الملف Books.mdb على المسار C:\.. وسنفهم الكود الذي يستخدمه هذا البرنامج بالتفصيل لاحقا.

بعد أن تنفذ هذا البرنامج، أضف اتصالا بقاعدة بيانات الكتب الموجودة على المسار C:\ في متصفح الخوادم، وأسدل عناصرها.. ستجد أن الإجراءين DeleteAuthor و GetAuhorBooks قد ظهرا تحت العنصر Stored Procedures.. لكن للأسف، لا يمنحك متصفح الخوادم أية طريقة لعرض كود هذين الإجراءين أو تعديلهما أو تشغيلهما.

ويريك الزر "الكتب1" في المشروع Factories كيف يمكن استدعاء الإجراء GetAuhorBooks من برنامجك، وسنفهم كيف يفعل هذا لاحقا.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 

الاثنين، 26 سبتمبر 2016

عشان من صغري حبيتك


عشان من صغري حبيتك 

وفاكرة إنك هتتعاري = إذا م الكبر تتعري
قوام بزيادة تتغري = وانا حضنك وانا بيتك
عشان من صغري حبيتك = و ع الفرقة دي بتصرّي 

يا شوك طارح في قلب ملاك = عرفت إن الزمن قساك
وأنا صابر وهستناك = منا حضنك وانا بيتك
عشان من صغري حبيتك = ولسة التوهة ليه واخداك؟ 

يا توتة ف بقها توتة = بقت حكايتنا حدوتة
وليه أحلامي مكبوتة = وأنا حضنك وأنا بيتك
عشان من صغري حبيتك = مسبتش فيكي فتفوتة 

يا خايفة وعاملة زعلانة = ما تنسي فلان وعلانة
ما دام إحساسنا علاّنا = وأنا حضنك وأنا بيتك
عشان من صغري حبيتك = ولسة عليا تقلانة! 

محمد حمدي غانم
26/9/2016

 

 

الإجراءات المخزّنة Stored Procedures


الإجراءات المخزّنة Stored Procedures:

الإجراءات المخزّنة هي برامج قصيرة مكتوبة بلغة T-SQL الخاصة بسيكويل سيرفر ، ويتم حفظها في قاعدة البيانات وتنفيذها على الخادم Server، لأداء وظيفة معيّنة على قاعدة البيانات.

ويمتاز الإجراء المخزن بالمميزات التالية:

1- يقوم SQL Server بترجمة Compile الإجراءات المخزّنة مرّة واحدة عند إنشائها، وبالتالي فهي تعمل أسرع من جمل SQL العاديّة.

2- اختصار الكود، بسبب قدرتك على استدعاء نفس الإجراء المخزن من برامج مختلفة أو من أكثر من موضع من نفس البرنامج.

3- سهولة التعديل في الإجراء المخزن بدون تغيير أكواد البرامج التي تستخدمه، وذلك لأنه موجود في قاعدة البيانات.

4- الإجراءات المخزنة أكثر مناعة ضد دس الاستعلامات SQL Injection كما سنرى فيما بعد.

وتسمّى اللغة التي تكتب بها الإجراءات المخزّنة T-SQL اختصارا لـ (Transact-SQL)، وهي نسخة مطوّرة من SQL خاصة بسيكيول سيرفر كما ذكرنا سابقا.

ويبدأ الإجراء المخزن بجملة التعريف التالية:

CREATE PROCEDURE dbo.SP1

حيث إن SP1 هو اسم الإجراء، ويمكنك تغييره إلى أيّ اسم يناسبك.

لاحظ أن الجملة CREATE PROCEDURE تستخدم عند إنشاء الإجراء المخزن للمرة الأولى، لكن بمجرد حفظه تتحول إلى ALTER PROCEDURE، لأنك ستعدل فيه بعد ذلك ولن تعيد إنشاءه من جديد.. ولو حاولت استخدام CREATE PROCEDURE مع نفس اسم الإجراء المخزن مرة أخرى فستحصل على خطأ يخبرك أن هذا الإجراء موجود من قبل، لهذا لو كنت تقصد إعادة حفظ نفس الإجراء بعد التعديل، فتأكد من أنه يبدأ بالفقرة ALTER PROCEDURE.

بعد هذا يأتي تعريف معاملات الإجراء.. وتبدأ المتغيّرات في لغة T-SQL بالرمز @.. والجملة التالية تعرّف معاملا نصّيا طوله ثلاثة أحرف:

@Str1 nvarchar(3)

كما ترى: تكتب اسم المعمل، يليه نوعه.

وعند وجود أكثر من معامل، توضع العلامة "," للفصل بينها.

ويمكن أن تضع للمعامل قيمة افتراضيّة، بحيث لو لم يُرسل هذا المعامل، يقوم الإجراء باستخدام هذه القيمة:

@Str2 nvarchar(7) = 'افتراضي'

وتوضع معاملات الإجراء بينَ قوسين ( )، ولا يشترط أن تكتب في سطر واحد.

ويبدأ الإجراء المخزّن بالكلمة AS، وينتهي بالكلمة RETURN، وبينهما الكود:

AS

………..

RETURN

ويمكنك تعريف المتغيّرات داخل الإجراء، باستخدام الجملة DECLARE:

DECLARE @Str3 nvarchar(7)

ويمكنك كتابة جمل الشرط كالتالي:

IF @Str3 = ''

BEGIN

      SELECT @Str3 = 'ABC'

END

وإذا كان مقطع الشرط جملة واحدة، فلسنا بحاجة إلى BEGIN و END:

IF @Str3 = ''

     SELECT @Str3 = 'ABC'

لاحظ استخدامنا للتعبير SELECT لتغيير قيمة المتغيّر @Str3.. يمكنك كذلك استخدام التعبير SET لتغيير قيمة المتغيّر، وهو ليس مربكا مثل SELECT:

SET @Str3 = 'ABC'

ويمكن أن تضع في المتغيّر ناتج جملة SELECT ـ طبعا إذا كانت تعيد قيمة واحدة، كأن تكون بها دالة من دوال التجميع Aggregate Functions أو يكون الجدول الناتج عبارة عن خانة واحدة ـ كالتالي:

SET @Str3 = (SELECT Book FROM Books WHERE ID = 3)

والآن، ما رأيك أن نكتب إجراء مخزّنا نرسل إليه اسم المؤلف، فيعيد إلينا الكتب التي ألفها؟

افتح فيجوال ستديو، وفي متصفّح خوادم الإنترنت Server Explorer، أسدل العناصر التي تنتمي لاتصال قاعدة البيانات Books.mdf التي أنشأناها بـ SQL Sever.. من هذه العناصر اضغط بزرّ الفأرة الأيمن على "الإجراءات المخزّنة" Stored Procedures، ومن القائمة الموضعيّة اضغط الأمر New Stored Procedure.. ستظهر لك نافذة تحرير الإجراء المخزّن.. اكتب بها هذا الإجراء:

CREATE PROCEDURE dbo.GetAuthorBooks

          (       

 /*لدينا معامل واحد فقط نستقبل فيه اسم المؤلف

وقد جعلناه 30 حرفا ليتلاءم مع طول حقل المؤلفين                  */

                   @Author char(30)

          )

AS

IF @Author <>''      /* تأكّد أن اسم المؤلف غير فارغ*/

BEGIN

/*هذه جملة استعلام عاديّة تماما*/

SELECT Book

FROM Books, Authors

WHERE Author = @Author

AND AuthorID = Authors.ID

END

RETURN /*وجود هذه الكلمة في أيّ موضع يؤدّي إلى إنهاء الإجراء*/

أعتقد أن الأمر في غاية البساطة.

ولا حاجة لألفت نظرك إلى أن التعليق في لغة T-SQL يوضع بين العلامات /* */.. هذه الرموز تتيح لك كتابة التعليق على أكثر من سطر.. فإذا أردت أن تكتب سطرا واحدا كتعليق، فيمكنك أن تضع في بدايته العلامتين --.. مثال:

/* هذا تعليق

على سطرين*/

--بينما هذا تعليق في سطر واحد

ولا بدّ أنك لاحظت ظهور الجملة SELECT في نافذة الإجراء السابق في مستطيل.. اضغط بزرّ الفأرة الأيمن داخل هذا المستطيل، ومن القائمة الموضعيّة اختر الأمر "تصميم مقطع الاستعلام" Design SQL Block.. ستظهر لك نافذة باني الاستعلام Query Builder، حيث يمكنك استغلاله لتطوير الجملة واختبارها.

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

نريد الآن اختبار الإجراء الذي كتبناه.. اضغط بزرّ الفأرة الأيمن في أيّ موضع من نافذة الإجراء، ومن القائمة الموضعيّة اضغط الأمر Run Stored Procedure.. ستظهر لك نافذة تسألك عن قيمة معامل الإجراء.. اكتب اسم (توفيق الحكيم) واضغط OK.. سيتمّ تنفيذ الإجراء، حيث ستظهر أسماء كتب (توفيق الحكيم) في نافذة المخرجات Output Window.

 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 

الأحد، 25 سبتمبر 2016

كيف أنتِ فكوني


كيف أنتِ فكوني

 

هذا مكانُكِ في الفؤادِ حبيبتي = مرآةُ حسنِكِ في ضياءِ فتوني

لا شيءَ يُنقصُ من بَهاهُ وإنما = يَزدادُ سحرا ما تمرُّ سنوني

يئسَ الزمانُ فلا تشيخُ محبتي = أنا لا أملُّ ولا يكلُّ جنوني

مهما تبدّتْ من خصالِكِ سوأةٌ = أهوَى عيوبَكِ كيفَ أنتِ فكوني

هذا مُحبُّكِ مُذْ رآكِ فما دهاكِ غفلتِ عن أشواقِه يا نوني؟

أنا لا أريدُكِ غيرَ أن تستسلمي = في أسرِ حضني دهشةً تَعروني

أحزنتِ قلبي، صالحيه صغيرتي = قولي "أحبُّكَ" كي تطيبَ شجوني

 

ارتجالا من وحي الصورة

 محمد حمدي غانم

 7\9\2016

 

 

لغة تعريف البيانات (DDL)


لغة تعريف البيانات SQL Data Definition Language (DDL):

تختصّ أوامر هذه اللغة بإنشاء أو حذف كائنات قاعدة البيانات، مثل الجداول وما تحتويه من أعمدة وفهارس، ومثل العلاقات Relations والقيود Constrains.

ولن نتوسّع في شرح هذه الأوامر في هذا الكتاب، ويمكنك أن تبحث في ملفات استعلام اللغة عن كيفيّة استخدام الأوامر التالية، وهي تستخدم لإنشاء عناصر قاعدة البيانات:

CREATE DATABASE

CREATE TABLE

CREATE PROCEDURE

CREATE FUNCTION

CREATE VIEW

CREATE INDEX

ولتعديل عناصر قاعدة البيانات، تستخدم الكلمة ALTER بدلا من الكلمة CREATE.. ولحذف أحد العناصر، تستخدم الكلمة DROP بدلا من الكلمة CREATE.

ويمكنك الاسترشاد بهذه الأمثلة (وهي خاصة بقواعد بيانات Access):

الجملة التالية تنشئ جدولا للمؤلفين، به عمودان يستوعبان نصوصا لا يزيد طولها عن 30 حرفا، مع ملاحظة أن العمود الثاني مفهرس (بإنشاء فهرس اسمه X) مع عدم السماح بتكرار القيم:

Create Table Authors

([Author] Text  (30), [City] Text (20) Constraint X Unique)

أمّا الجدول التالي، فله عمود رقميّ، والآخر ترقيم تلقائيّ:

Create Table Numbers

([No] Integer,[ID] Counter)

ولإنشاء فهرس اسمه X على العمود ID في الجدول السابق:

Create Unique Index X On Numbers (No)

ولإضافة عمود اسمه Y للجدول السابق:

ALTER TABLE  Numbers

ADD COLUMN Y Long

ولحذفه مرّة أخرى:

ALTER TABLE  Numbers DROP COLUMN Y

  

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


 

صفحة الشاعر