سؤال في ال sql
تاريخ التسجيل: 2007-08-01 مشاركات: 40
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: ماجستير الاختصاص: هندسة شبكات
|
صباح الخير
لدي مجموعة سجلات مخزنة في قاعدة البيانات وحقل المفتاح لهذه السجلات أقوم بحسابه يدويا عند إضافة سجل جديد والمشكل عند حذف سجل أو مجموعة سجلات تصبح هناك أرقام مفقودة أثناء استعراض السجلات لطباعتها مثلا السجلات ذات الأرقام 1-2-3-4-5 وقمت بحذف السجل الثني والرابع سوف تظهر الأرقام على الشكل 1-3-5 وهذا غير مقبول عند طباعة تقرير وما أريده هو إعادة ترقيمها لتصبح 1-2-3 .
وسؤال آخر لنفرض لدي سجلات من 1-50 وأريد استعراض السجلات التي تحقق شرط معين فكانت هي السجلات 23-46 وما أطلبه عرض هذ السجلات يالترقيم التالي 1-23 كي أتمكن من طباعتها. أنا أنفذ البرنامج بلغة السي شارب مع قاعدة معطيات access
أرجو مساعدتي ولكم جزيل الشكر .
|
| |
دخول أو تسجيل لإرسال التعليقات | قراءة: 328 |
|
عضو فعال
تاريخ التسجيل: 2006-12-01 مشاركات: 276
|
حقل المفتاح لهذه السجلات أقوم بحسابه يدويا (ليش يدويا ما فهمت ؟)
برأيي لازم تعمل حقل اضافي اسمه ord بعبر عن ترتيب السجل ,,, ووقت بتعمل اضافة بتشوف اعلى قيمة اله وبتزيد عليها واحد ووقت الحذف بتحذف وبتعمل update للقيم اللي ترتيبها اقل من اللي انت حذفتو .. كمان ممكن وقت العرض بس تحط متحول بما انه ما عندك عمليات تانية على الترتيب
بالنسبة لعرض سجلات من 23-46 كمان نفس الشي ممكن تعمل متحول counter أثناء العرض بس تطبع قيمته وبهالشكل بيطلعو مرتبين
ان شا الله تكون وصلت الفكرة ...
How Perfect You are O Allah, and I praise You. LA Ilah Ila Lah, I seek Your forgiveness and turn to You in repentance
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
عضو فعال
تاريخ التسجيل: 2007-06-07 مشاركات: 1163
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: ذكاء صنعي
|
اول شي بسأل نفس سؤال iman ... ليش يدوي ؟
حل iman ممكن التنفيذ
بس لنفرض انو عندي عدد سجلات كبير جدا وحذفت اول سجل
المطلوب اعمل update لكل السجلات المتبقية في الجدول
الحل الأحسن
هو انو بعد انتهاء الاستعلام وعند عرض السجلات تعرض رقم السجل بجانبه (متحول عداد)
بس
"Make me a sandwich"
"What? make it yourself"
"SUDO me a sandwich"
"Yes sir!"
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3231
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
يفترض حقل المفتاح الرئيسي يضل ثابت (مثلاً رقم الموظف أو رقم الفاتورة بضل 123 بغض النظر عن عمليات الحذف و الإضافة).
بس بالتقارير عادة بكون في حقل اسمه "مسلسل" (بيحتوي على قيم متسلسلة من 1 إلى n) وهاد غير المفتاح الرئيسي يعني يفضل يتم طباعة الحقلين (الرقم و المسلسل)
ما بعرف اذا كان في شي طريقة سريعة لعمل هالشي بالـAccess...
الطريقة البطيئة (في طرق أفضل بـ SQL Server و Oracle) هي:
لنفرض الجدول اسمه Emp وحقل المفتاح الأساسي اسمه ID بتكون التعليمة
SELECT
(SELECT COUNT(*) FROM Emp E1 WHERE E1.ID < E2.ID)+1 AS Seq,
*
FROM
Emp E2
ORDER BY
ID
|
| |
دخول أو تسجيل لإرسال التعليقات |
تاريخ التسجيل: 2007-08-01 مشاركات: 40
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: ماجستير الاختصاص: هندسة شبكات
|
شكرا للزملاء المرور على السؤال ومساعدتي وقد قمت بإضافة حقل جديد يستخدم في الطباعة وهو الذي عندما أقوم بالإضافة أرى اعلى قيمة له وأزيد عليها واحد ووقت الحذف بيحذف وبيعمل update لكل السجلات التي بعده بإنقاص قيمة الحقل الجديد بمقدار واحد . أما بالنسبة لطباعة السجلات من 23-49 لم أعرف كيف بالنسبة لجواب الزميلةiman ياريت لو بمثال . وجواب الزميل foaad ما هو E1,E2 في التعليمة التي تطبع السجلات مرتبة .
ولكم جزيل الشكر جميعا .
|
| |
دخول أو تسجيل لإرسال التعليقات |
|
مدير
تاريخ التسجيل: 2005-07-15 مشاركات: 3231
الجامعة: دمشق الكلية: الهندسة المعلوماتية المرحلة: السنة الخامسة الاختصاص: هندسة برمجيات
|
كتب soso83: شكرا للزملاء المرور على السؤال ومساعدتي وقد قمت بإضافة حقل جديد يستخدم في الطباعة وهو الذي عندما أقوم بالإضافة أرى اعلى قيمة له وأزيد عليها واحد ووقت الحذف بيحذف وبيعمل update لكل السجلات التي بعده بإنقاص قيمة الحقل الجديد بمقدار واحد .
بس هاد الحل مو كتير عملي, يعني اذا كان في عدد سجلات كبير رح يصير الحذف كتير بطيئ.
كتب soso83:
وجواب الزميل foaad ما هو E1,E2 في التعليمة التي تطبع السجلات مرتبة .
E1 و E2 هنن Aliases للجدول Emp يعني إعادة تسمية Emp مرة بـ E1 ومرة بـ E2 (طبعاً ممكن استخدام أي اسمين)
بس نسيت قول انو اذا كان في شرط لازم ينحط الشرط بتعليمتين الـ SELECT يعني مثلاً اذا كان بدي الموظفين الي رواتبهم أقل من 5000 بتصير التعليمة:
SELECT
(SELECT COUNT(*) FROM Emp E1 WHERE E1.ID < E2.ID
AND
E1.Salary < 5000 ) + 1 AS Seq,
*
FROM
Emp E2
WHERE
E2.Salary < 5000
ORDER BY
ID
|
| |
دخول أو تسجيل لإرسال التعليقات |
|