PDA

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



b.paseban
پنج شنبه 22 اردیبهشت 1390, 12:51 عصر
با سلام خدمت دوستان.
برای یک سیستم رزرو یه جدول با فیلدهای زیر ساختم:


[RequestID],[UserID],[Day],[Month],[Hours],[DateReserve],[DateReserveMerge],[DateNow],[RequestIP],[Status]

که از کاربر سه تا داده برای روز،ماه،ساعت مورد نظر میگیرم و اون ها رو داخل سه تا فیلد day,month,hours قرار میدم و ترکیب این سه فیلد رو هم به شکل یه فیلد DataTime در فیلدهای DateReserve و DateReserveMerge با کمی تفاوت قرار میدم.
به این ترتیب یسری از روزها پر میشن و اگر کاربر بعدی یکی از این روزهای رو بخواد رزرو کنه این اجازه به اون داده نمیشه.
حالا من میخوام برای مدیریت سایت این امکان رو بزرام که تمامی روزهای خالی ماه رو که هنوز رزرو نشده مشاده کنه و بتونه اون روزهارو رزرو کنه.
مشکل اینجاست که چطوری میشه اون روزهای خالی رو نمایش داد در صورتی که هنوز داخل دیتا بیس درج نشدن.
من توی جدولم یه فیلد بنام ststus دارم که پس از تائید کاربر برای رزرو اون روز این فیلد مقدار true میگیره.
آیا میشه که ما تمامی روزهای سال رو(البته ساعت به ساعت باتوجه به ساعات کاری اون مرکز) بترتیب داخل دیتا بیس درج کنیم و فیلد ststus اون جدول رو false قرار بدیم و هنگام رزرو یک روز توسط کاربر اگر اون روز فیلد status = false بود رزرو و اگر true بود اجازه رزرو به کاربر رو نده و برای نمایش روزهای خالی هم یه select به کل جدول بزنیم و با شرط ststus=false روزهای خالی رو بخونیم؟
یا اینکه راه حل بهتری هم دوستان میدونن.

behrouzlo
پنج شنبه 22 اردیبهشت 1390, 16:09 عصر
فکر کنم بشه با کدی شبیه نمونه زیر جواب گرفت
Declare @Month Tinyint = 6
Declare @DayCount Tinyint = Case When @Month <= 6 Then 30 Else 30 End

;WITH DaysNo (I) AS (
SELECT 1 UNION ALL
SELECT 1 + I FROM DaysNo WHERE I < @DayCount )

Select I From DaysNo Where I Not In (Select Day From Tbl Where Month = @Month)

b.paseban
پنج شنبه 22 اردیبهشت 1390, 17:38 عصر
بازم دست شما درد نکنه حداقل یه جوابی دادی. :بامزه:
الان دو روزه که دارم روش فکر میکنم و نمیتونم حلش کنم.
توی تالار asp.net مطرح کردم لطف کردن پاکش کردن.
من این کد رو trace کردم اما جوابی که گرفتم این بود که تمامی روزهای یک ماه رو برام میاره یعنی از 1 تا 30.فکر کنم بخاطر مقداریه که ما توی خط اول بهش دادیم(Tinyint = 6) که این مقدار با قرار گرفتن مقدار پارامتر @month تغییر میکنه و جواب اون ماه رو میاره.(درسته؟)
من زیاد از کدهای sql سر در نمیارم اگر دوستان میتونن یه راهنمایی کنن.
این خط مقادیر 6 ماه دوم سال رو که ماهها 30 روز هست رو میده؟

When @Month <= 6 Then 30 Else 30 End
بعد یه چیز دیگه ای هم که هست من میخوام ساعت های خالی رو هم نشون بدم حالا این کار شدنی هست یا نه؟
با تشکر.

محمد سلیم آبادی
پنج شنبه 22 اردیبهشت 1390, 19:59 عصر
حالا من میخوام برای مدیریت سایت این امکان رو بزرام که تمامی روزهای خالی ماه رو که هنوز رزرو نشده مشاده کنه و بتونه اون روزهارو رزرو کنه.
من میخوام ساعت های خالی رو هم نشون بدم این دو جمله یکی نیست. آیا یک روز فقط یک رزرو به آن اختصاص داده میشه یا نه هر ساعت میتونه یک رزور صورت بگیره.
من دقیقا متوجه مساله نشدم، میتونید یک نمونه از داده هایی که در جدول درج میشن رو پست کنید همراه با توضیح و اینکه نتیجه ی مورد نظرتون چیه؟

روشی که خودتون در پست اول شرح دادین اگه درست متوجه شده باشم جواب میده و درسته. ولی اول نیاز دارین به یک جدول کمکی Calender (سرچ کنید تو اینترنت) سپس با یک جستجوی ساده میتونید نتیجه رو بدست بیارین و برای رزور کردن هم کافیه سطر مورد نظر رو Update کنید بدون نیاز به Insert.

b.paseban
شنبه 24 اردیبهشت 1390, 18:08 عصر
سلام.
زمان رزرو مربوط به ساعات کارکرد اون مجتمع میشه که معمولا ساعت به ساعت میشه رزرو رو انجام داد.
داده های من هم به همین صورت هست که مثلا در روز 20 ماه 4 ساعت 17 رزرو انجام شده و در همین روز ساعت 18 نیز رزرو شده.(با دو کاربر متفاوت و در دو سطر جدا از جدول).
اون کد دوستمون فقط روزهای خالی یک ماه جدول من رو نمایش میده یعنی توی مثال بالای من، روز 20 رو رزرو شده میدونه و بقیه روزها رو به نمایش در میاره(از روز 1 تا 30 به جز 20 ) در صورتی که من میخوام ساعت 17 و 18 روز 20 رو رزرو شده بدونه و توی این روز ساعات خالی بین ساعت 8 تا 20 رو (بستگی به ساعات کارکرد اون مجتمع) نشون بده بدون ساعت 17 و 18 و بهمین روال برای روزهای دیگه.


روشی که خودتون در پست اول شرح دادین اگه درست متوجه شده باشم جواب میده و درسته. ولی اول نیاز دارین به یک جدول کمکی Calender (سرچ کنید تو اینترنت) سپس با یک جستجوی ساده میتونید نتیجه رو بدست بیارین و برای رزور کردن هم کافیه سطر مورد نظر رو Update کنید بدون نیاز به Insert.

این جدول کمکی چه تفاوتی با جدول من داره؟نمونه ای از این جدول دارین؟
ولی با توجه به جواب دادن روش دوستمون behrouzlo فکر کنم بشه همراه روزهای خالی، ساعات خالی رو هم به نمایش در آورد اینطوری ما نیازی به درج تمامی ساعات نداریم و فقط روزها و ساعاتی که از قبل رزرو شده اند رو فیلتر میکنیم و روزها و ساعات رزرو نشده رو نمایش میدیم

محمد سلیم آبادی
شنبه 24 اردیبهشت 1390, 19:39 عصر
سلام،
برای تولید تمام ماه ها و روزها و ساعات یک سال کد زیر رو اجرا کنید:

;with nums(n) as
(select row_number() over(order by s.object_id) n
from sys.columns s)

select n1.n as [month],
n2.n as [day],
n3.n as [hours]
from nums n1, nums n2, nums n3
where n1.n between 1 and 12
and n2.n between 1 and case when n1.n between 1 and 6 then 31 else 30 end
and n3.n between 1 and 24;

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


;with nums(n) as
(select row_number() over(order by s.object_id) n
from sys.columns s),
calander as
select n1.n as [month],
n2.n as [day],
n3.n as [hours]
from nums n1, nums n2, nums n3
where n1.n between 1 and 12
and n2.n between 1 and case when n1.n between 1 and 6 then 31 else 30 end
and n3.n between 1 and 24

select *
from TableName T
right join Calander C
on T.[month] = C.[month]
and T.[day] = C.[day]
and T.[hours] = C.[hours]
where T.[day] is null;

b.paseban
شنبه 24 اردیبهشت 1390, 20:19 عصر
خیلی ممنون از وقتی که گذاشتین.
من کد اول رو امتحان کردم درست بود اما کد دوم ارور زیر رو نمایش میده:
69914
این Calander چه معنی ای میده؟

محمد سلیم آبادی
شنبه 24 اردیبهشت 1390, 20:23 عصر
اول خط 5 یک پرانتز باز کن و در انتهای خط 11 پرانتز رو ببند.
منظورتون چیه؟ Calender به معنای تقویمه.

kafinetetaha
شنبه 25 خرداد 1392, 19:18 عصر
با سلام خدمت دوست عزیزم منم تو این مورد گیر کردم منم میخوام یه جدول به کاربر نشون بدم ساعت های خالی رو ببینه و رزرو کنه اگه شما به نتیجه ای رسیدید به منم بگید

kafinetetaha
شنبه 25 خرداد 1392, 21:34 عصر
اساتید لطفا کمک کنید