2017-01-11 1 views
0

Daypilot을 사용하여 마스터 로타를 만듭니다.Daypilot - SQL Server에서 약속 가져 오기

현재 데이터베이스에 약속을 저장하고 있지만 특정 날짜에 대한 모든 약속을 검색하고 날짜와 관련이없는 달력에 표시하려고합니다.

E.G 월요일에 작성된 모든 약속은 DATE의 날짜와 관계없이 항상 월요일에 표시되어야합니다.

현재 선택

public DataTable GetAssignmentsForLocation(DayPilotCalendar calendar) 
{ 
    DataTable dt = new DataTable(); 

    var da = CreateDataAdapter("select * from [master_rota] where [LocationId] = @location and Week = @Week"); 

    AddParameterWithValue(da.SelectCommand, "location", (int)calendar.ClientState["location"]); 
    AddParameterWithValue(da.SelectCommand, "week", (int)calendar.ClientState["week"]); 

    da.Fill(dt); 

    return dt; 
} 

그리고

protected void DayPilotCalendar1_Command(object sender, CommandEventArgs e) 
{ 
    switch (e.Command) 
    { 
     case "navigate": 
      var start = (DateTime)e.Data["start"]; 
      DayPilotCalendar1.StartDate = start; 
      DayPilotCalendar1.DataSource = new DataManager_MasterRota().GetAssignmentsForLocation(DayPilotCalendar1); 
      DayPilotCalendar1.DataBind(); 
      DayPilotCalendar1.Update(); 
      break; 
     case "refresh": 
      DayPilotCalendar1.DataSource = new DataManager_MasterRota().GetAssignmentsForLocation(DayPilotCalendar1); 
      DayPilotCalendar1.DataBind(); 
      DayPilotCalendar1.Update(); 
      break; 
     case "day": 
      DayPilotCalendar1.ViewType = ViewTypeEnum.Day; 
      DayPilotCalendar1.StartDate = (DateTime)e.Data["date"]; 

      DayPilotCalendar1.DataSource = new DataManager_MasterRota().GetAssignmentsForLocation(DayPilotCalendar1); 
      DayPilotCalendar1.DataBind(); 
      DayPilotCalendar1.Update(); 
      break; 
     case "week": 
      DayPilotCalendar1.ViewType = ViewTypeEnum.Week; 
      DayPilotCalendar1.DataSource = new DataManager_MasterRota().GetAssignmentsForLocation(DayPilotCalendar1); 
      DayPilotCalendar1.DataBind(); 
      DayPilotCalendar1.Update(); 
      break; 

    } 
} 

창조

public void CreateAssignment(DateTime start, DateTime end, int location, int week, int person, string note, DayOfWeek day) 
{ 
    using (DbConnection con = CreateConnection()) 
    { 
     con.Open(); 

     // string id = ""; 
     var cmd = CreateCommand("insert into [master_rota] ([AssignmentStart], [AssignmentEnd], [LocationId], [PersonId], [AssignmentNote], week, day) values (@start, @end, @location, @person, @note, @Week, @day)", con); 
     AddParameterWithValue(cmd, "start", start); 
     AddParameterWithValue(cmd, "end", end); 
     AddParameterWithValue(cmd, "location", location); 
     AddParameterWithValue(cmd, "week", week); 
     AddParameterWithValue(cmd, "person", person); 
     AddParameterWithValue(cmd, "note", note); 
     AddParameterWithValue(cmd, "day", day); 

     cmd.ExecuteScalar(); 
    } 
} 

데이터베이스 항목 : 그것은 할 수 있어야 이론적 있도록 데이터베이스가 각 항목에 대한 일을 기록하고 주어진 날짜 값에 대한 모든 값로드

는 예컨대 "1 일"에 대한 모든 항목은 모두

enter image description here

달력은 다음과 같은 날짜의 관련성, 월요일에 표시되어야합니다. 날이 약속이 제대로 달력에로드 있도록 누군가가 select 문을 구축 저를 도와 주 시겠어요

enter image description here

일치하는 경우 항상 약속을로드해야합니다 당신은 표시에는 날짜가없는 볼 수 있듯이? 화요일 등 월요일, 일 2 EG의 1 일 약속 ....

당신은 바인딩하여 매개 변수 내 @을 추가해야
+1

캘린더를 채우는 코드가 표시되지 않았습니까? 이제 DataTable을 채우는 것입니다. –

+0

이 지금 추가되었습니다. –

+0

그냥 INSERT 일뿐입니다. 데이터 테이블을 달력에 할당하는 데 사용하는 코드는 무엇입니까? –

답변

1

은 표시 한 데이터 만이 주 데이터 인 경우 (그리고 유일한보기는 주간보기입니다.) 다음 방법을 사용할 수 있습니다.

약속을로드 할 때 "시작"필드를 사용하여 사용자 지정 시작 날짜와 종료 날짜를 계산하고 원래 값을 무시하십시오. SQL에 그렇게 어려울 것입니다하지만 당신은 프로세스를 게시 할 GetAssignmentsForLocation()을 수정할 수 있습니다 쉽게 데이터 세트 :

public DataTable GetAssignmentsForLocation(DayPilotCalendar calendar) 
{ 
    DataTable dt = new DataTable(); 

    var da = CreateDataAdapter("select * from [master_rota] where [LocationId] = @location and Week = @Week"); 

    AddParameterWithValue(da.SelectCommand, "@location", (int)calendar.ClientState["location"]); 
    AddParameterWithValue(da.SelectCommand, "@week", (int)calendar.ClientState["week"]); 

    da.Fill(dt); 

    foreach (DataRow dr in dt.Rows) { 
     int dayOfWeek = (int) dr["Day"]; 
     DateTime start = (DateTime) dr["AssignmentStart"]; 
     DateTime end = (DateTime) dr["AssignmentEnd"]; 

     TimeSpan duration = end - start; 
     TimeSpan startTime = start.TimeOfDay; 

     dr["AssignmentStart"] = calendar.VisibleStart.AddDays(dayOfWeek).AddTime(startTime); 
     dr["AssignmentEnd"] = calendar.VisibleStart.AddDays(dayOfWeek).AddTime(startTime).AddTime(duration); 

    } 

    return dt; 
} 

참고 (즉 calendar.VisibleStart주의 첫 날이 일요일이 유일한 작품 항상 일요일입니다).

+0

놀랍습니다. 고마워요. 얼마나 많은 도움이 우리 조직에 도움이되는지 모릅니다. 다시 한번 감사드립니다. –

1

:

AddParameterWithValue(da.SelectCommand, "@location", (int)calendar.ClientState["location"]); 
AddParameterWithValue(da.SelectCommand, "@week", (int)calendar.ClientState["week"]); 
+0

좋은 픽업, 나는 스포크를 사용하여 위치 및 주간 인덱스를 훨씬 효율적으로 사용할 수 있습니다. –

+0

안녕하세요, 덕분에이 부분이 도움이되었지만 요청한 원래 문제를 해결하지 못했습니다. –

1

또한 작성을 수정하여 토요일을 시작일로 사용하여 일할 수 있으므로 일요일에 시작할 필요가 없습니다. 분명히 어떤 날이 "시작일"이 될 수 있도록 변경할 수 있습니다.

public void CreateAssignment(DateTime start, DateTime end, int location, int week, int person, string note, DayOfWeek day) 
    { 
     using (DbConnection con = CreateConnection()) 
     { 
      con.Open(); 
      //string id = ""; 

      var cmd = CreateCommand("insert into [master_rota] ([AssignmentStart], [AssignmentEnd], [LocationId], [PersonId], [AssignmentNote], week, day) values (@start, @end, @location, @person, @note, @Week, @day)", con); 
      AddParameterWithValue(cmd, "start", start); 
      AddParameterWithValue(cmd, "end", end); 
      AddParameterWithValue(cmd, "location", location); 
      AddParameterWithValue(cmd, "week", week); 
      AddParameterWithValue(cmd, "person", person); 
      AddParameterWithValue(cmd, "note", note); 
      if (day == DayOfWeek.Saturday) 
      { 
       AddParameterWithValue(cmd, "day", day - 6); 
      } 
      else 
      AddParameterWithValue(cmd, "day", day + 1); 

      cmd.ExecuteScalar(); 

     } 
    } 
관련 문제