2017-01-11 18 views
0

Я создаю мастер-роту, используя Daypilot.Daypilot - загрузка назначений из SQL Server

В настоящее время я храню встречи в базе данных, но я хотел бы получить все встречи на определенный день и отобразить их в календаре, не имеющем значения DATES.

E.G все назначения, созданные в понедельник, должны всегда отображаться в понедельник, не имеющими значения для ДАТА.

Текущий выберите

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», все должны показать в понедельник, не имеет значения из DATE

enter image description here

календарь выглядит ниже. Как вы можете видеть, что нет даты показана, так как он всегда должен загрузить назначение, если DAY соответствует

enter image description here

Может кто-то пожалуйста, помогите мне в построении оператора выбора, так что назначение нагрузку на календарь правильно? День EG 1 назначение в понедельник, 2-е дня на вторник и т.д ....

+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

Amazing, это работает. Большое спасибо, вы не представляете, насколько это поможет нашей организации. Еще раз спасибо. –

1

Вы должны добавить @ внутри ваших параметров связывания:

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

Хороший пикап, я бы добавил, что использование spoc будет гораздо более эффективным с индексами по местоположению и на неделе –

+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(); 

     } 
    }