PDA

View Full Version : جستجوی یک بازه تاریخ



نسرین2000
چهارشنبه 03 اردیبهشت 1393, 12:44 عصر
سلام
دارم یک برنامه هتل داری می نویسم و برای قسمت رزرواسیون به صورت زیر عمل کردم :
دو تکس باکس در فرمم دارم که در هر کدام از آنها تاریخ را وارد می کنم ( تاریخ شروع رزرو و تاریخ پایان رزرو )
یک تیبل هم در دیتابیسم دارم شامل سه ستون ، تاریخ شروع رزرو و تاریخ پایان رزرو و شماره اتاق
می خوام شماره اتاق هایی که بازه تاریخ ام ( که در تکس باکس ها وارد می کنم ) هیچ اشتراکی با بازه تاریخ اتاقها ( اتاقهای موجود در تیبل ) ندارند را برایم در یک لیست باکش نمایش دهد .
در واقع می خوام اتاق هایی که هیچ رزروی در آن بازه تاریخی براشون وجود نداره را برام نشون بده .
چه کدی باید بنویسم ؟

majidnazari65
چهارشنبه 03 اردیبهشت 1393, 13:46 عصر
برای بررسی تداخل دو بازه ی تاریخی بازه اول رو درنظر بگیر.
سه حالت برای تداخل وجود داره:
1- اگر تاریخ شروع این بازه بین بازه ی دوم باشه تداخل دارن.
2- اگر تاریخ پایان این بازه بین بازه ی دوم باشه تداخل دارن.
3- اگر تاریخ شروع کوچکتر از تاریخ شروع بازه ی دوم باشه و تاریخ پایان بزرگتر از تاریخ پایان بازه دوم باشه تداخل دارن.

بازه ی اول رو بازه ای در نظر بگیر که کاربر وارد میکنه:
@startDate , @ EndSate


بازه ی دوم هم دو فیلدی که در دیتابیس هستند. StartReserve , EndReserve


حلا کوئوری زیر رو اجرا کن:


SELECT * FROM yourDB
WHERE NOT((@StartDate BETWEEN StartReserve AND EndReserve) OR (@EndDate BETWEEN StartReserve AND EndReserve) OR (@StartDate <= StartReserve AND @EndDate >= EndReserve) )

نسرین2000
شنبه 06 اردیبهشت 1393, 09:25 صبح
آقای مجید حالا چه طوری خروجی این دستور select رو بدست بیارم ؟(ببخشید آخه من تازه کارم )
بهتره این طوری توضیح بدم :
یک فرم دیگر دارم که شماره اتاقها در آن نوشته شده و کنار هر شماره اتاقی یک چک باکس هست ، حالا من می خوام شماره اتاقهایی که از دستور select بدست می آیند فعال باشند و بقیه اتاقها چک باکسشون غیر فعال باشند ؟؟

majidnazari65
شنبه 06 اردیبهشت 1393, 09:53 صبح
ساختار دیتابیس و جداولی که داری چطوریه؟

نسرین2000
شنبه 06 اردیبهشت 1393, 10:24 صبح
منظورتون اینه که کل جداول دیتابیس و فیلدهاشون رو بگم ؟

majidnazari65
شنبه 06 اردیبهشت 1393, 10:33 صبح
اون جدولایی که با این کوئری در ارتباطن و یا میخوای اطلاعاتی ازشون نمایش داده بشه.

نسرین2000
شنبه 06 اردیبهشت 1393, 11:31 صبح
لطفا اجازه بدید یه مقدار فرمها رو براتون بیشتر توضیح بدم :
فرمی دارم که از شماره 1 تا 23 چک باکس گذاشتم ( هتل 23 اتاق دارد )
کلمه not شرط کوئری رو برداشتم تا در واقع با این کوئری اتاقهایی که با بازه مورد نظر تداخل دارند و نمی توان آنها را رزرو کرد انتخاب شوند .
حالا فرض کنیم خروجی کوئری اتاق های شماره 1 و 2 و 20 و 22 و 23 باشند که تداخل زمانی دارند و نمی توان آنها را رزرو کرد .
حالا می خوام در فرمم چک هایی که تکست آنها 1 و 2 و 20 و 22 و 23 هست غیر فعال شوند تا کاربر بفهمد این سوئیت ها قابل رزرو نیستند .
منظورم رو درست رسوندم ؟
در واقع قصد من از این کوئری نمایش سوئیت هایی است که قابل رزرو هستند تا کاربر بتواند آنها را انتخاب کند .

majidnazari65
شنبه 06 اردیبهشت 1393, 12:49 عصر
برای این کار بهتره از یک ListView و یا CheckedListBox استفاده کنی و فقط آیتمهایی رو نشون بدی که قابل رزرو شدن داره. چیزی شبیه کد زیر:

Dim dT As DataTable = ' get datatable from query


lstV.CheckBoxes = True
lstV.View = View.Details
lstV.Items.Clear()
lstV.Columns.Clear()
lstV.Columns.Add("col1")
For i As Integer = 1 To 23
lstV.Items.Add(i.ToString, i.ToString, "")
lstV.Items(i.ToString).Checked = False
Next
Dim strNumber As String
For Each dR As DataRow In dT.Rows
strNumber = dR("Room_number").ToString
If lstV.Items.ContainsKey(strNumber) Then
lstV.Items(strNumber).Remove()
End If
Next





اگر حتما باید از CheckBox جداگانه استفاده کنی بهتره چک باکسها رو توی یه panel بریزی و با دستور زیر انتخاب، بررسی و غیر فعالشون کنی:


Dim chkTemp As CheckBox
For Each chk As Control In Panel1.Controls
If TypeOf chk Is CheckBox Then
chkTemp = DirectCast(chk, CheckBox)
' enter code for chktemp
End If
Next

نسرین2000
یک شنبه 07 اردیبهشت 1393, 07:39 صبح
ببخشید ولی اصلا از این کدها چیزی نفهمیدم :خجالت:
تازه کارم :گریه:

majidnazari65
یک شنبه 07 اردیبهشت 1393, 09:31 صبح
lstV یه ListView هست. چند خط اول رو میتونی تو زمان طراحی هم با نتخاب lstV توی پنجره Properties تنظیم کنی.
حلقه اول 23 آیتم به لیست اضافه میکنه. در تابع Add پارامتر اول مربوط به key آیتم هست. منحصر به فرد و غیر تکراریه و اگه این پارامتر رو اضافه کنی میتونی با ContainsKey که تو حلقه دوم استفاده شده ببینی که یه key خاص در جدول وجود داره یا خیر. پارامتر دوم متن آیتم هست و پارامتر سوم کلید عکس آیتم هست که کاربردی نداره اینجا.
حلقه دوم روی ردیف های جدول حرکت میکنه و شماره اتاق رو از جدول درمیاره. بررسی می کنه که آیا این شماره توی لیست هست یا خیر (برای اطمینان البته ، تا برنامه ارور نده) و اگر بود اون رو از لیست حذف میکنه چون قبلا رزرو شده.
اگر میخوای از لیست ویو استفاده کنی بهتره قبلا در مورد کاربردش کمی بخونی.

برای بدست آوردن آیتمهای انتخاب شده هم از lstV.SelectedItems استفاده کن.

نسرین2000
یک شنبه 07 اردیبهشت 1393, 11:09 صبح
پس اول در مورد list view مطالعه می کنم بعد کد شما رو مطالعه می کنم اگر جاهایی برام گنگ بود دوباره مزاحمتون میشم .

نسرین2000
یک شنبه 07 اردیبهشت 1393, 14:09 عصر
متاسفانه از کد شما چیزی متوجه نشدم .
ببینید من در دیتابیسم یک جدول دارم به نام رزرواسیون که شامل سه ستون است . نام اتاق ، تاریخ شروع رزرو و تاریخ پایان رزرو . ( در واقع نام اتاقهای که برای آنها رزرو وجود دارد در این تیبل ذخیره می شود )
حالا با کوئری که در ابتدا برام نوشتید اگر تاریخ شروع و پایان من با تاریخ های تیبل تداخل داشته باشند نام اتاقها را می خواند ( مثلا اتاقهای2 و 7و 11)
حالا من می خوام در فرمی که 23 تا چک باکس دارم از شماره 1 تا 23 ، چک باکس هایی که شماره آنها 2 و 7 و 11 هست غیر فعال شوند .
در واقع سوال اصلی من اینه که به خروجی کوئری چه طور باید دسترسی داشته باشم ؟

majidnazari65
یک شنبه 07 اردیبهشت 1393, 14:21 عصر
خروجی کوئری یک جدوله و میتونه توی DataTable ذخیره بشه. این خروجی رو کجا ذخیره کردی و یا چطور نمایشش میدی؟

نسرین2000
یک شنبه 07 اردیبهشت 1393, 14:41 عصر
مشکل من هم اینه که نمی تونم این خروجی رو جایی ذخیره کنم یعنی بلد نیستم:خجالت:

majidnazari65
یک شنبه 07 اردیبهشت 1393, 15:15 عصر
از DataTable و TableAdapter به صورت زیر استفاده کن:

Dim dT As New DataTable
Using conn As SqlClient.SqlConnection = New SqlClient.SqlConnection("your-connection-string")
Using cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand("your-query", conn)
Using tblAdapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd)
tblAdapter.Fill(dT)
End Using
End Using
End Using




حالا به سطرها و ستونهای dT میتونی دسترسی داشته باشی با اندیس یا با نام ستون:

dT.Rows(0)(0)
dT.Rows(0)("Date1")


علاوه بر لیست ویو در مورد DataTable و TableAdapter هم یه کمی بخون.

نسرین2000
دوشنبه 08 اردیبهشت 1393, 08:15 صبح
تو کتابی که دارم بیشتر در مورد دیتاست توضیح داده

نسرین2000
دوشنبه 08 اردیبهشت 1393, 09:17 صبح
سلام
آقای مجید با کد زیر موفقم شدم به اطلاعات موجود در دیتاتیبلم دسترسی داشته باشم و شماره اتاقهایی رو که در آن تارخ خاص رزرو هستند رو بخونم .
Dim no_suite As Integer
Dim dt As New DataTable
Dim da As New SqlDataAdapter
Dim ds As New DataSet
da.SelectCommand = New SqlCommand
da.SelectCommand.Connection = objconnection
da.SelectCommand.CommandText = " SELECT no_suite FROM rezerve WHERE ((@txtdate1 BETWEEN date1 AND date2) OR (@txtdate2 BETWEEN date1 AND date2) OR (@txtdate1 <= date1 AND @txtdate2 >= date2) )"
da.SelectCommand.Parameters.AddWithValue("@txtdate1", CType(ShamsiToMiladi(txtdate1.Text), Date))
da.SelectCommand.Parameters.AddWithValue("@txtdate2", CType(ShamsiToMiladi(txtdate2.Text), Date))
objconnection.Open()
da.Fill(ds, "rezerve")
da.Fill(dt)
objconnection.Close()
فرم دیگری دارم به نام selectforrezerve که در آن 23 تا چک باکس از شماره 1 تا 23 دارم . سعی می کنم با کد زیر اگر خاصیت text یکی از چک باکس ها برابر شماره اتاق خوانده شده از دیتا تیبل بود آن چک باکس رو غیر فعال کنم تا کاربر بدونه که این اتاق رزرو شده . کد زیر را نوشتم ولی خطا می دهد .
Unable to cast object of type 'Dez_Hotel.UserControl1' to type 'System.Windows.Forms.CheckB


For i = 0 To dt.Rows.Count - 1
no_suite = dt.Rows(i)(0)
For Each ch As CheckBox In selectforrezerve.Controls
If ch.Text = no_suite Then
ch.Enabled = False
End If
Next
Next