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

أريد مساعدة في عمل جدول تحضير الطلاب

بدأه الأماني السامية في 18 أبريل 2011 · 5 رد · 1,199 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أنا أعمل على مشروع التخرج وهو نظام جامعي إداري متطور قائم على نظام الباركود..

استخدمت لغة الـ C#.Net و SQL server

إحدى مهام هذا البرنامج هو عمل تحضير الكتروني للطلاب وأريده أن يظهر بالشكل التالي:

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

| | | | |

حيث أنني قمت بتخزين بيانات هذا الجدول في قاعدة البيانات في جدول attendance الذي يحتوي على الحقول التالية:

stud_ID , sub_ID , date , attend , lec_num

حيث أنها تمثل رقم الطالب ، رقم المادة ، تاريخ المحاضرة ، الحضور ، ورقم المحاضرة على التوالي

فاستخدمت أداة الـ DataGridView لعرض الجدول

واستخدمت الاستعلام التالي

SELECT DISTINCT (attendance.stud_ID) , student.st_1name +' '+student.st_2name +' '+student.st_3name +' '+ student.st_4name , (SELECT attendance.attend WHERE attendance.lec_num = 1), (SELECT attendance.attend WHERE attendance.lec_num = 2), ( SELECT attendance.attend WHERE attendance.lec_num= 3) FROM student,attendance WHERE attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID

كما استعنت بالجدول student الذي يحتوي على بيانات الطالب

والمتغير ClassGlobal.subject الذي يحتفظ برقم المادة الذي نريد تحضير الحضور لها

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

لكن أنا أريد عرض تحضير الطالب الواحد في جميع المحاضرات في صف واحد

والسؤال الآخر هو هل توجد طريقة أخرى لتكرار الاستعلام عن الحقل attend لإني أشعر أن هذه الطريقة غير عملية ومجهدة ، أي هل يمكن إدخال جملة الاستعلام داخل for loop وتتكرر بعدد المحاضرات

اعذروني عالإطالة ولكنني أردت أن تتضح الفكرة بشكل أفضل

وجزاكم الله ألف خير

أختكم الأماني السامية

post-243731-040994600 1303151022_thumb.p

المرفقات
attendance.png
#2

للرفع

#3

السلام عليكم.

تم تعديل الاستعلام بالشكل التالي:

SELECT DISTINCT (student.stud_ID) , student.st_1name +' '+student.st_2name +' '+student.st_3name +' '+ student.st_4name , 
(SELECT attendance.attend FROM attendance WHERE attendance.lec_num = 1 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID)
, (SELECT attendance.attend FROM attendance WHERE attendance.lec_num = 2 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID)
, ( SELECT attendance.attend FROM attendance WHERE attendance.lec_num= 3 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID) 
FROM student

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

#4

السلام عليكم.

يمكن تعديل الاستعلام بعد استخدام خاصية ال Pivot فيصبح الاستعلام كالتالي:

SELECT  *
FROM    ( SELECT    attendance.stud_ID ,
                    student.st_name ,
                    attend ,
                    lec_num
          FROM      attendance
                    JOIN student ON attendance.stud_ID = student.stud_ID
          WHERE     dbo.attendance.sub_ID = '" + ClassGlobal.subject + "'
        ) AS SourceTable PIVOT
( AVG(attend) FOR lec_num IN ( [1], [2], [3] ) ) AS PivotTable

كما ترين, فإنه تم تقليص حجم الاستعلام بشكل كبير و لكن مايزال عليكي أن تضعي جميع حالات lec_num التي تريدينها في السطر الأخير و لكن هذا الحل أفضل بكثير من الحل الأول.

أخيراً: يمكن جعل حتى الحالات تظهر بشكل ديناميكي باستخدام Dynamic Pivot و هي مشروحة في المقالة التالية:

http://beyondrelational.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx

1
#5
Adel Khayata كتب:

السلام عليكم.

تم تعديل الاستعلام بالشكل التالي:

SELECT DISTINCT (student.stud_ID) , student.st_1name +' '+student.st_2name +' '+student.st_3name +' '+ student.st_4name , 
(SELECT attendance.attend FROM attendance WHERE attendance.lec_num = 1 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID)
, (SELECT attendance.attend FROM attendance WHERE attendance.lec_num = 2 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID)
, ( SELECT attendance.attend FROM attendance WHERE attendance.lec_num= 3 AND attendance.sub_ID ='" + ClassGlobal.subject + "' and student.stud_ID = attendance.stud_ID) 
FROM student

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

وعليكم السلام

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

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

#6
Adel Khayata كتب:

السلام عليكم.

يمكن تعديل الاستعلام بعد استخدام خاصية ال Pivot فيصبح الاستعلام كالتالي:

SELECT  *
FROM    ( SELECT    attendance.stud_ID ,
                    student.st_name ,
                    attend ,
                    lec_num
          FROM      attendance
                    JOIN student ON attendance.stud_ID = student.stud_ID
          WHERE     dbo.attendance.sub_ID = '" + ClassGlobal.subject + "'
        ) AS SourceTable PIVOT
( AVG(attend) FOR lec_num IN ( [1], [2], [3] ) ) AS PivotTable

كما ترين, فإنه تم تقليص حجم الاستعلام بشكل كبير و لكن مايزال عليكي أن تضعي جميع حالات lec_num التي تريدينها في السطر الأخير و لكن هذا الحل أفضل بكثير من الحل الأول.

أخيراً: يمكن جعل حتى الحالات تظهر بشكل ديناميكي باستخدام Dynamic Pivot و هي مشروحة في المقالة التالية:

http://beyondrelational.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx

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

قمت بتغيير نوع الحقل attend إلى int لكي يقبل العملية AVG

والحمدلله أعطت النتيجة المرجوة

وسوف أقوم بتجريب الطريقة الديناميكية وأعلمكم بالنتيجة

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