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

مشكلة في زر upetate و زر الحذف

بدأه aboumazen في 21 سبتمبر 2011 · 8 رد · 704 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

البرنامج هو مطور من برنامج phone

و ضعه أحد الاخوة في الموقع

و طورته ليتلاءم مع احتياجاتي

المشكلة في الحقيقة المشكلتان هما:

1 ـ زر التحديث ‘update يعدل في عمودين من قاعدة البيانات لكن لا يعدل في الثالث لا اعرف لماذا

و إذا عدلت في حقل آخر مع الحقل الثالث في فورم التعديل لا يتم التعديل في الجدول ابدا و إذا استثنيت العمود الثالث من التعديل يتم التعديل

2 ـ عند الضعط على زر الحذف يحذف كل الحقول التي قبل الحقل المضلل يعني إذا حذفت الحقل الرابع يتم حذف الاول و الثاني و الثالث و الرابع كلها لا اعرف لماذا و كذلك زر الحذف لا يحذف الحقل المنفرد الاخير

modification1.rar

#2

أخي الكريم ..

حسب تصميم قاعدة البيانات لديك الجدول Documents و فيه الحقل NUM و هو من نوع عدد صحيح طويل و لكنك لم تضعه كمفتاح للجدول , أي لكل جدول يجب أن يكون حقل له قيمة فريدة من أجل كل سجل , و سنفرض أن NUM هو مفتاح الجدول أي لا يمكن تكرار قيمه و بالتالي يجب الحذف حسب قيمة هذا الحقل ...

اقتباس
زر التحديث ‘update يعدل في عمودين من قاعدة البيانات لكن لا يعدل في الثالث

SavInto.CommandType = CommandType.Text
        SavInto.CommandText = "UPDATE Documents SET Num = '" & Trim(TextBox1.Text) & "', Document = '" & _
            Trim(ComboBox1.Text) & "' WHERE DateDoc ='" & TextBox2.Text & "'"
        Conn.Open()
        SavInto.ExecuteNonQuery()

و الكود الصحيح

SavInto.CommandType = CommandType.Text
        SavInto.CommandText = "UPDATE Documents SET DateDoc = '" & Trim(TextBox2.Text) & "', Document = '" & _
            Trim(ComboBox1.Text) & "' WHERE Num='" & TextBox1.Text & "'"
        Conn.Open()
        SavInto.ExecuteNonQuery()

اقتباس
عند الضعط على زر الحذف يحذف كل الحقول التي قبل الحقل المضلل

SavInto.CommandType = CommandType.Text
        SavInto.CommandText = "DELETE FROM Documents WHERE Document ='" & Trim(TextBox1.Text) & "'"
        Conn.Open()

و الكود الصحيح

SavInto.CommandType = CommandType.Text
        SavInto.CommandText = "DELETE FROM Documents WHERE Num='" & Trim(TextBox1.Text) & "'"
        Conn.Open()
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

جزاك الله خيرا وجعل الجنة مثواك انت ووالديك

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

#4
houssam11350_11350 كتب:

أخي الكريم ..

حسب تصميم قاعدة البيانات لديك الجدول Documents و فيه الحقل NUM و هو من نوع عدد صحيح طويل و لكنك لم تضعه كمفتاح للجدول , أي لكل جدول يجب أن يكون حقل له قيمة فريدة من أجل كل سجل , و سنفرض أن NUM هو مفتاح الجدول أي لا يمكن تكرار قيمه و بالتالي يجب الحذف حسب قيمة هذا الحقل ...

اذا سمحتلي بسؤال آخر

هل استطيع ان اجعل الحقل الذي هو مفتاح الجدول ترقيم تلقائي

ولن تحصل معي مشاكل عند التعديل على اي سجل؟؟؟؟؟؟

#5
اقتباس
جزاك الله خيرا وجعل الجنة مثواك انت ووالديك

بارك الله بك , و انت ايضا جزاك الله خيرا وجعل الجنة مثواك انت ووالديك و جميع المسلمين

اقتباس
هل استطيع ان اجعل الحقل الذي هو مفتاح الجدول ترقيم تلقائي

نعم يمكن ذلك , و من خصائص الحقل عند تصميم الجدول يمكنك وضعه Indexed = yes / no duplicates و تحدده و تضغط على رمز المفتاح بشريط الأدوات.

و تصبح عبارة الإضافة

SavInto.CommandText = "INSERT INTO Documents(Document,DateDoc)" & _
            "values ('" & ComboBox2.Text & "','" & TextBox4.Text & "')"
            Conn.Open()
            SavInto.ExecuteNonQuery()

            'this code to get last Num value for the inserted record
            'SavInto.CommandText = "Select @@Identity"
            'Dim last_Num = Convert.ToInt32(SavInto.ExecuteScalar())


            Conn.Close()

اي أن حقل الترقيم الذاتي لا يتم ذكره أبدا في عبارة الــ insert و هو لوحده يأخذ قيمته بشكل تزايدي.

و تصبح عبارة التحديث :

SavInto.CommandText = "UPDATE Documents SET DateDoc = '" & Trim(TextBox2.Text) & "', Document = '" & _
            Trim(ComboBox1.Text) & "' WHERE Num=" & TextBox1.Text & ""

اي لا داعي لعلامة التنصيص (الكوتيشن ') لأن الحقل من نوع عدد .

و تصبح عبارة الحذف :

SavInto.CommandText = "DELETE FROM Documents WHERE Num=" & Trim(TextBox5.Text) & ""

اي بإزالة علامة النص و تغير TextBox1 إلى TextBox5 .

ملاحظة :

عليك تسمية عناصر الفورم و المتحولات باسماء مفيدة و تدل عليها

مثل

txtNum , txtDateDoc , cmdInsert , cmdDelete

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#6

قال الحبيب المصطفى في معنى كلامه 3"من صنع لكم معروفا فكافئون فإن لم تجدو فادعوا له"

جازاك الله خيرا

ولك مني الدعاء عن ظهر الغيب

بقيت نقطة بالنسبة للترقم التلقائي للعمود NUm

ارى انه عند حذف سجل يبقى مكانه فراغا

اي مثلا السحلات من 1 الى 10

عند حذف السحل 3 يصبح الترقيم من 1 الى10 والرقم 3 عير موجود

اي 1 2 4 5 6 7 8 9 10

هل من الممكن ان يعيد ترقيم الملفات من 1الى9 ؟؟؟؟؟

#7

بارك الله بك أخي

اقتباس
عند حذف السجل 3 يصبح الترقيم من 1 الى10 والرقم 3 عير موجود

للمعلومات , يمكن عمل تحديث لحقل من نوع "ترقيم تلقائي" و لكنه يزداد دون أخذ القيم المعدلة بعين الاعتبار مثلا لو كانت القيمة الحالية لحقل الترقيم التلقائي هي 100 و قمنا بتعديل قيمة سابقة من 10 إلى 120 فإن حقل الترقيم التلقائي سيزداد بشكل تلقائي من 101 - 102 - 103 ... و هكذا حتى يصل إلى القيمة 120 عندها يحصل خطأ بسبب أن القيمة 120 موجودة مسبقا و لأنه لدينا فهرس على الحقل Num أي ممنوع تكرار القيم .. و لو لم يكن هناك فهرس لكان أصبح لدينا سجلان لهما القيمة 120 و هذا يخالف منطق التطبيق أي عندما نريد حذف أحدهما بعبارة WHERE Num = txtNum.Text سيتم حذف السجلان معا .. و هذا ما لانريده .

أما لو أردنا السجلات أن يبقى فيها الحقل Num بقيم مرتبة و متسلسلة دون انقطاع , فلا يوجد طريقة مباشرة لذلك (حسب معلوماتي و الله أعلم ) و لكن يوجد طريقة Work Around أي الالتفاف على الموضوع كمايلي :

أولا : نجعل الحقل Num من نوع "عدد صحيح" ... أي ليس ترقيم تلقائي ..

ثانيا : عند حذف سجل ما , نقوم بتحديث السجلات التي تأتي بعده و ذلك بإنقاص قيمة الــ Num إنقاصها "واحد" و ذلك لسد الفراغ الناجم عن حذف السجل .. بشرط أن نقوم بحذف السجلات .. سجل .. سجل (واحد في كل عملية حذف).

SavInto.Connection = Conn
        SavInto.CommandType = CommandType.Text
        Conn.Open()
        SavInto.CommandText = "DELETE FROM Documents WHERE Num=" & Trim(TextBox5.Text) & ""

        SavInto.ExecuteNonQuery()

        SavInto.CommandText = "UPDATE Documents SET Num = Num - 1 WHERE Num >" & Trim(TextBox5.Text) & ""
        SavInto.ExecuteNonQuery()

        DataSet1.Clear()

ثالثا : عند إضافة سجل جديد نضع قيمة الــ Num له هو أكبر قيمة موجودة زائدا واحد , على أن نقوم بإضافة السجلات (سجل .. سجل).

SavInto.Connection = Conn
            SavInto.CommandType = CommandType.Text
            Conn.Open()
            SavInto.CommandText = "SELECT Max(Num)  FROM Documents"
            Dim lastNum As Integer = 0
            Integer.TryParse(SavInto.ExecuteScalar().ToString(), lastNum)
            lastNum = lastNum + 1
            MessageBox.Show(lastNum.ToString())

             SavInto.CommandText = "INSERT INTO Documents(Num ,Document,DateDoc)" & _
            "values (" & lastNum & ",'" & ComboBox2.Text & "','" & TextBox4.Text & "')"

            SavInto.ExecuteNonQuery()

مساوئ الطريقة :

الوصول المتكرر لقاعدة البيانات , فمثلا لو أردنا حذف سجل و يوجد بعده ألف سجل , يعني التعديل على هذه الألف سجل و هذا في علم قواعد البيانات يعتبر عمليات مكلفة تتطلب نقل الكثير من البيانات من القرص الصلب (Hard Disk) و تعديلها ثم إعادة نقلها إلى القرص الصلب .

و التعديلات موجودة بالمرفقات (فقط الملف الذي فيه تعديلات) ... و بانتظار ردود الخبراء أيضا ... الموضوع مفتوح للنقاش ...

Form1.vb

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 22 سبتمبر 2011 في 23:34

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#8

جزاك الله خيرا

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

والحمد لله

انا الان راض عن البرنامج هكذا

إن وجدنا حلا للحفاظ على تسلسل الأرقام ,فبه و نعمة وإن لا فلابـأس به هكذا

وخلاصة انه علي ان اقرأ المزيد عن sql

لان البرنامج واجهت فيه الكثير من المشاكل لقلة علمي اس كيو ال طنا مني انه لا تخرج عن select .; delit;insert ; update

جزاك الله خيرا اخي houssam11350_11350

تم تعديل هذه المشاركة بواسطة aboumazen في 23 سبتمبر 2011 في 13:13

#9
اقتباس
جزاك الله خيرا اخي houssam11350_11350

بارك الله بك و يسر الله لك علمك

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

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

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

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

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

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