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

من يدلني على الجواب الكافي

مغلق
بدأه ابو خالد111 في 1 مايو 2005 · 4 رد · 618 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اخوتي في الله

لديه برنامج فيه ثلاثة نماذج وقاعدة بيانات واحده تتألف من جدولين والبرنامج عمل لأجل امر عمل صيانة اجهزة الكمبيوتر ولديه سؤالان

الاول: الجدولين مربوطه عن طريق ONOreder بس المشكله وعندما ادخل المعلومات الاوليه عن طريق الفورم الرئيسي ويحتاج الجهاز قطع غيار اضغط على مربع الاختيار التابع لقطع الغيار يعطيني نموذج يطلب مني ادخال قطع الغيار

ولما ادخل قطع الغيار لا يدخل لي (رقم امر العمل ) حيث ان جدول قطع الغيار منفصل عن الجدول الاساسي . كيف اجعل رقم امر العمل يخزن في الجدول الثاني ( جدول قطع الغيار )على طول مع العلم ان الترقيم يتم تلقائي عند اضافة سجل .

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

ارجو ان تكون الاسئله واضحه

ولكم مني فائق الاحترام

اخوكم ابو خالد

#2

ياأخي الكريم لو شرحت لنا ماهو المطلوب من البرنامج

وياليت تقول لنا كيف

كونت الجداول في قاعدة البيانات وماهي

اسماء الاعمدة في كل جدول

عشان نقدر نساعدك

#3

السلام عليكم

بالنسبة للسؤال الأول : يتطلب منا أن نبني علاقة بين الجدولين, فالجدول الرئيسي هو الأب و الجدول الفرعي هو الأبن

وهذه العلاقة من خلال التحليل , تكون علاقة One To Many اي كل عمل له أكثر من قطع غيار ( صح ام لا ) ؟

فإن كانت صحيحة سنقوم بربطها بشكل برمجي تلقائي كلما قمنا بتحميل النموذج

بشرط أن تتوفر لنا كل من

1 - DataSet

2 - XXXDataAdapters عدد أثنان واحد للأب و الثاني للأبن

3 - DataTables عدد أثنان كلاهما في الـ DataSet

بعد هذه المتطلبات سنقوم بالتالي

ننشئ عنصرين من نوع DataColumns بهذا الشكل

Dim ParentColumn As DataColumn
Dim childColumn As DataColumn

وهما عمودان الأول الأب و الثاني الأبن

الآن سنقوم بربط العمودين في الـ DataTables بهذين العنصرين بهذا الشكل

  ParentColumn = DsMain1.Tables("MainTable").Columns("ONOreder")
  childColumn = DsMain1.Tables("ChildTable").Columns("ONOreder")

الان سنقوم بإنشاء عنصر من نوع DataRelation لبناء هذه العلاقة بهذا الشكل

Dim Rel As New DataRelation("MainChild", ParentColumn, childColumn)

الان سنضم هذه العلاقة في العنصر DataSet بهذا الشكل

 DsMain1.Relations.Add(Rel)

ثم نستخدم العلاقة بإن نكتب اسم الجدول الرئيسي ثم نقطة ثم متبوعة باسم العلاقة مثلاً لإظهار قيم الجدول الأبن في DataGrid

سيكون بهذا الشكل

  DataGrid1.SetDataBinding(DsMain1, "MainTable.MainChild")

أما إذا كنت تستخدم DataView على الجدول الرئيسي سيكون الربط بهذا الشكل

  DataGrid1.SetDataBinding(DVAuthors, "MainChild")

في الشكل النهائي سيكون بهذا الشكل

 Private Sub BindDataRelation()
        Try
            Dim ParentColumn As DataColumn
            Dim childColumn As DataColumn
            ParentColumn = DsMain1.Tables("MainTable").Columns("ONOreder")
            childColumn = DsMain1.Tables("ChildTable").Columns("ONOreder")
            Dim Rel As New DataRelation("MainChild", ParentColumn, childColumn)
            DsMain1.Relations.Add(Rel)
            DataGrid1.SetDataBinding(DsMain1, "MainTable.MainChild")
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

وعند تحميل النموذج قم بمناداة بهذا الشكل

 Private Sub Entry_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            'After Filling Data
            'Call Bind DataRelation
            Me.DsMain1.Relations.Clear()
            BindDataRelation()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

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

أم في عملية الحذف فقم بتحديث الأبن أولاً ثم الأب .

بالنسبة للسؤال الثاني مبهم نوعً ما لكن في مثل هذه الأمور بشكل عام

عملية التحديث تظهر النتائج فهل بعد عملية الإضافة تقوم بالتحديث أم لا إن كان الجواب نعم فقم بعملية الإختيار Select

وهي عملية تحميل البيانات من جديد , لا زلت أقول أن المنطق أن تكون النتائج ظاهر للعيان مدام أن عملية التحديث قد تمت

قبل أن أنتهي لدي سؤال واحد فقط وهو

من حيث التصور , هل قاعدة البيانات متوقع أن تكون تحتوي على أكثر من 500 إلى 700 صف إذا كان الجواب نعم

فطريقة الربط البرمجي هي الأنسب , السبب أنه من المنطق أن لا نقوم بعملية تحميل البيانات عند حدث تحميل النموذج

بسبب الحجم و الذاكرة المستهلكه و الوقت المستقطع , أما إذا كان الجواب لا فالربط بالـ Design Time هو الاسهل

وليس الأفضل والطريقتين صحيحتي في هذه الحالة.

لكن كون البيانات ستجلب عند تحميل البرنامج فعملية الربط بـ Design Time لا تضر

حتى و إن كانت هنالك ضرورة بإستخدام عملية البحث ,فستتم عن طريق السلوكيات Methods الموجود في ال

DataSet أو حتى عن طريق الـ DataView ... على العموم موفق بإذن الله .

والله أعلم

في المثال يتضح المقال

#4

اخي العزيز الغملاسي

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

اخي

بالنسبة لقطع الغيار ممكن تكون اكثر من قطعة وممكن تكون واحده وممكن مايكون فيه شئ

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

واذا ادخلت قطعة الغيار وعملت لها اضافة اضافة في جدول القطع وهو عبارة عن حقلين للمفتاح FK للجدول الاب واسم قطعة الغيار علماً اني عامل ربط للجدولين عن طريق Design Time والجداول معموله ببرنامج الاكسس

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

ولك جزيل الشكر مرة اخرى على اهتمامك

والله ينفع بعلمك

اخوك ابو خالد

#5

السلام عليكم

من خلال فهمي القاصر فهمت أن المشكلة الأن تكمن بأن الفورم الفرعي لقطع الغيار لا يعرف الـ PK في النموذج السابق صح ؟

طيب الان حصرنا المشكلة الأولى

المشكلة الثانية هي أن النموذج الثاني لابد أن يكون فيه كل من DataSet و DataAdapters للجدولين

وبهذا يتطلب أعادة طلب الـ PK من النموذج الرئيسي أليس كذلك ؟

الحل كالتالي

..................

الربط أولاً لابد أن يكون في النموذج الفرعي لذلك من الأفضل أن نقوم به عن طريق الكود ..

ثانياً في بناء النموذج الثاني سنضيف ممرر parameter واحد فقط وهو يختص برقم العمل الـ ID لنتمكن

من جلب قطع الغيارات التابعة له و إن لم يكن يملك واحدة حتى الأن .

الممرر سيكون في الـ Sub New كما تعلم و بهذا الشكل

 Public Sub New(ByVal FK As Integer)

الان سنعتمد على هذا الممرر بهذا الشكل

   LoadParts(FK)

والآن جاء دور الإجراء LoadParts

 Private Sub LoadParts(ByVal JobID As Integer)
        Dim strSQL, strJob As String
        Try
            Me.Ds1.tb_Jobs.Clear()
            Me.Ds1.tb_Parts.Clear()
            Me.Ds1.EnforceConstraints = False
            Me.Ds1.Relations.Clear()
            strJob = "SELECT * FROM tb_Jobs " & _
            "WHERE ID =" & JobID
            strSQL = "SELECT * FROM tb_Parts " & _
            "WHERE ID =" & JobID
            Dim cmdJob As New OleDbCommand(strJob, cnn)
            Dim cmd As New OleDbCommand(strSQL, cnn)
            Me.daJobs.SelectCommand = cmdJob
            Me.daParts.SelectCommand = cmd
            Me.daJobs.Fill(Ds1, "tb_Jobs")
            Me.daParts.Fill(Ds1, "tb_Parts")
            Me.dg.DataSource = Ds1
            Me.dg.DataMember = "tb_Parts"
            BindDataRelation()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cnn.Close()
        End Try
    End Sub

في الملف المرفق حاول أن تدخل الرقم 1 أو 2 ثم الضغط على بحث

على إفتراض أن المفتاح الأساسي للجدول job موجود من الأصل أو تمت إضافة وتحديثه داخل النموذج الرئيسي

والله أعلم

SpareParts.zip

في المثال يتضح المقال

هذا الموضوع مغلق.

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