《rfid技术课程设计.docx》由会员分享,可在线阅读,更多相关《rfid技术课程设计.docx(32页珍藏版)》请在三一办公上搜索。
1、“*实践教学“*兰州理工大学计算机与通信学院2014年秋季学期RFID技术课程设计题 目: 基于高频的 RFID职工考勤管理系统专业班级: 计算机科学与技术(物联网方向)1班姓 名:牛文晋学 号:12280104指导教师:薛建彬成 绩:摘要3正文错误!未定义书签。一、前言4二、案例描述521、系统核心功能52.2、实施步骤5三、需求分析73.1、实验箱模块的选择73.2、皿高频读写器原理83.3、射频通信原理9四、整体描述和实现104.1实现RFID高频职工考勤管理系统的硬件设计104.2实现RFID高频职工考勤管理系统的软件设计114.3程序代码144.4系统运行结果27总结29致谢30参考
2、文献31摘要无线射频识别即RFID (Radio Frequency IDentification)技术,又称电子标签、 无线射频识别,是一种非接触的自动识别技术,可通过无线电讯号识别特定目标 并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。它基本 由三部分组成:标签(Tag)、阅读器(Reader)和天线(Antenna)。RFID技术与条码、生物识别等自动识别技术,以及与互联网、通信、传感网 络等信息技术融合,构筑一个无所不在的网络环境。现在很多学校也充分的利用 信息网络技术和计算机互联网技术,发挥信息网络的各种技术手段和现有各种教 育、科研、信息资源的优势,开发各种应用系
3、统和管理系统,实现网络交互式管 理,全面推进信息化管理。而基于RFID的职工考勤应用系统就是学校管理系统的 一个组成部分,它将智能化的完成考察职工出勤情况。它实时的自动采集数据信 息、自动对所采集数据进行分析处理,然后以可视化界面回报给学校管理人员。 通过点名、磁卡和接触式IC卡等方式对职工的上课出勤情况进行考勤、记录管理, 既耗时,而且又会相互干扰;而非接触式RFID员工考勤应用系统实现了利用无线 射频识别技术对员工考勤管理,既方便、快捷,又省资源。本文设计了一种基于RFID高频职工考勤管理系统,它是基于北京奥尔斯电 子科技有限公司生产的物联网RFID综合实验系统V1.0。利用其中的HF模块
4、,嵌 入式网关,并连接PC的串口线到嵌入式网关的J28接口。即可以实现网关控制HF 模块,也可以实现PC机对HF模块的控制。该系统采用13.56M射频识别技术进行 职工的门禁考勤管理,职工每人佩戴13.56M无源电子标签一张,作为考勤卡。 用于上课、下课时的考勤记录,只要标签处于读写器的有效识别范围,则阅读器 便可自动识别到该标签信息,通过软件系统自动记录考勤信息,同时控制电子锁 开门。关键词:RFID;高频;职工考勤一、前言RFID射频识别是一种世界上较为领先的技术:第一,可以识别单个的非常具 体的物体,而不是像条形码那样只能识别一类物体;第二,其采用无线电射频, 可以透过外部材料读取数据,
5、而条形码必须靠激光来读取信息;第三,可以同时 对多个物体进行识读,而条形码只能一个一个地读。此外,储存的信息量也非常 大。所以被广为使用。在很多的公司中基于RFID的职工考勤应用系统就是公司管 理系统的一个组成部分,它将智能化的完成考察职工出勤情况。它实时的自动采 集数据信息、自动对所采集数据进行分析处理,然后以可视化界面回报给学校管 理人员。为学校更好的管理职工提供了很大的方便。职工卡考勤查询管理系统基 于RFID技术,这样可以方便集成分布到公司中的每一个部门里RFID应用已经全 面普及,在校园中职工老师的考勤管理系统更是为学校的管理提供了很大的方 便。职工卡基于RFID无线射频技术,通过射
6、频技术便可获取校园卡中的各类信息, 对于职工卡考勤的应用而言,仅仅需要得到职工卡的一个唯一标志号便可完成考 勤记录。它将支持与职工管理系统、考勤管理系统的信息传递,同时可以方便的与“一 卡通”系统进行无缝连接。二、案例描述该系统采用13.56M射频识别技术进行职工的门禁考勤管理,职工每人佩戴 13.56M无源电子标签一张,作为考勤卡。用于上课、下课时的考勤记录,只要标 签处于读写器的有效识别范围,则阅读器便可自动识别到该标签信息,通过软件 系统自动记录考勤信息,同时控制电子锁开门。2.1、系统核心功能准确识别门禁考勤卡,并正确记录考勤时间,同时应给出声音提示和图像显 示;1、可以由具有系统管理
7、员权限的操作人员进行方便的录入职工信息,即: 将职工姓名、学号、所属学院、专业、班级和考勤卡号,以及照片图像存入数据 库;2、可以通过计算机方便的查询每一个人的考勤详细记录;3、可进行操作人员录入、权限限定、系统参数等功能设定;4、可进行节假日和日期的设定。5、可进行迟到、出差、请假录入等功能设定;6、可设置多种系统查询功能,并可以打印报表或导出EXCEL文件等文件格式。2.2、实施步骤1、用户管理用户分管理员和普通用户两种,管理员可以执行增加删除修改等各种操 作,普通用户只能查看。数据库中现有三种用户,管理员-用户名:牛文晋,密码:12280104,普 通用户-用户名:a,密码:(空);用户
8、名:user,密码:user。a. 增加用户:点击“增加”按钮,在弹出的“增加用户”框中输入新用户的 用户名,密码(可选),权限,备注(可选),然后点击确定,即可在用户管理 栏中看到新添加的用户信息。b. 删除用户:在用户管理栏中选择待删除的用户,点击“删除”按钮。c. 修改用户:在用户管理栏中,选择待修改的用户,点击“修改”按钮,即 可修改相应的信息,修改完后点击“确定”按钮。2、学院信息管理 与用户管理操作类似。3、专业信息管理与用户管理操作类似。4、职工信息管理与用户管理操作类似。5、考勤查询a. 设置好待查询的起始、终止时间和上、下课时间。b. (可选)设置过滤条件:班级或姓名。c.
9、点击“查询”按钮。d. 若有需要,点击“导出为Excel”,可对当前查询结果在当前目录 保存了 Exce l文件。6、读卡操作e. 设置好串口号和连接模式,点击“连接”按钮。f. 点击开始读卡按钮,即开始读卡,当有卡在读写器射频范围内时, 则会在下方的列表中显示对应的职工的姓名。g. 点击“停止读卡”,即可停止读卡。图1系统结构示意图三、需求分析该系统基于OURSRFIDRP实验平台系统,主要目的是结合RFID技术和职工 考勤管理理论,将RFID技术应用于考勤管理系统中。利用其中的HF高频读写器模 块,OMAP3530嵌入式网关。实现嵌入式网关对RFID模块的控制。并在Microsoft Of
10、fice Access中记录职工的一些基本信息,利用Microsoft Visual Studio 2005 创建MFC界面并与Microsoft Office Access 2003连接记录职工的一些情况,通 过13.56M的考勤卡来实现职工的考勤管理。3.1、实验箱模块的选择RFID系统由电子标签、读写器(阅读器)、天线三部分组成。读写器用于读取 或写入非接触Ic卡信息;天线则起至d在非接触IC卡和读写器间传递射频信号作 用。RFID系统还可通过读写器的RS232或RS485接口与外部计算机(上位机系统) 连接,进行数据交换。其系统组成图如下:RFID系统基本模型图图2 RFID系统基本模
11、型2、电子标签电子标签是指由IC芯片和无线通信天线组成的超微型的小标签,其内置的射 频天线用于和读写器进行通信。系统工作时,读写器发出查询(能量)信号,电在 标签(无源)收到查询(能量)信号后将其一部分整流为直流电源供电子标签内的 电路工作,另一部分能量信号被电子标签内保存的数据信息调制后反射回读写器 嘲.电子标签是射频识别系统真正的数据载体。3、读写器读写器在RFID系统中扮演着重要的角色,读写器主要负责与电子标签的双向 通信,同时接受来自于主机系统的控制指令。读写器的频率决定了RFID系统工作 的频段,其功率决定了射频识别的有效距离。读写器根据使用的结构和技术不同 可以是读或读/写装置,是
12、RFID系统信息控制和处理中心。读写器通常由射频接 口、逻辑控制单元和天线三部分组成。3、RFID系统的基本工作原理由读写器通过发射天线发送特定频率的射频信号,当电子标签进入发射天线 有效工作区域时产生感应电流,从而获得能量被激活,使电子标签将自身编码信 息通过内置射频天线发送出去;读写器的接收天线接收到从标签(射频卡)发送来 的调制信号,经天线调节器传送到读写器信号处理模块,经解调和解码后将有效 信息送至后台主机系统进行相关处理:主机系统根据逻辑运算判断该卡的合法 性,识别该标签的身份,针对不同的设定做出相应的处理和控制,最终发出指令 信号控制读写器完成不同的读写操作。高频RFID系统主要采
13、用的是电磁反向散射 耦合即雷达原理模型,发射出去的电磁波,碰到目标后反射,同时携带回目标信 息,依据的是电磁波的空间传播规律。其原理图如下:标签图3电磁反向散射耦合原理3.2、HF高频读读写器原理图4 HF高频读写器模块上电后,430先通过并口访问7970芯片,在没有读到卡时,程序运行在串口 读写模式,并每隔0.5s向串口发送一个“D”,直到有写操作为止。当有卡读写时, 针对相应的卡,程序进入不同的协议中,并且点亮相应的LED灯。并且上电后, 配置完内部寄存器,程序进入串口读写程序,可以进行人机交互。当读到不同 协议的卡时,程序退出串口读写程序,进入相应的协议子程序中(目前支持14443A 协
14、议和15693协议)。读完卡后,退出相应的协议子程序,进入串口读写程序。3.3、射频通信原理非接触式射频卡系统是一个典型的射频识别系统,它采用的是射频通信技 术,射频通信细节有:数据的调制和解调、能量的传输和通信协议。3.3.1、数据的调制和解调读写器和射频卡之间采用半双工通信方式,以一定频率的电磁波为媒介进 行通信。由于基带数字信号不可以直接进行传输,那么在读写器和射频卡之间进 行通信时,必须对该基带信号进行调制和解调处理。由于射频卡系统是一个数字通信系统,因此一般采用数字调制的方法进行 调制。数字调制是用载波信号参量的离散状态来表征所传输的数字信息,在解调 时只需对载波信号的受调参量进行检
15、测和判决.数字调制信号因此称为键控信 号.由于载波信号是正弦波信号,其三个参量幅度、频率和相位都能携带信息, 相应有调幅、调频和调相三种基本形式。在射频卡中常采用调幅形式。3.3.2、能量的传输射频卡在工作时,本身没有电源,因此需要从读写器发送的电磁波中提取能 量,在射频卡接受数据期间,它一方面从接受到的信号中解调出数据信息,另一 方面从接受到的信号中提取能量。当射频卡返回数据时,射频卡的数据是通过负 载调制的方式,使射频卡的天线上的信号幅度发生变化,这样藕合到读写器的天 线上的信号幅度也就发生相应的变化,从而使读写器得到射频卡返回的信息,同 时射频卡将读写器上的电磁波信号藕合过来,提供射频卡
16、工作所需的能量。3.3.3、通信协议RFID系统至少由一个读写器和一个射频卡组成.为了使系统具有高性能价格 比,通常在整个系统中加入相关通信协议,使一个读写器可以同时和多个射频卡 通信。(1)传输协议能量传送的方式一般是以固定频率的连续波或脉冲波(如跳频方式)为载体。 依据系统应用目的的不同,其能量传送的方式不同。目前使用最多的是跳频方式 的脉冲波如公路车辆识别系统,而在铁路车辆识别系统中常采用连续波.工作频 率是RFID系统的基本参数,频率的选取要遵循某些规范的限制。选取较高的工作 频率具有一定的优势。为了系统的可兼容性,信息的编码方式应符合某些规范。我国铁路车辆识别 系统采用了IS0103
17、74集装箱识别的编码方式。信息的结构常常包括帧头、固定信 息、用户信息、校验信息等。信息的长度决定于编码方式和具体识别的信息内容, 传送速度则取决于信息的长度和码元速率。.(2)信道编码技术在读写器与射频卡进行射频通信的过程中,存在许多干扰数据通信的因素, 其中最主要的两个因素是信道噪声和多卡操作(即有多张卡在读写器的天线感应 范围内)引起的数据干扰.因此,需要采用信道编码和访问控制技术,以保证读 写器和射频卡之间数据传输的完整、可靠和快速。为了提高系统的抗嗓声能力, 就需要采用信道编码技术,对可能或已经出现的差错进行控制,信道编码是使不 带规律性或规律性不强的原始数字信号变换为带上规律性或加
18、强了规律性的数 字信号,信道译码器则利用这些规律性来鉴别是否发生错误,进而纠正错误。根 据码的用途可将其分为检错码和纠错码。常用的检错码包括奇偶校验码和循环冗 余校验码响.四、整体描述和实现本系统的设计主要分为两大部分,一部分是考勤器的软、硬件设计,一部分 是上位机软件的设计。考勤器体积适中,便于携带到教室等场所,由它完成对职 工的考勤。主要功能是读取职工一卡通的信息,以及做相应显示、存储等处理。 上位机软件主要功能是向考勤器下传职工姓名、学号以及接收并保存考勤器上传 的卡号和考勤记录。4.1实现RFID高频职工考勤管理系统的硬件设计职工考勤几乎是每个学校必须而且是经常做的职工工作之一,如何简
19、单高效 的地考勤工作一直以来是很多学校都在努力解决,所以考虑如何实现简单高效的 考勤具有巨大的实际意义和价值,鉴于此,本文提出了一种可行的方案,方案的 总体思路:目前很多学校都在使用一卡通,本系统以职工的一卡通为基础,设计 一种读卡式考勤器,考勤器存储有职工的身份信息,职工刷卡,通过职工刷卡, 通过职工卡号来识别职工的身份,并记录刷卡时间来实现对职工的考勤,方法简 单有效。考勤器体积适中,便于携带,使用方便。4.1.1考勤器设计考勤器硬件设计主要构成:单片机、读卡模块、实时钟模块等4.1.2 HF 模块系统框图:图5 HF模块系统框图(1)系统运行简要说明: :上电后,430先通过并口访问79
20、70芯片,在没有读到卡时,程序运 行在串口读写模式,并每隔0.5s向串口发送一个“D”直到有写操作为止。 :当有卡读写时,针对相应的卡,程序进入不同的协议中,并且点亮相 应的LED灯。API调用说明 :上电后,配置完内部寄存器,程序进入串口读写程序,可以进行人机 交互。 :当读到不同协议的卡时,程序退出串口读写程序,进入相应的协议子 程序中(目前支持14443A协议和15693协议)。读完卡后,退出相应的协议子 程序,进入串口读写程序。(3)ISO 15693第三部分通过读卡器获取指令流,读卡器采用TI trf7970读卡器芯片。4.2实现RFID高频职工考勤管理系统的软件设计本次课程设计主要
21、是设计基于高频的职工考勤系统,其软件部分利用上位机 的Microsoft visual stdio 2005 Microsoft Ofice Access 200群软件来编写 职工考勤系统需要的代码及创建数据库。4.2.1 在 Microsoft Vsual Stdio 2005 的 MFC 应用程序模块设计在PC机上通过Microsoft Vsual Stdio 2005的MFC应用程序模块设计登陆界面、读卡界面职工信息界面该软件将自动生成相关程序代码段相关界面如图所示图6登陆界面图7用户界面图8职工界面图9添加专业界面图10专业界面图11信息界面图12班级界面图13读卡界面图14考勤界面4
22、.3程序代码/ Attendance.cpp :实现文件/#include stdafx.h#include HFExample.h#include Attendance.h#include BasicExcel.hppusing namespace YExcel;#define ATTENDANCE_LIST_DATETIME_IDX0#define ATTENDANCE_LIST_WEEK_IDX1#define ATTENDANCE_LIST_NAME_IDX2#define ATTENDANCE_LIST_DEPARTMENT_IDX 3#define ATTENDANCE_LIST_
23、SWORDTIME_IDX 4#define ATTENDANCE_LIST_EWORKTIME_IDX 5static TCHAR WeekDay6=TEXT(周 日),TEXT(周 一 ),TEXT(周二),TEXT(周三 ),TEXT(周四),TEXT(周五),TEXT(周六);/ CAttendance 对话框IMPLEMENT_DYNAMIC(CAttendance, CPropertyPage)CAttendance:CAttendance(): CPropertyPage(CAttendance:IDD)CAttendance:CAttendance()void CAttenda
24、nce:DoDataExchange(CDataExchange* pDX)CPropertyPage:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_ATTENDANCD, _lists);void CAttendance:GetRequestList( CString date1,CString time1,CString date2,CString time2 )CString dt1,dt2;dt1=date1+ +time1;dt2=date2+ +time2;theApp.getDB().GetAttendanceList(m_atten
25、danceinfoarray,dt1,dt2);void CAttendance:GetRequestListByName( CString date1,CString time1,CString date2,CString time2,CString name ) CString dt1,dt2;dt1=date1+ +time1;dt2=date2+ +time2;theApp.getDB().GetAttendanceListByName(m_attendanceinfoarray,dt1,dt2,name);void CAttendance:GetRequestListByDepart
26、ment( CString date1,CString time1,CString date2,CString time2,CString department ) CString dt1,dt2;dt1=date1+ +time1;dt2=date2+ +time2;theApp.getDB().GetAttendanceListByDepartment(m_attendanceinfoarray,dt1,dt2,department );void CAttendance:GetRequestListByNameAndDepartment( CString date1,CString tim
27、e1,CString date2,CString time2,CString name,CString department ) CString dt1,dt2;dt1=date1+ +time1;dt2=date2+ +time2;theApp.getDB().GetAttendanceListByNameAndDepartment(m_attendanceinfoarray,dt1,dt2, name,department);BEGIN_MESSAGE_MAP(CAttendance, CPropertyPage)ON_BN_CLICKED(IDC_BTN_QUERY, &CAttenda
28、nce:OnBnClickedBtnQuery) ON_BN_CLICKED(IDC_CHECK_DEPARTMENT,&CAttendance:OnBnClickedCheckDepartment)ON_BN_CLICKED(IDC_CHECK_NAME, &CAttendance:OnBnClickedCheckName)ON_BN_CLICKED(IDC_BTN_EXPORTEXCEL,&CAttendance:OnBnClickedBtnExportexcel)ON_NOTIFY(LVN_ITEMCHANGED,IDC_LIST_ATTENDANCD,&CAttendance:OnLv
29、nItemchangedListAttendancd)ON_NOTIFY(DTN_DATETIMECHANGE,IDC_DATETIMEPICKER_DATEEND,&CAttendance:OnDtnDatetimechangeDatetimepickerDateend) END_MESSAGE_MAP() / CAttendance消息处理程序BOOL CAttendance:OnInitDialog()CPropertyPage:OnInitDialog();/ TODO:在此添加额外的初始化COleDateTime dt1(2011,1,1,8,30,0),dt3(2011,1,1,1
30、7,30,0);(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_STARTWORK)-SetTime(dt1);(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_ENDWORK)-SetTime(dt3); _lists.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);_lists.InsertColumn(ATTENDANCE_LIST_DATETIME_IDX,TEXT(日期”);_lists.InsertColumn(ATTENDANCE_
31、LIST_WEEK_IDX,TEXT(星期);_lists.InsertColumn(ATTENDANCE_LIST_NAME_IDX,TEXT(姓 名”);_lists.InsertColumn(ATTENDANCE_LIST_DEPARTMENT_IDX,TEXT(专 业);_lists.InsertColumn(ATTENDANCE_LIST_SWORDTIME_IDX,TEXT(上 课);_lists.InsertColumn(ATTENDANCE_LIST_EWORKTIME_IDX,TEXT(下 课); CRect rect4;_lists.GetClientRect(rect4)
32、;获得当前客户区信息_lists.SetColumnWidth(ATTENDANCE_LIST_DATETIME_IDX,1.5*rect4.Width()/10);设置列的宽度。_lists.SetColumnWidth(ATTENDANCE_LIST_WEEK_IDX,1*rect4.Width()/10);_lists.SetColumnWidth(ATTENDANCE_LIST_NAME_IDX,1*rect4.Width()/10);_lists.SetColumnWidth(ATTENDANCE_LIST_DEPARTMENT_IDX,2*rect4.Width()/10);_li
33、sts.SetColumnWidth(ATTENDANCE_LIST_SWORDTIME_IDX,2*rect4.Width()/10);_lists.SetColumnWidth(ATTENDANCE_LIST_EWORKTIME_IDX,2*rect4.Width()/10);获取专业信息theApp.getDB().GetAllDepartment(_departmentinfoarray);int i;for(i=0;iAddString(aDepartmentI nfo.GetName();获取职工信息theApp.getDB().GetAllEmployee(_employinfo
34、array);for(i=0;iAddString(aEmployInfo.GetName ();return TRUE; / return TRUE unless you set the focus to a control/异常:OCX属性页应返回FALSEvoid CAttendance:ShowInListCtrl()int i;CString t;COleDateTime dt0,dt1,dt2,dtt;/dt0:查询起始时间dt1:数据库中时间dt2:查询结束时间dtt:临时变量(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_DATEST
35、ART)-GetTime(dt0);dt0.SetDateTime(dt0.GetYear(),dt0.GetMonth(),dt0.GetDay(),0,0,0); / 只提供查询 日 期,相应起始时间为点(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_DATEEND)-GetTime(dt2);dt2.SetDateTime(dt2.GetYear(),dt2.GetMonth(),dt2.GetDay(),23,59,59); / 查询终止时间为点COleDateTimeSpan dtsd(1,0,0,0),dtslast(0,3,0,0),d
36、tsampm(0,12,0,0); _lists.DeleteAllItems();const int iMax=m_attendanceinfoarray.GetUpperBound();for(i=0;i=dt0)/ & dt1dt0+dtsd) dt0+=dtsd;dt1=m_attendanceinfoarray.GetAt(i).GetDateTime2(); _lists.InsertItem(i,m_attendanceinfoarray.GetAt(i).GetDate();_lists.SetItemText(i,ATTENDANCE_LIST_NAME_IDX,m_atte
37、ndanceinfoarray.GetAt(i).Ge tName();if(dt1dt0+dtsampm) /am dtt.SetDateTime(dt1.GetYear(),dt1.GetMonth(),dt1.GetDay(),8,30,0); /记录 时间在:30前,显示“正常”,否则显示记录时间 if(dt1dtt)t=”正常”; elset=m_attendanceinfoarray.GetAt(i).GetTime(); _lists.SetItemText(i,ATTENDANCE_LIST_EWORKTIME_IDX,t); i+; if(iiMax) break; if(d
38、t1dt2 | iiMax) break;void CAttendance:ShowInListCtrl2()int i,j=0;CString t;COleDateTime dtdayb,dt1,dt2,dtdaye,dtt; /dt0:查询起始时间 dt1:数据库中时间 dt2:查询 结束时间dtt:临时变量(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_DATESTART)-GetTime(dtday b);dtdayb.SetDateTime(dtdayb.GetYear(),dtdayb.GetMonth(),dtdayb.GetDay()
39、,0,0,0); / 只提供查询日期,相应起始时间为点(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_DATEEND)-GetTime(dt2);dt2.SetDateTime(dt2.GetYear(),dt2.GetMonth(),dt2.GetDay(),23,59,59); / 查询终止时间 为点COleDateTimeSpan dtsd(1,0,0,0),dtslast(0,3,0,0),dtsampm(0,12,0,0),dtspan=dt2-dtdayb;int days=dtspan.GetTotalDays()+1;查询的总天数j=
40、0;for(i=0;idays & jm_attendanceinfoarray.GetSize();i+)ReSetQueryResultTime();SetQueryResultDate(dtdayb);dtdaye=dtdayb+dtsd;dt1=m_attendanceinfoarray.GetAt(j).GetDateTime2();while(jdtdayb & dt1dtdaye)Addrecord(j);j+;if(jm_attendanceinfoarray.GetSize()dt1=m_attendanceinfoarray.GetAt(j).GetDateTime2();
41、dtdayb+=dtsd;ShowQueryResult2();ReSetQueryResultTime();for(;idays;i+)SetQueryResultDate(dtdayb);dtdayb+=dtsd;ShowQueryResult2();void CAttendance:ShowQueryResult2()int i,j;CString s1,s2,s3;CDateAndTime dat;j=_lists.GetItemCount();for(i=0;i_queryresultarray.GetSize();i+)dat.m_date=_queryresultarray.Ge
42、tAt(i).GetDate();s1=_queryresultarray.GetAt(i).GetSTime();s2=_queryresultarray.GetAt(i).GetETime();s3=_queryresultarray.GetAt(i).GetWeek();_lists.InsertItem(j,_queryresultarray.GetAt(i).GetDate();_lists.SetItemText(j,ATTENDANCE_LIST_WEEK_IDX,s3);_lists.SetItemText(j,ATTENDANCE_LIST_NAME_IDX,_queryre
43、sultarray.GetAt(i).GetNam e();_lists.SetItemText(j,ATTENDANCE_LIST_DEPARTMENT_IDX,_queryresultarray.GetAt(i) .GetDepartment();_lists.SetItemText(j,ATTENDANCE_LIST_SWORDTIME_IDX,s1);_lists.SetItemText(j,ATTENDANCE_LIST_EWORKTIME_IDX,s2);j+;补课名单if(s3 = ”周六” | s3 = ”周日”)_workextraarray.Add(_queryresultarray.GetAt(i);正常上班时间没有时间记录即为缺勤elseif(s1 = & s2 =)_absentarray.Add(_queryresultarray.GetAt(i);/缺勤总表_employstatinfoarray.GetAt(i).m_absent.Add(dat); 单个职工缺勤统计表dat.m_time=上课”;_employstatinfo