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

مشكلة فى الحفظ فى فورم يحتوى جدول رئيسى وآخر فرعى

بدأه هانى عوض في 26 ديسمبر 2009 · 9 رد · 2,839 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تحياتى للجميع

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

فهو يقوم بعمل حفظ للجدول الرئيسى فقط ولكن التعديلات والاضافات التى تتم على الجدول الآخر وحتى عملية الربط لا تعمل..

والترقيم التلقائى يظهر القيم الجديدة "-1" كيف يمكن معالجة ذلك..

تمت عملية الربط للقاعدة من خلال المعالج

تقبلوا فائق تحياتى

"منتقل جديد من Vba إلى Vb.net"

Delta.rar

#2

أخي الفاضل

هاني عوض

أولاً:-

أنصح بقراءة هذه الموضوعات اولاً قبل البدء في الاستخدام

/index.php?showtopic=115282

/index.php?showtopic=184504

ثانياً : أنصح باستخدام الكود البرمجي لعمليات الحفظ والحذف والتعديل وباقي العمليات عن استخدام wizard لانها ستحقق كفائة عالية لاداء البرنامج

1

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#3

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

أخي الحبيب لقد قمت بعمل موضوع خاص بذلك وهو يتحدث عن العلاقة بين الجدول حيث انه عندما تقوم باضافة الجدول عن طريق المعالج يجب ان تعلم أن هناك عمود خاص بالجدول المرتبط بهذا الجدول أي اقصد في الداتا ست عندما تفتح الجدول الموجود في الداتا ست اقصد نافذة الداتا ست هناك ستجد هناك حقل باسم الجدول الفرعي داخل الجدول الرئيسي عليك ان تسحبه ولا تسحب الجدول الرئيسي وعندما تفوم بذلك سيقوم البرنامج بإضافة الكائن DAtaAdapter ويوجد بداخله الامر updateAll الخاص بتحديث الجدولين معا لذلك يوجد لديك احدى طريقتين

إما ان تقوم بإضافة الجدول الرئيسي والجدول الفرعي بنفس الطريقة التي اخبرتك بها

أو تقوم فقط باسناد اسم العلاقة بين الجدولين في الحقل Datamember الخاص بالأداة DataGridView

وهكذا

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

لوكنت وغلاً في الرجال لضرني**** حسن جرائتي ومقتدي

منتديات طريق الهداية

#4

بارك الله فيك أخي الفاضل أبو العزم

ولا اعرف لماذا لم ترفق هذه المشاركة الرائعة

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

/index.php?showtopic=205724&st=0&p=1020993&fromsearch=1entry1020993

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#5

شكراً أخى محمد فؤاد على إهتمامك بالموضوع

وبالفعل جارى العمل والدراسة داخل الموضوع الذى قمتم بإرفاقه

تحياتى لك أخى أبو عزام على مشاركتكم

بالفعل تم إدراج الجدول الفرعى من داخل Dataset الخاصة بالجدول الرئيسى

أظن المشكلة خاصة بنوع العلاقة داخل الأكسس ...

فالعلاقة من نوع One To Many

بخاصية Enforce Referential Integrity .. وأظن أن هذه المشكلة

حيث يتم إدراج قيم الجدول الفرعى قبل الربط بالجدول الرئيسى أثناء عملية الحفظ مما يحدث هذا الخطأ

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

"وأكون شاكراً لو أمكن المساعدة فى وضع مثال لنوع الربط بين جدولين بينهما علاقة رأس بأطراف"

تقبلوا فائق تحياتى

#6

تحياتى للجميع

تم العمل من خلال الكود "ضمن توجيهات أخى المشرف محمد فؤاد"

فى الوضع المنفصل Disconnected Mode

ولكن وجدت صعوبة فى عمل Relation للجدول Parent - Child...

وقمت بالبحث مراراً وتكراراً فى المنتدى عن موضوع العلاقات ولكن للأسف لم يبت فيها بحل وافى

لذا قمت بإرفاق ما تم عمله حتى الآن لعلى أجد من يساعدنى فى ربط الجدولين بطريقة مختصرة وصحيحة

تقبلوا فائق تحياتى

HRelation.rar

#8

شكراً أخى "محمد رضى" على مروركم الكريم

حيث أننى من المتابعين لمواضيعكم القيمة والمفيدة للجميع أود أن أعرب عن مدى إمتنانى لشخصكم الكريم..

وقد قمت بالاطلاع على أغلب المواضيع التى تتطرق لموضوع العلاقة بين الجدول الأب والابن والترقيم التلقائى وكيفية معالجتة لتوليد ID صحيح..

وجدت البعض منها يستغرق وقتاً طويلاً فى كتابة الأكواد للربط بطرق مختلفة..

ووجدت البعض الآخر لم يتوصل لحل وافى..!!!!

ودون الخوض فى تفاصيل طويلة..

ولتقريب المسافة بينكم ومشكلتى.. التى أتعبتنى ليالٍ كثيرة.. للوصول إلى ما أريده

الموضوع وما فيه... باختصار

هو أننى أريد أن أبنى مشروعاً محاسبياً قوياً .. يعتمد فى أكواده على البساطة وسهولة المراجعة والتعديلات عليه فيما بعد..

وبالفعل قد قمت بعمل هذا المشروع منذ عام 2002 على الأكسس باستخدام VBA والحمد لله لاقى إعجاباً فى السوق التجارية .. وحينما وجدت أن بيئة الأكسس لم تعد تكفى لتحمل الكثير من الأفكار التى أود أن أزيدها داخل برنامجى .. أرشدنى أخ فاضل إلى استخدام الدوت نت.. وبالفعل بدأت الدراسة والتطبيق والحمد لله قطعت شوطاً ليس بقلبل..

فبدأت باستخدام أقصر الطرق وصولاً لكود سهل وسليم 100% ..

باستخدام الوضع المنفصل كالتالى

قمت باستخدام جملة الربط هذه داخل Module

    Public DBCON As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Database.mdb;Persist Security Info=False")

وجملة ملء البيانات كالتالى

        Try
            Dim tbl As String = "tblItem"
            Dim tblChild As String = "tblItem_Sub"
            'fill DataSet From DataBase
            Sql = "select * from " & tbl
            SqlChild = "select * from " & tblChild

            DA = New OleDbDataAdapter(Sql, DBCON)
            DA_Child = New OleDbDataAdapter(SqlChild, DBCON)

            DS.Clear()
            DA.Fill(DS, tbl)
            DA_Child.Fill(DS, tblChild)

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

وجملة ربط مربعات النص و الداتا جريد

            txtId_Item.DataBindings.Add("Text", DS.Tables(tbl), "Id_Item")
            txtCod_Item.DataBindings.Add("Text", DS.Tables(tbl), "Cod_Item")
            txtName_Item.DataBindings.Add("Text", DS.Tables(tbl), "Name_Item")
            DataGridView1.DataSource = DS.Tables(tblChild)

وجملة الحفظ

            Me.Validate()
            Me.BindingContext(DS, tbl).EndCurrentEdit()

            If (DS.HasChanges = True) Then
                CMDB.DataAdapter = DA
                DS_Change = DS.GetChanges

                'add
                DS_Upload = DS_Change.GetChanges(DataRowState.Added)
                If (Not (DS_Upload) Is Nothing) Then DA.InsertCommand = CMDB.GetInsertCommand

                'Delete
                DS_Upload = DS_Change.GetChanges(DataRowState.Deleted)
                If (Not (DS_Upload) Is Nothing) Then DA.DeleteCommand = CMDB.GetDeleteCommand

                'Update
                DS_Upload = DS_Change.GetChanges(DataRowState.Modified)
                If (Not (DS_Upload) Is Nothing) Then DA.UpdateCommand = CMDB.GetUpdateCommand()

                DA.Update(DS.Tables(tbl))
                DA.Update(DS.Tables(tblChild))
                DS.AcceptChanges()
                MsgBox("تمت عملية حفظ البيانات بنجاح", MsgBoxStyle.Information, "تأكيد الحفظ")

وجملة إضافة جديد

            Me.BindingContext(DS.Tables(tbl)).AddNew()

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

لذا أرجو المساعدة فى إضافة جملة "علاقة الربط بين الجدولين الأب والابن " مع إمكانية التحديث والحذف والإضافة.. بنفس الطريقة المستخدمة

شاكراً لكم حسن المساعدة

#9

شكرا أخي الكريم هاني :)

و الله شهادة أعتز بها أخي الكريم...

جرب أخي الكريم أن تقوم بعد تصميم قاعدة البيانات أن تقوم بتحديد العلاقات بين الجداول على الأكسس أولا ثم تقوم بإنشاء typed dataset على المشروع عن طريق wizard المخصص لهذا الغرض. بعد انتهاء الويزارد من عملية الإنشاء قم بفتح ملف الداتاست الجديد بالنقر عليه من على نافذة solution explorer و تحقق من نتيجة عملية الإنشاء و خصوصا العلاقات بين الجداول. إذا كان هناك خطأ في الربط بين الجداول قم بتصحيحه كله عن طريق السحب و الإفلات. بعد الانتهاء و عند حفظ التغييرات سيقوم فيجوال ستوديو بإنشاء الكود الخاص بالداتاست الجديدة و الفئات التي تمثل الجداول و أسطرها بما فيها العلاقات بين الجداول. بهذه الطريقة سوف تكسب الكثير من الوقت خصوصا إذا كانت بنية قاعدة البيانات معقدة و تنتقل مباشرة إلى العمل على صلب المشروع لأن فيجوال ستوديو سوف يقوم بإنشاء أكواد جميع العمليات التي ستحتاج القيام بها من تحميل, زيادة, تحديث و حذف البيانات آخدا بعين الاعتبار العلاقات بين الجداول.

بالنسبة لكود جملة الحفظ المرفق في ردك السابق, فسيكون أحسن لو خصصت كائن OleDbDataAdapter خاص بكل جدول من جداول قاعدة البيانات. و يفضل دائما حفظ الجداول الأبناء قبل الجداول الآباء...

بالتوفيق :)

تم تعديل هذه المشاركة بواسطة محمد رضى في 18 يناير 2010 في 22:44

1
#10

شكراً أخى الكريم محمد رضى

على حسن التواصل

قمت بتجربة جميع توجيهاتك أخى الكريم ولكننى وجدت فى النهاية أن موضوع استخدام Wizard لربط قاعدة البيانات أسلوب للهواة ولايجدى نفعاً للتعديل فيما بعد حيث وجود كمية هائلة من الأكواد وصعوبة تتبع الأخطاء.. حيث طريقة الربط المستخدمة من الدوت نت طريقة عامة لأى قاعدة بيانات..

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

عموماً بعد قراءة وإطلاع وبحث داخل موضوعات المنتدى وخاصة موضعاتك أخى الكريم توصلت حتى الآن للآتى:

1- ربط الجدولين بطريقة صحيحة.

2- ملىء مربعات النص الـ Parent و الداتا جريد الـ Child

3-عمل Navigator للتنقل بين السجلات.

حتى الآن... تمام

باقى جملة الحفظ (التحديث "الاضافة - الحذف - التعديل")

وحين أكتمل من حل هذه المشكلة سوف أقوم برفع المثال بعد التعديل..

للتقييم.. ولمساعدة من هم فى مثل مشكلتى..

تحياتى للجميع

تم تعديل هذه المشاركة بواسطة هانى عوض في 3 فبراير 2010 في 12:37

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…