Electronic Gilgamesh

عزيزي الزائر كما هو واضح بأنك زائر للمنتدى لذى نود ان ندعوك الى الدخول ان كانت لديك عضوية او التسجيل في المنتدى نتشرف بتواجدك معنا حيث المعلومة الجديدة والدروس التعليمية الحصرية
Electronic Gilgamesh

For information & communication technology


    الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    شاطر

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:18 am

    الحين بدينا بالجد

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

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

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

    سأستخدم بهذا القالب المميزات التالية
    قواعد بيانات في SQL
    الاداة Property Grid للتعديل في قيود قاعدة البيانات
    الاداة TreeView والاداة ListView في استعراض البيانات
    تقليد شريط ادوات اوفيس 2007 (ToolBar Office 2007) للاوامر
    الكائن Report الموجود في الفيجوال بيسك 2005 ولن استخدم الكريستال ريبورت
    Object Oriented Programming OOP
    DataSet
    Enums

    مكونات المشروع
    Stores.mdf ملف قاعدة البيانات منتجة من داخل الفيجوال موقعه Bin\Debug
    يتكون المشروع من المجلدات التالية
    المجلد Central نضع بداخله الكائن الرئيسي والنموذج الرئيسي والوحيد وDataSet الخاصة بالنظام وDataSet الخاصة بالتقرير
    المجلد Components نضع فيه الكائنات التي تستخدم في القالب وتكون عامة بحيث لا تختلف من نظام لاخر
    المجلد Entities يكون فيه كائنات النظام وتتغير خصائصها حسب الكائن

    مكونات المجلد Central
    Manager.vb كائن عام يتخصص بفتح قاعدة البيانات ويولد جميع الخدمات المشتركة في النظام
    frmMain.vb النموذج الوحيد وواجبه استعراض البيانات والتعديل عليها واستدعاء التقارير المطلوبة
    StoresDataSet.xsd هيكل قاعدة البيانات المخازن
    DataReport.xsd هيكل لبيانات التقارير

    مكونات المجلد Components
    Enums.vb ملف فيه اي مرقمات في النظام
    IDs.vb اكثر الكائنات استخداما وهو عام يتكرر في جميع انظمة قواعد البيانات يحمل مجموعة من الارقام التي هي عبارة عن مفاتيح قيود في قاعدة البيانات ليتم التعامل معها
    Report.vb كائن متخصص باستقبال بيانات تقرير ويعرذ ذلك التقرير

    مكونات Entities
    فيه كائن يقابل جدول في قاعدة البيانات وهو يحمل قيد واحد في كل نسخة مسؤوليته توفير جميع بيانات العرض والتعديل والتقارير لذلك الكائن

    Company.vb شركة وهو يمثل الشركات التي يتم شراء المواد منها للمخزن
    Employee.vb موظف وهو يمثل اي موظف من حقه استلام او ارجاع مادة
    Item.vb مادة وهي المواد الموجودة بالمخزن
    Invoice.vb فاتورة استلام مادة من قبل موظف

    هذا عرض للقالب ونموذج للمثال اللي راح نتابعه
    ارجو من الاساتذة والطلبة المهتمين بيان تعليقاتهم لكي نقرر المباشرة بشرح هذا القالب
    __________________

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    الفئة IDs

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:20 am

    سأبدأ بشرح هذا الفئة لانه مستقل تماما عن المشروع ويمكن استخدامه بأي مشروع قاعدة بيانات وهو عباره عن تجمع من الارقام الصحيحة التي تمثل مفاتيح مجموعة من القيود في جدول معين في قاعدة البيانات
    الفرق بين المصطلح فئة (نوع) Class والمصطلح كائن Object هو ان الفئة هي الكود والكائن هو المتغير الذي نعلنه من نوع تلك الفئة
    رمز برمجي:


    PublicClass IDs
    Inherits CollectionBase
    PublicSubNew()
    EndSub
    PublicSubNew(ByVal Table As DataTable, OptionalByVal Filter AsString = "", OptionalByVal Sort AsString = "", OptionalByVal ColumnName AsString = "")
    Dim Rows() As DataRow = Table.Select(Filter, Sort)
    Dim Row As DataRow
    If ColumnName = ""Then
    ForEach Row In Rows
    list.Add(Row(0))
    Next
    Else
    ForEach Row In Rows
    list.Add(Row(ColumnName))
    Next
    EndIf
    EndSub
    يرث CollectionBase وهو عبارة عن تجمع من الارقام
    ماهو التجمع Collection: ان المصفوفة Array عبارة عن مجموعة محددة من القيم ذات النوع الواحد ويتم الوصول الى اي قيمة بواسطة تسلسلها والتجمع تطوير للمصفوفة حيث اصبحت عدد القيم التي فيها غير محددة ويوجد ما هو احدث من التجمع وهو القاموس Dictionary وهو تطوير للتجمع فالوصول لاي عنصر من عناصره يتم لوصول اليه بواسطة مفتاح وهو من نوع كائن ايضا مثلا نص

    الاجراء New وهذا الاجراء يتنفذ عند انشاء اي متغير من هذه الفئة نرى ان هذا الاجراء فاضي وهذا يعني اننا يمكن اعلان متغير من هذا النوع (فئة) بدون اي كود

    الاجراء New هذه طريقة ثانية لبناء متغير من هذا النوع وهو بتمرير الاتي
    Table As DataTable جدول من قاعدة البيانات وهو الجدول الذي نرغب من هذا الكائن ان يحمل مفاتيح مجموعة من قيوده
    Filter As String نص يمثل الشروط التي نرغب بتجميع مفاتيح القيود التي تتوافق مع هذا الشرط
    Sort As String نص نضع فيه اسم الحقل الذي نرغب بان تكون القيود مرتبه عليه
    ColumnName As String نص نضع فيه الحقل الذي نرغب بوجوده بدل المفتاح واستخدامه قليل
    المصطلح Optional الذي يسبق المتغير المرر للاجراء معناه ان هذا المتغير اختياري التمرير اي من الممكن عدم تمرير هذا المتغير وهو سيأخذ القيمة الافتراضية له الموجوده بعده
    يحتوي هذا الاجراء على الكود التالي
    رمز برمجي:
    Dim Rows() As DataRow = Table.Select(Filter, Sort)
    اعلان عن مصفوفه من القيود من نوع DataRow وتساوي الاجراء Select من الجدول المرر ونسلم للاجراء Select الشروط وحقل الترتيب ويرجع مصفوفة من DataRow التي تنتمي لهذه الشروط
    رمز برمجي:
    Dim Row As DataRow
    نعلن عن متغير من نوع قيد بيانات
    رمز برمجي:
    If ColumnName = ""Then
    اذالم نكن قد سلمنا اسم الحقل المراد تجمعه سيتنفذ الكود التالي
    رمز برمجي:
    ForEach Row In Rows
    list.Add(Row(0))
    Next
    هذا التكرار يتحرك على جميع قيود البيانات الموجودة في المصفوفة ويضيف قيمة الحقل الاول من كل قيد في المتغير List وهو من مكونات ال CollectionBase الذي ورثناه وهو الذي يحمل القيم الموجودة في التجمع
    رمز برمجي:
    ForEach Row In Rows
    List.Add(Row(ColumnName))
    Next
    والا سنضيف الى المتغير List الحقل المطلوب تعبئته
    الخاصية Item
    رمز برمجي:
    DefaultPublicReadOnlyProperty Item(ByVal index AsLong) AsLong
    Get
    ReturnCType(List.Item(index), Long)
    EndGet
    EndProperty
    Default تعني افتراضي وهذا يجعل هذه الخاصية هي الافتراضية حيث اذا كتبنا المتغير فقط كأنه استدعينا هذه الخاصية
    تستلم تسلسل المفتاح المطلوب وترجع قيمته
    الدالة CType هي اختصار لـ ConvertType وهذه الدالة تحول من اي نوع الى نوع ثاني اذا كان بالامكان تغييره فهي الان تحول القيمة الموجوده الى رقم من نوع Long عدد صحيح كبير

    الخاصية IndexOf
    رمز برمجي:
    PublicReadOnlyProperty IndexOf(ByVal ID AsLong) AsLong
    Get
    Return List.IndexOf(ID)
    EndGet
    EndProperty
    خاصية للقراءة فقط نسلم لها القيمة وتسلمنا تسلسلها وتفيد للبحث

    الخاصية CountIDs
    رمز برمجي:
    PublicReadOnlyProperty CountIDs() AsLong
    Get
    ReturnCType(List.Count, Long)
    EndGet
    EndProperty
    ترجع عدد المفاتيح الموجودة

    الخاصية Contains
    رمز برمجي:
    PublicReadOnlyProperty Contains(ByVal ID AsLong) AsBoolean
    Get
    Return List.Contains(ID)
    EndGet
    EndProperty
    ترجع صح اذا المفتاح المسلم لها موجود وخطأ اذا لم يكن موجودا

    الدالة AddID
    رمز برمجي:
    PublicFunction AddID(ByVal ID AsLong) As IDs
    List.Add(ID)
    ReturnMe
    EndFunction
    لاضافة مفتاح الى موجودات التجمع

    الدالة AddIDs
    رمز برمجي:
    PublicFunction AddIDs(ByVal IDs As IDs) As IDs
    Dim i AsLong
    ForEach i In IDs
    List.Add(i)
    Next
    ReturnMe
    EndFunction
    لاضافة تجمع مفاتيح الى التجمع الحالي

    الدالة RemoveID والدالة RemoveIDs لالغاء مفتاح واحد او تمجع من المفاتيح من التجمع الحالي
    رمز برمجي:
    PublicFunction RemoveID(ByVal ID AsLong) As IDs
    If List.Contains(ID) Then
    List.Remove(ID)
    EndIf
    ReturnMe
    EndFunction
    PublicFunction RemoveIDs(ByVal IDs As IDs) As IDs
    Dim i AsLong
    ForEach i In IDs
    RemoveID(i)
    Next
    ReturnMe
    EndFunction

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    رد: الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:21 am

    الدالة Sort لترتيب المفاتيح من الاصغر الى الاكبر
    رمز برمجي:
    PublicFunction Sort() As IDs
    InnerList.Sort()
    ReturnMe
    EndFunction
    الدالة Text ترجع المفاتيح على شكل نص يفيد استدعائها بمراجعة القيم الموجودة في عملية تصحيح الاخطاء
    رمز برمجي:
    PublicFunction Text() AsString
    Dim i AsLong
    Dim Ret AsString = ""
    For i = 0 To List.Count - 1
    Ret &= List(i) & vbCrLf
    Next
    Return Ret
    EndFunction
    vbCrLf يمثل سطر جديد بالنص

    الدالة RemoveDuplicates لالغاء المفاتيح المتكررة من التجمع
    رمز برمجي:
    PublicFunction RemoveDuplicates() As IDs
    Dim RetIDs AsNew IDs
    Dim i AsLong
    Me.Sort()
    If List.Count > 0 Then RetIDs.AddID(List(i))
    For i = 0 To List.Count - 2 ' To Befor Last
    If List(i) <> List(i + 1) Then
    RetIDs.AddID(List(i + 1))
    EndIf
    Next
    Return RetIDs
    EndFunction
    EndClass
    تم الكائن

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

    كما سنلاحظ ان هذا الكائن سيكون البديل عن تعامل النظام مع جمل SQL التي نضطر لمراجعتها كل ما تم تغيير اسم احد الحقول او الجداول

    في امامنا الكثير من النقاش

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    رد: الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:22 am

    الفئة Manager
    هذه الفئة نعلن على متغير واحد من نوعها ومسؤوليتها جميع خدمات قاعدة البيانات بالاضافة الى بعض الخدمات التي نحتاجها في بناء النظام
    وهذا الكائن مستقل عن المشروع ويمكن تكراره مع اي مشروع مع تغييرات بسيطة
    رمز برمجي:
    Imports System.Data.SqlClient
    PublicModule World : Public Our As Manager : EndModule
    PublicClass Manager
    Private Cnn AsNew SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename='" & Application.StartupPath & "\Stores.Mdf';Integrated Security=True;User Instance=True")
    Public Data As StoresDataSet
    Private SystemKey AsInteger
    Private LicenceKey AsString
    Public Path AsString = Application.StartupPath
    Public ApplicationName AsString
    سنبدا باستيراد الكائن SqlClient الذي يتكون من جميع كائنات قاعدة البيانات
    رمز برمجي:
    PublicModule World : Public Our As Manager : EndModule
    هذا الكود يعلن عن متغير من نوع الفئة Manager واسمه Our
    (وكنت قبل الفيجوال 2005 اسميه My وقد استخدم هذا المتغير في اصل اللغة وغيرته الى Our وقد احدثت هذه الحادثة مفاجأه لطلابي لانهما متشابهان بالعمل)
    رمز برمجي:
    PublicClass Manager
    Private Cnn AsNew SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename='" & Application.StartupPath & "\Stores.Mdf';Integrated Security=True;User Instance=True")
    المتغير Cnn من نوع SqlConnection كائن الاتصال بقاعدة البيانات ونتوقع ان تضع قاعدة البيانات بجانب البرنامج اي الملف Exe واسم قاعدة البيانات Stors

    المتغير Data المعلن من نوع StoresDataSetالتي هيكل قاعدة البيانات
    المتغيرات SystemKey, LicenceKey تخص حماية النظام من النسخ وفي مشروعنا هذا لم نعمل حماية له وسيكون موضوع احد الحلقات القادمة من السلسلة
    المتغير Path يحمل موقع البرنامج وقاعدة البيانات ويفيد في ايجاد الملفات المرفقة ان وجدت
    المتغير ApplicationName يحمل اسم التطبيق
    رمز برمجي:
    PublicSubNew()
    ReadDate()
    EndSub
    عند انشاء الكائن نستدعي الاجراء المختص بقراءة البيانات
    رمز برمجي:
    PublicSub ReadDate()
    Data = New StoresDataSet
    Dim Adp As SqlDataAdapter
    ForEach aTable As DataTable In Data.Tables
    Adp = New SqlDataAdapter("Select * From " & aTable.TableName, Cnn)
    Dim Cmdbld AsNew SqlCommandBuilder(Adp)
    Adp.Fill(aTable)
    Next
    EndSub
    يجدد المتغير العام Data ويعلن عن متغير من نوع SqlDataAdapter وهذا الكائن هو حلقة الوصل بين Connection و DataSet فهو يعبيء DataSet او اي جزء منها من خلال Cnn

    لجميع جداول الموجودة في DataSet نسلم لل Adapter جملة SQL جميع الحقول وجميع القيود في الجدول
    نبني SqlCommandBuilder وهو باني الاوامر ونسلم له Adp ثم نستدعي هذا المتغير لتعبئة الجدول ببياناته

    الاجراء WriteData المختص بحفظ البيانات وهو مشابه للاجراء قراءة بيانات
    رمز برمجي:
    PublicSub WriteData()
    Dim Adp As SqlDataAdapter
    ForEach aTable As DataTable In Data.Tables
    Adp = New SqlDataAdapter("Select * From " & aTable.TableName, Cnn)
    Dim Cmdbld AsNew SqlCommandBuilder(Adp)
    Adp.Update(aTable)
    Next
    EndSub
    الاجراء Run لتشغيل اي ملف او برنامج خارجي
    رمز برمجي:
    PublicSub Run(ByVal Path AsString)
    Try
    Process.Start(Path)
    Catch ex As Exception
    MessageBox.Show("The file " & Path & " Can't be found..." & vbCrLf & "Try again latter...", "Run...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    EndTry
    EndSub
    الاجراء NewRow المتخصص باضافة قيد جديد لاي جدول بيانات
    رمز برمجي:
    PublicSharedFunction NewRow(ByVal Table As DataTable) AsInteger
    Dim ID AsInteger = 1
    Dim TmpIDs AsNew IDs(Table)
    TmpIDs = TmpIDs.Sort
    If TmpIDs.Count > 0 Then ID = TmpIDs(TmpIDs.Count - 1) + 1
    Dim Rw As DataRow = Table.NewRow
    Rw = FillDefaultData(Rw)
    Rw(0) = ID
    Table.Rows.Add(Rw)
    Return ID
    EndFunction
    يستلم هذا الاجراء جدول بيانات يكون اعلى مفتاح للقيد المراد انشاءه وهو عدد قيود الجدول مضاف لو 1
    يكون القيد الجديد ويسدعي الدالة FillDefaultData لكي تعبئه بالقيم الافتراضية ويضيفه للجدول

    الدالة FillDefaultData تستلم قيد وتمر على الحقول التي فيه وتعبئها بقيم افتراضية
    رمز برمجي:
    PublicSharedFunction FillDefaultData(ByVal Row As DataRow) As DataRow
    Dim Cln As DataColumn
    Dim Typ AsString
    ForEach Cln In Row.Table.Columns
    If IsDBNull(Row(Cln)) Then
    Typ = Cln.DataType.ToString.Substring(7) ' For Cut [System.]
    SelectCase Typ
    Case"String", "Char", "Object"
    Row(Cln) = ""
    Case"DateTime"
    Row(Cln) = Now.Date
    Case"Byte", "Integer", "Long", "Short", "Int16", "Int32", "Int64", "Decimal", "Single", "Double"
    Row(Cln) = 0
    Case"Boolean"
    Row(Cln) = False
    CaseElse
    InputBox("Insert This Type to FillDefault Function", "Call Programmer", Typ)
    Stop
    EndSelect
    EndIf
    Next
    Return Row
    EndFunction

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    رد: الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:22 am

    الاجراء Edit وهو اجراء يفيد في تصحيح الاخطاء ففي وقت معين تحتاج لترى خصائص كائن معين اثناء التنفيذ وتعدل بها فما عليك الا استدعاء هذا الاجراء وتمرر له المتغير المطلوب
    رمز برمجي:
    PublicSub Edit(ByVal EditableObject AsObject)
    Dim frm AsNew Form
    With frm
    .Font = New System.Drawing.Font("Tahoma", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(178, Byte))
    .ClientSize = New System.Drawing.Size(288, 406)
    .ShowInTaskbar = False
    .StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
    .Text = EditableObject.GetType.ToString & " Property"
    Dim Pry AsNew PropertyGrid
    With Pry
    .Dock = DockStyle.Fill
    .SelectedObject = EditableObject
    EndWith
    .Controls.Add(Pry)
    .ShowDialog()
    EndWith
    EndSub
    يكون نموذج جديد ويضبط خصائصه
    Font هذه الطريقة لتوليد متغير لبناء خط
    حجم النموذج
    ولا يظهر في شريط المهام
    واول ظهور له في وسط نموذج المشروع
    وعنوان النموذج يكون كلمة (خصائص) يليها اسم الكائن المطلوب عرض خصائصه

    رمز برمجي:
    Dim Pry AsNew PropertyGrid
    With Pry
    .Dock = DockStyle.Fill
    .SelectedObject = EditableObject
    EndWith
    نعلن عن متغير من نوع الاداة PropertyGrid ونجعلها تمليء النموذج من خلال الخاصية Dock ونعلم الاداة بالكائن المطلوب استعراضه
    نضيف الاداة للنموذج وننظهر النموذج

    الاجراء Execute لتنفيذ اي SQL
    رمز برمجي:
    PublicSub Execute(ByVal SQL AsString)
    Cnn.Open()
    Dim Cm AsNew SqlCommand(SQL, Cnn)
    Cm.ExecuteNonQuery()
    Cnn.Close()
    EndSub
    هنا يجب الانتباه الى انه يجب حفظ البيانات قبل استدعاء هذا الاجراء

    الاجراء Calculate لتنفيذ اي SQL ترجع نتيجة
    رمز برمجي:
    PublicFunction Calculate(ByVal SQL AsString) AsDouble
    Dim Ret AsDouble
    Cnn.Open()
    Dim Cm AsNew SqlCommand(SQL, Cnn)
    Try
    Ret = Cm.ExecuteScalar
    Catch ex As Exception
    EndTry
    Cnn.Close()
    Return Ret
    EndFunction
    الدالة Viewer ترجع DataViewer اذا رغبنا
    رمز برمجي:
    PublicFunction Viewer(ByVal Table As DataTable, ByVal strFilter AsString, OptionalByVal strSort AsString = "") As DataView
    Dim Ret As DataView = New DataView(Table, strFilter, strSort, DataViewRowState.CurrentRows)
    Return Ret
    EndFunction
    الدالة Reader ترجع DataReader
    رمز برمجي:
    PublicFunction Reader(ByVal SQL AsString) As SqlDataReader
    Cnn.Open()
    Dim Cm AsNew SqlCommand(SQL, Cnn)
    Dim Ret As SqlDataReader = Cm.ExecuteReader(CommandBehavior.CloseConnection)
    Return Ret
    EndFunction
    EndClass
    تم الكائن

    Admin
    Admin
    Admin

    عدد الرسائل : 117
    تاريخ التسجيل : 02/09/2008

    رد: الحلقة 2 من السلسلة 167 للاستاذ عبد العبيدي

    مُساهمة من طرف Admin في الجمعة سبتمبر 14, 2012 3:25 am

    طبقات المشروع



      الوقت/التاريخ الآن هو الخميس ديسمبر 08, 2016 2:17 am