• 选择页面风格:
  • C# 将员工考勤数据进行转置

    作者:追梦 更新时间:2016-09-20 12:40:32 来源:原创 【字号: 】 浏览
    [导读]数据库中的考勤数据都是每次记录一条数据,在对考勤进行处理时,往往需要将纵向的考勤时间数据进行横向排列。

    数据库中的考勤记录.jpg

    图一 数据库中的考勤记录

    整理后的考勤记录.jpg

    图二 整理后的考勤记录

    设计思路:

      ①将数据库中的第一行数据写入到DataGridView中,此时读取数据的指针在图一的第一行的考勤时间处,写入数据的指针在图二的时间1处;

      ②读取指针下移到第二行,利用该行的姓名、考勤日期与图二中第一行的姓名和考勤日期做对比,如果日期和姓名都一致表示的是同一个人的第二次刷卡,那么写入的指针移动到时间2处,并将读取指针所在行的考勤时间写入到时间2中。

      ③重复②的操作,如果姓名、日期不相等,则表示是第二天或者另一个人。那么写入的指针下移一行,进行数据写入。

    设计代码:

    DataTable table = new AttenBLL().GetAllByDate(fromDateTime, toDateTime);
    if (!(table == null))
    {
      for (int tri= 0,row=0; tri < table.Rows.Count; row++) //行数,在到此处时,tri已经增加过了,此处不需要增加
      {
        //20160919如果行不为0,则自动增加一行//去掉条件判断,只要进入循环,DGV行自动+1
        dgvAttenData.Rows.Add(1);
        dgvAttenData.Rows[row].Cells[0].Value = row+1; //序号,循环异常,序号增加1
        dgvAttenData.Rows[row].Cells[1].Value = table.Rows[tri][1].ToString();  //考勤号 
        dgvAttenData.Rows[row].Cells[2].Value = table.Rows[tri][2].ToString();  //姓名
        dgvAttenData.Rows[row].Cells[3].Value = table.Rows[tri][3].ToString();  //部门
        dgvAttenData.Rows[row].Cells[4].Value = table.Rows[tri][4].ToString();  //星期
        dgvAttenData.Rows[row].Cells[5].Value = table.Rows[tri][5].ToString();  //考勤日期
        dgvAttenData.Rows[row].Cells[6].Value = table.Rows[tri][6].ToString();  //考勤时间
        //i table。rows的增加量;j    dgv 列的增加量,从7开始,暂时考勤次数最多为4次
        for (int j=7;j<11 ;j++)
        {
          tri++;
          if ((tri) < table.Rows.Count)
          {
             if (table.Rows[tri][5].ToString() == dgvAttenData.Rows[row].Cells[5].Value.ToString() && table.Rows[tri][1].ToString()==dgvAttenData.Rows[row].Cells[1].Value.ToString())
             {
                dgvAttenData.Rows[row].Cells[j].Value = table.Rows[tri][6].ToString();
              }
              else
              {
                 break;
              }
            }
          }
        }
     }

    问题:使用这种方式获取数据,按行读取,按行判断、按行写入。效率低下、界面闪动厉害,不知道目前的考勤软件是怎么对考勤数据进行处理的。

    下篇预告:根据每天的考勤记录,技术迟到、早退的时间。

    {$FL_ggad250}
    栏目导航