ورود

View Full Version : پیشنهاد راه حل برای بخشی از برنامه مدیریت باشگاه فوتبال



mohammad5530
یک شنبه 02 شهریور 1393, 22:39 عصر
با سلام

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

عکس دیتابیس من رو در زیر ببینید .

http://s6.uplod.ir/i/00410/gmr2k1z90t62.png


من توی یک قسمت به مشکل بر خوردم . اون قسمت هم نمایش بازیکنان محرومی در زمان انتخاب بازیکنان تیم

مراحل کار این برنامه به صورت زیر هست :

1- کاربر یک مسابقه اضافه میکند . این مسابقه در جدول tbl_Match اضافه می شود که در بالا با عدد 1 نمایش دادم

2- کاربر به قسمت بازیکنان بازی می رود . یعنی یک بازی را انتخاب میکند و سپس بازیکنان تیم ها را اضافه میکند که این کار در جدول tbl_MatchPlayer انجام میشود . (منظور 11 بازیکن اصلی و 3 تعویضی)

3- کاربر به بخش رویداد ها می رود و بازی مورد نظر را انتخاب میکند . سپس بازیکن را انتخاب میکند و سپس رخداد را . مثلا بازیکنی را انتخاب می کند و رویداد کارت قرمز را برای او ثبت میکند .

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

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

ممنون میشم راهنمایی کنید .

aminmousavi
یک شنبه 02 شهریور 1393, 23:06 عصر
سلام دوست عزیز .
با این ساختار میتونی کارت قرمز رو پیاده سازی کنی ، اما نمیتونی به هیچ وجه کارت زرد رو پیاده سازی کنی (به نظر بنده) ، چون ممکن هست طرف 5 تا کارت زرد بگیره ، نمیتونین متوجه بشین کدوم کارت زرد ها رو باید اعمال کنین که طرف محرومه یا نه ! ، کوئری عجیب غریبی میشه !

پشینهاد میکنم یک جدول محرومان بساز :

id , PlayerId,EventId

اگه کارت قرمز گرفت یک راست توی جدول ذخیره میکنی بعد از بازی بعدی هم پاکش میکنی
اگه کارت زرد گرفت ذخیره میکنی ، وقت بازی بعدی بررسی میکنی 3تا رکورد کارت زرد برای بازکین n وجود داره یا نه ، اگه وجود داشت محرومه بعد از بازی هم 3تا رکورد رو پاک میکنی اگر محروم نبود هم که هیچی !

در ضمن اگه توی تالار پایگاه داده مطرح میکردین بهتر بود .
موفق باشین

plus
یک شنبه 02 شهریور 1393, 23:40 عصر
با فرض اینکه:
1) Transfer بین بازی ها وجود نداشته باشه.
2) محرومیت کارتهای زرد کاملا از کارت قرمز جدا باشه. یعنی اگه بازیکنی در یک بازی 2 کارت زرد و در نتیجه 1 کارت قرمز گرفت، فقط همون 2 کارت زرد در نظر گرفته بشه.

برای محرومیت ناشی از کارت قرمز، فقط کافیه بررسی کنید که بازیکن، در بازی قبلی تیمش، کارت قرمز نگرفته باشه.
برای محرومیت ناشی از کارت زرد، باید بررسی کنید که آیا بازیکن در بازی قبلی کارت زرد گرفته؟ اگه گرفته، در صورتی که مجموع کارت زرد های گرفته شده توسط بازیکن (در طول بازیها) مضرب 3 باشه بازیکن محروم هست.
بررای محرومیت ناشی از کارت زرد، حالت دیگه که باید بررسی کنید این هست که آیا بازیکن در دو بازی قبلی کارت قرمز گرفته؟ اگه گرفته، آیا بازیکن در همون بازی کارت زرد هم گرفته؟ اگه گرفته، در صورتی که مجموع کارت زرد های گرفته شده توسط بازیکن مضرب 3 باشه بازیکن محروم هست.
حالت دوم برای کارت زرد زمانی پیش میاد که بازیکن تا قبل از بازی x ام، دو کارت زرد گرفته و در بازی x اول یک کارت زرد و بعد یک کارت قرمز مستقیم میگیره. در این حالت باید دو بازی محروم باشه.

mohammad5530
دوشنبه 03 شهریور 1393, 01:15 صبح
با فرض اینکه:
1) Transfer بین بازی ها وجود نداشته باشه.
2) محرومیت کارتهای زرد کاملا از کارت قرمز جدا باشه. یعنی اگه بازیکنی در یک بازی 2 کارت زرد و در نتیجه 1 کارت قرمز گرفت، فقط همون 2 کارت زرد در نظر گرفته بشه.

برای محرومیت ناشی از کارت قرمز، فقط کافیه بررسی کنید که بازیکن، در بازی قبلی تیمش، کارت قرمز نگرفته باشه.
برای محرومیت ناشی از کارت زرد، باید بررسی کنید که آیا بازیکن در بازی قبلی کارت زرد گرفته؟ اگه گرفته، در صورتی که مجموع کارت زرد های گرفته شده توسط بازیکن (در طول بازیها) مضرب 3 باشه بازیکن محروم هست.
بررای محرومیت ناشی از کارت زرد، حالت دیگه که باید بررسی کنید این هست که آیا بازیکن در دو بازی قبلی کارت قرمز گرفته؟ اگه گرفته، آیا بازیکن در همون بازی کارت زرد هم گرفته؟ اگه گرفته، در صورتی که مجموع کارت زرد های گرفته شده توسط بازیکن مضرب 3 باشه بازیکن محروم هست.
حالت دوم برای کارت زرد زمانی پیش میاد که بازیکن تا قبل از بازی x ام، دو کارت زرد گرفته و در بازی x اول یک کارت زرد و بعد یک کارت قرمز مستقیم میگیره. در این حالت باید دو بازی محروم باشه.

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

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

veniz2008
دوشنبه 03 شهریور 1393, 09:47 صبح
بررای محرومیت ناشی از کارت زرد، حالت دیگه که باید بررسی کنید این هست که آیا بازیکن در دو بازی قبلی کارت قرمز گرفته؟ اگه گرفته، آیا بازیکن در همون بازی کارت زرد هم گرفته؟ اگه گرفته، در صورتی که مجموع کارت زرد های گرفته شده توسط بازیکن مضرب 3 باشه بازیکن محروم هست.
سلام.
امکان اینکه یک بازیکن در دو بازی قبلی کارت قرمز گرفته باشه وجود نداره.
چون یک بازیکن در صورتیکه کارت قرمز بگیره،بازی بعدی محروم هست و امکان گرفتن کارت قرمز براش وجود نداره.
شاید منظور دیگه ای داشتید که من درست متوجه نشدم.

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

شما برای هر بازی که یک id مشخص داره رویدادهای اون بازی رو ثبت می کنید که شامل شماره بازیکن (همون ID بازیکن)، نوع محرومیت (کارت زرد، قرمز و ...) و ... هستش، بنابراین در هر بازی جدید،رویدادهای بازی قبلی رو برای هر شخص بیرون می کشید (جهت چک کردن کارت قرمز).


و اون قسمت آبی رنگ رو کلا متوجه نشدم
حالت دوم برای کارت زرد زمانی پیش میاد که بازیکن تا قبل از بازی x ام، دو کارت زرد گرفته و در بازی x اول یک کارت زرد و بعد یک کارت قرمز مستقیم میگیره. در این حالت باید دو بازی محروم باشه.

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

plus
دوشنبه 03 شهریور 1393, 13:50 عصر
سلام.
امکان اینکه یک بازیکن در دو بازی قبلی کارت قرمز گرفته باشه وجود نداره.
چون یک بازیکن در صورتیکه کارت قرمز بگیره،بازی بعدی محروم هست و امکان گرفتن کارت قرمز براش وجود نداره.
شاید منظور دیگه ای داشتید که من درست متوجه نشدم.

من این حالت رو برای کارت زرد گفتم...وقتی بازیکن در در همون بازی که کارت قرمز گرفته قبلش کارت زرد گرفته باشه و 3 کارته شده باشه.در این حالت دو بازی قبلی کارت قرمز داشته، بازی بعدی بخاطر کارت قرمز محروم شده و بازی بعدش بخاطر 3 کارته شدن محرومه...همون حالتی که آبی ش کردین.

mohammad5530
دوشنبه 03 شهریور 1393, 21:40 عصر
خب مشکل من اینه که نمیدونم بازی قبلی رو چطور بدست بیارم که بخام رخداد هاشو چک بکنم

veniz2008
دوشنبه 03 شهریور 1393, 23:04 عصر
من این حالت رو برای کارت زرد گفتم...وقتی بازیکن در در همون بازی که کارت قرمز گرفته قبلش کارت زرد گرفته باشه و 3 کارته شده باشه.در این حالت دو بازی قبلی کارت قرمز داشته، بازی بعدی بخاطر کارت قرمز محروم شده و بازی بعدش بخاطر 3 کارته شدن محرومه...همون حالتی که آبی ش کردین.
من اینطور برداشت کرده بودم که اون جملات که دوستمون با رنگ آبی (در پست 4) مشخص کرده بود، 2 حالت متفاوت هستن ولی در حقیقت همش یک حالت هست که برای 3 کارت زرد، بررسی میشه.

خب مشکل من اینه که نمیدونم بازی قبلی رو چطور بدست بیارم که بخام رخداد هاشو چک بکنم
شما وقتی میخوای برای بازی های مثلا هفته 8 ام بازی ها رو درج کنی باید از جدول رویدادها، بازی های هفته 7 ام رو برای هر بازیکن بیرون بکشی : مثلا اگر رویداد کارت قرمز کدش 1 و کارت زرد هم کدش 2 باشه و بازیکن مد نظر هم مثلا کدش 1000 باشه برای کارت قرمز یه همچین چیزی میشه. این کد برای حالتی هستش که همزمان 3کارت زرد و قرمز نگرفته باشه.

Select * From Tbl-Event where MatchID = 7 AND PlayerID = 1000 AND EventID = 1
برای حالتی هم که همزمان بازیکن 3 اخطاره و کارت قرمز دریافت میکنه، با ساختار جداول شما نیاز هست که دو بازی قبل رو بررسی کنید که اگر کارت قرمز داره، آیا تعداد کارت های زردش هم مضربی از 3 هست یا نه :

Select PlayerID, Count(*) From TblEvent where MatchID <= 6 AND PlayerID = 1000 AND EventID = 2 Group By PlayerID
UNION
Select PlayerID,Count(*) From TblEvent where MatchID = 6 AND
PlayerID = 1000 AND EventID = 1 Group By PlayerID

در کد بالا دستور select اول تعداد کارت های زرد یک بازیکن خاص رو از هفته اول تا 2 هفته قبل از هفته جاری شمارش میکنه.
دستور select دوم هم تعداد کارت قرمز برای یک بازیکن خاص رو در 2 هفته قبل بررسی میکنه که یا 1 برگشت داده میشه یا 0 .
حالا اگر نتیجه برگشتی شامل 2 سطر بود (چون از عملگر UNION استفاده کرده ایم و نتیجه select ها پشت سر هم اضافه میشن) و تعداد کارت زرد ها (شمارنده count در select اول) مضریی از 3 بود و تعداد کارت قرمز هم 1 بود، این بازیکن برای این هفته هم (دومین هفته متوالی) محروم هستش.
همه حالت های دیگه رو هم که دوستمون براتون شرح دادن باید به همین شکل در برنامه در نظر بگیرید.
موفق باشید.

mohammad5530
سه شنبه 04 شهریور 1393, 23:01 عصر
من اینطور برداشت کرده بودم که اون جملات که دوستمون با رنگ آبی (در پست 4) مشخص کرده بود، 2 حالت متفاوت هستن ولی در حقیقت همش یک حالت هست که برای 3 کارت زرد، بررسی میشه.

شما وقتی میخوای برای بازی های مثلا هفته 8 ام بازی ها رو درج کنی باید از جدول رویدادها، بازی های هفته 7 ام رو برای هر بازیکن بیرون بکشی : مثلا اگر رویداد کارت قرمز کدش 1 و کارت زرد هم کدش 2 باشه و بازیکن مد نظر هم مثلا کدش 1000 باشه برای کارت قرمز یه همچین چیزی میشه. این کد برای حالتی هستش که همزمان 3کارت زرد و قرمز نگرفته باشه.

Select * From Tbl-Event where MatchID = 7 AND PlayerID = 1000 AND EventID = 1
برای حالتی هم که همزمان بازیکن 3 اخطاره و کارت قرمز دریافت میکنه، با ساختار جداول شما نیاز هست که دو بازی قبل رو بررسی کنید که اگر کارت قرمز داره، آیا تعداد کارت های زردش هم مضربی از 3 هست یا نه :

Select PlayerID, Count(*) From TblEvent where MatchID <= 6 AND PlayerID = 1000 AND EventID = 2 Group By PlayerID
UNION
Select PlayerID,Count(*) From TblEvent where MatchID = 6 AND
PlayerID = 1000 AND EventID = 1 Group By PlayerID

در کد بالا دستور select اول تعداد کارت های زرد یک بازیکن خاص رو از هفته اول تا 2 هفته قبل از هفته جاری شمارش میکنه.
دستور select دوم هم تعداد کارت قرمز برای یک بازیکن خاص رو در 2 هفته قبل بررسی میکنه که یا 1 برگشت داده میشه یا 0 .
حالا اگر نتیجه برگشتی شامل 2 سطر بود (چون از عملگر UNION استفاده کرده ایم و نتیجه select ها پشت سر هم اضافه میشن) و تعداد کارت زرد ها (شمارنده count در select اول) مضریی از 3 بود و تعداد کارت قرمز هم 1 بود، این بازیکن برای این هفته هم (دومین هفته متوالی) محروم هستش.
همه حالت های دیگه رو هم که دوستمون براتون شرح دادن باید به همین شکل در برنامه در نظر بگیرید.
موفق باشید.

امکانش هست این کد رو به صورت Linq بنویسید ؟

veniz2008
چهارشنبه 05 شهریور 1393, 00:46 صبح
امکانش هست این کد رو به صورت Linq بنویسید ؟
معادل کوئری که از Group By درونش استفاده شده بود :

var result = (context.tbl_Event.Where(e => e.MatchID <= 6 && e.PlayerID == 1000 && e.EventID == 2).GroupBy(event => event.CategoryID).Select(column => new { playernumber = column.Key, mycount = column.Count()}))
.Union
(context.tbl_Eevnt.Where(e=>e.MatchID == 6 && e.PlayerID == 1000 && e.EventID == 1).GroupBy(event => event.CategoryID).Select(column => new { playernumber = column.Key, mycount = column.Count()}));
حالا کافیه تعداد سطرهای متغیر result رو چک کنید که اگر دو سطر برگشت داد و برای متغیر mycount در سطر اول مضربی از 3 بود و برای همین متغیر در سطر دوم عدد 1 برگشت داده شده بود، این بازیکن برای دومین هفته متوالی باید محروم باشه :

if(result.Count() == 2)
{
if(result.ToList()[0].mycount % 3 == 0 && result.ToList()[1].mycount == 1)
{
// دستورات محرومیت بازیکن رو اینجا بنویسید
}
}
موفق باشید.

mohammad5530
شنبه 08 شهریور 1393, 15:38 عصر
معادل کوئری که از Group By درونش استفاده شده بود :

var result = (context.tbl_Event.Where(e => e.MatchID <= 6 && e.PlayerID == 1000 && e.EventID == 2).GroupBy(event => event.CategoryID).Select(column => new { playernumber = column.Key, mycount = column.Count()}))
.Union
(context.tbl_Eevnt.Where(e=>e.MatchID == 6 && e.PlayerID == 1000 && e.EventID == 1).GroupBy(event => event.CategoryID).Select(column => new { playernumber = column.Key, mycount = column.Count()}));
حالا کافیه تعداد سطرهای متغیر result رو چک کنید که اگر دو سطر برگشت داد و برای متغیر mycount در سطر اول مضربی از 3 بود و برای همین متغیر در سطر دوم عدد 1 برگشت داده شده بود، این بازیکن برای دومین هفته متوالی باید محروم باشه :

if(result.Count() == 2)
{
if(result.ToList()[0].mycount % 3 == 0 && result.ToList()[1].mycount == 1)
{
// دستورات محرومیت بازیکن رو اینجا بنویسید
}
}
موفق باشید.

توی کد بالا ، اون قسمتی رو که قرمز کردم رو ببینید .
یک مشکل توی این قسمت هست . شما نوشتید آیدی بازی اگر کوچکتر یا مساوی 6 باشه . ما داخل برنامه ممکن است بازی به دو لیگ اضاقه کنیم . مثلا لیگ ایران یک بازی اضافه کنیم و سپس بریم یک بازی به لیگ قهرمانان آسیا اضافه کنیم . پس از آی دی بازی نمیشه 2 هفته قبل رو بدست آورد . باید یک کد دیگه جایکزین این قسمت بکنیم

veniz2008
سه شنبه 11 شهریور 1393, 11:34 صبح
توی کد بالا ، اون قسمتی رو که قرمز کردم رو ببینید .
یک مشکل توی این قسمت هست . شما نوشتید آیدی بازی اگر کوچکتر یا مساوی 6 باشه . ما داخل برنامه ممکن است بازی به دو لیگ اضاقه کنیم . مثلا لیگ ایران یک بازی اضافه کنیم و سپس بریم یک بازی به لیگ قهرمانان آسیا اضافه کنیم . پس از آی دی بازی نمیشه 2 هفته قبل رو بدست آورد . باید یک کد دیگه جایکزین این قسمت بکنیم
در چنین مواردی که شما چندین لیگ دارید، قاعده کار اینه که یک جدول جداگانه برای لیگ ها داشته باشید که هر لیگ یک کد منحصر بفرد داشته باشه (فکر میکنم جدول tbl_league رو برای این کار طراحی کردید!).
حالا درون کوئری بالا، باید کد لیگ رو هم به سایر شرط ها اضافه کنید.
موفق باشید.

mohammad5530
جمعه 21 شهریور 1393, 18:52 عصر
خسته نباشید . آقایون یک خواهش دارم ازتون

لطفا میکنید یکی یک راه حل ساده بهم بگه ؟

من متوجه منظور شما نشدم