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

مساعده في اعاده ترتيب الجدول

بدأه altae13 في 25 أغسطس 2012 · 15 رد · 1,136 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندي جدول block بيه مفتاح رئيسي من 1 الى 24 ترتيب تلقائي ومرتبط مع جدول اخرى

عندما احذف واحد من القيود المرتبة 1- 24 تظهر لي رساله خطا بعد تنفيذ البرنامج مره اخرى!

انا احتاج بان اعيد ترتيب الجدول فرضنا لو حذفنا رقم 5 اي قيد رقم 5 مع البيانات

سوف يكون الترتيب 1-2-3-4-6-7 بدون ال 5 وهذا الخطا الموجود عندي

كبف اعمل التالي !

عند حذف احد القيود من جدول البلوك كيف يتم اعاده ترتيب الجدول بحيث بدل ال 5 يكون 6 ويكون ترتبيه 5 وبدل ال 6 الى 7 وهكذا

#2

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

#3

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

#4

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

أعتقدت فى البداية انك تريد مجرد حذف سجل من داخل sql server ولذلك

نصيحتى لك لا تحاول ابدا ان تقوم بحذف سجل معين من الجدول لان :

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

ثانيا ستجد صعوبة فى حالة وجود foriegn key فى جدول اخر

الحل : اضافة column جديد للجدول يكون اسمه deleted

default value 0

فى حالة حذف اى سجل من الجدول قم فقط بعمل update statment للcolumn

بالقيمة 1 وبذلك حصلت بعد ذلك على جميع ال rows المحذوفة where deleted= 1

والغير محذوفة where deleted =0

تنبية : عمل datatype : smallint وليس int لصغر حجم القيمة 0و1

تم تعديل هذه المشاركة بواسطة Dev.Ehab في 26 أغسطس 2012 في 12:05

#5

للتصحيح: عمل datatype : bitوليس int لصغر حجم القيمة 0و1

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

#6

الحل اضافة حقل للترتيب لرقم القيد الفعلي أو المسلسل ويكون حقل عادي جداً بعد حذفك للصف اللي تريده تمر على كل الصفوف وتسند القيمة المرتبة لهذا الحقل باستخدام for loop

الحقل الرئيسي المفترض أنه مرجع للصف ليستخدم في جدول آخر أو لتسهيل البحث يعني هو بصمة الصف ولا ينبغي أن نستخدم قيمته في أعمال logic or business الخاصة بالبرنامج

مثال على هذا بعد الترتيب يكون كالتالي

================
ID | No | Name |
================
1    1    ahmed
2    2    mohamed
3    3    ali
4    4    homam
6    5    mozna
7    6    hanan
8    7    hesa
9    8    somia
================
Electrical communications and electronics engineer

C++ Developer

 


stackoverflow profile : http://stackoverflow.com/users/249120/ahmed-safan


 


Just Keep Moving On , never stop until you are dead


#7

لتوضح اكثر ! وبطرقه سريعه لان المشروع كبير

عملت برنامج يقوم بمعاجله التضاربات التي تحدث في جدول المواد الدراسية وجدول الامتحانات في الجامعات باستخدام الخورزميات الجينيه

هناك جدول يدعى بلوك مكون من بيانات لكن اهم حقل هو حقل الايدي IDBlcok هو مفتاح رئيسي والترقيم تلقائي !

فلو فرضنا لدينا 24 بلوك هذا يعني لدينا 24 محاضرة سوف يتم وضع تلك المحاضرات في قوائم او مصفوفات بالتسلسل من [0] الى [23]! اي عدد المحاضرات 24 لكن يبداء من الصفر فاينتهي بالرقم 23 فيتم توليد 24 وقت و24 قاعه للتك المحاضرات الى الان الشغل اوك لا توجد مشكله

المشكله تبداء الان

فرضنا لو تم مسح احد البلوكات اي احد المحاضرات ولنفترض IdBlock= 5

يكون لدينا عدد البلوك 23 اي count Block =23 لكن تبداء من 1 وتنتهي بال 24 عدا ال بلوك رقم 5 وبهذا يتم ترتيب البلوكات بالمصفوفه من [0] الى [22] لان عددها 23 اي بلوك رقم 24 سوف يجلس في رقم[22] بالمصفوقه ! وبذلك تحدث مشكله لان سوف يتم توليد الوقت والقاعات الى 23 بلوك بالتسلسل وسوف يصل الى بلوك 24 ! بدون وقت او قاعه وسيظهر الخطا بان البرنامج خرج من ضمن المدى للمقرر للمصفوفه

الحل في راي الشخصي البسبط لكن لا اعرف كيف

هو جعل بلوك رقم 24 يجلس بدلا ال 5 او يتم يعد عمليه الحذف ترتيب الجدول لي بلوك بالتسلسل من 1 الى ----- بدون فرغات

#8
أبو هاشم المصري كتب:

الحل اضافة حقل للترتيب لرقم القيد الفعلي أو المسلسل ويكون حقل عادي جداً بعد حذفك للصف اللي تريده تمر على كل الصفوف وتسند القيمة المرتبة لهذا الحقل باستخدام for loop

الحقل الرئيسي المفترض أنه مرجع للصف ليستخدم في جدول آخر أو لتسهيل البحث يعني هو بصمة الصف ولا ينبغي أن نستخدم قيمته في أعمال logic or business الخاصة بالبرنامج

مثال على هذا بعد الترتيب يكون كالتالي

================
ID | No | Name |
================
1    1    ahmed
2    2    mohamed
3    3    ali
4    4    homam
6    5     mo
7    6    hanan
8    7    hesa
9    8    somia
================

شكرا على الرد

لكن اخي عندما نمسج قيد من الجدول سوف يتم مسح ID و No و Name

وبذلك لو فرصنا مسحنا رقم 5 من الجدول سوف يتم مسح القيد يالكامل .

#9

أعتقد أن مشكلتك يمكن أن تحل بتعديل الشفرة التي تقوم باستخدامها للمرور على سجلات المصفوفة (البلوكات) وليس من خلال تعديل سجلات الجدول Blocks.

لو قمت بوضع الخوارزمية التي فيها الحلقة التي تمر على سجلات المصفوفة، فربما نتمكن من مساعدتك.

try..catch قد تحل لك المشكلة من خلال التقاط الخطأ وتجاهله (طبعاً لا يمكن أن أجزم بهذا لأني لم أرى الشفرة بعد)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

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

عرفني بس المعلومات التالية

تصميم الجدول --- مش فاهم هو محاضرات ولا أماكن في القاعات!

ليه عايز تحذف؟؟ السبب اللي بيدعوك للحذف

وايه المشكلة ان رقم 24 يكون رقمها فاضي؟؟

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

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

شكراً لك أخي الكريم

Electrical communications and electronics engineer

C++ Developer

 


stackoverflow profile : http://stackoverflow.com/users/249120/ahmed-safan


 


Just Keep Moving On , never stop until you are dead


#11

السلام عليكم !

اخي اشكرك على تفاعلك معي !

اولا هاي صورة باهم الجداول الموجوده بالمشروع !

64036951.png

Uploaded with ImageShack.us

classes هي القاعات الدراسية !

Time وقت الماحضرة

Block هو يمثل المحاضره المتكونه من ( الاستاذ والطلبه والماده الدراسية ونوع الماحضرة )

TimeTable يمثل الجدول النهائي المتكون من البلوك والوقت والقاعه

1- حاليا لدينا جدول البلوك جاهز بالبيانات ويحتوي على 10 محاضرات وهذا البيانات تم ادخلها يدويا !

2- يتم توفير لكل بلوك وقت الماحضرة وقاعه دراسية ! بصورة عشوائية من بيانات موجوده في قاعات البيانات في جدول الوقت وجدول القاعات الدراسية وبذلك اصبح لدينا جدول يسمى TimeTable مكون من بلوك ووقت وقاعه دراسية !

لكن هذا الجدول وربما يحتوي على مجموعه من التظاربات بالوقت والقاعه الدراسية وربما في نفس الوقت يوجد بلوكيين او اكثر او ربما يوجد في نفس الوقت محاضرتين لنفس الاستاذ في نفس القاعه وهذا يعتبر تضارب ! لذلك جتي فكره الخورزميات الجينيه بمعالجه تلك التضاربات ! وذلك بتوليد 100 TimeTable اي 100 جدول دراسي اسبوعي ! وفي كل جدول يوجد نفس حقل البلوك في الجداول الاخرى ال 100 لان جدول البلوك تم ادخله الى قاعات البيانات بحسب المعلومات التي لدينا اي هاي المعلومات لا يوجد فيها اي تصارب لاننا نعرف على سبيل المثال هاي الماده منو مدرسها او الى اي صف تدرس او ماهو نوع الدرس هل عملي او نظري لذلك حقل البلوك لا يوجد فيه اي مشكله ومتسلسل من 1 الى 10 ! اما حقل الوقت وحقل القاعه الدراسية في الجداول ال100 تكون بيانات تلك الحقول مختلفه نوع ما لان تم توليده بصورة عشوائيه !

3- هنا ياتي دور الخورزميات الجنيه مره ثانية هو حساب عدد التصاربات في كل جدول ! والجدول الي يكون فيه عدد التصاربات اقل يكون هو الجدول الافضل !

المشكله الرئيسي في مشكلتي هنا تبداء عند حساب عدد التصاربات بالجدول ويكون هناك فراغ في حقل البلوك ! مثل ماذكرنا سابقا بان لدينا 10 بلوك من 1 الى 10 متسلسله هنا لا توجد مشكله

اما اذا تم حذف بلوك رقم 5 الى اي سبب ما ! سوف تظهر المشكله

وسوف اشرح الكم ماهو السبب ظهور تلك المشكله

سوف نشرح على البلوك وقت المحاصرة فقط لان هي نفس الفكره!! ونترك القاعه حاليا لان اني اتوقع دوختكم !!!!!!

IdBlcok idTime

[0]4 [0] 1

[1]5 [1] 2

[2]1 [2] 3

[3]7 [3] 4

وهكذا

[0] ----[3] تسلسل المصفوفه

حتى استطيع ان اقارن في وقت البلوكات من حيث التصاربات هل يوجد تضارب اما لا ابداء اقارن وقت بلوك الاول مع باقية اوقات البلوك الاخرى ووقت البلوك الثاني مع باقية اوقات البلوكات الاخرى وهكذا تستمر الى اخر بلوك ونحسب عدد التصاربات في هذا الجدول !

كيف تتم عمليه المقارنه ؟

بلوك رقم واحد idblock =1 يجلس في الخانه 0

ووقت بلوك رقم واحد ايظا يجلس في خانه رقم 0

يعني

[ idTime= [ IdBlock[0]-1

1 - 1 = 0

اذا [idtime[0 = اربعه 4 وبذلك عرفنا وقت البلوك الاول ويتم مقارنته مع وقت البلوك الثاني وهكذا تستمر الى اخر بلوك والى اخر جدول بالمشروع الى ان نصل الى افضل جدول

ناتي في حاله الحذف لو حذفنا احد البلوكات وليكن رقم 3 الجالس في خانه رقم 2

وبذلك يكون لدينا البلوكات التالي 1 -2 -4 في الخانات 0 و 1 و 2 بالتسلسل

والوقات التاليه 4 - 5 - 7 في الخانات 0 و1 و2 بالتسلسل

نطبق القانون لحساب التضاربات للبلوك الاخير رقم 4

[ idTime= [ IdBlock[2]-1

[4-1] = [3]

وبذلك يظهر لدينا خطا لاننا لا نملك خانه رقم 3 اكبر خانه لدبنا هي رقم 2 لذلك نحتاج الى اعاده ترتيب الجدول

اشكرك مره ثانية على الاصغاء وتفاعلك معي

اتمنى بان تكون المشكله اتضحت افضل

السلام عليكم

#12

ارفق هذا الجزء المشروع مع قاعدة البيانات او مثل منها

#13

أتوقع أنك تستخدم حلقة، ألا تحل مشكلتك باستخدام try..catch و continue لتجاوز المرحلة التي يحدث فيها خطأ داخل الحلقة؟

طبعاً بدون شفرة لقراءتها يكون ردّي مجرد تكهّنات.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

شكرا على ردودكم اللطيفة ووبارك الله فيكم ان شاء الله !

هذا جزء من الكود واحد الشروط الموجود في البرنامج في تتبع التضاربات لان هناك مجموعه من الشروط

هنا تحدث المشكله

  class SameAuditorySameTimeMoreBlock : IRule// شرط معرفه هل هناك اكثر من محاضرة في نفس الوقت ونفس القاعه الدراسية  
        {

            private static Block[] blocksall = Database_Helper.GetInstance().getBlocks();//تهيئه البلوك 
            public int calcRule(Individual ind)// داله تستلم جدول المواد الدراسية وتبحث عن التصاربات 
            {
                int count = 0;
                Chromosome Time = ind.GetTimeChromosome();//تهيئه الاوقات من كلاس الكرموسوم  
                Gen[] TimeGen = Time.GetTimeGenes();// وضع الاوقات في مصفوفه من نوع جين  
                Chromosome Auditory = ind.GetAuditoryChromosome();//تهيئه القاعات الدراسية  من كلاس الكرموسوم
                Gen[] AuditoryGen = Auditory.GetAuditoryGenes();//وضع االقاعات الدراسية في مصفوفه من نوع جين
                for (int i = 0; i < blocksall.Length; i++)//حلقه في البحث على التضارب الموجود 
                {
                    for (int j = i + 1; j < blocksall.Length; j++)
                    {
                        if ((TimeGen[blocksall.getIdBlock() - 1].getValue() == TimeGen[blocksall[j].getIdBlock() - 1].getValue()) &&
                        (AuditoryGen[blocksall.getIdBlock() - 1].getValue() == AuditoryGen[blocksall[j].getIdBlock() - 1].getValue()) &&
                           blocksall.getIdBlock() != blocksall[j].getIdBlock())
                        {

                            count++;// يحسب عدد التضاربات 


                        }

                    }
                }
                return count;// هنا عدد التضاربات 

            }

        }
#15

تستطيع وضع Id_Time ضمن Blocks ويكون FK يشير إلى Id_Time في TimeTable الذي يكون PK، وتتخلص من Id_Block في TimeTable

بهذا الشكل حتى لو تم حذف block فلن يؤثر على بقية الـ blocks التي ما زالت ترتبط بالـ Id_Time الصحيح المقابل.

طبعاً ستحتاج بعد هذا التعديل لتعديل خوارزميتك بشكل بسيط لتقوم بالمرور على حلقة واحدة فقط هي blocksall وتقوم بمقارنة blocksall.getTime() مع blocksall[i+1].getTime()

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#16

السلام عليكم

اخي لا يمكن ان يكون Id_Time في TimeTable على اساس PK وذلك لان هذا المتغير قابل الى التكرر

فمثلا id_time = 15

يعني وقت رقم خمسه عشر اي الخميس الساعه ال12 الى الساعه 2 يمكن ان يكون الوقت متكرر الى عدد من البلوكات لكن هذا البلوكات مختلفه من حيث الاستاذ او الماده او الطلبه لذلك لا يعتبر هذا تضارب !

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