2013-07-02 3 views
0

У меня есть страница в моем проекте asp.net, где я хочу показать посещаемость сотрудников. Если присутствуют P, а при отсутствии, то A и в праздничные дни H должны быть показаны в ретрансляторе. Теперь на моей веб-странице у меня есть 2 текстовых поля, через которые я ввожу год и месяц, и в этом месяце я хочу получить участие. Мои таблицы базы данных выглядят следующим образом.Как показать шаблон в шаблоне шаблона asp-Repeater?

(1) Каландр

CalederID Year Month  WorkingDays 
1   2013 January 1111001111100111110011111001111 
2   2013 February 1001111100111110011111001111 

и так далее. Здесь 1 представляют рабочие дни в месяце, а 0 - дни субботы и воскресенья утра, используя этот шаблон, потому что на одной из моих страниц я устанавливаю флажки для проверки (сидел и солнце) и не отмечен для других, поэтому я знаю, что это праздники

(2) Участники Таблица

AttendanceID EmpID PresentDays CalenderID LeaveDate 
1    1  Null   1  2013-01-14 
2    1  Null   2  2013-02-15 
3    1  Null   4  2013-04-11 
4    3  Null   6  2013-06-26 

(3) EmpInfo Таблица

EmpID EmpName and so on 
1  Joe 
2  Sandra    

Сейчас подходит к проблеме на моей веб-странице, когда я вхожу в год и месяц, я хочу показать ретранслятор с заголовками, как Число номеров h представляют даты этого месяца. Теперь, если месяц имеет 30 дней, показывается 30 номеров. Другой используется повторитель, который должен показывать посещаемость в формате P, A, H, как сказано выше

Мои повторители выглядеть следующим образом

<table class="table1" > 
     <asp:Repeater ID="Repeater1" runat="server"> 
      <HeaderTemplate> 
       <tr> 
        <td>Employee ID</td> 
      </HeaderTemplate> 
      <ItemTemplate> 
        <td><asp:Label ID="lbldates" runat="server" Text='<%# Eval("Dates") %>' ></asp:Label></td> 
      </ItemTemplate> 
      <FooterTemplate> 
        <td>TOTAL</td></tr> 
       <tr> 
      </FooterTemplate>   
     </asp:Repeater> 
      <asp:Repeater id="rptAttendance" runat="server" OnItemDataBound="rptAttendance_ItemDataBound"> 
     <ItemTemplate> 
      <tr> 
       <td><asp:Label ID="lblEmpName" runat="server" /></td> 
       <asp:Repeater ID="rptAttendanceCode" runat="server" OnItemDataBound="rptAttendanceCode_ItemDataBound" > 
        <ItemTemplate><td><asp:Label ID="lblAttendanceCode" runat="server" /></td></ItemTemplate> 
       </asp:Repeater> 
       </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
     </table> 

и код за это

protected void Page_Load(object sender, EventArgs e) 
     { 


     } 

     public void search(object sender, EventArgs e) 
     { 
      string cnnString = "Server=localhost;Port=3307;Database=leavesystem;Uid=root;Pwd=ashish"; 
      MySqlConnection cnx = new MySqlConnection(cnnString); 
      cnx.Open(); 
      string cmdText1 = "SELECT DAY(LAST_DAY(CAST(CONCAT('" + year.Value + "', '-', MONTH(STR_TO_DATE('" + month.Value + "', '%M')), '-', 1) AS DATE))) "; 
      MySqlCommand cmd1 = new MySqlCommand(cmdText1, cnx); 
      MySqlDataAdapter adapter1 = new MySqlDataAdapter(); 
      DataSet ds1 = new DataSet(); 
      adapter1.SelectCommand = cmd1; 
      adapter1.Fill(ds1); 
      DataRow dr; 
      dr = ds1.Tables[0].Rows[0]; 
      string value = dr[0].ToString(); 

      string cmdText2 = "SELECT Dates from temp where Dates <= " + value + " "; 
      MySqlCommand cmd2 = new MySqlCommand(cmdText2, cnx); 
      MySqlDataAdapter adapter2 = new MySqlDataAdapter(); 
      DataSet ds2 = new DataSet(); 
      adapter2.SelectCommand = cmd2; 
      adapter2.Fill(ds2); 
      DataTable dt = ds2.Tables[0]; 
      Repeater1.DataSource = dt; 
      Repeater1.DataBind(); 


      string cmdText3 = "SELECT CalenderID, WorkingDays from calender where Year = '" + year.Value + "' and Month = '" + month.Value + "' "; 
      MySqlCommand cmd3 = new MySqlCommand(cmdText3, cnx); 
      MySqlDataAdapter adapter3 = new MySqlDataAdapter(); 
      DataSet ds3 = new DataSet(); 
      adapter3.SelectCommand = cmd3; 
      adapter3.Fill(ds3); 
      DataTable calender = ds3.Tables[0]; 
      DataRow dr3; 
      dr3 = ds3.Tables[0].Rows[0]; 
      string CalenderID = dr3[0].ToString(); 

      string cmdText4 = "SELECT EmpID,EmpName from empinfo "; 
      MySqlCommand cmd4 = new MySqlCommand(cmdText4, cnx); 
      MySqlDataAdapter adapter4 = new MySqlDataAdapter(); 
      DataSet ds4 = new DataSet(); 
      adapter4.SelectCommand = cmd4; 
      adapter4.Fill(ds4); 
      DataTable employees = ds4.Tables[0]; 

      string cmdText5 = "SELECT EmpID,DAY(LeaveDate) AS LeaveDayOfMonth from attendance where CalenderID = '" + CalenderID + "' "; 
      MySqlCommand cmd5 = new MySqlCommand(cmdText5, cnx); 
      MySqlDataAdapter adapter5 = new MySqlDataAdapter(); 
      DataSet ds5 = new DataSet(); 
      adapter5.SelectCommand = cmd5; 
      adapter5.Fill(ds5); 
      DataTable attendance = ds5.Tables[0]; 

      List<Tuple<string, string[]>> info = new List<Tuple<string, string[]>>(); 
      int calendarID = calender.Rows[0].Field<int>("CalenderID"); 
      string days = calender.Rows[0].Field<string>("WorkingDays"); 
      days = days.Replace("1", "P"); 
      days = days.Replace("0", "H"); 
      string[] daysList = days.Select(d => d.ToString()).ToArray(); 
      int present = 0; 
     int holidays = 0; 

     for (int i = 0; i < daysList.Length; ++i) 
     { 
      if (daysList[i] == "P") 
       present++; 

      if (daysList[i] == "H") 
       holidays++; 

     } 

     int working = (monthdays - holidays); 
     string total = (present + "/" + working); 



     Tuple<string, string[],string> employeeAttendance = null; 
     foreach (DataRow employee in employees.Rows) 
     { 
      employeeAttendance = new Tuple<string, string[],string>(employee.Field<string>("EmpName"), daysList,total); 


      foreach (DataRow absentDay in attendance.AsEnumerable().Where(a => a.Field<int>("EmpID") == employee.Field<int>("EmpID"))) 
      { 
       var leaveDay = absentDay.Field<Int64>("LeaveDayOfMonth"); 
       int leaveDay1 = Convert.ToInt16(leaveDay); 
       leaveDay1 = leaveDay1 - 1; 
       employeeAttendance.Item2[leaveDay1] = "A"; 
      } 


      info.Add(employeeAttendance); 
     } 
     this.rptAttendance.DataSource = info; 
     this.rptAttendance.DataBind(); 
     } 


    protected void rptAttendance_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Tuple<string, string[],string> info = (Tuple<string, string[],string>)e.Item.DataItem; 
      ((Label)e.Item.FindControl("lblEmpName")).Text = info.Item1; 
      ((Label)e.Item.FindControl("lbltotal")).Text = info.Item3; 
      Repeater attendanceCode = (Repeater)e.Item.FindControl("rptAttendanceCode"); 
      attendanceCode.DataSource = info.Item2; 
      attendanceCode.DataBind(); 
     } 
    } 

    protected void rptAttendanceCode_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      ((Label)e.Item.FindControl("lblAttendanceCode")).Text = e.Item.DataItem.ToString(); 
     } 
    } 

В код позади Я получаю количество дней в месяце, затем сравниваю его со столом, в которой есть 31 дата, и из этой логики я рисую свои номера, а внизу внизу с помощью повторителя 2, чтобы показать мои EmpID, а теперь рядом с ними ниже цифр даты I хочу показать посещаемость. Может кто-нибудь сказать мне, как это сделать. Столбцы PresendtDays в моей таблице посещаемости пусты, но я не знаю, как это использовать. Пожалуйста, помогите мне, я пробовал это из многих часов, и именно поэтому я разместил свой полный код, чтобы кто-то помог мне. Ищете ранний ответ. Заранее спасибо !!

+0

Помогите мне понять, в таблице посещаемости запись является праздник (H), в этот день это «LeaveDate»? Если у сотрудника нет записи на определенный день, они присутствовали (P)? –

+0

Кроме того, эта строка sql: '' string cmdText2 = "SELECT Dates from temp where ..." '.Какой таблицей называется' temp'? –

+0

(строка cmdText2 = "SELECT Даты от temp где Dates <=" + value + "";). В этом значении количество дней в этом месяце. Предположим, что я использую 2012 год и февраль, поэтому значение = 29 (нет в этом месяце), а temp - другая таблица, которая имеет 31 запись. все даты из этой таблицы, которые являются <= значение, так что он принимает 29 дат от temp и показывает их в повторителе1 как заголовки. – user2527367

ответ

1

Из-за нетрадиционного дизайна вашей базы данных мне пришлось сделать некоторые основные манипуляции с данными, чтобы сделать эту работу. Это, как говорится, вот мое предлагаемое решение.

Вместо заявления SQL "SELECT EmpID from empinfo ", вам необходимо будет выполнить три дополнительных запросов:

  1. Получить информацию из Calendar таблицы:

    • ВЫБРАТЬ CalendarID, Рабочие календарные WHERE Year = [ YEAR] и Month = [MONTH]
    • Это вернет таблицу, которая выглядит так:

    enter image description here

  2. Получить данные из таблицы календаря с помощью CalendarID:

    • ВЫБРАТЬ EmpID, EmpName от сотрудников
    • Это возвращает таблицу, которая выглядит следующим образом:

    enter image description here

  3. Получить информацию из таблицы посещаемости, используя CalendarID из первого запроса.

    • ВЫБОР EmpID, ДЕНЬ (LeaveDate) КАК LeaveDayOfMonth от посещения ГДЕ CalendarID = [КАЛЕНДАРЬ ID]
    • Это будет возвращать таблицу, которая выглядит следующим образом:

    enter image description here

После того, как вы это сделали, замените второй повторитель (Repeater2) следующим TWO повторителей. Первый ретранслятор (rptAttendance) перечисляет каждый сотрудник, второй ретранслятор (rptAttendanceCode) список каждый день месяца для сотрудника. (Обратите внимание, мы подключаемся к ретрансляторов OnItemDataBound игровая события, об этом чуть позже):

<asp:Repeater id="rptAttendance" runat="server" OnItemDataBound="rptAttendance_ItemDataBound"> 
     <ItemTemplate> 
      <tr> 
       <td><asp:Label ID="lblEmpName" runat="server" /></td> 
       <asp:Repeater ID="rptAttendanceCode" runat="server" OnItemDataBound="rptAttendanceCode_ItemDataBound" > 
        <ItemTemplate><td><asp:Label ID="lblAttendanceCode" runat="server" /></td></ItemTemplate> 
       </asp:Repeater> 
       </tr> 
     </ItemTemplate> 
    </asp:Repeater> 

Теперь это, где начинается самое интересное!

Во-первых, вам необходимо создать структуру данных, в которой будут указаны имя сотрудника и его/ее посещаемость для каждого дня месяца. Мы будем использовать поле WorkingDays для нашей базовой линии и добавим его при посещении каждого сотрудника (взято из таблицы посещаемости).

//This list (info) holds the employee's name in the first string, and their attendance in the string array 
List<Tuple<string, string[]>> info = new List<Tuple<string, string[]>>(); 
int calendarID = calendar.Rows[0].Field<int>("CalendarID"); 
string days = calendar.Rows[0].Field<string>("WorkingDays"); 

Замените код день типа с соответствующей буквой

days = days.Replace("1", "P"); 
days = days.Replace("0", "H"); 

Преобразование это в массив таким образом, мы можем перебрать его

string[] daysList = days.Select(d => d.ToString()).ToArray(); 

Теперь мы будем перебирать каждого сотрудника записывать и создавать структуру данных для каждого сотрудника. Затем мы будем перебирать выходной день каждого сотрудника и обновлять их коллекцию дневников в те дни, когда они не работали.

foreach (DataRow employee in employees.Rows) 
{ 
    employeeAttendance = new Tuple<string, string[]>(employee.Field<string>("EmpName"), daysList); 
    foreach (DataRow absentDay in attendance.AsEnumerable().Where(a => a.Field<int>("EmpID") == employee.Field<int>("EmpID"))) 
{ 
     employeeAttendance.Item2[absentDay.Field<int>("LeaveDayOfMonth") - 1] = "A"; 
} 
    info.Add(employeeAttendance); 
} 

Вот ItemDataBound обработчики событий для каждого ретранслятора:

protected void rptAttendance_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Tuple<string, string[]> info = (Tuple<string, string[]>)e.Item.DataItem; 
     ((Label)e.Item.FindControl("lblEmpName")).Text = info.Item1; 
     Repeater attendanceCode = (Repeater)e.Item.FindControl("rptAttendanceCode"); 
     attendanceCode.DataSource = info.Item2; 
     attendanceCode.DataBind(); 
    } 
} 

protected void rptAttendanceCode_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     ((Label)e.Item.FindControl("lblAttendanceCode")).Text = e.Item.DataItem.ToString(); 
    } 
} 

Вот код-за в целом:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      List<Tuple<string, string[]>> info = new List<Tuple<string, string[]>>(); 
      int calendarID = calendar.Rows[0].Field<int>("CalendarID"); 
      string days = calendar.Rows[0].Field<string>("WorkingDays"); 
      days = days.Replace("1", "P"); 
      days = days.Replace("0", "H"); 
      string[] daysList = days.Select(d => d.ToString()).ToArray(); 
      Tuple<string, string[]> employeeAttendance = null; 
      foreach (DataRow employee in employees.Rows) 
      { 
       employeeAttendance = new Tuple<string, string[]>(employee.Field<string>("EmpName"), daysList); 
       foreach (DataRow absentDay in attendance.AsEnumerable().Where(a => a.Field<int>("EmpID") == employee.Field<int>("EmpID"))) 
       { 
        employeeAttendance.Item2[absentDay.Field<int>("LeaveDayOfMonth") - 1] = "A"; 

       } 
       info.Add(employeeAttendance); 
      } 
      this.rptAttendance.DataSource = info; 
      this.rptAttendance.DataBind(); 
     } 
    } 

    protected void rptAttendance_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      Tuple<string, string[]> info = (Tuple<string, string[]>)e.Item.DataItem; 
      ((Label)e.Item.FindControl("lblEmpName")).Text = info.Item1; 
      Repeater attendanceCode = (Repeater)e.Item.FindControl("rptAttendanceCode"); 
      attendanceCode.DataSource = info.Item2; 
      attendanceCode.DataBind(); 
     } 
    } 

    protected void rptAttendanceCode_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      ((Label)e.Item.FindControl("lblAttendanceCode")).Text = e.Item.DataItem.ToString(); 
     } 
    } 
+0

@ user2527367 - Помог ли этот ответ? –

+0

Эй, извините, ответьте так поздно. Это дает некоторые ошибки. Как в строке int calendarID = calendar.Rows [0] .Field («CalendarID»); Он говорит, что каландр не найден. что должно быть в календаре? – user2527367

+0

Это происходит из этого SQL: 'SELECT CalendarID, WorkDays FROM Calendar WHERE Year = [YEAR] и Month = [MONTH]'. Я только что заметил в вашем вопросе, что вы написали его «CalederID». Это может быть проблема? –