PDA

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



asrah6
پنج شنبه 09 آبان 1392, 15:28 عصر
سلام
من یک جدول به نام tblgrade برای ثبت نمرات دانش آموزان دارم که شامل فیلد های زیر است:
id به صورت خودکار شماره گذاری می شود
DID کد درس است که با جدول درسها رابطه دارد
TID کد ترم است که با جدول ترم ها رابطه دارد
IDSt شماره دانش آموز که با جدول مشخصات دانش آموزان رابطه دارد
Nomre نمره دانش آموز در درس مورد نظر می باشد
RANk برای ذخیره رتبه دانش آموز در درس مورد نظر در آن کلاس می باشد.
توسط عملیات اینسرت اطلاعات را از طریق فرم ویندوزی بدست آورده و در ستونهای DID,TID,IDSt,Nomre ذخیره می کنم در این قسمت داخل ستون RANK چیزی ذخیره نمی شود.
سپس در ادامه رویداد همان باتن ذخیره نمره اومدم یک SqlDataAdapter گذاشتم و با کوئری زیر رتبه هر دانش آموز را در هر درس به دست می آورم و در یک دیتا گرید نمایش می دهم


select IDSt ,DID,TID,Nomre,DENSE_RANK() over (order by Nomre desc) as Rank2
from TblGrade
where TID=@TID AND DID=@DID

و بعد در ادامه رویداد همان باتن ذخیره نمره اومدم یک sql command گذاشتم و رتبه هر دانش آموز را از دیتاگرید نمایش رتبه بدست آورده و در ستون RANK از جدول نمره ذخیره می کنم
در این روش هیچ مشکلی ندارم و تمام عملیات با موفقیت انجام شده و در کارنامه هم به درستی نمایش داده می شود
حال سوالم اینجاست که به نظر شما راه من در اینکار چگونه است اگر به نظر شما خوب است که هیچ اما اگر روش خوبی نیست راه حل بهتری اگر دارید پیشنهاد کرده و توضیح بفرمایید

veniz2008
پنج شنبه 09 آبان 1392, 16:24 عصر
سلام.
همونطور که خودتون هم در لابه لای صحبت هاتون اشاره کردید، رتبه دانش آموز یک عملیات محاسباتی (فیلد محاسباتی) هست که از روی فیلدهای نمره درس، سال تحصیلی و شماره ترم و کد درس محاسبه میشه. این گونه فیلدها رو درون جدول ذخیره نمی کنند دلیل اصلیش هم این هست که احتمال بروز خطا در چنین حالاتی زیاد هست و همچنین هزینه اضافی رو به سیستم تحمیل میکنه. چطور؟
مثلا فرض کنید نمره یک دانش آموز به هر دلیلی بخواد عوض بشه (فرضا" اشتباه ثبت شده).
در این حالت، تمامی رتبه هایی که ثبت کردید فاقد اعتبار هستن و نمیشه بهشون اعتماد کرد. حالا اگر فرض رو بر این بگیریم که شما یادتون مونده باشه که با تغییر یک نمره، دوباره تمامی رکوردهای مربوط به اون درس رو آپدیت کنید باز هم هزینه اضافی رو به سیستم وارد کردید (جدا از خطرناک بودن کار).
اینگونه فیلدها رو بایستی در زمانی که به اونها نیاز داریم، محاسبه و استفاده کنیم.
موفق باشید.

asrah6
پنج شنبه 09 آبان 1392, 22:56 عصر
با تشکر از شما
برای بدست آوردن رتبه دانش آموز و نمایش در کارنامه نیاز به دو پارامتر است یکی کد ترم ودیگری کد درس
این دو پارامتر را چگونه مشخص کنم

sajadsobh
پنج شنبه 09 آبان 1392, 22:59 عصر
یه نگاه اینجا (http://barnamenevis.org/showthread.php?425715-%DA%A9%D9%85%DA%A9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D9%84%DA%A9%D8%AA-RANK-%D8%A7%D8%B2-%DB%8C%DA%A9-%D8%AC%D8%AF%D9%88%D9%84-%D9%88-%D8%A7%DB%8C%D9%86%D8%B3%D8%B1%D8%AA-%D8%AF%D8%B1-%DB%8C%DA%A9-%D8%B3%D8%AA%D9%88%D9%86-%D8%A7%D8%B2-%D9%87%D9%85%D8%A7%D9%86-%D8%AC%D8%AF%D9%88%D9%84&p=1906612&viewfull=1#post1906612) بنداز :چشمک:

veniz2008
جمعه 10 آبان 1392, 10:21 صبح
برای بدست آوردن رتبه دانش آموز و نمایش در کارنامه نیاز به دو پارامتر است یکی کد ترم ودیگری کد درس
این حرف زمانی صحیح هست که یا شماره ترم در هر ترم جدید یه مقدار جدید و غیر تکراری بگیره!! یا به کد درس در هر ترم جدید یک شماره منحصربفرد بدید.
در مورد شماره ترم که مرسوم هست اعداد 1 و 2 رو ثبت کنیم.
در مورد کد درس هم، شما که نمیخوای در هر ترم جدید، دوباره همه درس ها رو با یه کد جدید، از نو ثبت کنی؟
بذارید مثال بزنم.
شما میای این ترم (مثلا ترم 1) برای درس با کد 12220 برای چندین دانش آموز نمره ثبت می کنی.
سال آینده دوباره برای همین ترم و کد درس برای یکسری دانش آموز دیگه نمره ثبت میشه. حالا وقتی با استفاده از کد ترم و کد درس کوئری میزنی، غیر از این هست که نمرات سال (و سال های) گذشته هم لیست میشن؟
به همین خاطر هست که گفتم سال تحصیلی هم باید باشه تا فقط نمرات این سال تحصیلی و این ترم برای اون درس خاص حساب بشه.

این دو پارامتر را چگونه مشخص کنممتوجه نشدم.
منظورتون از مشخص کردن چی هست؟ طراحی جدول منظورتون هست؟ یا در طراحی فرم ها؟
کامل توضیح بدید.

asrah6
شنبه 11 آبان 1392, 15:39 عصر
سلام وتشکر از شما برای پاسخگویی

این حرف زمانی صحیح هست که یا شماره ترم در هر ترم جدید یه مقدار جدید و غیر تکراری بگیره!! یا به کد درس در هر ترم جدید یک شماره منحصربفرد بدید.

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

112474
کوئری هم به صورت زیر است که نمرات ثبت شده را مانند تصویر زیر مرتب می کند


SELECT IDSt,DID, [Nomre],TID,DENSE_RANK() over (order by Nomre desc) as Rank1,
CASE
WHEN [Nomre] BETWEEN 18 AND 20 THEN N'عالی'
WHEN [Nomre] BETWEEN 14 AND 17.99 THEN N'خوب'
WHEN [Nomre] BETWEEN 10 AND 13.99 THEN N'متوسط'
WHEN [Nomre] BETWEEN 0 AND 9.99 THEN N'ضعیف'
END AS [Grade]
FROM TBlGrade
group by DID,IDSt,Nomre,TID
order by DID,IDSt

112475
کد درس (DID)
19 مربوط به علوم --- 20 مربوط به درس ریاضی ---21مربوط به درس دینی---- 22 مربوط به درس هنر می باشد
خوب اگر به عکس دقت کنید ستون Rank1 آمده نمرات همه درسها را مرتب کرده است در حالیکه من می خواهم نمرات درس علوم با هم مقایسه شود یا ریاضی ها با هم و......
امیدوارم توضیحاتم کافی و خوب باشد.

veniz2008
شنبه 11 آبان 1392, 19:51 عصر
جدول TblNomre رو در نظر بگیرید :

112481

در کدهای زیر، تابع partition باعث میشه که به ازای درس جدید، شماره گذاری مجددا از 1 شروع بشه.
بدست آوردن رتبه تمام دانش آموزان :

112480

و اگر میخواید برای یک دانش آموز خاص، رتبه اونو در تمام درس ها حساب کنید :

112479
موفق باشید.

reza4359
جمعه 10 دی 1395, 08:57 صبح
جدول TblNomre رو در نظر بگیرید :

112481

در کدهای زیر، تابع partition باعث میشه که به ازای درس جدید، شماره گذاری مجددا از 1 شروع بشه.
بدست آوردن رتبه تمام دانش آموزان :

112480

و اگر میخواید برای یک دانش آموز خاص، رتبه اونو در تمام درس ها حساب کنید :

112479
موفق باشید.

با سلام دوستان عزیز
در این رابطه حالا اگه بخواهیم رتبه را با مقایسه بین امتیاز کاربران بدست بیاریم به چه صورت هست یعنی بین کاربر a,b,c از طریق امتیازشون بیاد بگه از 3 تا کاربر a رتبه اول b رتبه دوم , c رتبه سوم
اسکریپت این به چه شکله؟
ممنون

reza4359
جمعه 10 دی 1395, 18:02 عصر
دوستان اگه کسی اطلاع داره راهنمایی کنه لطفا بهش نیاز دارم

reza4359
شنبه 11 دی 1395, 23:40 عصر
با سلام دوستان
من جهت رتبه بندی از این اسکریپت استفاده میکنم ولی اعداد منفی را منفی در نظر نمیگیره و رتبه آنها را با اعداد مثبت یکی حساب میکنه باید چه تغییری در اسکریپتم بدم که منفی را تشخیص بده؟


select id_user,score,RANK() over(order by score desc)as rank from tbl_score

reza4359
پنج شنبه 16 دی 1395, 00:47 صبح
سلام دوستان این مشکل بالا حل شد
حالا برای بدست آوردن رتبه بعد از هر آزمون باید چکار کرد؟
یعنی هر کاربر پس از هر آزمون با مقایسه بین دیگر کاربرانی که آزمون دادند رتبشو بیاد داخل یک لیبل نمایش بده

reza4359
سه شنبه 21 دی 1395, 09:28 صبح
سلام دوستان ما که هر چی سوال اینجا میپرسیم هیچ کسی جواب نمیده
من در خصوص بدست آوردن رتبه به یک مشکل برخوردم که وقتی رتبه را به دست میاریم و در دیتابیس ذخیره میکنیم رتبه قبلی در مقایسه با رتبه جدید مشکل داره
مثلا اگه یک نفر آزمون داده و به همه سوالات پاسخ نداده و رتبه اون چون اولین نفر آزمون هست 1 بوده و در دیتابیس ثبت شده و نفر بعد که میخواد آزمون بده و همه سوالات را پاسخ داده اونم با توجه به نفر قبلی رتبه 1 را دارد حالا چطوری در دیتابیس رتبه نفر قبلی را با بعدی مقایسه کنیم و اون رتبه 1 نفر اول آزمون را به 2 تغییر بدیم ؟
امیدوارم منظورم را رسانده باشم
ممنون

Mahmoud.Afrad
سه شنبه 21 دی 1395, 13:10 عصر
سلام دوستان ما که هر چی سوال اینجا میپرسیم هیچ کسی جواب نمیده
من در خصوص بدست آوردن رتبه به یک مشکل برخوردم که وقتی رتبه را به دست میاریم و در دیتابیس ذخیره میکنیم رتبه قبلی در مقایسه با رتبه جدید مشکل داره
مثلا اگه یک نفر آزمون داده و به همه سوالات پاسخ نداده و رتبه اون چون اولین نفر آزمون هست 1 بوده و در دیتابیس ثبت شده و نفر بعد که میخواد آزمون بده و همه سوالات را پاسخ داده اونم با توجه به نفر قبلی رتبه 1 را دارد حالا چطوری در دیتابیس رتبه نفر قبلی را با بعدی مقایسه کنیم و اون رتبه 1 نفر اول آزمون را به 2 تغییر بدیم ؟
امیدوارم منظورم را رسانده باشم
ممنون

وقتی سوال میپرسید، باید اطلاعات اولیه ارائه کنید. شامل کد، اسکریپت جدول و ...

در مورد این سوالتون باید بگم که رتبه، یک فیلد محاسباتی هست و نیاز به ذخیره سازی نیست. هر زمان نیاز داشتید کوئری بزنید و بدست بیارید.

reza4359
جمعه 24 دی 1395, 21:20 عصر
با سلام
ممنونم آقای افراد از پاسختون
من میخوام وقتی روی نام هر کاربر کلیک میکنم رتبه آزمون اون را محاسبه کنه و نمایش بده حالا از این اسکریپت استفاده میکنم میشه راهنمایی کنید که مشکل از کجاست و در قسمت where از چه کدی استفاده کنم
SqlCommand command1 = new SqlCommand("select score,RANK() OVER(order by score)as r FROM tbl_score where score=(select id_user from tbl_score where id_user='" + textBox1.Text + "')", con);

Mahmoud.Afrad
جمعه 24 دی 1395, 23:05 عصر
اسکریپت جداول رو ندادید بتونیم تست کنیم.

reza4359
شنبه 25 دی 1395, 18:10 عصر
آقای افراد این اسکریپت جدول tbl_score
CREATE TABLE [dbo].[tbl_score](
[id] [int] IDENTITY(1,1) NOT NULL,
[Score] [int] NULL,
[Rank] [int] NULL,
[ans_true] [int] NULL,
[ans_false] [int] NULL,
[date] [nvarchar](50) NULL,
[id_user] [int] NULL,
[GroupID] [int] NULL,
CONSTRAINT [PK_tbl_score] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[tbl_score] WITH CHECK ADD CONSTRAINT [FK_tbl_score_tbl_group] FOREIGN KEY([GroupID])
REFERENCES [dbo].[tbl_group] ([GroupID])
GO

ALTER TABLE [dbo].[tbl_score] CHECK CONSTRAINT [FK_tbl_score_tbl_group]
GO

ALTER TABLE [dbo].[tbl_score] WITH CHECK ADD CONSTRAINT [FK_tbl_score_tbl_user] FOREIGN KEY([id_user])
REFERENCES [dbo].[tbl_user] ([id_user])
GO

ALTER TABLE [dbo].[tbl_score] CHECK CONSTRAINT [FK_tbl_score_tbl_user]
GO

Mahmoud.Afrad
شنبه 25 دی 1395, 20:01 عصر
به طور کلی به صورت زیر میتونید عمل کنید(به جای @id کد شخص رو قرار بدید. اگر رتبه سالیانه و یا ماهیانه و یا حتی در درس خاصی میخواهید رتبه بگیرید باید در گروهبندی سال رو هم قرار بدید و در مورد رتبه در یک درس یا رشته خاص باید فیلدی که مربوط به درس یا رشته هست رو دخالت بدید.
select
RANK() OVER(order by sum(score) desc) as rank ,
id_user , SUM(score) as TotalScore
from tbl_score
where id_user=@id
group by id_user