Page1.cpp
Upload User: bjvcxy
Upload Date: 2021-05-06
Package Size: 2054k
Code Size: 9k
Development Platform:

Visual C++

  1. // Page1.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Attendance.h"
  5. #include "Page1.h"
  6. #include "DepartRS.h"
  7. #include "PersonRS.h"
  8. #include "CounterRS.h"
  9. #include "AttDlg.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. extern CDatabase db;
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CPage1 property page
  18. IMPLEMENT_DYNCREATE(CPage1, CPropertyPage)
  19. CPage1::CPage1() : CPropertyPage(CPage1::IDD)
  20. {
  21. // 得到当前时间并格式化
  22. CTime t=CTime::GetCurrentTime();
  23. CString str=t.Format("%Y-%m-%d %H:%M");
  24. //{{AFX_DATA_INIT(CPage1)
  25. m_strIOTime = str;
  26. m_strDepartID = _T("");
  27. m_strDepartName = _T("");
  28. m_strPersonID = _T("");
  29. m_strPersonName = _T("");
  30. //}}AFX_DATA_INIT
  31. }
  32. CPage1::~CPage1()
  33. {
  34. }
  35. void CPage1::DoDataExchange(CDataExchange* pDX)
  36. {
  37. CPropertyPage::DoDataExchange(pDX);
  38. //{{AFX_DATA_MAP(CPage1)
  39. DDX_Control(pDX, IDC_LIST1, m_cList);
  40. DDX_Control(pDX, IDC_PROGRESS1, m_cProgress);
  41. DDX_Text(pDX, IDC_EDT_IOTIME, m_strIOTime);
  42. DDX_Text(pDX, IDC_EDT_DEPARTID, m_strDepartID);
  43. DDX_Text(pDX, IDC_EDT_DEPARTNAME, m_strDepartName);
  44. DDX_Text(pDX, IDC_EDT_PERSONID, m_strPersonID);
  45. DDX_Text(pDX, IDC_EDT_PERSONNAME, m_strPersonName);
  46. //}}AFX_DATA_MAP
  47. }
  48. BEGIN_MESSAGE_MAP(CPage1, CPropertyPage)
  49. //{{AFX_MSG_MAP(CPage1)
  50. ON_EN_CHANGE(IDC_EDT_DEPARTID, OnChangeEdtDepartid)
  51. ON_EN_CHANGE(IDC_EDT_PERSONID, OnChangeEdtPersonid)
  52. ON_BN_CLICKED(IDC_BTN_ADDPERSON, OnBtnAddperson)
  53. ON_BN_CLICKED(IDC_BTN_ADDDEPART, OnBtnAdddepart)
  54. ON_BN_CLICKED(IDC_BTN_ADDALL, OnBtnAddall)
  55. ON_BN_CLICKED(IDC_BTN_DELETEATTEND, OnBtnDeleteattend)
  56. ON_BN_CLICKED(IDC_BTN_SEEKIO, OnBtnSeekio)
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CPage1 message handlers
  61. BOOL CPage1::OnInitDialog() 
  62. {
  63. CPropertyPage::OnInitDialog();
  64. // 出入情况缺省为出
  65. ((CButton*)GetDlgItem(IDC_RADIO_OUT))->SetCheck(TRUE);
  66. // 为List添加网格
  67. m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);
  68. // 设置List的列
  69. int nWidth=110;
  70. m_cList.InsertColumn(0, "记录编号", LVCFMT_LEFT, nWidth);
  71. m_cList.InsertColumn(1, "员工号", LVCFMT_LEFT, nWidth);
  72. m_cList.InsertColumn(2, "出入情况", LVCFMT_LEFT, nWidth);
  73. m_cList.InsertColumn(3, "时间", LVCFMT_LEFT, nWidth);
  74. CAttendanceRS rs(&db); // 构造出勤记录表
  75. UpdateList(rs); // 更新List
  76. return TRUE;  // return TRUE unless you set the focus to a control
  77.               // EXCEPTION: OCX Property Pages should return FALSE
  78. }
  79. void CPage1::OnChangeEdtDepartid() 
  80. {
  81. UpdateData(); // 更新数据
  82. CDepartRS rs(&db); // 构造记录集
  83. rs.m_strFilter = "ID='" + m_strDepartID + "'"; // 设置过滤条件
  84. rs.Open(); // 打开记录集
  85. if(rs.GetRecordCount()==1) // 判断部门代码输入是否正确
  86. {
  87. m_strDepartName=rs.m_NAME; // 提取部门名称
  88. }
  89. else m_strDepartName.Empty(); // 清除部门名称
  90. rs.Close(); // 关闭记录集
  91. UpdateData(FALSE); // 更新界面数据
  92. }
  93. void CPage1::OnChangeEdtPersonid() 
  94. {
  95. UpdateData(); // 更新数据
  96. CPersonRS rs(&db); // 构造PERSON记录表
  97. rs.m_strFilter = "ID='" + m_strPersonID + "'"; // 设置过滤条件
  98. rs.Open(); // 打开记录表
  99. if(rs.GetRecordCount()==1) // 判断员工号是否正确
  100. {
  101. m_strPersonName=rs.m_NAME; // 提取员工姓名
  102. m_strDepartID=rs.m_DEPARTMENT; // 提取员工所在部门编号
  103. }
  104. else m_strPersonName.Empty(); // 清除员工姓名显示
  105. rs.Close(); // 关闭记录表
  106. UpdateData(FALSE); // 更新界面数据
  107. OnChangeEdtDepartid(); // 显示部门名称
  108. }
  109. // 添加出勤记录函数
  110. void CPage1::IO_Add(CString strPersonID)
  111. {
  112. int counter; // 用于计数
  113. CString strIO; // 保存出入情况
  114. CCounterRS rs_counter(&db); // 构造计数器记录表
  115. // 记录编号
  116. rs_counter.m_strFilter = "ID='A'"; // 设置过滤器,提取计数值
  117. rs_counter.Open(); // 打开计数器记录表
  118. counter=rs_counter.m_COUNTER_VALUE; // 提取计数值
  119. counter++; // 计数值加1
  120. rs_counter.Edit(); // 编辑计数器
  121. rs_counter.m_COUNTER_VALUE=counter; // 保存当前计数
  122. rs_counter.Update(); // 提交修改
  123. rs_counter.Close(); // 关闭计数器记录表
  124. // 添加记录
  125. // 判断确定出入情况
  126. if(((CButton*)GetDlgItem(IDC_RADIO_OUT))->GetCheck())
  127. strIO="O";
  128. else strIO="I";
  129. // 转换出入时间类型
  130. int nYear,nMonth,nDay,nHour,nMinute; // 年,月,日,时,分
  131. sscanf(m_strIOTime.Left(4), "%d", &nYear); // 得到年
  132. sscanf(m_strIOTime.Mid(5,2), "%d", &nMonth); // 得到月
  133. sscanf(m_strIOTime.Mid(8,2), "%d", &nDay); // 得到日
  134. sscanf(m_strIOTime.Mid(11,2), "%d", &nHour); // 得到时
  135. sscanf(m_strIOTime.Mid(14,2), "%d", &nMinute); // 得到分
  136. // 得到出入时间
  137. CTime IO_time(nYear,nMonth,nDay,nHour,nMinute,0);
  138. CAttendanceRS rs_attendance(&db); // 构造考勤记录表
  139. rs_attendance.Open(); // 打开考勤记录表
  140. rs_attendance.AddNew(); // 追加考勤记录
  141. rs_attendance.m_ID=counter;
  142. rs_attendance.m_PERSON=strPersonID;
  143. rs_attendance.m_IN_OUT=strIO;
  144. rs_attendance.m_IO_TIME=IO_time;
  145. rs_attendance.Update();
  146. rs_attendance.Close(); // 关闭考勤记录表
  147. UpdateList(rs_attendance); // 更新列表框
  148. }
  149. void CPage1::OnBtnAddperson() // 追加单个员工考勤记录
  150. {
  151. if(!m_strPersonName.IsEmpty()) // 判断员工是否存在
  152. {
  153. IO_Add(m_strPersonID); // 追加单个员工记录
  154. }
  155. }
  156. void CPage1::OnBtnAdddepart() // 追加部门员工考勤记录
  157. {
  158. int i,n; // 用于保存记录条数
  159. CPersonRS rs_person(&db); // 构造员工信息表
  160. if(m_strDepartName.IsEmpty()) return; // 判断部门代号是否正确
  161. // 设置过滤条件
  162. rs_person.m_strFilter="DEPARTMENT='"+m_strDepartID+"' and STATE='T'";
  163. rs_person.Open(); // 打开员工信息表
  164. n=rs_person.GetRecordCount(); // 获取员工人数
  165. i=0; // 初始化已添加记录条数
  166. // 初始化进度条
  167. m_cProgress.SetRange(0, n);
  168. m_cProgress.SetPos(0);
  169. while(!rs_person.IsEOF()) // 对数据表中所有记录进行处理
  170. {
  171. IO_Add(rs_person.m_ID); // 添加当前员工出勤记录
  172. rs_person.MoveNext(); // 跳到下一个员工记录
  173. m_cProgress.SetPos(++i); // 显示进度
  174. }
  175. rs_person.Close(); // 关闭员工信息表
  176. }
  177. void CPage1::OnBtnAddall() // 添加所有员工出勤记录
  178. {
  179. int i,n; // 用于保存记录条数
  180. CPersonRS rs_person(&db); // 构造员工信息表
  181. // 设置过滤条件,提取员工列表
  182. rs_person.m_strFilter = "STATE='T'";
  183. rs_person.Open(); // 打开员工信息表
  184. n=rs_person.GetRecordCount(); // 获取员工人数
  185. i=0; // 初始化已添加记录条数
  186. // 初始化进度条
  187. m_cProgress.SetRange(0, n);
  188. m_cProgress.SetPos(0);
  189. while(!rs_person.IsEOF()) // 对数据表中所有记录进行处理
  190. {
  191. IO_Add(rs_person.m_ID); // 添加当前员工出勤记录
  192. rs_person.MoveNext(); // 跳到下一个员工记录
  193. m_cProgress.SetPos(++i); // 显示进度
  194. }
  195. rs_person.Close(); // 关闭员工信息表
  196. }
  197. void CPage1::UpdateList(CAttendanceRS& rs) // 更新列表框内容
  198. {
  199. int i=0;
  200. CString strID,strTime;
  201. rs.Open(); // 打开出勤记录表
  202. m_cList.DeleteAllItems(); // 清除列表框内容
  203. while(!rs.IsEOF()) // 对数据表中所有记录进行处理
  204. {
  205. m_cList.InsertItem(i, ""); // 添加新Item
  206. strID.Format("%d", rs.m_ID); // 转换为字符串
  207. m_cList.SetItemText(i, 0, strID);
  208. m_cList.SetItemText(i, 1, rs.m_PERSON);
  209. m_cList.SetItemText(i, 2, rs.m_IN_OUT);
  210. m_cList.SetItemText(i, 3, rs.m_IO_TIME.Format("%Y-%m-%d %H:%M"));
  211. rs.MoveNext(); // 跳到下一条记录
  212. i++;
  213. }
  214. rs.Close(); // 关闭出勤记录表
  215. }
  216. void CPage1::OnBtnDeleteattend() // 删除出勤记录列表中所选记录
  217. {
  218. CString strSQL;
  219. int nItem;
  220. // 得到第一个被选择Item的位置
  221. POSITION pos = m_cList.GetFirstSelectedItemPosition();
  222. if(pos==NULL)
  223. {
  224. AfxMessageBox("没有选择记录!");
  225. return;
  226. }
  227. while(pos) // 遍历所有被选Item
  228. {
  229. nItem=m_cList.GetNextSelectedItem(pos); // 得到Item Index
  230. // 构造SQL语句
  231. strSQL="delete from ATTENDANCE where ID="
  232. + m_cList.GetItemText(nItem, 0);
  233. db.ExecuteSQL(strSQL); // 执行
  234. }
  235. CAttendanceRS rs(&db); // 构造出勤记录表
  236. UpdateList(rs); // 更新列表框
  237. }
  238. void CPage1::OnBtnSeekio() 
  239. {
  240. CAttendanceRS rs(&db); // 构造出勤记录表
  241. CAttDlg *pDlg; // 指向包含本对象的CAttDlg的指针
  242. CString strFilter; // 用于保存过滤字符串
  243. CString strSTime,strETime; // 起始,结束时间
  244. pDlg=(CAttDlg*)GetParent()->GetParent(); // 得到指针
  245. pDlg->UpdateData(); // 更新数据
  246. strSTime=pDlg->m_StartTime.Format("%Y-%m-%d");
  247. strETime=pDlg->m_EndTime.Format("%Y-%m-%d");
  248. if(pDlg->m_bSeekbyperson) // 判断是否根据员工号检索
  249. strFilter="PERSON='" + pDlg->m_strPersonID + "'"; // 添加过滤条件
  250. if(pDlg->m_bSeekbytime) // 判断是否有时间范围
  251. {
  252. if(strFilter.GetLength()>0) // 判断是否已有过滤条件
  253. strFilter += " and "; //如果是,需要添加and连接符
  254. strFilter += "IO_TIME>#" + strSTime + "#"; // 添加开始时间过滤
  255. strFilter += " and IO_TIME<#" + strETime + "#"; // 添加结束时间过滤
  256. }
  257. if(strFilter.GetLength()>0) // 判断是否有过滤条件
  258. rs.m_strFilter=strFilter; // 设置Filter
  259. UpdateList(rs); // 更新列表框
  260. }