《基于高频RFID的学生考勤系统方案.pdf》由会员分享,可在线阅读,更多相关《基于高频RFID的学生考勤系统方案.pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、*实践教学*XX理工大学计算机与通信学院2013 年秋季学期RFID应用技术课程设计题目:基于高频 RFID的学生考勤系统院系:计算机与通信学院专业:计算机科学与技术(物联网工程方向)姓名:XXX 学号:XXXXX 指导老师:XXXXXX 成绩:目录摘 要2 前 言3 一、案例描述:4 1.1RFID 的定义 4 1.2 RFID 系统的组成4 1.3 RFID 技术的基本工作原理6 1.4RFID 高频相关的国际标准7 1.5 高频(工作频率主要为 13.56MHz)8 二、需求分析8 三、整体描述和实现:9 1.硬件设计9 2.软件设计12 3.程序代码14 4.运行结果30 总 结32
2、参 考 文 献 33 摘 要本次 课 程 设计 主要 是设 计基 于 高 频的 学生考 勤 系统,利用 上位 机 的Microsoft visual stdio 2008、Microsoft Ofice Access 2000等软件来编写学生考勤系统需要的代码,绘制相关界面以及创建数据库。同时,使用奥尔斯电子科技的 RFID综合实验系统的试验箱,使用实验模块上的高频读卡区实现对高频卡 ISO15693 的识别,其中读卡区主要由7970A,F2370,MAX3232,天线等组成。此次课程设计主要分为四步,第一步是在上位机上绘制登陆界面、读卡界面、学生信息界面等,第二步是在 PC机上建立数据库,并
3、在 VS中与数据库连接,第三步是编译程序,通过后与实验箱连接,烧写程序,第四步是读卡,通过读卡就可以看见卡片上的相关信息显示在我们绘制的界面上了。通过此次课程设计使我加深了对单片机的理解,明白了单片机在该系统中的作用,并且熟悉了实验箱的电路板。关键词:学生考勤;考勤器;RFID卡前 言随着电子技术的发展,智能卡 RFID在生活中随处可见。而射频识别卡(简称射频卡、RFID卡)正逐渐取代传统的接触式IC 卡,成为智能卡领域的新潮流。RFID卡由于成功结合了射频识别和IC 卡技术,解决了无源(卡无电池)和免接触的难题,因此,具有磁卡和接触式IC 卡不可比拟的优点。RFID卡由 IC 芯片、感应天线
4、组成,完全密封在一个标准PVC卡片中,无外露部分。学生考勤系统设计利用无线射频识别技术,实现对学生进行考勤、记录等功能。通过点名、磁卡和接触式IC 卡的等方式对学生的到课情况进行考勤、记录管理,既耗时又容易相互干扰;而非接触式RFID学生考勤系统实现了利用无线射频识别技术对学生考勤管理,既方便快捷,又省时。学生考勤系统由应答器和阅读器组成,其中应答器由标签(即卡片)构成,阅读器(读卡器)由射频卡基站器件及其支撑电路、主控器件及其支撑电路和外围接口电路(键盘、液晶、时钟、和串口模块)构成。一、案例描述:1.1 RFID的定义无线射频识别即 RFID(Radio Frequency IDentif
5、ication)技术,又称电子标签、无线射频识别,是一种非接触的自动识别技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。它基本由三部分组成:标签(Tag)、阅读器(Reader)和天线(Antenna)1.1.1.RFID电子标签(Tag,或称射频标签):由芯片及置天线组成。芯片保存有一定格式的电子数据,作为待识别物品的标识性信息,是射频识别系统真正的数据载体。置天线用于和射频天线间进行通信。1.1.2 阅读器:读取或读/写电子标签信息的设备,主要任务是控制射频模块向标签发射读取信号,并接收标签的应答,对标签的对象标识信息进行解码,将对象标识信
6、息连带标签上其它相关信息传输到主机以供处理。1.1.3 天线:标签与阅读器之间传输数据的发射、接收装置。RFID射频识别是英文Radio Freqency Identification的缩写,它是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,可工作于各种恶劣环境。RFID 技术可识别高速运动物体并可同时识别多个识别卡,操作快捷方便。RFID射频识别是一种世界上较为领先的技术:第一,可以识别单个的非常具体的物体,而不是像条形码那样只能识别一类物体;第二,其采用无线电射频,可以透过外部材料读取数据,而条形码必须靠激光来读取信息;第三,可以同时对多个
7、物体进行识读,而条形码只能一个一个地读。此外,储存的信息量也非常大。1.2 RFID 系统的组成一个 RFID 系统 通常有两个组件组成:图 1 RFID 系统基本原理模型图收发器(transponder)或者标签(Tag):位于或者通过某种物理手段附加于被识别的对象之上;讯问器(interrogator)或者阅读器(reader):取决于设计和所采用的技术,可以是阅读或者读写设备。图 2 RFID 系统阅读器通常包含一个射频模块(发射器和接收器),一个控制单元和一个与收发器的耦合单元。另外,某些阅读器还包含其他数据接口系统(RS 232,RS 485,TCP/IP 等),以便将数据转发到其他
8、系统。标签:表示 RFID系统的实际数据载体,通常有一个耦合单元和一个电子芯片组成。标签通常不具备自身电源供应,当它不在质询器的质询围时,整体呈被动状态。它只有在质询器的质询围之才被激活。激活雷达收发器的电力通过耦合单元传输给收发器,所需的数据和时钟脉冲也是如此。图 3 RFID 天线 1.3 RFID技术的基本工作原理 RFID技术的基本工作原理:电子标签与阅读器之间通过耦合元件实现射频信号的空间(无接触)耦合、在耦合通道,根据时序关系,实现能量的传递、数据的交换。当标签进入磁场后,接收读写器发出的射频信号,标签凭借感应电流所获得的能量为自身供电并发送出存储在芯片中的产品信息(Passive
9、 Tag,无源标签或被动标签),或者由标签主动发送某一频率的信号(Active Tag,有源标签或主动标签),读写器读取信息并解码后,送至中央信息系统进行有关数据处理。图 4 读写器的原理图 RFID标签和读写器之间采用无线通信方式传递信息。其基本的通信方式有两种,第一种基于电磁耦合或者电感耦合,第二种基于电磁波的反向散射耦合。1、电感耦合:变压器模型,通过空间高频交变磁场实现耦合,依据的是电磁感应定律。图 5 读写过程2、电磁反向散射耦合:雷达原理模型,发射出去的电磁波,碰到目标后反射,同时携带回目标信息,依据的是电磁波的空间传播规律。图 6 读写原理电感耦合方式一般适合于高、中、低频工作的
10、近距离射频识别系统。典型的工作频率有:125kHz、225kHz 和 1356MHz。识别作用距离小于1m,典型作用距离为 1020cm。电磁反向散射耦合方式一般适合于超高频、微波工作的远距离射频识别系统。典型的工作频率有:433MHz,915MHz,245GHz,58GHz。识别作用距离大于1m,典型作用距离为3l0m。RFID标签与读写器之间的耦合通过天线完成,天线通常可以理解为电波传播的天线,也指电感耦合的天线。数据在读写器和标签之间用无线方式传递,噪声、干扰以及失真与数据本身一样传递。与其他通信系统相似,技术上必须保证数据被正确传递和恢复。数据传递有同步和异步之分,在RFID系统中,码
11、流结构也要适应信道特性的要求,码流结构化过程称为信道编码。对于RFID系统,信道编码必须对用户透明,现在有各种不同的信道编码方法,其特点也不尽相同。为了通过空间有效传递数据,要求将数据调制在载波上,这一过程称为调制。常用的调制方法有 ASK、FSK和 PSK。1.4 RFID高频相关的国际标准该频率的感应器不再需要线圈进行绕制,可以通过腐蚀或者印刷的方式制作天线。感应器一般通过负载调制的方式进行工作。也就是通过感应器上的负载电阻的接通和断开促使读写器天线上的电压发生变化,实现用远距离感应器对天线电压进行振幅调制。如果人们通过数据控制负载电压的接通和断开,那么这些数据就能够从感应器传输到读写器。
12、高频段射频标签目前具有全球统一13.56MHz的工作频率。该频段的射频标签称为高频标签。是目前实际应用最多且技术最成熟的射频标签技术。相应的国际标准:(1)ISO/IEC 14443 A/B近耦合 IC 卡,最大的读取距离为10cm (2)ISO/IEC 15693(兼容于 ISO/IEC 18000-3)疏耦合 IC 卡,最大的读取距离为 1m;(3)ISO/IEC 18000-3该标准定义了13.56MHz系统的物理层,防冲撞算法和通讯协议。;(4)EPC C1 HF 定义 13.56MHz符合 EPC 的接口定义;(5)Ubiquitous ID 其中 EPC C1 HF兼容于 ISO/
13、IEC15693,而 ISO15693兼容于 ISO18000-3 的 mode 1;1.5 高频(工作频率主要为 13.56MHz)高频下识别卡不需要绕制线圈,可以通过印刷的方式制作天线。识别卡一般是负载调制的方式工作,也就是通过识别卡的负载电阻的接通和断开促使读写器天线上的电压发生变化,实现远距离识别卡对天线电压进行振幅调制。就频率而言,高频 RFID 具有以下特性:工作频率为 13.56MHz,该频率的波长大概为 22米。除了金属材料外,该频率的波长可以穿过大多数的材料,但是往往会降低读取距离。识别卡(感应器)需要离开金属一段距离。该频段在全球都得到认可并没有特殊的限制。该系统具有防冲撞
14、特性,可以同时读取多个识别卡。可以把某些数据信息写入识别卡中。数据传输速率比低频要快且价格不是很贵。高频RFID 主要应用有:航空包裹的管理和应用、瓦斯钢瓶的管理应用、预收费系统、酒店门锁的管理和应用、大型会议人员通道系统、固定资产的管理系统、医药物流系统的管理和应用、智能货架的管理二、需求分析此次课程设计我选择奥尔斯电子科技的RFID综合实验系统的高频模块来完成读卡,运用了 C+的编程方法来完成界面以及与实验箱的连接,采用RS232接口实现 PC 机与实验箱的连接,以下是我的应用程序结构图:图 7 流程图对于数据的存储我选用的是微软的Access,实现对卡号,学生的专业,学号等的数据存储以及
15、登陆时的所有用户。三、整体描述和实现:考勤系统的核心是射频卡读卡器,而射频卡读写器的关键是射频卡基站器件,该器件主要完成数据的调制、发射和射频接收以及数据解调任务。从射频识别卡的使用方便、交易速度快、便于维护和使用寿命较长等优点来看,射频识别卡正在逐渐替代目前广泛使用的接触式IC 卡。这里所设计的学生考勤系统实现了方便、快捷、省时的学生考勤管理功能。1.硬件设计本统的设计主要分为两大部分,一部分是考勤器的软、硬件设计,一部分是上位机软件的设计。考勤器体积适中,便于携带到教室等场所,由它完成对学生的考勤。主要功能是读取学生一卡通的信息,以及做相应显示、存储等处理。上PC 机上的编程数据库的建立测
16、试与调试否是实验箱的连接读卡结束位机软件主要功能是向考勤器下传学生、学号以及接收并保存考勤器上传的卡号和考勤记录。采用的是基于高频的射频识别。(1)总体设计方案设计学生考勤几乎是每个学校必须而且是经常做的学生工作之一,如何简单高效的地考勤工作一直以来是很多学校都在努力解决,所以考虑如何实现简单高效的考勤具有巨大的实际意义和价值,鉴于此,本文提出了一种可行的方案,方案的总体思路:目前很多学校都在使用一卡通,本系统以学生的一卡通为基础,设计一种读卡式考勤器,考勤器存储有学生的身份信息,学生刷卡,通过学生刷卡,通过学生卡号来识别学生的身份,并记录刷卡时间来实现对学生的考勤,方法简单有效。考勤器体积适
17、中,便于携带,使用方便。(2)考勤器设计考勤器硬件设计主要构成:单片机、读卡模块、实时钟模块等(3)HF 模块图 8 HF 模块系统框图:图 9 系统框图LED灯显示说明:D1:绿色,电源启动指示灯,在430 下完程序后,如果430 正常运行,灯亮。D2:红色,ISO14443A协议指示灯,D3:黄色,ISO14443B协议指示灯 D4:红色,ISO15693协议指示灯 D5:红色,tag-it指示灯 D6:红色,预留系统运行简要说明:上电后,430 先通过并口访问7970 芯片,在没有读到卡时,程序运行在串口读写模式,并每隔0.5s 向串口发送一个“D”,直到有写操作为止。:当有卡读写时,针
18、对相应的卡,程序进入不同的协议中,并且点亮相应的LED灯。API 调用说明:上电后,配置完部寄存器,程序进入串口读写程序,可以进行人机交互。:当读到不同协议的卡时,程序退出串口读写程序,进入相应的协议子程序中(目前支持 14443A协议和 15693 协议)。读完卡后,退出相应的协议子程序,进入串口读写程序。ISO 15693 第三部分通过读卡器获取指令流,读卡器采用TI trf7970 读卡器芯片,开发资料参考协议 ISO 15693,trf7970 datasheet,参考 trf7960EVM.pdf 实现ISO 15693第三部分指令部分,防碰撞实验,附录的CRC 实验;(4)仪器推出
19、低功耗的非接触式接收器-TRF7970A TRF7970A是仪器(TI),推出一款业界功耗最低的适用于近场通信(NFC)的非接触式短距离通信收发器。此TRF7970A 收发器适用于基础设备,其电池寿命是竞争产品的两倍,可提供功率围为1A120mA 的 8个不同的功率模式。该收发器带有可配置的辅助软件,以帮助开发人员更快入手,收发器与软件通过一系列超低功耗 MSP 微控制器兼容。该收发器支持点对点通信,例如用于医疗设备、移动支付以及卡仿真。它也还具有读写能力,两个晶体振荡频率(13.56MHz 或27.12M赫兹)和一个容量为 128字节的“先进先出(FIFO)”缓冲器,使之能够处理大量数据的传
20、输。TRF7970A发器符合 ISO18092 和ISO/IEC21481NFCRFID 标准,并支持多个读写协议。它包括符合 ISO15693,ISO18000-3,ISO14443A/B 标准和 FeliCaRFID规的专为读写器模式设计的示性软件包。(4)TI TRF7970A 13.56MHz NFC通信系统解决方案 TI公司的 TRF7970A 用于13.56MHz RFID/NFC 近场通信系统的模拟前端和数据帧器件,可工作于三种模式之一:RFID/NFC 阅读器,NFC 对等和模拟卡片模式。器件工作电压 2.7-5.5 VDC,支持 NFC 标准NFCIP-1(ISO/IEC 1
21、8092)和NFCIP-2(ISO/IEC 21481),完全集成了 ISO15693,ISO15693,ISO18000-3,ISO14443A/B,FeliCa 协议处理,置的用户可配置编程选择使TRF7970A 适合于广泛的应用如移动设备(平板电脑,手机等),安全配对(蓝牙,WiFi 等),护照或 POS读系统,短程无线通信任务,产品辩认或鉴定,医疗设备,接入控制,数字门锁,电子交易卡共享等。2.软件设计在PC 机上通过 Microsoft Vsual Stdio 2008的MFC 应用程序模块设计登陆界面、读卡界面、学生信息界面该软件将自动生成相关程序代码段相关界面如图所示:图 10
22、登陆界面图 11 用户界面图 12 学员界面图 13 添加用户界面图 14 专业界面图 15 信息界面图 16 班级界面图 17 读卡界面图 18 考勤界面3.程序代码下面是程序代码:/Attendance.cpp:实现文件/#include stdafx.h#include HFExample.h#include Attendance.h#include BasicExcel.hpp using namespace YExcel;#define ATTENDANCE_LIST_DATETIME_IDX 0#define ATTENDANCE_LIST_WEEK_IDX 1#define AT
23、TENDANCE_LIST_NAME_IDX 2#define ATTENDANCE_LIST_DEPARTMENT_IDX 3#define ATTENDANCE_LIST_SWORDTIME_IDX 4#define ATTENDANCE_LIST_EWORKTIME_IDX 5 static TCHAR WeekDay6=TEXT(周 日),TEXT(周 一),TEXT(周 二),TEXT(周三),TEXT(周四),TEXT(周五),TEXT(周六);/CAttendance 对话框IMPLEMENT_DYNAMIC(CAttendance,CPropertyPage)CAttendan
24、ce:CAttendance():CPropertyPage(CAttendance:IDD)CAttendance:CAttendance()void CAttendance: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,
25、dt2;dt1=date1+time1;dt2=date2+time2;theApp.getDB().GetAttendanceList(m_attendanceinfoarray,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_atte
26、ndanceinfoarray,dt1,dt2,name);void CAttendance:GetRequestListByDepartment(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
27、:GetRequestListByNameAndDepartment(CString date1,CString time1,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,
28、CPropertyPage)ON_BN_CLICKED(IDC_BTN_QUERY,&CAttendance: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_
29、ITEMCHANGED,IDC_LIST_ATTENDANCD,&CAttendance:OnLvnItemchangedListAttendancd)ON_NOTIFY(DTN_DATETIMECHANGE,IDC_DATETIMEPICKER_DATEEND,&CAttendance:OnDtnDatetimechangeDatetimepickerDateend)END_MESSAGE_MAP()/CAttendance 消息处理程序BOOL CAttendance:OnInitDialog()CPropertyPage:OnInitDialog();/TODO:在此添加额外的初始化CO
30、leDateTime dt1(2011,1,1,8,30,0),dt3(2011,1,1,17,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_
31、IDX,TEXT(日期);_lists.InsertColumn(ATTENDANCE_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(下课);CRe
32、ct rect4;_lists.GetClientRect(rect4);/获得当前客户区信息_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_
33、DEPARTMENT_IDX,2*rect4.Width()/10);_lists.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(aDepartmentInfo.GetName();/获取学生信息th
34、eApp.getDB().GetAllEmployee(_employinfoarray);for(i=0;iAddString(aEmployInfo.GetName();return TRUE;/return TRUE unless you set the focus to a control/异常:OCX 属性页应返回 FALSE void CAttendance:ShowInListCtrl()int i;CString t;COleDateTime dt0,dt1,dt2,dtt;/dt0:查询起始时间dt1:数据库中时间 dt2:查询结束时间 dtt:临时变量(CDateTimeC
35、trl*)GetDlgItem(IDC_DATETIMEPICKER_DATESTART)-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);/查询终止时间为点COleDateTimeSp
36、an dtsd(1,0,0,0),dtslast(0,3,0,0),dtsampm(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,A
37、TTENDANCE_LIST_NAME_IDX,m_attendanceinfoarray.GetAt(i).GetName();if(dt1dt0+dtsampm)/am dtt.SetDateTime(dt1.GetYear(),dt1.GetMonth(),dt1.GetDay(),8,30,0);/记录时间在:30 前,显示“正常”,否则显示记录时间if(dt1dtt)t=正常;else t=m_attendanceinfoarray.GetAt(i).GetTime();_lists.SetItemText(i,ATTENDANCE_LIST_EWORKTIME_IDX,t);i+;
38、if(iiMax)break;if(dt1dt2|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(dtdayb);dtdayb.SetDateTime(dtdayb.GetYear(),dtdayb.GetMonth(),dt
39、dayb.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),dtsampm(0,12,0,0),dtspan=dt2-dtdayb;int days=dtspan.GetTotalDays()+1;
40、/查询的总天数j=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).GetDateTim
41、e2();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=_queryresultarr
42、ay.GetAt(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,_qu
43、eryresultarray.GetAt(i).GetName();_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.Ge
44、tAt(i);/正常上课时间/没有时间记录即为缺勤else if(s1=&s2=)_absentarray.Add(_queryresultarray.GetAt(i);/缺勤总表_employstatinfoarray.GetAt(i).m_absent.Add(dat);/单个学生缺勤统计表dat.m_time=上课;_employstatinfoarray.GetAt(i).m_norecord.Add(dat);/未刷卡记录表dat.m_time=下课;_employstatinfoarray.GetAt(i).m_norecord.Add(dat);/未刷卡记录表 else if(s
45、1=)dat.m_time=上课;_employstatinfoarray.GetAt(i).m_norecord.Add(dat);/未刷卡记录表 if(s2!=正常)if(s2=)dat.m_time=下课;_employstatinfoarray.GetAt(i).m_norecord.Add(dat);/未刷 卡记录表 else _leaveearlyarray.Add(_queryresultarray.GetAt(i);_employstatinfoarray.GetAt(i).m_leave.Add(dat);void CAttendance:SetQueryResultDate
46、(COleDateTime _d)int i;for(i=0;i_queryresultarray.GetSize();i+)_queryresultarray.GetAt(i).SetDate(_d.Format(%Y-%m-%d);_queryresultarray.GetAt(i).SetWeek(WeekDay_d.GetDayOfWeek()-1);void CAttendance:ReSetQueryResultTime()int i;for(i=0;i_queryresultarray.GetSize();i+)_queryresultarray.GetAt(i).SetSTim
47、e();_queryresultarray.GetAt(i).SetETime();void CAttendance:Addrecord(const int _i)int i,j,k;CString t1,t2,t3;COleDateTime dt1,dt2;CDateAndTime dat;COleDateTimeSpan dts2(0,12,0,0),dts0;t1=m_attendanceinfoarray.GetAt(_i).GetName();t2=m_attendanceinfoarray.GetAt(_i).GetDepartment();dt1=m_attendanceinfo
48、array.GetAt(_i).GetDateTime2();dt2.SetDateTime(dt1.GetYear(),dt1.GetMonth(),dt1.GetDay(),0,0,0);dts0=dt1-dt2;for(i=0;i_queryresultarray.GetSize();i+)if(_queryresultarray.GetAt(i).GetName()=t1)&(_queryresultarray.GetAt(i).GetDepartment()=t2)dat.m_date=_queryresultarray.GetAt(i).GetDate();dat.m_time=d
49、t1.Format(%H:%M:%S);/if(dts0 m_startworktime)/_queryresultarray.GetAt(i).SetSTime(正常);/else if(dts0 dts2)/_queryresultarray.GetAt(i).SetSTime(dt1.Format(%H:%M:%S);/_latearray.Add(_queryresultarray.GetAt(i);/迟到/_employstatinfoarray.GetAt(i).m_late.Add(dat);/单个学生迟到统计表/else if(dts0 m_endworktime)/_quer
50、yresultarray.GetAt(i).SetETime(dt1.Format(%H:%M:%S);/_leaveearlyarray.Add(_queryresultarray.GetAt(i);/早退/_employstatinfoarray.GetAt(i).m_leave.Add(dat);/单个学生早退统计表/else /_queryresultarray.GetAt(i).SetETime(正常);/break;/2011/08/02 13:27/上午if(dts0 m_startworktime)/正常上课时间前刷卡/正常上课时间前,不计多次刷卡/if(_queryresul