تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[سؤال] مساعدة في عمل برنامج تعليم
#11
اهلا اخي شمس جدول المحتويات سيكون لكل المواضيع صممه بالشكل الذي تريد
اعرف ان الامور ستختلط عليك لان هذا النوع من العلاقات صعب جدا و التعامل معه مرير و لكن الهدف كان التوضيح فقط
لا عليك اخي شمس , باذن المولى عز و جل ساحاول ان اوجهك بطريقة جيدة لفهم الالية (حسب قدرتي)
سارفق لك ملف قاعدة البيانات و سابدأ بشرح مقتضب عبر مثال يعطيك القدرة على فهم الالية

ابدأ مشروع جديد وادرج فيه فورم (Form1) و ادرج ايضاً مديول وسميه (Connect)
سنضيف داخل المديول بعض الدوال البسيطة لتسهل علينا العمل (لكي لا نكرر كتابة الاكواد)
داخل المديول سنكتب هذه الاكواد
PHP كود :
ImportsSystem.Data.OleDb
Module Connect
    Public ConnectionString 
As String "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestDb.accdb"
 
   Public Con As New OleDbConnection(ConnectionString)

 
   Public Sub CloseConnect()
 
       If Con.State ConnectionState.Open Then
            Con
.Close()
 
       End If
 
   End Sub

    Public Sub OpenConnect
()
 
       If Con.State ConnectionState.Closed Then
            If Con
.ConnectionString Nothing Then Con.ConnectionString ConnectionString
            Con
.Open()
 
       End If
 
   End Sub


    Public 
Function SelectWithString(ByVal TblNmae As StringByVal Fileds() As StringByVal CondFiled As StringByVal Match As String) As DataTable

        If Fileds
.Length 0 Then
            MessageBox
.Show("تاكد من ملئ مصفوفة الحقول")
 
           Return Nothing
        End 
If

 
       Dim SelectStatement As String "Select "
 
       Dim SetFileds As String ""
 
       For Each str As String In Fileds
            SetFileds 
+= str ","
 
       Next

        If SetFileds
.EndsWith(","Then SetFileds SetFileds.Remove(SetFileds.Count 11)

 
       SelectStatement += SetFileds " From " TblNmae " Where " CondFiled " Like '" Match "' "
 
       If Con.ConnectionString Nothing Then Con.ConnectionString ConnectionString
        Dim Cmd 
As New OleDbCommand(SelectStatementCon)
 
       Dim Dt As New DataTable
        Dt
.Clear()
 
       Dim Da As New OleDbDataAdapter(Cmd)
 
       If Con.State ConnectionState.Closed Then Con.Open()
 
       Da.Fill(Dt)
 
       Cmd.Dispose()
 
       Return Dt
    End 
Function

 
   Public Function SelectWithInteger(ByVal TblNmae As StringByVal Fileds() As StringByVal CondFiled As StringByVal ID As Integer) As DataTable

        If Fileds
.Length 0 Then
            MessageBox
.Show("تاكد من ملئ مصفوفة الحقول")
 
           Return Nothing
        End 
If

 
       Dim SelectStatement As String "Select "
 
       Dim SetFileds As String ""
 
       For Each str As String In Fileds
            SetFileds 
+= str ","
 
       Next

        If SetFileds
.EndsWith(","Then SetFileds SetFileds.Remove(SetFileds.Count 11)

 
       SelectStatement += SetFileds " From " TblNmae " Where " CondFiled " Like '" ID "' "
 
       If Con.ConnectionString Nothing Then Con.ConnectionString ConnectionString
        Dim Cmd 
As New OleDbCommand(SelectStatementCon)
 
       Dim Dt As New DataTable
        Dt
.Clear()
 
       Dim Da As New OleDbDataAdapter(Cmd)
 
       If Con.State ConnectionState.Closed Then Con.Open()
 
       Da.Fill(Dt)
 
       Cmd.Dispose()
 
       Return Dt
    End 
Function


 
   Public Function SelectFTableNormal(ByVal TblNmae As StringByVal Fileds() As String) As DataTable
        If Fileds
.Length 0 Then
            MessageBox
.Show("تاكد من ملئ مصفوفة الحقول")
 
           Return Nothing
        End 
If

 
       Dim SelectStatement As String "Select "
 
       Dim SetFileds As String ""
 
       For Each str As String In Fileds
            SetFileds 
+= str ","
 
       Next

        If SetFileds
.EndsWith(","Then SetFileds SetFileds.Remove(SetFileds.Count 11)

 
       SelectStatement += SetFileds " From " TblNmae
        If Con
.ConnectionString Nothing Then Con.ConnectionString ConnectionString
        Dim Cmd 
As New OleDbCommand(SelectStatementCon)
 
       Dim Dt As New DataTable
        Dt
.Clear()
 
       Dim Da As New OleDbDataAdapter(Cmd)
 
       If Con.State ConnectionState.Closed Then Con.Open()
 
       Da.Fill(Dt)
 
       Cmd.Dispose()
 
       Return Dt
    End 
Function

    Public Function GetFiled(ByVal ReturnFiled As StringByVal Tbl As StringByVal CondFiled As StringByVal Id As String) As String
        Dim serch 
As String ""
        serch "Select " ReturnFiled " From " Tbl " Where " CondFiled " Like '" Id "' "

        Dim Cmd As New OleDbCommand(serchCon)
        Dim ReturnResult As String ""
        OpenConnect()
        Dim red As OleDbDataReader Cmd.ExecuteReader
        
While red.Read
            
If red.HasRows Then
                
If Not (red(ReturnFiledIs Nothing) Or red(ReturnFiled).ToString.Length 0 Then
                    ReturnResult 
red(ReturnFiled).ToString
                
Else
                    ReturnResult 0
                End 
If
            End If
        End While
        red.Close()
        Cmd.Dispose()
        CloseConnect()
        Return ReturnResult
    End 
Function


End Module 

الاكواد بسيطة جدا و هي تقوم بالعمليات الاعتيادية (جلب البيانات وفق شرط و بدون شرط) ساقوم بشرحها الان

PHP كود :
   Public ConnectionString As String "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestDb.accdb"
 
   Public Con As New OleDbConnection(ConnectionString)

 
   Public Sub CloseConnect()
 
       If Con.State ConnectionState.Open Then
            Con
.Close()
 
       End If
 
   End Sub

    Public Sub OpenConnect
()
 
       If Con.State ConnectionState.Closed Then
            If Con
.ConnectionString Nothing Then Con.ConnectionString ConnectionString
            Con
.Open()
 
       End If
 
   End Sub 
في هذا الكود انا اقوم بتاسيس اتصال مع القاعدة الموجودة في مجلد البرنامج و لدي دالتان واحدة تقوم بفتح الاتصال و الثانية تقوم بغلق الاتصال



الدوال
PHP كود :
   Public Function SelectWithString(ByVal TblNmae As StringByVal Fileds() As StringByVal CondFiled As StringByVal Match As String) As DataTable

        If Fileds
.Length 0 Then
            MessageBox
.Show("تاكد من ملئ مصفوفة الحقول")
 
           Return Nothing
        End 
If

 
       Dim SelectStatement As String "Select "
 
       Dim SetFileds As String ""
 
       For Each str As String In Fileds
            SetFileds 
+= str ","
 
       Next

        If SetFileds
.EndsWith(","Then SetFileds SetFileds.Remove(SetFileds.Count 11)

 
       SelectStatement += SetFileds " From " TblNmae " Where " CondFiled " Like '" Match "' "
 
       If Con.ConnectionString Nothing Then Con.ConnectionString ConnectionString
        Dim Cmd 
As New OleDbCommand(SelectStatementCon)
 
       Dim Dt As New DataTable
        Dt
.Clear()
 
       Dim Da As New OleDbDataAdapter(Cmd)
 
       If Con.State ConnectionState.Closed Then Con.Open()
 
       Da.Fill(Dt)
 
       Cmd.Dispose()
 
       Return Dt
    End 
Function 

عمل هذه الدالة ان تقوم بجلب البيانات (الحقول) من جدول ما وفق شرط ما و تعود لي بكائن جدول (DataTable)
الوسائط المطلوبة (اسم الجدول و مصفوفة الحقول و الحقل الشرطي و قيمة الحقل الشرطي) لا عليك سترى مدى سهولتها عند استعمالها
سافرض انك تريد جلب الحقول (ID,Name) من الجدول TBL1 وفق شرط ان يكون الحقل (Name="العلوم")
فانت ستستخدم الدالة وفق الطريقة التالية
PHP كود :
   Dim Fileds() As String Nothing
        Fileds 
= New String() {"ID""Name"}

Dim TBL1 As New DataTable
TBL1
=SelectWithString("TBL1"Fileds"Name""العلوم"
كما ترى صديقي العملية بسيطة و مختصرة بنفس الوقت تغنيني عن اعادة كتابة الاكواد
الدالة الثانية و الثالثة لهما نفس العمل مع اختلاف في الوسائط فمرة نحن نجلب وفق حقل نصي و مرة نجلب وفق حقل رقمي ومرة بدون شروط
و اما الدالة الاخيرة فهي تجلب بيانات حقل واحد بالاعتماد على شرط محدد
اتمنى ان يكون الشرح بسيط وسهل

الان ننتقل الى واجهة النموذج و نضيف اثنين كومبو بوكس(ComboBox) واحد للمواد و واحد للمجلدات 
المواد=Cmb_M
المجلدات=Cmb_F
و نضيف (ListBox) نسميها (ListContent) سنستخدمها لعرض عناوين المواضيع من جدول المحتويات
اما محتويات الموضوع نستخدم لها (RichTextBox)
كما في الصورة التالية


الان الى كود النموذج 

PHP كود :
Public Class TForm

    Dim TB_M
TB_FTB_Content As New DataTable
    Dim Fileds
() As String Nothing

    Private Sub M_Cmb_SelectedIndexChanged
(sender As ObjectAs EventArgsHandles Cmb_M.SelectedIndexChanged
        Fileds 
= New String() {"MF_ID""F_Nmae"}
 
       TB_F SelectWithString("TB_MF"Fileds"M_Nmae"Cmb_M.Text)
 
       Cmb_F.DataSource TB_F
        Cmb_F
.DisplayMember "F_Nmae"
 
       Cmb_F.ValueMember "MF_ID"
 
   End Sub


    Private Sub F_Cmb_SelectedIndexChanged
(sender As ObjectAs EventArgsHandles Cmb_F.SelectedIndexChanged

        Fileds 
= New String() {"Cont_ID""Cont_Title"}
 
       TB_Content SelectWithInteger("TB_Content"Fileds"MF_ID"Cmb_F.SelectedValue)
 
       ListContent.DataSource TB_Content
        ListContent
.DisplayMember "Cont_Title"
 
       ListContent.ValueMember "Cont_ID"

 
   End Sub

    Private Sub ListContent_SelectedIndexChanged
(sender As ObjectAs EventArgsHandles ListContent.SelectedIndexChanged
        If Not TypeOf 
(ListContent.SelectedValueIs DataRowView Then
            RichTextBox1
.Text GetFiled("Content""TB_Content""Cont_ID"ListContent.SelectedValue)
 
       End If
 
   End Sub


    Private Sub TForm_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        Fileds 
= New String() {"M_ID""M_Name"}
 
       TB_M SelectFTableNormal("TB_M"Fileds)
 
       Cmb_M.DataSource TB_M
        Cmb_M
.DisplayMember "M_Name"
 
       '
    End Sub

End Class 

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


الملفات المرفقة
.rar   TestDb.rar (الحجم : 20.04 ك ب / التحميلات : 42)
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: أبو عمر , Adrees , Adrees


الردود في هذا الموضوع
RE: مساعدة في عمل برنامج تعليم - بواسطة ابو ليلى - 16-11-16, 02:50 AM


التنقل السريع :


يقوم بقرائة الموضوع: