.NET Flat Calendar for Windows Form Application

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

اخواني الاعضاء الكرام, كيف حال الجميع؟

أسأل الله تعالى ان تكونوا في افضل حال واتم عافية.

اقدم لكم اليوم أداة جديدة من برمجتي الا وهي:

.Net Flat Calendar 
for Windows Form Applications 

والأن لنتعرف على الأداة ومميزاتها:

ما هي .NET Flat Calendar؟
هي عبارة عن أداة تقويم ميلادي تُستخدم داخل تطبيقات Windows Form والمتضمنة داخل إطار عمل .NET, تُساعدك تلك الأداة على مُعالجة التواريخ وتصفح السنوات, الشهور والأيام بطريقة مرنة جداً وسهلة وسريعة ايضاً بالإضافة إلى واجهتها العصرية والمُسطحة المواكبة للتصميم الحديث لتطبيقات سطح المكتب لتُساعدك في تقديم افضل واجهة للمستخدم.

ما نوع هذه الأداة؟
.NET Flat Calendar عبارة عن User Control كُتبت بلغة C# .NET وتعمل تحت إطار عمل .NET تحت بيئة Visual Studio المُقدم من شركة Microsoft.

كيف تعمل تلك الأداة؟
أداة .NET Flat Calendar ليست كمثلها من أدوات التقويم وذلك لأنها تعتمد على خوارزميات في شدة المنطقية لإحتساب التاريخ بدون قيود او حدود فضلاً عن طرق الإحتساب بالحلقات التكرارية وما يترتب عليه من تقليل الأداة والحمل الزائد على المعالج. كذلك تقوم الأداة بإنشاء كآفة كائناتها أثناء وقت العمل Rum Time لتعطيك المرونة الكافية والإمكانية المطلقة للتصميم للوصول للواجهة الرائعة التي تفضل سواءاً كان ذلك خلال Design Time او حتى Run Time. وإمكانيات عدة ستتضح إليك فالتالي:

-القابلية لإعادة التحجيم والموزانة.
-إمكانية تغيير الخط.
-تدعم العربية والأنجليزية.
-تحويل ما بين عرض أيام, شهور وسنوات.

-تبدأ الإحتساب من سنة 1 إلى ما لا نهاية!.
-صيغ تاريخ مُخصصة لا تعتمد على لغة النظام.
-نظامي عرض دائري ومربع.
-لون الخلفية.
-لون مخصص لكل من ايام الشهر المقبل-السابق واخر للحالي واخر للتظليل.
-تغيير مؤشر الفأرة.
-التحكم البرمجي في عرض الأداة والتصفح.
-حركات تأثيرية اثناء تصفح الشهور.
-أحداث وطرق للتواريخ وللتحويل وتصفح.

ما الجديد والفرق بين .NET Flat Calendar و Microsoft Month Calendar؟

مُخطط لمكونات الأداة ومحتوى السلوك:

صور مُلتقطة للأداة:

فيديو لكيفية إضافة وعمل الأداة:

سعر الأداة

 10$
كترخيص لمستخدم واحد وداخل برنامج واحد
50$
 كترخيص غير محدود الإستخدام لإستخدامها في عدة برامج غير محدودة العدد

كيفية الشراء
يُمكنك شراء الأداة من موقع CodeCanyon عن طريق الرابط التالي:

أتمنى أن تحوذ الأداة على إعجاب الجميع وأن يجعل الله فيها من الأفادة أكثر قدراً مما قُيمت به من مقابل مادي, وشكراً جزيلاً
Advertisements

كيفية تحويل اسعار العملات بإستخدام Yahoo Exchange Rates Web Service

السلام عليكم ورحمة الله وبركاته
الأخوة الأعضاء الكرام, كيف حالكم جميعاً؟

اليوم بإذن الله سوف نتعلم معاً كيفية الحصول على أسعار العملات بإستخدام خدمة الويب الخاصة بخوادم Yahoo عن طريق Visual Basic.NET.

فالحقيقة ليست Yahoo فقط من تقدم تلك الخدمة. فالعديد من الـ Web Services تُمكنك من الحصول على أسعار العملات مُحدثة يومياً ولكن يُمكنك القول أن أفضلها وأسرعها هي Yahoo Exchange Rates Web Service وذلك بحكم عملي وتجربتي مع أكثر من خدمة فلم أجد خدمة أسرع وأكثر إستقراراً من Yahoo فهي أفضل من Google ذاتها.

شرح بسيط لفكرة الخدمة:

خدمات الويب تُشبه -في غايتها- إلى حد كبير ما تُقدمة لك دوال البرمجة كائنية التواجه -Object Oriented Function- فالأمر ليس أكثر من إرسال مُعاملات -Parameters- والحصول على قيمة او نتيجة -Returned Value- ولكن انت هنا تتعامل داخل تطبيقات سطح المكتب -Desktop Applications- وهناك تتعامل مع تطبيقات الويب -Web Applications- وبنفس الطريقة الخدمة تستقبل منك مُعاملين فقط هما:

1-اسم العملة المُحول منها.

2-اسم العملة المُحول إليها.

مثال اريد ان اعرف كم ين ياباني يُساوي الـدولاار امريكية .

وبالنهاية تُعطيك نتيجة نصية -String- تحتوي على قيمة مزدوجة -Double Data Type- لقيمة التحويل وقيمة تاريخ ووقت -Date Time Data Type- لتوقيت الحصول على السعر للمُزامنة على الشكل التالي:

كود :
'Returns: ""SAREGP=X",1.8355,"11/19/2013","8:53pm""

SAR=Saudi Arabia Reial, EGP=Egyptian Pound, 1.8355=Exchange Rate, 11/19/2013=Date of Rate, 8:83pm=Time of Rate.

ولكن تُمرر المعاملات بصيغة خاصة بالخدمة وتعتمد على الإختصارات العالمية للعملات الورقية تبعاً لكل دولة. فمثلاً الين الياباني حينما أريد أرساله سوف يكون في السياق النصي “JPY” كذلك الدولار الأمريكي سيكون في السياق التالي “USD” … إلخ.

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

إقتباس :EGP ‘Egyptian Pound

AED ‘United Arab Emirates Dirham

ANG ‘Netherlands Antillean Guilder

ARS ‘Argentine Peso

AUD ‘Australian Dollar

BDT ‘Bangladeshi Taka

BGN ‘Bulgarian Lev

BHD ‘Bahraini Dinar

BND ‘Brunei Dollar

BOB ‘Bolivian Boliviano

BRL ‘Brazilian Real

BWP ‘Botswanan Pula

CAD ‘Canadian Dollar

CHF ‘Swiss Franc

CLP ‘Chilean Peso

CNY ‘Chinese Yuan

COP ‘Colombian Peso

CRC ‘Costa Rican Colón

CZK ‘Czech Republic Koruna

DKK ‘Danish Krone

DOP ‘Dominican Peso

DZD ‘Algerian Dinar

EEK ‘Estonian Kroon

EUR ‘Euro

FJD ‘Fijian Dollar

GBP ‘British Pound Sterling

HKD ‘Hong Kong Dollar

HNL ‘Honduran Lempira

HRK ‘Croatian Kuna

HUF ‘Hungarian Forint

IDR ‘Indonesian Rupiah

ILS ‘Israeli New Sheqel

INR ‘Indian Rupee

JMD ‘Jamaican Dollar

JOD ‘Jordanian Dinar

JPY ‘Japanese Yen

KES ‘Kenyan Shilling

KRW ‘South Korean Won

KWD ‘Kuwaiti Dinar

KYD ‘Cayman Islands Dollar

KZT ‘Kazakhstani Tenge

LBP ‘Lebanese Pound

LKR ‘Sri Lankan Rupee

LTL ‘Lithuanian Litas

LVL ‘Latvian Lats

MAD ‘Moroccan Dirham

MDL ‘Moldovan Leu

MKD ‘Macedonian Denar

MUR ‘Mauritian Rupee

MVR ‘Maldivian Rufiyaa

MXN ‘Mexican Peso

MYR ‘Malaysian Ringgit

NAD ‘Namibian Dollar

NGN ‘Nigerian Naira

NIO ‘Nicaraguan Córdoba

NOK ‘Norwegian Krone

NPR ‘Nepalese Rupee

NZD ‘New Zealand Dollar

OMR ‘Omani Rial

PEN ‘Peruvian Nuevo Sol

PGK ‘Papua New Guinean Kina

PHP ‘Philippine Peso

PKR ‘Pakistani Rupee

PLN ‘Polish Zloty

PYG ‘Paraguayan Guarani

QAR ‘Qatari Rial

RON ‘Romanian Leu

RSD ‘Serbian Dinar

RUB ‘Russian Ruble

SAR ‘Saudi Riyal

SCR ‘Seychellois Rupee

SEK ‘Swedish Krona

SGD ‘Singapore Dollar

SKK ‘Slovak Koruna

SLL ‘Sierra Leonean Leone

SVC ‘Salvadoran Colón

THB ‘Thai Baht

TND ‘Tunisian Dinar

TRY ‘Turkish Lira

TTD ‘Trinidad and Tobago Dollar

TWD ‘New Taiwan Dollar

TZS ‘Tanzanian Shilling

UAH ‘Ukrainian Hryvnia

UGX ‘Ugandan Shilling

USD ‘US Dollar

UYU ‘Uruguayan Peso

UZS ‘Uzbekistan Som

VEF ‘Venezuelan Bolívar

VND ‘Vietnamese Dong

XOF ‘CFA Franc BCEAO

YER ‘Yemeni Rial

ZAR ‘South African Rand

ZMK ‘Zambian Kwacha

والأن إلى البرمجة:

الـ Module التالي يحتوي على Function قمت بعملها وأعتمد عليها داخل عملي الخاص وتحتوي على ثلاثة مُعاملات -Parameters- فقط وتعود إليك بـ قيمة مزدوجة -Double Data Type-:

PHP كود :
Imports System.Net 'System.Net.dll
Imports System.Web.Script.Serialization '
System.Web.Extensions.dll
Module mdlCurrencyRate
Public Function Get_Currency_Rate(ByVal currFromName As StringByVal currToName As String) As Double
Dim result 
As Double 0.0
Dim wbServiceLink 
"http://www.finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X"
Dim url As String String.Format(wbServiceLinkcurrFromNamecurrToName)
Dim client As New WebClient()
Dim rates As String client.DownloadString(url'Returns: ""SAREGP=X",1.8355,"11/19/2013","8:53pm""
Dim rate_part As String = Split(rates, ",")(1)
If Double.TryParse(rate_part, result) Then
result = CDbl(rate_part)
End If
Return result
End Function
End Module

يتطلب المثال أعلاه المكتبات -يتضمنها المِثال المُرفق بالموضوع- الخاصة بـ System.Net, System.Web.Extensions Name Spaces.

مثال إستخدام الـ Function:

PHP كود :
Dim Saudi_Rial_To_Egypt_Pound As Double Get_Currency_Rate("SAR""EGP"'Result= 1.8355

المثال السابق يأتي بسعر عملة الريال السعودي بالنسبة للجنية المصري.

مُرفق بالموضوع Visual Studio 2010 Project.

إذا كان هُناك أي إستفسار إن شاء الله أنا مُتواجد -قدر المُستطاع-.

أتمنى أن يكون الموضوع مُفيداً إليك. ووفقنا الله وإياكم.

Private Text Encryption -خدمة للمبرمجين في جديد عالم التشفير-

التشـــفير الخــــاص للنصـــوص


حمـــــــــــــاية أســـــــــــــــرارك

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

إخواني الأعضــاء الكرام, كيف حال الجميع؟
أسـأل الله العظيم أن تكونوا في أفضل حال وأتم عافية.

كم من مُستخدمي Dot Not Framework يعتمدون على خواص Settings و Registery Keys للتعامل مع القيم من حفظ وإستدعاء. ولكن بكل أسف مُفتقدين “الأمان” للحفاظ على سرية تلك القيم التي من المُمكن جدا أن تكون بيانات إتصالات خادمك الخاص وكلمات المرور وغيرها.

فبكل بساطة إذا إطلع أحداً على ملف الـ Settings الخاص بمشروعك سوف يستمتع بالإطلاع على جميع قيم إعداداتك الخاصة التي قُمت بتسجيلها. ذلك ما دعاني للتفكير فى إنشاء خدمة ذو فكرة جديدة توفر عملية تشفير مُعقدة للنصوص مما يوفر لنا نوع من الإطمئنان وبالفعل إنتهيت بفضل الله من تنفيذ الأمر من الألف إلى الياء بأفكار جديدة إستغرقت فترة لا بأس بها حتى توصلت لما أردت تنفيذه, وها أنا اليوم أتيت لكم بـ Private Text Encryption وهو ليس أكثر من ملف DLL صغير جدا وبسيط جدا ولكنه ليس بسهل!., لنتعرف معاً عليه:

لقد قُمت بإختيار إسم Private Text Encryption ليس لأنه مُجرد أسم, ولكنه بالفعل يعي المفهوم تماماً مما سوف يتضح إليك بعد الإطلاع على إمكانيات الـ DLL التالية:

1-نص مُشفر جديد فى كل مُحاولة للتشفير:

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

2-حاسبك الوحيد فى العالم القادر على فك التشفير:

إذا قمت بتفشير نص ما وقمت بتمريره إلى أحد الأصداقاء ليقوم بتشفيره إليك سوف تُفاجأ بأن الـ DLL غير قادر على فك التشفير حيث أن الحاسب الذي يتم فك التشفير عليه ليس هو من تم التشفير عليه. ذلك سوف يُعطي الجميع الثقة فى الإستخدام حيث إذا كنا جميعاً أعضاء مُستخدمي VB4ARAB نستخدم الـ DLL لن يستطيع أحدنا فك نص مُشفر للأخر والعكس صحيح.

3-أنا نفسي لن أستطيع فك التشفير!!:

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

___________________________________________

الـ DLL يحتوي على Class واحد فقط والـ Class لا يحتوي سوى على دالتين فقط من نوع String الأولى وهي EncryptText وتحتوي على معامل واحد فقط من نوع String ويُمرر إليه النص المُراد تشفيره وتعود بالنص المُشفر. وأما الدالة الثانية وهي DecryptText وتحتوي أيضاً على مُعامل واحد فقط من نوع String يُمرر إليه النص المُشفر وتعود بالفك.

Download PrivateTextEncryption DLL

وهــذا مثــــال
Imports PrivateTextEncryption
Public Class frmMain
Dim PrivateText As New PrivateTextEncryption.PrivateTextEnc
Private Sub btnEncryption_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEncryption.Click
txtEncryption.Text = PrivateText.EncryptText(txtRealText.Text)
End Sub
Private Sub btnDecrypt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDecrypt.Click
txtDecryptedText.Text = PrivateText.DecryptText(txtEncryptedText.Text)
End Sub
End Class

Download VS2010 Example

ملحوظة هامة: قد يطلب البعض الـ Source Code الخاص بالملف ولكني سأعتذر الغاية من نشر الموضوع هنا هو فقط أن أشعر بأني حققت إليك أي نوع من أنواع الأفادة والمُساعدة ليس أكثر فإذا أردت إستخدام الملف فها هو بين يديك مدى الحياة, أما إذا كُنت تبحث عن الـ Source Code فبكل بساطة يُمكنك إعتبار هذا المقال الفقير غير موجود وتصفح موضوعات المنتدى الغنية.

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

ولا تنســـونا من صالح دعائكم

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

Lesson5-Part2

Lesson5-Part2

Beginning with SQL

إبـــــــــــــــــــــــــــــــــدأ مع SQL

بسـم الله والصلاة والسلام على رسول الله,

2 – الأمر ALTER TABLE:

تعني الكلمتين ALTER TABLE عدل –أو تعديل- جدول على التوالي وكما يتضح من مدلول الأمر أنه خاص بالتعديل على الجداول او الوحدات المُنشأة سابقاً داخل قاعدة بيانات مُعينة وهو يُشبه الأمر CREATE TABLE فى صيغة التركيب فقط إلى حد ما, لكن كُل منهم له وظيفته ومهامه. وقد تعرفنا على مهام وتركيب الأمر CREATE TABLE مُسبقاً أما بالنسبة للأمر ALTER TABLE فهو كما أسلفنا مُتخصص فى التعديل على الجداول المُنشأة ويحتوي على عدة بنود كل منها له مهامه الخاصة إما بإنشاء حقل جديد (ADD) داخل أحد الجداول المُنشأة مُسبقاً أو تعديل Data Type –نوع بيانات-  أو تمكين-تعطيل إحتواء الفراغات –NULL, NOT NULL- لحقل (ALTER COLUMN) موجود داخل جدول مُعين أو حذف حقل بإكمله (DROP COLUMN) من جدول مُعين أو تغيير إسـم حقل (SP_RENAME) أو حتى تغيير إسم جدول بأكمله (SP_RENAME) فى جدول مُعين ويكون تركيب الأمر ALTER TABLE ترتيباً  للبنود (Clauses) السابقة فى الصيغ التالية:


ALTER TABLE [YourTableName] ADD [Column_Name] [DataType](Length) NULL Or NOT NULL –إنشـاء حقل-

——————————————————-

ALTER TABLE [YourTableName] ALTER COLUMN [Column_Name] [DataType](Length) NULL Or NOT NULL –تعديل حقل-

——————————————————-

حــذف حقل–ALTER TABLE [YourTableName] DROP COLUMN [Column_Name]
——————————————————-

تعديل إسـم جدول– SP_RENAME ‘OldTableName‘,’NewTableName
——————————————————-

SP_RENAME ‘YourTableName.OldColumnName‘,’NewColumnName‘,’COLUMN’ تعديل إسـم حقل–

لنُطبق الأن بعض الأمثلة على الأمر CREATE TABLE بكافة بندوه, أحدهم فالأخر, هيا:

الأن سوف نقوم بإنشـاء جدول صغير ونتعمد نسيان إنشاء أحد الحقول داخله حتى نقوم بإستخدام الأمر ALTER TABLE لإضافة ذلك الحقل المَنسي, وليكن هو الجدول “tblJobs” الذى قُمنا بإنشاءه فى قاعدة بيانتنا خلال تلك الدروس وسنتعمد نسيان الحقل “jobDescription”:


CREATE TABLE tblJobs

(

      jobID   SMALLINT NOT NULL,

      jobName NVARCHAR(20) NOT NULL,

      jobSalary MONEY NULL,

PRIMARY KEY (jobID)

)

الأن قد قمنا بإنشاء الجدول tblJobs ولكن قد نسينا إنشاء الحقل jobDescription وسنستخدم الأن أولى جملاتنا الموجهة عن طريق الأمر ALTER TABLE هيا:

سيراً على صيغتنا الأولى, سيكون الأمر كالتالي:

ALTER TABLE tblJobs ADD jobDescription TEXT NULL

إنتهت الجملة!

وبنفس الطريقة لأي جدول تُريد إضافة اي حقل من أي نوع إليه, ولكن لحظة لحظة!

لقد أخطأت الأمر السابق حيث أن نوع البيانات الخاص بالحقل jobDescription فى قاعدة بياناتنا هو NVARCHAR وليس TEXT إذن سوف نضطر للتعديل على الحقل, ولكن ما رأيك بإن ننتهز الفرصة ونستخدم البند الثاني من بنود الأمر ALTER TABLE لتطبيق التعديل على ذلك الحقل؟!… هيا:


ALTER TABLE tblJobs ALTER COLUMN jobDescription NVARCHAR(50) NULL

إنتهت الجملة!

أما الأن فإذا عصبك أحد الحقول فإليك بالحل الفاصل أخر بنود الأمر ALTER TABLE وهو خاص بحذف الحقول نهائياً, وليكن أننا بصدد حذف الحقل jobDescription ذلك الحقل المسكين الذى أتينا به من هنا إلى هناك وهو فى شدة الإستسلام, هيا:


ALTER TABLE tblJobs DROP COLUMN jobDescription

إنتهت الجملة!

أمر فى شدة السهولة والسلاسة, ولكنك قد تتعجب أنني بدأت بالحديث عن الأمر ALTER TABLE قبل أن نُكمل الحديث عن مشكلتنا الأخيرة فى الدرس السابق حينما حاولنا إنشاء الجدول tblEmployees برمجياً ولكن أُعقنا فى تحديد علاقة الحقل الغريب jobID المتواجد بالوحدة “tblEmployees” بالحقل الأساسي له بالجدول “tblJobs”.. آاااه صح, ولكن كيف؟

فى الحقيقة إذا كنت مُحدَق العينين أثناء قراءتك لذلك الدرس الأكثر من ممل ليُمكنني أن أقول لك أنه يُمكنك إنشاء العلاقات بين الجداول برمجياً مهما كانت بكل بساطة ولكن بنسبة 80% فقط, لما؟

لأن هُناك أربعة من الـ KeyWords تنقصك فقط حتى تتمكن من ذلك, وما هي إذا؟

هي:


CONSTRAINT

FK_YourForiegnTable_YourPrimaryTable

FOREIGN KEY

REFERENCES

تعني كلمة CONSTRAINT  القيد او الحبل الرابط –وأعتقد أنك مبرمج لماح ستفهم تلقائياً أنه حبل العلاقات الذي تراه أثناء إنشائك للعلاقات يدوياً- وأما الكلمة الثانية فهو بند يبدأ بإختصار FK لـ Foreign Key ويفصل بين الجدول الفرعي والأساسي بعلامة Under Score(_) –نوعاً من أنواع التدقيق على المُحرر- وأما الثالثة Foreign Key فهي أكيد لتحديد الحقل الفرعي كما يتبين من أسمها وأما الأخير References فيعني مصـ(ا)ـدر ودون عبقرية فهو هنا ليُحدد مصدر الحقل الأساسي من الجدول الأساسي…. إنتهى.

الصيغة كما تعودنا, بكل بساطة:


ALTER TABLE [YourTableName] ADD CONSTRAINT FK_YourForiegnKeyTable_YourPrimaryKeyTable FOREIGN KEY (YourForiegnKeyField,…) REFERENCES YourPrimaryKeyTable(YouPrimaryKeyField)

تحديد مصادر الحقول الفرعية(إنشاء العلاقات)–

وسيراً على مِثالُنا المُعلق منذ الدرس السابق لنُحدد الأن العلاقة للحقل الغريب jobID المتواجد بالجدول tblEmployees والذى مصدره الأساسي طبعاً داخل الجدول tblJobs وتحديداً فى الحقل jobID, هيا:


ALTER TABLE tblEmployees ADD CONSTRAINT FK_tblEmployees_tblJobs FOREIGN KEY (jobID) REFERENCES tblJobs(jobID)

إنتهت الجملة!

أما الأن فدعنا نُعطي للجملة الأخيرة فى الدرس السابق نسبة 100% وذلك بإنشاءنا للجدول من الألف إلى الياء بما فيه من علاقات, هيا:


CREATE TABLE tblEmployees

(

               empID INT NOT NULL,

               empSignUpDate DATE NOT NULL,

               empFirstName NVARCHAR(20) NOT NULL,

               empMiddleName NVARCHAR(20) NOT NULL,

               empLastName NVARCHAR(20) NOT NULL,

               empDateOfBirth DATE NOT NULL,

               empGender REAL NOT NULL,

               empPhone NVARCHAR(20) NOT NULL,

               empMobile NVARCHAR(20) NULL,

               jobID SMALLINT NOT NULL,

 PRIMARY KEY (empID)

)

ALTER TABLE tblEmployees ADD CONSTRAINT FK_tblEmployees_tblJobs FOREIGN KEY (jobID) REFERENCES tblJobs(jobID)

هُنا يُمكنني أن أقول وبكل ثقة أنها جملة كاملة وناجحة 100% دون شك.

أما الأن فدعنا ننسى الـ Right Click>> Rename أو الضغط على مفتاح F2 لتعديل أسماء الكائنات ونستخدم الأمر الأكثر من رائع sp_RENAME ولكن قبل البدء يجب علي أن أُنبهك هنا بأن تكون حذراً أثناء تعديلك على أسماء الكائنات حتى لا يستدعي منك الأمر إعادة تحديد العلاقات من جديد وكتابة الكثير من جمل SQL وليس قضاء وقت كثير بإستخدام Ms-Mouse!, وسيراً على صيغتنا وتعديلاً لأسم الجدول tblJobs إلى TableJobs ومن ثُم إعادته إلى اسمه الطبيعي مره أُخرى حتى لا يزعل, هيا:


sp_RENAME ‘tblJobs’, ‘TableJobs’

لنعيده مره أخرى:


sp_RENAME ‘TableJobs’, ‘tblJobs’

هذا بالنسبة لإعادة تسمية الجداول أما لإعادة تسمية الحقول فهو هو نفس الأمر ولكن فقط زيادة قيمة ‘COLUMN’ للمعامل الأخير للأمر sp_RENAME وإتباع طريقة إحترام الكبير بذكر إسم الجدول قبل إسم الحقل كالـتالي وليكن أننا سنقوم بإعادة تسمية الحقل jobDescription ونُعيده مره أخرى, هيـا:


sp_RENAME ‘tblJobs.jobDescription’, ‘JobeDescription’, ‘COLUMN’

لنُعيده مره أخرى:


sp_RENAME ‘tblJobs.JobeDescription’, ‘jobDescription’, ‘COLUMN’

بالشفا, لقد إنتهينا من الأمر ALTER TABLE, أستطيع أن أقول الأن أنه بإمكانك بإذن الله الأن أن تقوم بإنشاء أي وحدة أو جدول بما تحتوي على أي نوع من أنواع الحقول وكذلك الأطوال المُحددة لكل مُنهما وأيضاً تحديد العلاقات فيما بينها, ولكن بكل أسف لا يُمكنك حذف جدول برمجياً, هيا لنُتم الأمر كاملاً.

3 – الأمر DROP TABLE:

دون أي ثرثرة فارغة الأمر أبسط من أن يأخذ نقطة وحده ولكنها أحد مُحاولات إثارة عصبيتك, يُمكنك حذف جدول بإكمله بإستخدام الأمر DROP TABLE والذى يعني على التوالي حذف -إلقاء- جدول وله صيغة مسكينة وحيدة, تتضح فى التالي:

حذف جدولDROP TABLE [YourTableName] —

وكمثالاً لنحذف الجدول المسكين tblJobs, هيا:

DROP TABLE tblJobs

إنتهت الجملة!

أستطيع الأن أخبرك بإننا قد إنتهينا بفضل الله من الأمرين CREATE TABLE, ALTER TABLE و DROP TABLE, بل وقد إنتهينا تقريباً أولى فروع القسم الأول Basic Section  وهو (DDL أو Data Definition Language –لا تنسى هذه المصطلحات- فالـ Expressions شئ هام إليك كمبرمج) حيث أنه لم يبقى لنا فيه إلا القليل وذلك لأنه بإطلاعك على ذلك الدرس والسابق له فتكون قد تجمعت إليك حصيلة قوية جداً لإساسيات سوف تُساعدك فى باقي الدروس القادمة بإذن الله, ودعني أُنبهك بإننا سنستثني أوامر الفهارس (INDEXES) وجداول الإستعلامات (VIEWS) حيث أنها مُرتبطة إرتباطاً قوياً بالفرع الأخير من ذلك القسم وهو الفرع (DQL أو Data Query Language) وسوف نتحدث عن الفرع الثاني من القسم الأول وهو الفرع (DML أو Data Manipulation Language) وذلك…

فى الدرس القادم بإذن الله>>

Lesson5-Part1

Lesson5-Part1

Beginning with SQL

إبـــــــــــــــــــــــــــــــــدأ مع SQL

 

بسـم الله والصلاة والسلام على رسول الله,

حان الوقت للعب بأوامر SQL, ولكن قبل أن نبدأ بحديثنا ولقائاتنا الشيقة معها, دعني أوضح لك شيئاً عن تلك اللغة الرقيقة. يتبين من إسـم تلك اللغة (SQL: Structured Query Language) أنها لغة إستعلام توفر إمكانية الحصول على بيانات من قاعدة مُحددة فحسب.

ولكنها فى الحقيقة على العكس تماماً, حيث أن أوامر وجمل SQL تنقسم إلى قسمين فقط يحتوي كل منهم على ثلاثة فروع, وهي كالتالي:

القسـم الأول ويُمكنك تسميته بـ Section Basic أو القسم الأساسي (تلك تسمية شخصية!) ويحتوي على الفروع التالية:

Data Definition Language (DDL)

Data Manipulation Language (DML)

Data Query Language (DQL)

القسم الثاني ويُمكنك تسميته بـ Control Section أو قسم التحكم (تسمية شخصية أيضاً) ويحتوي على الفروع التالية:

Data Control Language (DCL)

Data Administration Commands

Transactional Control Commands

قبل أن أبدأ بشرح المصطلحات السابقة دعني أعترف لك بشئ وهو أن فكرة تقسيم الستة أجزاء الخاصة بلغة SQL المذكورة أعلاه هي فكرة شخصية ليس أكثر. حيث أنني وجدت تلك الفكرة تُعطي أكثر تنظيماً وقابلية للإستيعاب بشكل متدرج –كرأي شخصي- عموما لن نختلف مادام سينتهي بك الحال بإذن الله بفهمهم جميعاً, وسـوف نبدأ بالقسم الأول وهو القسم الأهم بالنسبة لك ولي وهو الأكثر إستخداماً أيضاً, هيـا.

1 – القسم الأول (Basic Section):

لقد قمت بتسمية ذلك القسم بـ Basic Section حيث أنه يحتوي على أهم وأشهر وأكثر أوامر SQL إستخداماً وذكرت ثلاثة فروع تابعة لذلك القسم وهي كالتالي:

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

يختص هذا الفرع من لغة SQL بـالتحكم والتعامل مع الكائنات الأساسية لقواعد البيانات من إنشاء وتعديل وحذف, ويحتوي على ثمانية أوامر أساسية فقط كل منهم له طريقة تركيبه ليعمل بشكل صحيح, وهي كالتالي:



CREATE TABLE –إنشـاء وحدة (جدول)-

ALTER TABLE  --تعديل وحــــــــدة

DROP TABLE   --حــــــذف وحــــدة

CREATE INDEX –-إنشـاء حقل

ALTER INDEX  -تعديل حقل-

DROP INDEX   --حــذف حقل

CREATE VIEW  -إنشـاء جدول إستعـلام-

حــذف جدول إستعــلام--DROP VIEW

ب- لغة التعامل مع –أو التلاعب بـ- البيانات (Data Manipulation Language (DML)):

يشمل هذا الفرع جميع العمليات التي يُمكن أن تُجرى على بيانات كائنات قواعد البيانات من إنشاء وتعديل وحذف وكذلك كل منهم له طريقة تركيبة داخل SQL, ويحتوي على ثلاثة أوامر أساسية فقط وهي:



INSERT –-إدخــال

UPDATE –تعديــل-

DELETE –حــذف-

جـ - لغة إستعلامات البيانات (Data Query Language (DQL)):

أهم فرع فى فروع البيانات حيث انه المُتخصص والمسؤال الأول عن توفير المعلومات من قواعد البيانات ويحتوي على أمر أساسي واحد ويُعد أكثر أوامر SQL إستخداماً ألا وهو:


إختـيار أو إحضـار (حبيب الملايين)–SELECT

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

1 – الأمر CREATE TABLE:

يتكون هذا الأمر من إثنين من الكلمات المحجوزة (Keywords) للغة SQL –الكلمات المحجوزة هي الكلمات الخاصة بلغة SQL, وسُميت بمحجوزة حيث أنه لا يُمكنك إستخدامها (تقريباً!) لتسمية كائن مُعين داخل قواعد البيانات وذلك لأن SQL Complier أو مُترجم لغة SQL المتواجد داخل المُحرك (Engine) يعتمد على  تلك الكلمات حتى يستوعب منك الأمر الذي تُريد تنفيذه- تعني الكلمة الأولى “إنشاء” والثانية “وحدة أو جدول” على التوالي وكما يتبين لك من المعنى أن ذلك الأمر خاص بإنشـاء الجداول داخل قواعد البيانات, ولكن له طريقة أو صيغة تركيب مُعينة حتى يعمل بشكل صحيح وهي كالتالي:



CREATE TABLE [YourTableName]([Field1] DataType(length), [Field2] DataType(length),....)

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

بالمثـال يتضح المقال, لنقوم الأن بكتابة أولى أوامر SQL لإنشاء جدول بإسم “Numbers” يحتوي على حقل واحد فقط –أقل نسبة للحقول داخل الجدول, حيث لا يُمكنك أبدأ إنشاء جدول بدون حقول- بإسم “numValue” ومن نوع “رقم” وليكن الغاية منه تسجيل الأعداد (….1,2,3) حتى يُمكننا العودة إليه فى حالة نسيان ترتيب عدد داخل سلسلة الأعداد المنطقية!.

دعنا ننظر لصيغة تركيب الأمر السابقة ونحللها إلى أمرنا الحالي…… بعدها ستجد التركيب الصحيح للأمر كالتالي:



CREATE TABLE Numbers(numValue BIGINT)

إنتهت الجملة!

ملحوظة

نوع البيانات المُحدد فى جملة SQL (SQL Statement) السابقة (BIGINT) هو أحد الـ Data Types الخاصة بنظـام Ms-SQL Server وإذا كُنت تعمل على أي من أنظمة إدراة قواعد البيانات الأخرى فاستبدل ذلك النوع بالمقابل له داخل النظام الذي تستخدم, وبنفس الطريقة على أي من الجمل التي سوف نقوم بكتابتها معاً خلال تلك الدروس.

الجملة السابقة يُمكنها وبكامل ثقتها بذاتها أن تقوم بإنشاء جدول جديد لك بإسم “Numbers” ويحتوي على حقل واحد فقط بإسم “numValue” ونوع بياناته “رقم”.

إذا كنت قد دققت النظر فى الصيغة الخاصة بالأمر CREATE TABLE لكنت قد لاحظت شئ مقارنةً بالجملة التى قُمنا بكتابته معاً!

الطول(Length)… نعم. لو لاحظت فى الصيغة ستجد أنه يعقب نوع البيانات (Data Type) إثنين من الأقواس (Parenthesis) من المفترض أن تحمل داخلها الطول المُحدد للحقل, ولكننا لم نقم بتحديد طول الحقل “numValue” داخل الجملة السابقة, ما السبب؟

-أولاً تحديد الطول للحقول إختياري (Optional) داخل لغة SQL حيث أنك إذا لم تقم بتحديد طول الحقل سوف يقوم المُحرر بإعتماد الطول الإفتراضي لذلك النوع المُحدد ولكن يُفضل دائماً أن تتحرى الدقة فى تحديدك لأطوال الحقول حتى لا تُعطي حقلاً طولاً أكثر مما يحتاج وما ترتب على ذلك من فقدان لمساحة قاعدة البيانات دون أي فائدة ووجه حق. ولكن فى الحقيقة ليس ذلك السبب فى عدم تحديدنا للطول فى الأمر السابق ولكن السبب أنه البيانات من نوع “رقم” لا يُمكن تحديد الطول الخاص بها وذلك لأن الأعداد بالمنطق لا تُقاس بالطول ولكن تُقاس بالقيمة. فإذا حاولت مثلا أن تقول:



CREATE TABLE Numbers(numValue BIGINT(10))

لن يعترض مُحرر لغة SQL على ما قمت بكتابته حيث أنك وضعتها فى صيغة صحيحة فعلاً تُرضيه, ولكنه سيعترض وقت التنفيذ ولن يقم بتنفيذ الجملة حيث أنك حددت طولاً لبيانات من نوع “رقم”. إذن تفوز جملتنا الأول بالصحة و التنفيذ.

هُناك شيئاً أخر نلاحظه أيضاً بمقارنة بصيغة الأمر CREATE TABLE مع الجملة التي قُمنا بكتابتها معاً وهو وجود الأقواس المُربعة [] (Right-Left Square Brackets) فى بداية ونهاية إسماء الحقول والجداول مع العلم أننا لم نستخدمها داخل جملتنا السابقة, لمـــا يا تُرى؟!

-لو تتذكر منذ قليل حينما تحدثنا عن الكلمات المحجوزة (Keywords) لـ SQL وقد تكون إستغربت حينما أخبرتك بأنه لا يُمكنك (تقريباً) إستخدام تلك الكلمات المحجوزة لتسمية كائنات قواعد البيانات.

ذكري لكلمة تقريباً هُنا كان السبب بها هو ضميري حيث أنني كُنت أريد أن أُخفي عليك أنه يُمكنك إستخدام الكلمات المحجوزة لتسمية الكائنات بطريقة ما وذلك لأن ذلك الأمر غير مُفضل تماااماً ولكن إذا أردت ذلك مع أني لا أنصحك أبداً هُنا يأتي دور الأقواس المُربعة [] (Right-Left Square Brackets) حيث أن SQL لم تكن لتُقيدك بشئ وسمحت لك بتسمية الكائنات بما تشاء وحتى أن إستخدمت كلماتها المحجوزة ولكن بشرط أن تضع ذلك الإسم ما بين إثنين من الـ Right-Left Square Brackets, فمثلاً إذا أردنا أن نقوم بإنشاء جدول بإسم CREATE و CREATE من أهم الكلمات المحجوزة لـ SQL كيف ستكون الجملة؟!, سيراً على جملتنا السابقة ستكون كالتالي:



CREATE TABLE [CREATE](numValue BIGINT)

هُنا قد تأكد فعلاً المُحرر أنك تقصد بكلمة CREATE الثانية فى الجملة السابقة إسم الجدول وليس الأمر CREATE, ونفس الفكرة بالنسبة لتسمية الحقول أيضاً وليكن أننا سنقوم بتسمية الجدول بإسم CREATE والحقل بإسم TABLE والإثنين من الكلمات المحجوزة, إذن ستكون الجملة كالتالي:



CREATE TABLE [CREATE]([TABLE] BIGINT)

ولكن ضع فى الإعتبار أن إسم الجدول والحقل فى الجملة السابقة ليس بـ CREATE و TABLE ولكنهم [CREATE] و [TABLE] يعني ذلك أنك حينما تود التحدث مع SQL Compiler عن الجدول والحقل السابقين ستذكر له الجدول [CREATE] وليس الجدول CREATE وكذلك ستذكر له الحقل [TABLE]  وليس الحقل  TABLE حيث أن الـ Brackets الأن هي جزء من إسماء تلك الكائنات.

ولكن كيف الحال إن لم أقم بوضع الـ Brackets فى الجملة السابقة؟!

-بكل بساطة سيعتبر المُحرر أنك تقصد بالكلمتين CREATE الأولى والثانية الكلمة المحجوزة CREATE وكذلك الكلمتين TABLE الأولى والثانية الكلمة المحجوزة TABLE وسيشك فعلاً فى مدى إستيعابك للغة SQL ويإخذ على خاطره منك ولن يقوم بتنفيذ الأمر حتى يَلِج الجَمل في سَم الخياط.

رائع.. ولكن كيف الحال إن حددت أسماء ليس بالكلمات المحجوزة لـ SQL وبنفس الوقت قُمت بكتابة الأسماء ما بين الـ Brackets ؟

هُنا سيعبرك الـ Complier مبرمج حذر ودقيق جداً فى عملك, وستعلو فى نطره حيث أنك قد قُمت بشئ لست مطالباً به, تلك الحالة تحدث حينما نقوم بكتابة جملتنا الأولى كالتالي:



CREATE TABLE [Numbers]([numValue] BIGINT) --Standard Statement

جملة قياسية فعلاً!

ويُمكنك أيضاً إستخدام الـ Righ-Left Square Brackts داخل SQL حين محاولة إستخدام المسافات (Spaces) داخل أسماء الكائنات كـ [employee table] (ويُفضل إستبدال المسافات بالـ Under Score (_) كـ  employee_tableولا داعي للـ Brackets  حينها من باب توفير الجهد).

دعنا الأن نقوم بإنشاء جدول يحتوي على أكثر من حقل, وليكن جدول لبيانات الأسماء الحقيقة والمستعارة (Name, Nick Name) لأعضاء منتدى فيجوال بيسيك للعرب وسيكون الجدول بإسم VB Members ويحتوي على ثلاثة حقول وهم mbr_ID و mbr_Name و mbr_NickName وهم على التوالي رقم العضو, الأسم, الإسم المستعار, الأول من نوع “رقم” أما الثاني والثالث فمن نوع “نص”.

ولكن هُنا دعني أسألك سؤالاً, كم أقصى طولاً مناسباً لأسم عضو داخل منتدى؟!

-هل سيتدعى الـ 40 حرف؟, أعتقد أنها نسبة كريمة جداً.

وأيضاً كم أقصى طولاً مناسباً لأسم مستعار لعضو داخل منتدى؟!

-هل سيتعدى الـ 20 حرف؟,طول مناسب جداً.

إذن ستكون جملتنا هُنا كالتالي:



CREATE TABLE vb_Members

(

             mbr_ID INT,

             mbr_Name NVARCHAR(40),

             mbr_NickName NVARCHAR(20)

)

ليس هُناك فرق ما بين إنشاء جدول يحتوي على حقل واحد وأخر يحتوي على أكثر من حقل سوى وجود الفاصلة والمسافة (Comma + Space(, )) كفاصل ما بين حقل والأخر.

ولكن هناك شيئاً يتناقد مع قوانين قواعد البيانات العلائقية فى الجدول السابق –vb_Members- وهو عدم وجود الحقل الأساسي!… صح؟

ولكن كيف يُمكن تحديد الحقل الإساسي بإستخدام SQL؟!

بجملة بسيطة جدا وستكون بنفس طريقة ترتيب الحقول ولكن سيكون موضعها بعد أخر حقل مُحدد للجدول, ولكن ما هي تلك الجملة؟, هي:



PRIMARY KEY ([Your Primary Key Field0], [Your Primary Key Field1])

ولو ولاحظت فى التركيب ستجد أن الحقل الأساسي يُحدد ما بين إثنين من الأقواس (Patenthesis) مما يُوحي إليك بمدى إستيعاب الـ Complier لإمكانية إحتياجك لتحديد أكثر من حقل أساسي داخل جدول واحد كـ علاقة Many To Many لو تتذكر!.

لنُحدد الأن الحقل الأساسي للجدول vb_Members وهو بالطبع الحقل vb_ID, هيا:



CREATE TABLE vb_Members

(

             mbr_ID INT,

             mbr_Name NVARCHAR(40),

             mbr_NickName NVARCHAR(20),

PRIMARY KEY (mbr_ID)

)

ما رأيك الأن بأن نقوم بإنشاء أكبر جدول “tblEmployees” داخل قاعدة البيانات التي قُمنا بإنشاءها فى الدرس السابق برمجياً؟!, هيـا بنا:

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



CREATE TABLE tblEmployees

(

               empID INT,

               empSignUpDate DATE,

               empFirstName NVARCHAR(20),

               empMiddleName NVARCHAR(20),

               empLastName NVARCHAR(20),

               empDateOfBirth DATE,

               empGender REAL,

               empPhone NVARCHAR(20),

               empMobile NVARCHAR(20),

               jobID SMALLINT,

 PRIMARY KEY (empID)

)

الجملة السابقة يُمكنها أن تٌوم بإنشاء الجدول “tblEmployee” دون شك, ولكن ليس بنسبة 100%, لمــا؟!

لو تلاحظ فى تصميم قاعدة البيانات فى الدرس السابق ستجد أننا قُمنا بإعتماد إمكانية إحتواء بعض الحقول على فراغات والأخرى لا, وذلك لم نقم بإعتماده وتهيئته فى الجملة السابقة حيث أن الـ Compiler حينما لا يجد تمكين-تعطيل للفراغات داخل جملة مُعينة يقوم بإعتماد النمط الإفتراضي لذلك لديه وهو إعتماد الفراغات داخل جمييع الحقول, أي أن الجملة السابقة تسمح للمستخدم بفراغ بيانات أي من الحقول السابقة عدى الحقل الأساسي طبعاً لأنه بالفطرة لا يُمكن له أن يحتوي على فراغات. ولكن كيف يُمكن إعتماد ذلك؟!

-بإضافة احد إثنين من بنود (Clauses) الـ Keywords الخاصة بـ SQL تعقب نوع البيانات الطول فى تركيب الجملة وهما NULL وتختص بإعتماد الفراغات داخل بيانات الحقول وعكسها NOT NULL وتُعطل إمكانية الفراغات داخل بيانات الحقول, أي ستُحتم على المُستخدم إدخال بيانات فى ذلك الحقل أثناء الإدخال, وتكون صيغتها كالتالي:



[Field0] DataType(length) NULL OR NOT NULL

وبإعتمادها داخل جملتنا السابقة تُصبح الجملة:



CREATE TABLE tblEmployees

(

               empID INT NOT NULL,

               empSignUpDate DATE NOT NULL,

               empFirstName NVARCHAR(20) NOT NULL,

               empMiddleName NVARCHAR(20) NOT NULL,

               empLastName NVARCHAR(20) NOT NULL,

               empDateOfBirth DATE NOT NULL,

               empGender REAL NOT NULL,

               empPhone NVARCHAR(20) NOT NULL,

               empMobile NVARCHAR(20) NULL,

               jobID SMALLINT NOT NULL,

 PRIMARY KEY (empID)

)

هُنا يُمكنني أن أقول أن تلك الجملة تقوم بإنشاء الجدول كما قُمنا بإنشائه يدوياً بنسبة 90%, لــــــــــــما أيضاً؟

-ألم تلاحظ الحقل الغريب (Foreign Key Field) “jobID”  المتواجد فى  الجدول “tblEmployees” السابق؟, من المفترض أنه لا ينم لذلك الجدول بصلة وذلك لأنه هُناك علاقة بينه وبين جدول الأخر ولكن كيف يُمكن تحديد الـ Foreign Key Field داخل جمل SQL؟!

هذا ما سنتحدث عنه حين وصولنا للأمر ALTER TABLE حيث أنه من المُفترض عليك الأن ودون أدنى شك أن تقوم بإنشاء جميع جداول قاعدة البيانات التي أنشأناها فى الدرس السابق برمجياً بإستخدام الأمر CREATE TABLE (لا تنسى أن الـ Practice أو المُمارسة هو طريقك الوحيد للإحتراف) وذلك حتى نلتقي…..

فى الدرس القادم بإذن الله>>

Lesson4-Part2

SQL

(Structured Query Language)

(لغة الإستعـلام الهيكلية أو المُركبة)

(الغائب المُنتظر –على ما أعتقد- من الدرس السابق)

بعد أن علمنا أن الغاية النهائية لإنشاء مستر كودّ لقوانين نظام يُسمى بـ “نظام قواعد البيانات العلائقية” كانت بمثابة الأثاث الخرساني لبناء تطبيقات إلكترونية تعمل على الحاسب الآلي وتقوم بإدارة قواعد البيانات تِبعاً لتلك القوانين التي تفضل سيادته بها, وبما أن تلك النظم (RDBMS) تتخصص فى إدارة قواعد البيانات فكان لابد من وجود مُحرك (Engine) بداخلها يُمكنها من الإدارة والتحكم والقيادة لقواعد البيانات العلائقية,

ولكن ما طبيعة عمل الـ Database Engine (مُحرك قواعد البيانات)  داخل قواعد البيانات العلائقية؟!

بعد أن انتهى مستر كودّ من قوانين قواعد البيانات العلائقية, قام إثنين من الباحثين بشركة IBM بإنشاء لغة برمجة جديدة تُحقق وتسعى لتحقيق هدف قوانين ومبادئ قواعد البيانات العلائقية, وقد سُميت تلك اللغة فى بادئ الأمر بـأسـم:

American Structured Query Language (ونعم الإنتماء الوطني)

(لغة الإستعلام الهيكلية الأمريكية), أما بالنسبة للنطق فكان يُطلق عليها إسم S.Q.L إختصاراً لكلماتها (Structured Query Language). أو SEQUEL كنطقاً للثلاثة حروف معاً, ولكن سرعان ما غيرت IBM منطوق وإسـم SEQUEL إلى SQL بعد أن وُجد أنها علامة تُجارية مُسجلة لأحد شركات الطيران فى ذلك الوقت وكان الإسم النهائي لتلك اللغة هو SQL (Structured Query Language) إ           لا أن الكثير من المائلين للإختصار مازالوا يُطلقون عليها إسم SEQUEL ولكن ذلك لا تُسأل عنه IBM.

ما هي SQL؟

SQL أحد لغات البرمجة الغير إجرائية (Non Procedural Language) على عكس غيرها من اللغات مثل VB, C++, Java …إلخ.

حيث ان لغات البرمجة الغير إجرائية تتخصص للتعامل والتحكم داخل مجال واحد أما لغات البرمجة الإجرائية فتتعمم فى إنشاء شتى أنواع التطبيقات والبرامج كـ C++و VB …إلخ.

وتتخصص لغة SQL فى التعامل والتحكم فى قواعد البيانات العلائقية فقط, أي لا تنتظر منها أن تُساعدك فى برمجة تطبيق مُعين, فلو لاحظت من إسمها ستجد أنها لغة إستعلام.

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

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

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

سؤال, هل يعني ذلك أن نُظم إدارة قواعد البيانات تدعم تلك لغة SQL؟

لا ليست داعمة لها!…… هي لم تُبنى إلا على أساسها أصلاً!.

 أي يُمكنك أن تقول أن نظام إدارة قواعد البيانات الذى أمامك مهما كان نوعه ومهما كانت الشركة المُصممه له فهو ليس أكثر من شيئين فقط لا غير وهمـا (واجهة و لغة SQL). الواجهة او الـ Interface هي الأدوات والنوافذ المرئية التي تشاهدها وتستخدمها داخل ذلك النظام وتُمكنك من التعامل مع قواعد البيانات إما بإستخدام الـ Keyboard أو الـ Mouse, أما بالنسبة لما وراء الحائط أو ما وراء الستار أو ما وراء تلك الواجهة من تأثيرات وحركات (Transactions) على قواعد البيانات بمعنى أوضح فهو ليس أكثر من SQL.

يعني ذلك أن SQL هي الأساس الأول للتحكم وإدارة قواعد البيانات العلائقية؟!

-أييييوة, بالضبط.

يتبين من كلمة “لغة” أنها تتطلب دراسة وجهد جهيد حتى نتمكن من فهمها وأساسياتها, أليس كذلك؟

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

لا داعي للثرثرة, لقد حان الوقت لتُشمر عن ساعديك وتبدأ بطرقعة أناملك الجميلة ويبدأ تعدد ضحاياك من لوحات المفاتيح التي سوف تُدمرها عملاً وكتابة لأوامر SQL (لغة البرمجة الرقيقة).

 

بما أن لغة SQL هي لغة برمجة وبما أن إحتراف لغات البرمجة لا يأتي إلا بالـفهم ومن ثُم الـ Practice أو المُمارسة, فلابد لنا من مثالاً عملياً (قاعدة بيانات) حتى نتمكن من التطبيق عليه.

أسرع الأن بفتح نظـام إدارة قواعد البيانات الذي تستخدمه -حيث أن ما سنقوم به يسري على أي نظام لقواعد البيانات العلائقية- وسمي الله, وإبدأ معي بإنشاء أولى قواعد بياناتك فى تلك الدروس المُملة!.

قُم بإنشاء قاعدة بيانات جديدة بإسم:

MedicalCenter

(أعتقد انها قاعدة بيانات لمركز طبي!)

 

ثم قُم بإنشاء الوحدات او الجداول التالية:

بعد أن قُمت بتصميم الوحدات أو الجدوال, قُم إنشاء العلاقات التالية ما بين الجداول السابقة:

(الصور السابقة مُلتقطة من نظـام Ms-SQL Server 2008)

الأن وبعد أن إنتهينا, من تصميم قاعدة البيانات, يتوجب عليك الأن القيام بإدخال بيانات داخل تلك القاعدة قدر المُستطاع, حتى تكون مُستعداً للتلاعب بالبيانات (Manipulating Data) بإستخدام أوامر SQL وذلك…

فى الدرس القادم بإذن الله >>


Lesson4-Part1

Lesson4-Part1

بسـم الله والصلاة والسلام على رسول الله,

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

Data Types

أنـــواع البيانات

إن سألتني الأن التالي:

 ما إسمك؟     –عمر نجم.

كم سنك؟      -23.

تاريخ ميلادك؟ -268\1988.

نحن متفقين أن ما قمت بإجابتك عليه هو ليس أكثر من بيانات, ولكن لو لاحظت ستجد لكل منهما نوع خاص من البيانات.

كيف؟!.. نعم الإجابة الأولي كانت “عمر نجم” وتلك الجملة بصرف النظر عن ما تحتويه هي فى الأساس قيمة نصية, وكذلك الإجابة الثانية كانت 23 وذلك رقم أو عدد فهو فى الأساس قيمة عددية, وأما الثالثة والأخيرة فكانت #268\1988# وذلك تاريخ وليس قيمة تاريخية فليس بموسوعة جينيس!, وللعلم الثلاثة أنواع السابقة هي الأشهر إستخداماً داخل قواعد البيانات.

هذا هو المنطق العام لتلك البيانات البسيطة السابقة وكذلك أيضاً منطق أنواع البيانات داخل قواعد البيانات العلائقية, حيث أنك حينما تقوم بإنشاء قاعد بيانات بوحداتها بحقولها تكون قد أسبقت تلك العملية بتحليل للبيانات التي سوف تحتويها قاعدة بياناتك. ولكن ما دور أنواع البيانات وما هي الفائدة منها؟!

لقد وفرت إليك جميع أنظمة إدارة قواعد البيانات العلائقية الإمكانية لتحديد أنواع بيانات الحقول (Fields Data Type) حتى تتمكن من تطبيق المنطق العام للبيانات على قاعدة بياناتك فإذا كُنت تُحاول عمل قاعدة بيانات لـ “بيانات أعضاء منتدى فيجوال بيسيك للعرب” سيرناً على مثالانا السابق من الثلاثة أسئلة التي تفضلت بطرحها علي, سيكون تحديدنا لنوع بيانات الحقول كالتالي:

الأول = نص.

الثاني = رقم.

الثالث = تاريخ.

وأنا متأكد أنك لن تنسى الحقل الأساسي قبل الثلاثة حقول السابقة!

ولكن مــا الفائدة من تطبيق منطق أنواع البيانات, داخل أنظمة إدارة قواعد البيانات العلائقية(RDBMS)؟؟!

أنظمة إدارة قواعد البيانات أنظمة حاسوبية تعمل على الحاسب الآلي, ومن أبرز مكونات الحاسب الآلي وحدات التخزين (Storage Devices) كـ الـهارد ديسك (Hard disk) وتقوم تلك الوحدات بتخزين البيانات داخلها حيث يُمكنك القراءة والكتابة (Read & Write Data) منها وعليها. وتستخدم تلك الوحدات طريقة نظام عددي يُسمى “بالنظـام الثنائي” –Binary System- لكتابة وقراءة البيانات داخلها ويتكون الأساس -Base- الخاص بالنظـام الثنائي من رمزين فقط وهما (صفر, واحد) وأحدهما داخل قيمة ثنائية يُسمى بـ Bit حيث أن القيمة المكونة من 8 Bit  تُساوي 1 Byte والـ 1000 Byte تُساوي 1 Kilo byte والـ 1000 Kilo Byte تُساوي 1 Mega Byte والـ 1000 Mega byte تُساوي 1 Giga byte والـ 1000 Giga byte تُساوي 1 Tera byte والـ 1000 Tera byte تُساوي 1 Bitabyte .. كفاية كده!.

وأعتقد أنك على علم بأن كل ما تراه من بيانات داخل أي وحدة تخزين فهو يَشغل مساحة تخزينية داخل تلك الوحدة قيس على ذلك أي نوع من أنواع الببانات وكذلك الفرق بيهم, فأنت تعلم أن مساحة ملفات الوسائط المُتعددة –Multi Media- تشغل مساحة أكبر المستندات النصية –Text Documents- .ولكن وحدات التخزين عبارة عن كتلة فارغة من المساحة التخزينية تُقسمها وتكتب وتقرأ عليها ومنها كما تشاء وكيف تشاء ولن تعترض على أي نوع من أنواع البيانات إلا إذا حملتها فوق طاقتها وحاولت نسخ 80 GB من البيانات إلى وحدة تخزين مساحتها النهائية 40 GB مثلاً.

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

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

لإستقبال البيانات؟!

وهل يُمكن لقاعدة بيانات أن لا تستجيب لإستقبال أو تسجيل البيانات؟!

-منذ فترة قليلة وليست بعيدة كُنا نحيا فى عصر يُسمى بـ Limited Spaces او المساحات المحدودة فكل نوع من قواعد البيانات له مساحة نهائية من البيانات لا يُمكنك أن تتحمل فوقها, فقواعد بيانات Ms-Access مثلاً أقصى مساحة تخزينية لها 2 Giga Byte فقط –ليس هذا فقط فهي محدودة الكفائة جدا… إستخدمها فى عمل Phone Index ولا يُكلف الله نفساً إلا وسعها!- وقواعد بيانات SQL Server 2000 أقصى مساحة تخزينية لها 1 Terabyte وكذلك Oracle. فبما أننا كنا نتعامل مع قواعد بيانات محدودة أو مُحددة المساحة فكان لابد أن نُحافظ قدر المُستطاع على مساحة قاعدة البيانات لذلك تم إعتماد تنوع البيانات لحقول وحدات قواعد البيانات, ولكن ما علاقة ذلك بالحفاظ على مساحة قاعدة البيانات؟!

-سؤال رائع وذكي جدا!, تحدثنا من قبل عن الفرق بين المساحة التي يشغلها نوع من البيانات عن الأخر فإذا كانت الحقول تحتوي على نوع واحد من البيانات فقط ومن المفترض بما أنه نوع واحد أن يعتمد أي نوع من أنواع البيانات كوحدات التخزين وليس هُناك طريقة لحفظ أي نوع من البيانات سوى طريقة واحدة وهي الـ Binary System او النظام الثناي (0,1)  الذى تتبعه وحدات التخزين, ولكن سؤال من فضلك, هل ستقوم بحفظ إسم كامل لموظف لا يتعدى إسمه الـ 200 حرف على شكل Binary!..ومما لا شك فيه أنك ستكون بحاجة إلى ترجمة تلك القيمة النصية إلى الثنائية عند محاولتك لتخزينها والعكس عند إسترجاع بياناتها.

لذلك حينما كان يتناقش مُطوري نظم قواعد البيانات إتقفوا على أن المستخدم ليس بحاجة دائمة لنوع واحد من البيانات وما ترتب على ذلك من فقدان للمساحة دون حاجة وصعوبة صعيبة فى إدخال وإخراج البيانات, لذلك منحتك جميع أنظمة قواعد البيانات العديد من أنواع البيانات (Data Types) حتى تستخدم سيادتك كل منهم بما يتلائم  ويتفق مع نوع البيانات الخاصة بالوحدة التي تقوم بإنشاءها حتى تتمكن من الحفاظ على مساحة قاعدة البيانات وتسهل عليك عمليات الإدخال والإخراج من وإلى قاعدة البيانات.

العجيب أنني أجد من لا يتحرى الدقة فى إختيار النوع المناسب للبيانات وهو على علم بأهميتها بدافع أن أهمية قاعدة البيانات التي يعمل عليها لا تتطلب كل ذلك…. أسفاً فى لفظي.. ليس شأنك؟!,

هل تُنشئ قاعدة البيانات لشخصك أم لأحد المُستخدمين الذين لهم مطلق الحرية فى إدخال وعرض البيانات وتتلقى منه ثمناً لذلك؟!

هل قاعدة البيانات ستُستخدم ليومين وتتوقف أم سيحتفظ بها المُستخدم كما يشاء  لسنوات مثلاً؟!

هل تقوم بذلك لأنه واجب عليك أم أنه إختياري وقت ما يحلو لك تُنفـــــــذه؟

هل تُخلص وتُراعي ضميرك فى العمل أم لا يعني لك الكثير؟

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

الأن من المفترض أن أذكر لك أنواع البيانات (Data Types) التي ستتعامل معها داخل قواعد البيانات ولكن بكل أسف لا يُمكنني ذلك حيث أن الهدف من تلك الدروس هو شرح قواعد البيانات عموماً وليس نوع مُحدد منها, فيُمكنك إستخدام مُحرك بحث Google –حبيب المليارات!- للبحث عن طبيعة كل نوع من أنواع البيانات الخاصة بنظام إدارة قواعد البيانات الذي تستخدم وكذلك الحجم الذي يشغله من ذاكرة الحاسب الآلي.

 وبعدها تخيل أي من الوحدات (Tables) بذهنك فى جو هادئ وضوء خافت مع وجه حـَسـ….. أسف! مع فنجان من القهو! وقُم بتحليلها وتحديد حقولها وتحديد كل نوع منها بمنطق أنواع البيانات الخاص بـنظام إدارة قواعد البيانات الخاص بك وذلك بعد أن تكون قد قرأت ودرست أنواعه جيداً.

قبل أن أنسى لقد أخبرتك منذ قليل أننا كُنا -ماضي- نحيا فى عصر Limited Spaces حيث أن احدث إصدارات قواعد بيانات SQL Server وهو الإصدار العاشـر (SQL Server 2008) يحتوي على خاصية جديدة وهي Unlimited Spaces اي قواعد بيانات غير محدود المساحة أي ستستجيب للبيانات بشكل دااائم حتى تنتهى مساحة وحدة التخزين الخاصة بك, ولكن ذلك لا يعني أن نتنازل عن تحديد أنواع البيانات فإذا كانت خاصية Unlimited Spaces قد ظهرت فإن فقدان المساحة دون حاجة لن ينتهي!- ولك ما تشاء Make Your Choice J.

أما الأن فقد حان الوقت للتحدث عن الشئ الناقص الغائب المنتظر منذ الدرس السابق, هيـا بنا.