1、本科学生设计性实验报告一、实验名称:企业备忘录管理系统二、实验目的1掌握数据库设计的基本技术,熟悉数据库设计的每个步骤中的任务和实施方案,并加深对数据库系统系统概念和特点的理解。2初步掌握基于C/S的数据库应用系统分析、设计和实现方法。3进一步提高学生分析与解决问题的综合能力。4培养团队合作精神。三、实验内容在SQL Server2005数据库管理系统上,利用VC+开发工具开发一个企业备忘录系统的数据库应用系统。四、实验过程1 系统需求说明在企业管理中,对于信息的处理是最重要的一环,其方式体现现在信息的采集、清理、分析、保存、失效的生命周期中。设计一个企业备忘录管理系统,可以极大的提高企业的信
2、息流转效率,从而提高生产率。这个系统包含的模块主要用户登陆、备忘录类型社顶、信息录入以及特定信息采集2 数据库结构设计(1)系统功能进入系统前需要身份验证用户可以根据需要定义备忘录的信息拥护可以定义企业员工的信息具体的时间信息有拥护登入根据不同的要求,可以在数据库中对时间进行查询和编辑(2)功能模块划分企业备忘录管理系统身份验证成员信息管理类型管理备忘录管理查询管理增加新成员增加新类型增加条目生日提示修改成员信息修改类型信息修改条目备忘录提示删除成员信息删除类型信息删除条目大事记企业备忘录管理系统模块示意图(3)系统流程分析登陆界面用户验证成员信息管理查询管理类型管理备忘录管理推出系统系统流程
3、图3 数据库设计(1)数据库需求设计企业成员基本信息:成员ID、姓名、出生日期、性别、籍贯、职位。备忘录类型信息:备忘录类型ID、备忘录名称。备忘录信息:备忘录ID、备注企业成员ID、备忘录操作日期、备忘录发生日期、是否有重大事件、时间花费、备忘录类型ID、备忘录内容。(2)数据库逻辑结构设计企业成员基本信息表字段名称数据类型可否为空约束条件说明member_idINTEGERNOT NULL主键成员IDmember_nameVARCHAR(24)NOT NULL无姓名birth_dateDATENOT NULL无出生日期member_genderVARCHAR(2)-member_posit
4、ionVARCHAR(10)NULL 无职位备忘录类型信息表字段名称数据类型可否为空约束条件说明 type_idINTEGERNOT NULL主键备注类型IDtype_nameVARCHAR(24)NOT NULL无备注类型名称备忘录信息表字段名称数据类型可否为空约束条件说明memo_idINTEGERNOT NULL主键备注信息ID、ID值从系统中获取member_idINTEGERNOT NULL外键(family_member_tab)成员IDoper_dateDATENOT NULL无操作备忘录信息时间happen_dateDATENOT NULL无备忘录发生时间is_bigevent
5、INTEGERNOT NULL无是否为重大事件,1代表大事件event_costVARCHAR(20)NULL无时间花费type_idINTEGERNOT NULL外键(memo_type_tab)备注类型IDmemo_textCARCHAR(100)NULL无备注信息企业备忘录管理系统E-R图4 系统实现(1)创建数据库创建表的SQL语句:IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = company_member_tab) DROP TABLE company_member_tab-
6、创建企业成员基本信息表CREATE TABLE company_member_tab(member_id INT IDENTITY(1,1) PRIMARY KEY ,member_name VARCHAR(24) NOT NULL,member_position VARCHAR(10),birth_date DATETIME NOT NULL,member_gender VARCHAR(5),member_hometown VARCHAR(20);IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NA
7、ME = memo_type_tab) DROP TABLE memo_type_tab-创建备忘录类型信息表 CREATE TABLE memo_type_tab(type_id INT PRIMARY KEY ,type_name VARCHAR(24) NOT NULL);IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = memo_info_tab) DROP TABLE memo_info_tab-创建备忘录类型信息表CREATE TABLE memo_info_tab(memo_
8、id INT NOT NULL PRIMARY KEY ,member_id INT NOT NULL,oper_date DATETIME NOT NULL,happen_date DATETIME NOT NULL,is_bigevent INT NOT NULL CHECK (is_bigevent IN (0, 1),event_cost VARCHAR(20),type_id INT NOT NULL,memo_text VARCHAR(1000) NULL,FOREIGN KEY (member_id) REFERENCES company_member_tab ,FOREIGN
9、KEY (type_id) REFERENCES memo_type_tab );表的截图企业成员基本信息表备忘录类型信息表备忘录信息表(2)工程框架设计设计主界面并增添函数 公司成员基本信息管理控件列表控件类型ID属性变量或函数Group BoxIDC_STATIC公司成员基本信息管理无List ControlIDC_LIST_FAMILY_MEMBER无列表控件类型变量m_listMemberButtonIDC_BTN_ADD_MEMBER添加函数OnBtnAddMember()添加公司成员信息ButtonIDC_BTN_MOD_MEMBER修改函数OnBtnModMember()修改公司
10、成员信息ButtonIDC_BTN_DEL_MEMBER删除函数OnBtnDelMember()删除公司成员信息 备忘录配置信息管理控件列表控件类型ID属性变量或函数Group BoxIDC_STATIC备忘录类型信息管理无List ControlIDC_LIST_MEMO_TYPE无列表控件类型变量m_listTypeButtonIDC_BTN_ADD_TYPE添加函数OnBtnAddType()添加备忘录类型信息ButtonIDC_BTN_MOD_TYPE修改函数OnBtnModType()修改备忘录类型信息ButtonIDC_BTN_DEL_TYPE删除函数OnBtnDelType()删
11、除备忘录类型信息备忘录信息管理控件列表控件类型ID属性变量或函数Group BoxIDC_STATIC备忘录信息管理无List ControlIDC_LIST_MEMO_INFO无列表控件类型变量m_listTypeButtonIDC_BTN_ADD_MEMO添加函数OnBtnAddMemo()添加备忘录类型信息ButtonIDC_BTN_MOD_MEMO修改函数OnBtnModMemo()修改备忘录类型信息ButtonIDC_BTN_DEL_MEMO删除函数OnBtnDelMemo()删除备忘录类型信息查询备忘录信息控件列表控件类型ID属性变量或函数Group BoxIDC_STATIC备忘
12、录信息管理无ButtonIDC_BTN_QUERY_BIRTH生日提示函数OnBtnQueryBirth()处理生日提示信息ButtonIDC_BTN_MEMO_INFO备忘录提示函数OnBtnMemoInfo()处理备忘录信息提示ButtonIDC_BTN_MEMO_EVENT大事记函数OnBtnMemoEvent()处理大事记信息主对话框类名称为CMemoDBSDlg,资源ID为IDD_MEMODBS_DIALOG,对话框名称为“公司备忘录管理系统”。主界面用到了3个列表控件分别显示公司成员基本信息,备忘录类型信息和备忘录信息。需要为这3个列表控件添加显示的列,从而显示相应的数据信息。为了
13、代码设计的清晰,在CMemoDBSDlg类中定义了一个InitConcrol私有函数负责添加控件的显示列。InitConcrol函数代码如下:void CMemoDBSDlg:InitControl()/设置列表控件扩展风格DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE | LVS_EX_UNDERLINEHOT;m_listMember.SetExtendedStyle(dwExStyle);m_listMemoInfo.SetEx
14、tendedStyle(dwExStyle);m_listType.SetExtendedStyle(dwExStyle);/初始化公司成员列表控件m_listMember.InsertColumn(0,ID,LVCFMT_CENTER,30);m_listMember.InsertColumn(1,姓名,LVCFMT_CENTER,60);m_listMember.InsertColumn(2,职位,LVCFMT_CENTER,60);m_listMember.InsertColumn(3,出生日期,LVCFMT_CENTER,60);m_listMember.InsertColumn(4,
15、性别,LVCFMT_CENTER,40);m_listMember.InsertColumn(5,籍贯,LVCFMT_CENTER,100);/初始化备注类型列表控件m_listType.InsertColumn(0,类型ID,LVCFMT_CENTER,60);m_listType.InsertColumn(1,类型名称,LVCFMT_CENTER,100);/初始化备注信息列表控件m_listMemoInfo.InsertColumn(0,备忘录ID,LVCFMT_CENTER,60);m_listMemoInfo.InsertColumn(1,姓名,LVCFMT_CENTER,60);m
16、_listMemoInfo.InsertColumn(2,备忘录操作日期,LVCFMT_CENTER,140);m_listMemoInfo.InsertColumn(3,备忘录发生日期,LVCFMT_CENTER,140);m_listMemoInfo.InsertColumn(4,大事件,LVCFMT_CENTER,60);m_listMemoInfo.InsertColumn(5,事件花费,LVCFMT_CENTER,60);m_listMemoInfo.InsertColumn(6,备注类型,LVCFMT_CENTER,60);m_listMemoInfo.InsertColumn(7
17、,备注内容,LVCFMT_CENTER,200);在InitConcrol函数中首先调用CListCtrl的SetExtendedStyle方法设置控件的扩展风格。这3个空间设置了相同的风格,以确保界面的一致性,设置扩展风格后的公司成员列表控件获取鼠标选择和鼠标略过情况的样式如图(3)连接数据库系统启动之后,可以将数据库中的数据升秒年十时毫 到界面上,首先需要处理数据库的连接问题,需要3个函数:ODBC数据源名称、数据库用户名称、数据库用户密码。数据库用户的名称和密码均为dbaccess。在CMemoDBSDlg类的OnInitDialog函数中处理数据库的连接。其中关键代码为:BOOL CM
18、emoDBSDlg:OnInitDialog()CLoginDlgdlg; BOOL login=TRUE,DB_SYS_EXIT=FALSE; while (login) if(dlg.DoModal()=IDOK) CString strConnect; strConnect.Format(DSN=%s;PWD=%s,dlg.m_strDBSource,dlg.m_strDBUser,dlg.m_strDBPassword); TRY m_db.OpenEx(strConnect,CDatabase:noOdbcDialog); login=FALSE; CATCH(CDBExceptio
19、n,ex) AfxMessageBox(ex-m_strError); AfxMessageBox(ex-m_strStateNativeOrigin); AND_CATCH(CMemoryException,pEx) pEx-ReportError(); AfxMessageBox(memory exception); AND_CATCH(CException,e) TCHAR szError100; e-GetErrorMessage(szError,100); AfxMessageBox(szError); END_CATCH else login=FALSE; DB_SYS_EXIT=
20、TRUE; if(DB_SYS_EXIT) CDialog:OnCancel(); else InitControl(); InitCtrlData(); OnInitDialog函数首先判断数据库是否打开,如果已打开就退出函数,否则创建一个数据库的连接字符串,利用CDatabase的OpenEx方法打开数据库的连接,并处理数据库的异常。(4)显示数据到界面上连接数据库之后,西药把数据库中的数据显示在3个列表控件中。在CMemoDBSDlg类中定义一个InitCtrlData私有函数,负责从数据库中读取数据并显示到列表控件中。同时还需要定义3个分别把数据插入到列控件中的函数,分别为Insert
21、MemberItem,InsertMemoTypeItem,InsertMemoInfoItem,在MemoDBSDlg.h文件中添加这3个函数定义。代码为:private:/向公司成员信息列表框中插入公司成员列表信息void InsertMemberItem(int id, CString name, CString position,CString date,CString gender,CString hometown);/向备忘录类型信息列表框中插入类型信息.void InsertMemoTypeItem(int id,CString name);/向备忘录列表框中插入备忘录信息.vo
22、id InsertMemoInfoItem(int id, CString name, CString operDate, CString happenDate, int isEvent, CString cost,CString type, CString memoTxt);/从数据库中读取数据,并显示在.列表框中.void InitCtrlData(); /初始化列表控件.void InitControl();向公司成员信息列表控件中插入公司成员信息的函数是InsertMemberItem。代码为:void CMemoDBSDlg:InsertMemberItem(int id,CStri
23、ng name,CString position,CString date,CString gender,CString hometown)int nIndex=m_listMember.GetItemCount();LV_ITEM IvItem;IvItem.mask=LVIF_TEXT;IvItem.iItem=nIndex;IvItem.iSubItem=0;CString temp;temp.Format(%d,id);IvItem.pszText=(char*)(LPCTSTR)temp;m_listMember.InsertItem(&lvItem);m_listMember.Se
24、tItemText(nIndex,1,name);m_listMember.SetItemText(nIndex,2,position);m_listMember.SetItemText(nIndex,3,date);m_listMember.SetItemText(nIndex,4,gender);m_listMember.SetItemText(nIndex,5,hometown);向备忘录类型信息列表控件中添加备忘录类型信息的函数InsertMemoTypeItem。代码为:void CMemoDBSDlg:InsertMemoTypeItem(int id ,CString name)
25、int nIndex=m_listType.GetItemCount(); LV_ITEM lvItem; lvItem.mask=LVIF_TEXT; lvItem.iItem=nIndex; lvItem.iSubItem=0; CString temp; temp.Format(%d,id); lvItem.pszText=(char*)(LPCTSTR)temp; m_listType.InsertItem(&lvItem); m_listType.SetItemText(nIndex,1,name);向备忘录信息列表控件中田间被望里信息的函数是InsertMemoInfoItem。代
26、码为:void CMemoDBSDlg:InsertMemoInfoItem(int id,CString name,CString operDate,CString happenDate,int isEvent,CString cost,CString type,CString memoTxt)int nIndex=m_listMemoInfo.GetItemCount();LV_ITEM lvItem;lvItem.mask=LVIF_TEXT;lvItem.iItem=nIndex;lvItem.iSubItem=0;CString temp;temp.Format(%,id);lvIt
27、em.pszText=(char*)(LPCTSTR)temp;m_listMemoInfo.InsertItem(&lvItem);m_listmemoInfo.SetItemText(nIndex,1,name);m_listmemoInfo.SetItemText(nIndex,2,operDate);m_listmemoInfo.SetItemText(nIndex,3,happenDate); m_listmemoInfo.SetItemText(nIndex,4,isEvent=0?否:是); m_listmemoInfo.SetItemText(nIndex,5,cost); m
28、_listmemoInfo.SetItemText(nIndex,6,type); m_listmemoInfo.SetItemText(nIndex,7,memoTxt);从数据库中读取数据并显示到3个列表控件中的函数为InitCtrlData。代码为:void CMemoDBSDlg:InitCtrlData()TRYCRecordset rs; rs.m_pDatabase=&m_db; CString sql=Select*from company_member_tab; rs.Open(CRecordset:dynaset,sql);int id;CString name,posit
29、ion,date,gender,hometown;while(!rs.IsEOF()CDBVariant var;rs.GetFieldValue(short)0,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NULL)id=var.m_iVal;var.Clear();rs.GetFieldValue(1,name); rs.GetFieldValue(2,position); rs.GetFieldValue(3,date); rs.GetFieldValue(4,gender); rs.GetFieldValue(5,hometown);InsertMem
30、berItem(id,name,position,date,Left(10),gender,hometown);rs.MoveNext();rs.Close();sql=Select*from MEMO_TYPE_TAB;rs.Open(CRecordset:dynaset,sql);while(!rs.IsEOF()CDBVariant var;rs.GetFieldValue(short)0,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NULL)id=var.m_iVal;var.Clear();rs.GetFieldValue(1.name);Inser
31、tMemoTypeItem(id,name);rs.MoveNext();rs.Close();sql=Select*from MEMO_INFO_TAB;rs.Open(CRecordset:dynaset,sql);while(!rs.IsEOF()CDBVariant var;int memoID,memberID,isEvent,nTYPE;CString,happenDate,operDate,memoTxt,strName,strType,cost;rs.GetFieldValue(short)0,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NUL
32、L)memoID=var.m_iVal;var.Clear();rs.GetFieldValue(1,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NULL)memberID=var.m_iVal;var.Clear();rs.GetFieldValue(2,operDate);var.Clear();rs.GetFieldValue(3,happenDate)var.Clear();rs.GetFieldValue(4,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NULL)isEvent=var.m_iVal;var.Clea
33、r();rs.GetFieldValue(5,cost);rs.GetFieldValue(6,var,SQL_C_SLONG);if(var.m_dwType!=DBVT_NULL)nType=var.m_iVal;var.Clear();rs.GetFieldValue(7,memoTxt);CRecordset rs2(&m_db);CString temp;temp.Format(Select MEMBER_NAME from COMPANY_MEMBER_TAB where MEMBER_ID=%d,memberID);rs2.Open(CRecordset:dynaset,temp
34、);if(!rs2.IsEOF()rs2.GetFieldValue(short)0,strName); var2.Close(); temp.Format(Select TYPE_NAME from MEMO_TYPE_TAB where TYPE_ID=%d,nType); rs2.Open(CRecordset:dynaset,temp); if(!rs2.IsEOF() rs2.GetFieldValue(short)0,strType); var2.Close();InsertMemoInfoItem(memoID,strName,operDate.Left(19),happenDa
35、te.Left(19),isEvent,cost,strType,memoTxt);rs.MoveNext();CATCH(CDBException,ex)AfxMessageBox(ex-m_strError); AfxMessageBox(ex-m_strStateNativeOrigin);AND_CATCH(CException,e)TCHAR szError100;e-GetErrorMessage(szError,100); AfxMessageBox(szError); END_CHTCH(5)工程模块设计工程框架设计完成之后就可以根据需求对各个模块进行实现了。本系统中需要编码实
36、现的主要有登陆、成员信息管理、类型信息管理、备忘录管理与查询管理5个模块。1.登陆模块设计在进入主对话框之前,首先调用登陆对话框,有数据源名称、用户名和密码3个部分组成。在系统中添加的对话框类名称为CLoginDlg,资源ID为IDD_DIALOG_LOGIN,界面设计如图:2.成员信息模块设计公司成员基本信息的管理包括了公司成员基本信息的添加、修改和删功能。添加的对话框类名称为CMemberDlg,资源ID为IDD_DIALOG_MEMBER。界面如图:公司成员基本信息控件列表控件类型ID属性变量或函数LabelIDC_STATIC姓名无Edit BoxIDC_EDIT_NAME无CStri
37、ng类型变量m_strNameLabelIDC_STATIC职位无Edit BoxIDC_EDIT_POSITION无CString类型变量m_strPositionLabelIDC_STATIC生日无DateTime PickerIDC_DT_BIRTH无COleDateTime类型变量m_dtBirthLabelIDC_STATIC性别无Edit BoxIDC_EDIT_GENDER无CString类型变量m_strGenderLabelIDC_STATIC籍贯无Edit BoxIDC_EDIT_HOMETOWN无CString类型变量m_strHometownButton确定确定无But
38、tonIDCANCEL取消无1 添加公司成员信息利用“公司成员信息”对话框能够方便的实现公司成员信息的添加操作。添加公司成员的函数为OnBtnAddMember。代码为:void CMemoDBSDlg:OnBtnAddMember() / TODO: Add your control notification handler code here/创建一个成员对话框实例CMemberDlg dlg;/打开成员对话框if(dlg.DoModal() = IDOK)/从对话框中获取姓名和生日参数.CString strName = dlg.m_strName;CString strPosition
39、 = dlg.m_strPosition;CString strBirth = dlg.m_dtBirth.Format(%Y-%m-%d);CString strGender = dlg.m_strGender;CString strHometown = dlg.m_strHometown;TRY/打开记录集,获取最大的成员ID值.CRecordset rs(&m_db);rs.Open(CRecordset:dynaset, Select max(member_id) from company_member_tab);/设置新添加记录的成员ID值.int newMemberID = 1;/
40、如果数据库里面已经有记录了,则新的成员ID是成员ID最大值+1if(!rs.IsEOF() CDBVariant var;rs.GetFieldValue(short)0, var, SQL_C_SLONG);if (var.m_dwType != DBVT_NULL)newMemberID = var.m_iVal + 1;/创建插入新记录的字符串.CString sql ;sql.Format(Insert into company_member_tab(member_name,member_position,birth_date,member_gender,member_hometown) VALUES( %s,%s,%s,%s,%s),strName,strPosition,strBirth,strGender,strHometown);TRACE(sql);/把新记录插入到数据库中.m_db.ExecuteSQL(sql);/把新记录的信息显示在成员列表控件中.InsertMemberItem(newMemberID,strName,strPosition,st