0

私のシナリオ:訪問者が訪問を予約するためのイベントカレンダーと予約フォームを備えたWebサイトがあります。ガーデンxyzとしましょう。この庭園でイベントが行われている場合、訪問者は庭園を訪問できません。

イベントカレンダーは管理者によって管理されており、イベントが2012年6月16日から2012年6月20日まで開催されている場合、このイベントでは訪問者のために庭を閉鎖します。

予約の反対側では、ドロップダウンまたはポップアップカレンダーで訪問者の利用可能な日付を表示する必要があります。これにより、イベントカレンダーで予約された日付がブロックされます。

イベントデータは、次のようなフィールドを持つEvent_Calenderテーブルに保存されます

Event_ID
Event_Name
Event_Start_Date
Event_End_Date
Event_Start_Time
Event_End_Time
Event_Block_Visitor

重要いつでも50人の訪問者だけが庭を訪問することができます そして訪問者データはVisitor_Bookingテーブルテーブル構造に保存されます

Booking_ID
Booking_Date
Visitor_Name
No_Of_Visitor
EMail_ID
Contact_No

予約フォームには、利用可能な日付を表示するドロップダウンがあります。

  1. イベントカレンダーで予約またはブロックされていない日付
  2. 6月28日がすでに50人の訪問者を予約している場合、6月28日は利用可能な予約日のテーブルに表示されないはずです。

私のテーブル構造は少し複雑で、例に示されています。

誰かがこれを最善の方法で行うことができれば幸いです。

Booked_Dates1つのクエリを使用して生成しようとしていEvent_Calender Tableます。他のクエリを使用して、Visitor_Bookingテーブルから50件の予約で予約済みの日付を生成しようとしています。

これにより、予約されているすべての日付がわかります。これに基づいてブロックされた日付があります。訪問に使用できる日付を生成するにはどうすればよいですか。

偶数カレンダーから予約日を生成するCTEクエリ

注:クエリ結果の問題の1つは、指定された日付より古い結果をフェッチするクエリに関連する結果です。オペレーターの優先順位によるものでした

結果

これまでのスクリプト:

;WITH Calendar
     AS (SELECT EventID,
                EventTitle,
                EventStartDate,
                EventEndDate,
                EventEnumDays,
                EventRecurring,
                EventStartTime,
                EventEndTime,
                EventStartDate AS PlannedDate,
                EventType,
                EventCategory
         FROM   EventCalender
         WHERE  EventActive = 1
                AND LanguageID = 1
                AND EventBlockDate = 1
         UNION ALL
         SELECT EventID,
                EventTitle,
                EventStartDate,
                EventEndDate,
                EventEnumDays,
                EventRecurring,
                EventStartTime,
                EventEndTime,
                Dateadd(dd, 1, PlannedDate),
                EventType,
                EventCategory
         FROM   Calendar
         WHERE  EventRecurring = 1
                AND Dateadd(dd, 1, PlannedDate) <= EventEndDate)
SELECT EventID,
       EventStartDate,
       EventEndDate,
       PlannedDate AS [EventDates],
       EventStartTime,
       EventEndTime,
       Cast(EventStartDate AS DATETIME) + '' + Cast(EventStartTime AS DATETIME) AS DT,
       EventTitle,
       EventType,
       EventCategory,
       Datename(weekday, PlannedDate) AS [WEEKDAY],
       Getdate() AS [YYYY/MM/DD]
FROM   Calendar
WHERE  PlannedDate >= Getdate()
       AND ',' + EventEnumDays + ',' LIKE '%,' + Cast(Datepart(dw, PlannedDate) AS CHAR(1)) + ',%'
        OR EventEnumDays IS NULL
ORDER  BY EventID,
          PlannedDate
OPTION (maxrecursion 0)
4

1 に答える 1

0
  1. イベントのために庭園が予約されている日付を取得する
  2. 庭園が定員に達した日付を取得 (==50)

  3. 1 と 2 の結果を組み合わせる

  4. 表示するカレンダーを選択/予約/訪問日を選択
  5. カレンダーのロード/月変更イベントで、手順 3 で受信した日付を何らかの方法で無効にします。

このサンプル コードを参照してください。

   static List<DateTime> lstBookedDates;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            lstBookedDates = new List<DateTime>();
            lstBookedDates.Add(DateTime.Today);
            lstBookedDates.Add(DateTime.Today.AddDays(2));
            lstBookedDates.Add(DateTime.Today.AddDays(-2));
            lstBookedDates.Add(DateTime.Today.AddMonths(1));
            lstBookedDates.Add(DateTime.Today.AddMonths(1).AddDays(2));
        }
    }

    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (lstBookedDates.Where(a=> e.Day.Date.ToShortDateString().Equals(a.Date.ToShortDateString())).Count()>0)
        {
            foreach (Control c in e.Cell.Controls)
            {
                if (typeof(LiteralControl) == c.GetType())
                {

                    LiteralControl c1 = (LiteralControl)c;
                    c1.Text = "";
                }
            }
            e.Cell.BackColor = System.Drawing.Color.Gray;
            e.Cell.ToolTip = "Booking full";
            e.Cell.Enabled = false;

        }        
    }
于 2012-06-18T09:05:51.933 に答える