SQLite 数据库是以表的形式存储数据,本系统的数据表结构设计如下表1所示,包含10项条目。 表1 设计的数据表结构 [序号\&fault_id\&整型\&主键 自动录入\&登录人\&user\&字符型\&手动输入(可查项)\&日期\&date\&日期型\&手动输入(可查项)\&时间\&time\&字符型\&手动输入\&平台\&path\&字符型\&下拉菜单选择(可查项)\&信源类型\&source\&字符型\&下拉菜单选择(可查项)\&故障节点\&node\&字符型\&下拉菜单选择(可查项)\&故障频道\&program\&字符型\&下拉菜单选择(可查项)\&故障原因\&description\&字符型\&下拉菜单选择(可查项)\&备注\&remark\&字符型\&手动输入\&] 1.3 软件设计 基于MFC的非模态对话框设计,以模块化逐层对话框展开呈现,支持后续的功能扩展,目前除包含录入与查询的基础功能之外,还附加通知和通讯录功能。具体的界面安排及实现全部本着贴近实际使用流程而布置,也保障了从思维模式到使用习惯的平稳过渡,另外查询结果可以完整导出到Excel文档中,方便转发以及更高自由度的灵活编辑,弥补了数据库格式化以及本地化存储的局限性。 1.3.1 开始界面 开始界面(图2) 分为录入、查询、通知、通讯录四个子模块,每个子模块对话框都以非模态为基础支持并发打开操作、拖动等,互不影响限制。开始界面在最小化时做了托盘处理,减少任务栏的占用,也防止误关闭。另外,通过增加布尔型变量InitDabase() 判断数据库初始化是否成功。如果判断条件失败,会通过函数AfxMessageBox弹出消息框“打开数据库失败”,同时EnableWindow函数将录入和查询模块锁定为禁止状态,避免使用人员在做无用功。 1.3.2 录入模块 录入界面(图3) 分为登录人、日期、时间、平台、信源类型、故障节点、故障频道、故障现象、备注9个可录入点来完成一张表的日志信息录入工作。其中平台、信源类型、故障节点、故障频道、故障现象项都可以通过下拉菜单的形式直接选择所,备注部分用来完善辅助补充说明现象、处理情况等,可以在此灵活描述。 主要用到的MFC控件有Edit Control和Combo-box Control两项。通过GetWindowText函数将每个控件内的具体数据写入字符数组,调用已定义的Faults类下的成员函数SetXX和GetXX进行赋值与传参,使用sql语句执行insert插入语句并调用api ExecSQL(sql) 执行底层操作(图4) 。 期间又增加了两项安全提示:一、用逻辑或的关系将“登录人”、“日期”、“时间”三项需操作人手动填入的进行判断,任意一栏没填则弹出Message提示,防止漏填。其二,在点击“录入”按钮时添加MessageBox提示“是否确定录入”,给操作人一个修改检查的机会。最后根据录入返回值提示录入成功或失败。 1.3.3 查询模块 查询界面(图5) 分为登录人、日期、平台、信源类型、故障节点、故障频道、故障现象 7个可复选选项,通过任意条件组合可以迅速精确定位到查询结果,所得结果以建立窗体列表形式呈现。查询结果有数据统计、删除以及保存功能并支持完整导入到Excel文档。 主要用到的MFC控件有List Control、Check-box Control、Combo-box Control和Edit Control。对于复选组合这部分的实现,分控件勾选和逻辑实现两部分。使用GetCheck()函数去判断选项是否勾选,定义变量 ifFirstChoice作为逻辑判断,并赋予初始值为true,将其放在条件语句中作为判断sql查询语句后是否加“and”的依据(图6) 。根据选择的条件将查询结果返回到vector数组中,最后插入到CListCtrl控件中显示。 在查询的同时,使用GetItemCount()函数得到查询结果数量,并通过静态文本显示统计结果。删除部分的功能,由于两条记录总会有可能完全一样,所以选取唯一每条信息的ID值作为sql删除语句的条件。使用OnNMClick事件处理配合GetFirstSelectedItemPosition函数通过点击某一行得到当前行数以及第0列中存储的这条记录fault_id号。根据行号从CListCtrl列表中删除所显示内容,根据记录的fault_id号删除在数据库中对应记录内容。删除前依旧使用MessageBox做删除提示,防止误删。 保存功能,使用api SHGetSpecialFolderPath获取当前用户的桌面路径,通过文件流格式化输出(图8) ,将存储在数组里的数据以txt形式保存到桌面,并以tab键作为分隔符以支持完整格式导入到Excel文件中。 1.3.4 通知模块 在Edit Control控件内写入需要转达的通知,和其他模块窗口不同,并不使用DestroyWindow()在关闭窗口时进行销毁,所以可以在内存中保留数据。用MFC封装的CStdioFile类进行文件流操作,完成文本形式的本地读取与存储功能。运用setlocale()函数进行环境设置以便解决读取文本时Unicode和ANSI编码之间不兼容的转换问题。同时在读取时利用LineScroll使垂直滚动条自动滚动到底端,方便操作者看到最新的通知。 另外有提醒功能,点击“提醒”按钮出现“有一条新通知,请查看!!”的醒目水印,通过设置全局变量将此静态文本传递到通知、查询、录入三个界面中。使用者在看到提醒并阅读通知后,可以点击已阅来取消水印(图7) 。 1.3.5 通讯录模块 使用CListCtrl控件,将公司各部、集团相关重要部门、合作方以及各系统第三方技术支持等重要人员信息以及联系方式都一一汇总,方便应急联系。可通过查找关键词迅速定位。 其原理是通过每行和每列的遍历将关键词变量myFindStr与列表内荣进行核实匹配,先将所有匹配项保存坐标到二维数组resultVector里。点击查找时,垂直滚动条滚动到二维数字里第一条保存结果所在的行数并且高亮。通过条件语句判断,如果此时再点击查找且所搜索的关键词与第一次相同即lastSearchStr = myFindStr,则指针累加移动一位,起到“查找下一个”的作用。反之,则二维数组清零重新遍历(图8) 。 |