PDA

View Full Version : مبتدی: رتبه بندی به تفکیک کلاس و شیفت



Nazir Ahmad
یک شنبه 09 تیر 1392, 09:04 صبح
سلام خدمت تمام اساتید و دوستان گرامی

در سایت تاپیکهای مختلفی در مورد رتبه بندی بیان شده، اما همه رتبه بندی رو در یک سطح (مثلا یک کلاس) اعمال میکنند.

مشکل اینجاست که اگر خواسته باشیم از یک جدول که تعداد کلاسها و شیفت متفاوت است، یعنی ما در شیفتهای مختلف تعداد کلاسهای زیادی داریم که میخواهیم در هر شیفت به تفکیک صنف رتبه بندی انجام بشه.

از اساتید و دوستان خواهش میکنم که کمک کنید. فایل رو هم ضمیمه کردم

ممنون

یا حق

Nazir Ahmad
دوشنبه 10 تیر 1392, 07:53 صبح
:گریه:کسی نیست کمک کنه؟:گریه:

Nazir Ahmad
سه شنبه 11 تیر 1392, 06:52 صبح
:گریه::گریه::گریه::ناراحت::نا احت::ناراحت::گریه::گریه::گری :
:افسرده::افسرده::افسرده::افس ده::افسرده::افسرده::افسرده:: فسرده::افسرده::افسرده:

saeed1234n
سه شنبه 11 تیر 1392, 09:19 صبح
با سلام
دوست عزيز
خيلي گنگ توضيح داديد
اگر توضيح بيشتري بدهيد حتما دوستان و اساتيد راهنمايي خواهند نمود

Nazir Ahmad
سه شنبه 11 تیر 1392, 09:54 صبح
با سلام
دوست عزيز
خيلي گنگ توضيح داديد
اگر توضيح بيشتري بدهيد حتما دوستان و اساتيد راهنمايي خواهند نمود

سلام
ببینید موضوع سادست:
ما در یک مدرسه تعداد زیادی کلاس داریم (مثلا 1 (الف) ، 1 (ب) ، 2 (الف) و الی آخر)
در عین حال در این مدرسه در دو شیفت (صبح و بعد از ظهر) درس جریان داره. یعنی در هر شیفت کلاسهای مختلفی داریم که در بالا گفته شد.
حالا ممکنه کلاس 1 (الف) رو هم در شیفت صبح داشته باشیم و هم در شیفت بعد از ظهر. ( 1 (الف) شیفت صبح .... 1 (الف) شیفت بعد از ظهر)
در دیتابیس هم تمام کلاسها در هر دو شیفت به طور نامنظم ثبت شده و در هر کلاس تعداد زیادی دانش آموز موجود است.
با استفاده از کوییری ها و گزارشات دانش‌آموزان هر کلاس از همدیگه تفکیک شده.
حالا ما میخوایم نتایج امتحانات اونا رو ثبت کنیم. یعنی مجموع نمره ، میانگین و حتی درصد نمره هر شاگرد رو در کلاس داریم و میخواهیم عملیه رتبه بندی رو به شکل خودکار انجام بشه. یعنی در هر کلاس به بالاترین نمره رتبه 1 و همچنین در ادامه نظر به تعداد شاگردان هر کلاس رتبه بندی صورت گیرد.

یه فایل هم آپلود کردم که از تو خود سایت از تاپیکهای دیگه گرفتم. من هم میخوام همین کار رو انجام بدم با این تفاوت که فایل ضمیمه رتبه بندی رو تنها برای یک کلاس انجام میده نه اینکه کلاسهای مختلف رو مجزا رتبه بندی کنه. (مشکل اینجاست که من خیلی از کد نویسی سر در نمیارم تا بتونم فایل رو به دلخواه تغییر بدم)
ممنون
با حق

Nazir Ahmad
چهارشنبه 12 تیر 1392, 07:12 صبح
اساتید گرامی لطفا کمک کنید
:ناراحت::ناراحت::ناراحت::نار حت::ناراحت::ناراحت::ناراحت:: اراحت::ناراحت:

Nazir Ahmad
پنج شنبه 13 تیر 1392, 07:53 صبح
نبود کسی؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
به ما کمک کنه؟؟؟؟؟؟؟؟؟؟؟؟؟
لطفا!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Nazir Ahmad
یک شنبه 16 تیر 1392, 10:37 صبح
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه:

mhamedm2008
یک شنبه 16 تیر 1392, 20:31 عصر
من که چیزی متوجه نشدم
خیلی پیچ در پیچه

Nazir Ahmad
سه شنبه 18 تیر 1392, 08:44 صبح
من که چیزی متوجه نشدم
خیلی پیچ در پیچه
دوست عزیز منظور شما رو نفهمیدم....
موضوع پیچ در پیچه یا توضیحات بنده پیچ درپیچه؟؟؟؟

Nazir Ahmad
دوشنبه 24 تیر 1392, 14:12 عصر
مثل اینکه هیچی ..................
هی
.
.
.

master13111
پنج شنبه 27 تیر 1392, 15:20 عصر
یعنی شما میخاین اول کلاس الف صبح که مثلا 10 تا دانش آموز داره بر حسب بیشترین نمره از 1 تا 10 رتبه بندی بشن بعد کلاس الف عصر دوباره مثلا از 1 تا 15 و بعد کلاسهای دیگه به همین ترتیب؟

Nazir Ahmad
شنبه 29 تیر 1392, 08:13 صبح
یعنی شما میخاین اول کلاس الف صبح که مثلا 10 تا دانش آموز داره بر حسب بیشترین نمره از 1 تا 10 رتبه بندی بشن بعد کلاس الف عصر دوباره مثلا از 1 تا 15 و بعد کلاسهای دیگه به همین ترتیب؟
بله دقیقا منظورم همینه.
البته ما در این رتبه بندی دو حالت داریم که حالت دوم 2 تا شرط داره.
حالت اول: اگر کسی در یک کلاس بیشترین نمره رو گرفت رتبه 1 و شاگرد بعدی 2 و الی آخر (این درصورتیه که نمرات شاگردان مساوی نباشه.
حالت دوم: در صورتیکه نمره دو شاگرد مساوی بود,
شرط 1: دانش آموزی که روزهای حاضر بیشتری داشته باشه درجه بالاتر رو بگیره (یعنی اونی که تعداد روزهای غیابت بیشتری داره یه رتبه پایین تر
شرط 2: درصورتیکه نمره مساوی بود, تعداد روزهای حاضر هم مساوی بود, به ترتیب شماره ردیف رتبه بندی صورت بگیره (یعنی اونی که شماره ردیف کمتری داره یعنی در جدول در ردیف بالاتر قرار داره رتبه بالاتری بگیره)

میدونم خیلی مبهمه
ممنون میشم اگر راهنمایی کنید
البته الان من تمام این کارها رو کلاس به کلاس با سورت کردن انجام میدم که کار بسیار مشکل و وقت گیریه

یا حق

master13111
شنبه 29 تیر 1392, 22:10 عصر
البته توضیحاتتون کامل و جامع بود اما قایلی که ضمیمه کردین مشخص نبود کدوم یکی نمره س کدوم یکی تعداد روزهای حاضر یا غایب و آیا شماره ردیف همون شماره در جدول است یا std_id

Nazir Ahmad
یک شنبه 30 تیر 1392, 08:42 صبح
البته توضیحاتتون کامل و جامع بود اما قایلی که ضمیمه کردین مشخص نبود کدوم یکی نمره س کدوم یکی تعداد روزهای حاضر یا غایب و آیا شماره ردیف همون شماره در جدول است یا std_id
بفرمایید دوست عزیز . این هم فایل اصلاح شده
ممنون میشم اگر کمک کنید تا مشکل برطرف بشه
در ضمن یه مشکل دیگه هم که الان پیش اومد اینه که کوییری که ترکیب دو جدول است که در فایل مشاهده میکنید، در دیتابیس اصلی قابل ویرایش و اضافه کردن رکورد جدید هست اما وقتی من بعضی جداول و فرمها و .... رو حذف کردم و کوییری رو برای ارسال ویرایش کردم دیگه قابل ویرایش و اضافه کردن رکورد جدید نیست.
دلیل این کار چیه؟ و چرا دیگه نمیشه اطلاعات رو ویرایش کرد؟ و روش حل مشکل چیه؟
ممنون
یاحق

master13111
یک شنبه 30 تیر 1392, 11:43 صبح
خب, شما سه تا شرط دارین که به ترتیب باید اعمال بشن. برای این کار اول یه فیلد ترکیبی میسازیم که از نوع رشته س و شامل نمره و روزهای حاضر و شماره ردیف
نکاتی که باید توی این ترکیب در نظر بگیریم ایناست
1- فیلدا از نوع عدد هستن و باید با استفاده از فانکشن str تبدیل به رشته بشن
2- از اونجایی که در حالت رشته, 9 خیلی خیلی بزرگتر از 100 هستش پس با فانکشن Format همه رو به فرمت استاندارد برمیگردونم مثل 9 رو تبدیل میکنیم به 009 که در اینصورت کمتر از 100 هست
3- چون فیلد نمره رو ندیدم از فیلد مجموع استفاده کردم و حداکثر اونو چهار رقمی در نظر گرفتم و از ماسک '0000' استفاده کردم و برای روزهای حاضر حداکثر 3 کاراکتر و برای شماره ردیف حداکثر دو کاراکتر. که شما بسته به نیازتون میتونید اینارو تغییر بدین

به احتساب توضیحات بالا فیلد ترکیبیمون میشه

Format((Str([3-NatayejQuery].Majmoo4)),'0000')+Format(Str([3-NatayejQuery].hazer),'000')+Format(Str([3-NatayejQuery].[Hazeri-NO]),'00')


به این ترتیب کسی که مجموع 540 داره و 90 روز حاضر بوده با شماره ردیف 4, عدد بدست آمده میشه 054009004
خب حالا به جای اینکه سه تا شرط گفته شده رو بررسی کنیم فقط کافیه بر اساس این عدد رتبه بندی کنیم که در برگیرنده هر سه شرطه
تا اینجا قسمت اول ماجرا حله
حالا اینکه گفتین بر اساس سال و کلاس و شیفت و شعبه و ... گروه بندی بشه. بازم به همین ترتیب به فیلد ترکیبی از مجموع اینا ساختم که البته فقط سال از نوع عدد هست و لازمه به رشته تبدیل بشه
این ستون هم میشه این

Trim(Str([3-NatayejQuery].[3_Natayej].sal))+[3-NatayejQuery].shobe+[3-NatayejQuery].shft+[3-NatayejQuery].cls

پس با این حساب فقط کافیه بر اساس این ستون گروه بندی صورت بگیره که کارمون خیلی راحتتر شد

در آخر سر هم با استفاده از دستور Count عملیات رتبه بندی رو انجام میدیم

SELECT [3-NatayejQuery].[3_Natayej].sal, [3-NatayejQuery].shobe, [3-NatayejQuery].shft, [3-NatayejQuery].cls, [3-NatayejQuery].[1_Students].[st-ID], (select count(*) FROM [3-NatayejQuery] as n where
(Format(Str(n.Majmoo4),'0000')+Format(Str(n.hazer) ,'000')+Format(Str(n.[Hazeri-NO]),'00') >=Format((Str([3-NatayejQuery].Majmoo4)),'0000')+Format(Str([3-NatayejQuery].hazer),'000')+Format(Str([3-NatayejQuery].[Hazeri-NO]),'00')) and
Trim(Str([3-NatayejQuery].[3_Natayej].sal))+[3-NatayejQuery].shobe+[3-NatayejQuery].shft+[3-NatayejQuery].cls= Trim(Str(n.[3_Natayej].sal))+n.shobe+n.shft+n.cls
) AS rnk
FROM [3-NatayejQuery]


این خط رو هم به کد بالا اضافه میکنیم تا نتیجه کار بهتر دیده بشه

ORDER BY Trim(Str([3-NatayejQuery].[3_Natayej].sal))+[3-NatayejQuery].shobe+[3-NatayejQuery].shft+[3-NatayejQuery].cls, Format((Str([3-NatayejQuery].Majmoo4)),'0000')+Format(Str([3-NatayejQuery].hazer),'000')+Format(Str([3-NatayejQuery].[Hazeri-NO]),'00') DESC;


اما سایر نکاتی که اگه جسارت نباشه لازم باشه بیان کنم. چون این مورد رو خیلی جاهای دیگه دیدیم
1- هیچوقت در جدول سال فیلد آی دی رو نذارین. خود مقدار سال یکتا هست و به راحتی میتونه کلید اصلی بشه
2- اگه من جای شما بودم فیلد شیفت و شعبه رو به جدول کلاس اضافه میکردم. به این ترتیب شما یه جدول با رکوردهای بیشتر دارین بجای اینکه جداول بیشتر داشته باشید و کاربر مجبور باشه دیتاهاشو از اینور اونور بخونه

موفق باشید

Nazir Ahmad
یک شنبه 30 تیر 1392, 13:33 عصر
ممنون دوست عزیز، واقعا زحمت کشیدی
البته هنوز موضوعاتی رو که بیان کردید به دیتابیس اصلی انتقال ندادم. اما کاملا همون چیزی بود که میخواستم
در مورد پیشنهاد دومتون


2- اگه من جای شما بودم فیلد شیفت و شعبه رو به جدول کلاس اضافه میکردم. به این ترتیب شما یه جدول با رکوردهای بیشتر دارین بجای اینکه جداول بیشتر داشته باشید و کاربر مجبور باشه دیتاهاشو از اینور اونور بخونه

یعنی منظور شما اینه که جداول شیفت و شعبه رو به طور کل حذف کنیم ؟
و در صورتیکه این کار رو بکنم وقتی مثلا خواسته باشم تنها لیست دانش‌آموزان شیفت صبح، یا شعبه اول و .... رو فیلتر کنم و از بقیه لیست جدا کنم، آیا به مشکل برخورد نمیکنم و کارم بیشتر نمیشه؟ و یا راهی برای این کار هم هست.
---- در مورد سوال دیگه ای هم که پرسیدم مبنی بر اینکه چرا در کوییری جدیدی که درست کردم دیگه نمیشه تغییرات وارد نمود در صورتیکه این کوییری یک کپی از کوییری است که قابلیت ویرایش اطلاعات را دارد. باعین جداول. و در کل چرا نمیشه اطلاعات کوییری رو ویرایش کرد و چگونه این کار رو انجام بدیم.
همچنین در کوییری‌ها فیلدهای text رو دیگه نمیشه فیلتر رو هم انجام داد؟ چرا؟
باز هم ممنون
یا حق

master13111
سه شنبه 01 مرداد 1392, 13:15 عصر
یعنی منظور شما اینه که جداول شیفت و شعبه رو به طور کل حذف کنیم ؟

به نظرم بهتره. حداقل اگه حذف نميكنيد فيلد آي دي رو ازشون حذف كنيد. جدولاتون يه فيلد داره كه خودشون هم كليدن



و در صورتیکه این کار رو بکنم وقتی مثلا خواسته باشم تنها لیست دانش‌آموزان شیفت صبح، یا شعبه اول و .... رو فیلتر کنم و از بقیه لیست جدا کنم، آیا به مشکل برخورد نمیکنم و کارم بیشتر نمیشه؟ و یا راهی برای این کار هم هست.

فقط هنگام ورود اطلاعات يه كم كاربر سخت ترش ميشه كه البته اونم با يه كم طراحي و كد نويسي ميتوني حلش كني. اما در عوض مزيتهاي بيشتري داره. برا گزارش گيريها و آمارگيري و مقايسه و نمودار .... خيلي بهتره. هر نوع گزارش و كوئري هم كه بخاي بگيري ميتوني بگيري. شما وقتي جدولها رو حذف ميكني فيلداشو ميفرستي به جدول كلاس. با يه كوئري بهشون دسترسي داري. فقط ركورداي جدول كلاس با اين حساب 9 برابر ميشه



در مورد سوال دیگه ای هم که پرسیدم مبنی بر اینکه چرا در کوییری جدیدی که درست کردم دیگه نمیشه تغییرات وارد نمود در صورتیکه این کوییری یک کپی از کوییری است که قابلیت ویرایش اطلاعات را دارد. باعین جداول. و در کل چرا نمیشه اطلاعات کوییری رو ویرایش کرد و چگونه این کار رو انجام بدیم.

دليلش اينه كه ارتباط منطقي بين دو جدول شما وجود نداره. منظورم ارتباطيه كه از طريق فيلد كليد يا ايندكس باشه. در اينصورت شما اجازه ويرايش ندارين.



همچنین در کوییری‌ها فیلدهای text رو دیگه نمیشه فیلتر رو هم انجام داد؟ چرا؟

ميشه. مثلا شما فيلد نتيجه رو تست كن و بر اساس مردود فيلتر كن. من احتمال ميدم شما فيلدايي مث سال و كلاس و شعبه و شيفت و ... اينا رو امتحان كردين. كه در اينصورت دليلش اينه:
اين مقادير در واقع مقدار اصلي ذخيره شده در ديتابيس نيستن. به عنوان مثال شما وقتي براي فردي سال 1392 رو انتخاب ميكنيد مقداري كه در ديتابيس ذخيره ميشه عدد 5 هست كه آي دي مربوط به سال 1392 در جدول ساله. و همينطور براي فيلداي مشابه. حالا فرض كنيد شما در يك فيلدي كه از نوع عدد هست ميخاين بر اساس رشته اي مانند "شعبه اول" فيلتر كنيد. نتيجه اين ميشه كه اول يه خطا ميده و بعدش هم فيلتر نميكنه