《数据库系统》课程设计
课题
班级
学号
姓名
指导教师
时间:2015.6.15—2015.6.26
1 系统需求分析
1.1系统功能分析
员工培训系统需要实现的主要功能包括: ● 企业总体培训课程的设置和安排。
● 允许员工根据自己的情况选择合适的课程和上课时间。
● 对选课结果进行统计报表。允许员工对最后选课结果的查询。 ● 培训考核成绩的输入和查询。 ● 员工培训效果的综合报表。 ● 员工个人信息的修改。
1.2系统功能模块设计(划分)
本系统涉及到员工和培训管理部门之间的交流,因此需要根据用户的不同分成两大功能模块。这两个模块的功能和使用的权限完全不同。本系统功能模块如图1所示。
1.3与其它系统的关系
员工培训系统可以为员工素质技能的评价提供可靠的依据,是职务评定的一个参考信息源。系统本身需要用到人事管理系统中的员工基本信息和部门信息等辅助资料,这些数据可以通过数据库直接读取。
1.4数据流程图
员工培训管理系统的数据流程如图2所示。
2 数据库设计
2.1数据库需求分析
根据系统数据流程图,我们可以列出以下系统所需的数据项和数据结构: ● 课程设置:编号、名称、简介、所用教材、上课地
点、人数、上课时间
● 选课结果:记录编号、员工、课程、考核成绩、评价、考核日期。 所需的外部数据支持:
● 人员信息:员工号、密码、权限、姓名、部门、当前状态等。 ● 部门设置:部门编号、名称等。
2.2数据库概念结构设计
图3是本系统所需数据的E-R 模型图。
图2、培训管理数据流程图
2.3数据库逻辑结构设计
根据E-R图和数据库需求分析,培训管理系统需要创建2个主要的数据表:课程设置表和培训安排表。对应这两个表中的个别代码字段,又需要创建2个代码表:课程状态代码表和考核评价代码表。这4个数据表的结构如表1至表4所示。员工信息和部门信息作为外部数据支持可以使用人事管理系统中建立的数据表,如表5和表6所示。
员工
PK员工号
密码
权限
姓名
职务
部门
当前状态
FK1部门编号
培训
PK ID
成绩
评价
考核日期
FK1员工号
FK2编号
课程
PK编号
名称
简介
教材
上课地点
上限人数
上课时间
课程状态部门
PK部门编号
部门名称
图3、培训管理E-R图
字段名数据类型是否可空说明
ID 课程编号
NAME 课程名
TEACHER 任课教师(外部关键字PERSON)INTRO 课程简介
BOOK 所用教材CLASSROOM 上课地点
NUMBER 课程上限人数CLASSTIME 开课时间STATE 状态(外部关键字COURSE_STATE)字段名数据类型是否可空说明
ID 编号PERSON 员工(外部关键字PERSON)COURSE 课程
SCORE 成绩APPRAISEMENT 评价(外部关键字APPRAISEMENT)EXAM_DATA 考核日期字段名数据类型是否可空说明
CODE 状态代码DESCRIPTION 描述字段名数据类型是否可空说明
CODE 评价代码DESCRIPTION 描述
字段名数据类型是否可空说明
ID 员工号(主关键字)
2.4数据库的建立
2.4.1数据库的建立
2.4.2初始数据的输入
本系统中,初始数据包括课程状态代码和评价代码,如表7至表8所示。
表8 考核评价代码
(以下各部分请设计者完成)。
3 各功能模块的设计与实现
3.1功能说明
本管理系统主要分为两大部分:培训管理应用程序和学员选课应用程序。培训管理应用程序主要用于培训中心的管理人员对培训课程和培训情况进行维护。此应用程序主要包括四项功能:课程设置、选课结果查询修改、成绩输入、培训成绩统计报表。另外,系统需要有登录窗口(用于权限认证)和导航窗口(用于连接各项功能)。学员选课应用程序包括个人信息修改、选课和成绩查询三项功能。
(一)培训管理管理应用程序功能说明
(二)学员选课应用程序功能说明
3.2用户界面设计
完成数据库创建和功能说明以后,我们可以进行下一步工作,既设计用户界面。
1、培训管理应用程序登录窗体的创建
2、培训管理应用程序主窗体的创建
3、课程设置窗体的创建
4、选课结果查询窗体的创建
5、学员名单报表窗体的创建
6、考核评定结果窗体的创建
7、培训统计窗体的创建
8、培训成绩报表窗体的创建
9、学员选课客户端界面的创建
3.3各功能模块的实现
1、培训管理应用程序数据模块的创建
2、培训管理应用程序登录程序的实现
3、课程设置模块的实现
4、选课结果查询的实现
5、学员名单报表的实现
6、考核评定结果的实现
7、培训统计的实现
8、培训成绩报表的实现
9、学员选课客户端应用程序的创建
4 系统实现
基本方法:通过一个ado控件与数据库进行连接,一个datagrid控件显示表信息。1 edit控件对应表的字段。button按钮对应“查询”、“更新”、“删除”和“添加”。
4.1登陆界面:
//登陆按钮功能
/*
1.首先连接数据库
2.通过sql语句获得PERSON表的信息,得到与输入账号名相对应的账号密码(sql.Format("select * from person where P_ID = '%s' and P_PASSWD = '%s'",this->m_id,this->m_password);)
3.判断输入的密码与从数据库中得到的密码是否相一致
4. 得到与输入账号名相对应的账号权限
5.判断用户的身份,选择进入不同的功能界面
*/
void CEmploymentDlg::OnButton1()
{this->UpdateData(true);
//连接数据库
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
try{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConn="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return ;
}
//定义sql查询
CString sql;
variant_t RecordsAffected;
_RecordsetPtr m_pRecordset;
sql.Format("select * from person where P_ID = '%s' and P_PASSWD =
'%s'",this->m_id,this->m_password);
//执行SQL查询
m_pRecordset = m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdText);
//如果找到
if(!m_pRecordset->adoEOF)
{
RecordsAffected=m_pRecordset->GetCollect("p_authority");
CString authority=(LPCSTR)_bstr_t(RecordsAffected);
//int i=(int)RecordsAffected.iVal;
if(authority=="employee"){
this->ShowWindow(SW_HIDE);
id=this->m_id;
employer dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}else {
this->ShowWindow(SW_HIDE);
teacher dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
}
else MessageBox("用户名或密码有误");
}
//退出按钮功能,直接调用exit(0)退出整个程序
void CEmploymentDlg::OnButton2()
{exit(0);}
/*
1.这个界面主要是有三个按钮,用来选择进入不同的功能区
*/
void employer::OnButton1()
{
this->ShowWindow(SW_HIDE);//当前界面隐藏
employer_chioce dlg; //需要添加该C***Dlg.h头文件,否则编译通不过
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
void employer::OnButton2()
{
this->ShowWindow(SW_HIDE);//当前界面隐藏
employer_score dlg; //需要添加该C***Dlg.h头文件,否则编译通不过
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
void employer::OnButton3()
{
this->ShowWindow(SW_HIDE);//当前界面隐藏
employer_information dlg; //需要添加该C***Dlg.h头文件,否则编译通不过dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
void employer::OnButton4()
{
exit(0);
}
/*
点击显示个人课程,会显示出个人课程
这部份功能主要有:
1.查找
2.增加
3.删除
*/
//增加选择课程
/*
1.连接数据库
2.定义sql1,sql2用于获得信息,和添加课程
sql.Format("select * from course where C_ID = '%s'",this->m_add_id);
sql2.Format("SELECT C_NAME,COUNT(C_ID) as num FROM TRAINING_PLAN,PERSON,COURSE WHERE P_ID=T_PERSON and C_ID=T_COURSE GROUP BY C_NAME");
3.差错控制选课人数与选课上限人数
4.其余的功能和增加功能只是sql语句的差别,就不详细描述了
*/
void employer_chioce::OnButton1()
{
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return;
}
//定义sql查询
CString sql,sql2;
variant_t RecordsAffected,RecordsAffected2;
_RecordsetPtr m_pRecordset,m_pRecordset2;
sql.Format("select * from course where C_ID = '%s'",this->m_add_id);
sql2.Format("SELECT C_NAME,COUNT(C_ID) as num FROM TRAINING_PLAN,PERSON,COURSE WHERE P_ID=T_PERSON and C_ID=T_COURSE GROUP BY C_NAME");
//执行SQL查询
m_pRecordset = m_pConnection->Execute((_bstr_t)sql,&RecordsAffected,adCmdText);
m_pRecordset2 = m_pConnection->Execute((_bstr_t)sql2,&RecordsAffected2,adCmdText);
RecordsAffected=m_pRecordset->GetCollect("C_NUMBER");
CString number=(LPCSTR)_bstr_t(RecordsAffected);
RecordsAffected2=m_pRecordset2->GetCollect("num");
CString num=(LPCSTR)_bstr_t(RecordsAffected2);
if(num<=number){
_variant_t ra;
_bstr_t strAdd="INSERT INTO training_plan VALUES(";
strAdd=strAdd+id+",";
strAdd=strAdd+m_add_id+",0,0,'20150909')";
m_pConnection->Execute(strAdd,&ra,adCmdText);
m_pConnection->Close();
//以下显示当前数据
CString strSQL="SELECT P_NAME,C_ID,C_NAME,C_TEACHER,C_CLASSROOM,C_CLASSTIME,C_STATE,T_EXAM_DATE FROM TRAINING_PLAN,PERSON,COURSE,APPRISEMENT WHERE P_ID=T_PERSON AND C_ID=T_COURSE AND A_CODE=T_APPRISEMENT and T_PERSON= "+id;
m_adodc2.SetRecordSource(strSQL);
m_adodc2.Refresh();
m_datagrid2.ShowWindow(SW_SHOW);
AfxMessageBox("选课成功");
UpdateData(FALSE);
}else {
AfxMessageBox("选课失败,选课人数已达到上限!");
}
}
//显示个人选择课程
void employer_chioce::OnButton4()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString tmpStr,strSQL="SELECT P_NAME,C_ID,C_NAME,C_TEACHER,C_CLASSROOM,C_CLASSTIME,C_STATE,T_EXAM_DATE FROM TRAINING_PLAN,PERSON,COURSE,APPRISEMENT WHERE P_ID=T_PERSON AND C_ID=T_COURSE AND A_CODE=T_APPRISEMENT and T_PERSON= "+id;
m_adodc2.SetRecordSource(strSQL);
m_adodc2.Refresh();
m_datagrid2.ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
//删除选择课程
void employer_chioce::OnButton2()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return;
}
//以下插入数据
_variant_t ra;
_bstr_t strAdd="delete from training_plan where t_person ="+id+" and t_course = "+m_delete_id+"";
//AfxMessageBox(strAdd); return;
m_pConnection->Execute(strAdd,&ra,adCmdText);
m_pConnection->Close();
//以下显示当前数据
CString tmpStr,strSQL="SELECT P_NAME,C_ID,C_NAME,C_TEACHER,C_CLASSROOM,C_CLASSTIME,C_STATE,T_EXAM_DATE FROM TRAINING_PLAN,PERSON,COURSE,APPRISEMENT WHERE P_ID=T_PERSON AND C_ID=T_COURSE AND A_CODE=T_APPRISEMENT and T_PERSON= "+id;
m_adodc2.SetRecordSource(strSQL);
m_adodc2.Refresh();
m_datagrid2.ShowWindow(SW_SHOW);
AfxMessageBox("删除课程成功");
UpdateData(FALSE);
//查找课程ID
void employer_chioce::OnButton5()
{
UpdateData(TRUE);
CString str="select * from course where c_name like '%"+m_name+"%'";
m_adodc1.SetRecordSource(str);
m_adodc1.Refresh();
UpdateData(FALSE);
}
void employer_chioce::OnButton6()
{exit(0);}
void employer_chioce::OnButton7()
{
this->ShowWindow(SW_HIDE);
employer dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
void employer_information::OnButton1()
{UpdateData(TRUE);
CString strSQL="SELECT * from PERSON where P_ID= "+id;
m_adodc1.SetRecordSource(strSQL);
m_adodc1.Refresh();
m_datagrid1.ShowWindow(SW_SHOW);
UpdateData(FALSE);
}
void employer_information::OnButton2()
{
MessageBox("更新个人信息成功!");
UpdateData(TRUE);
_variant_t ra;
_bstr_t strAdd="UPDATE PERSON SET ";
strAdd=strAdd+" p_passwd = "+"'"+m_passwd+"',";
strAdd=strAdd+" P_NAME = "+"'"+m_name+"',";
strAdd=strAdd+" p_sex = "+"'"+m_sex+"',";
strAdd=strAdd+" p_birahday = "+"'"+m_birahday+"',";
strAdd=strAdd+" p_edu_level = "+"'"+m_edu_level+"',";
strAdd=strAdd+" p_speciaty = "+"'"+m_speciaty+"',";
strAdd=strAdd+" p_address = "+"'"+m_address+"',";
strAdd=strAdd+" p_tel = "+"'"+m_tel+"',";
strAdd=strAdd+" p_email = "+"'"+m_email+"',";
strAdd=strAdd+" p_remark = "+"'"+m_pemark+"'";
strAdd=strAdd+" where"+" P_ID = "+id+";";
m_adodc1.SetRecordSource(strAdd);
m_adodc1.Refresh();
MessageBox("更新个人信息成功!");
UpdateData(FALSE);
}
BEGIN_EVENTSINK_MAP(employer_information, CDialog)
//{{AFX_EVENTSINK_MAP(employer_information)
ON_EVENT(employer_information, IDC_DATAGRID1, -601 /* DblClick */, OnDblClickDatagrid1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void employer_information::OnDblClickDatagrid1()
{
UpdateData(TRUE);
int ColNum = 2;
CString colVal;
CColumns cols; //要包含的文件头COlumns.h
CColumn col; //要包含的文件头COlumn.h
VARIANT v_ColNum,v_Value;
cols = m_datagrid1.GetColumns(); //调用GetColumns 返回CDataGrid对应的CColumns对象v_ColNum.vt = VT_I2;
v_ColNum.iVal = 1; //设置列编号
col = cols.GetItem(v_ColNum);//根据列编号返回CColumn 对象
v_Value = col.GetValue();//读取列值
m_passwd = v_Value.bstrVal;
v_ColNum.iVal = 3;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_name = v_Value.bstrVal;
v_ColNum.iVal = 4;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_sex = v_Value.bstrVal;
v_ColNum.iVal = 5;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_birahday = v_Value.bstrVal;
v_ColNum.iVal = 8;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_edu_level = v_Value.bstrVal;
v_ColNum.iVal = 9;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_speciaty = v_Value.bstrVal;
v_ColNum.iVal = 10;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_address = v_Value.bstrVal;
v_ColNum.iVal = 11;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_tel = v_Value.bstrVal;
v_ColNum.iVal = 12;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_email = v_Value.bstrVal;
v_ColNum.iVal = 14;
col = cols.GetItem(v_ColNum);
v_Value = col.GetValue();
m_pemark = v_Value.bstrVal;
UpdateData(FALSE);
}
void employer_information::OnButton4() {
this->ShowWindow(SW_HIDE);
employer dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
void employer_information::OnButton6() {
exit(0);
}
void teacher::OnButton1()
{
this->ShowWindow(SW_HIDE);
tercher_course dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW); }
void teacher::OnButton2()
{ this->ShowWindow(SW_HIDE);
tercher_score dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW); }
void teacher::OnButton3()
{
this->ShowWindow(SW_HIDE);
tercher_result dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW); }
void teacher::OnButton4()
{
this->ShowWindow(SW_HIDE);
tercher_all dlg;
dlg.DoModal();
this->ShowWindow(SW_SHOW); }
void teacher::OnButton5()
{
exit(0);
}
//新增
void tercher_course::OnButton1()
{
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
try{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t
strConn="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return;
}
_variant_t ra;
_bstr_t strAdd="INSERT INTO COURSE VALUES(";
strAdd=strAdd+m_c_id+",";
strAdd=strAdd+"'"+m_c_name+"',";
strAdd=strAdd+"'"+m_c_teacher+"',";
strAdd=strAdd+"'"+m_c_intro+"',";
strAdd=strAdd+"'"+m_c_book+"',";
strAdd=strAdd+"'"+m_c_classroom+"',";
strAdd=strAdd+"'"+m_c_number+"',";
strAdd=strAdd+"'"+m_c_classtime+"',";
strAdd=strAdd+"'"+m_c_state+"');";
//清空输入框
m_c_id=" ";
m_c_name=" ";
m_c_teacher=" ";
m_c_intro=" ";
m_c_book=" ";
m_c_classroom=" ";
m_c_number=" ";
m_c_classtime=" ";
m_c_state=" ";
m_pConnection->Execute(strAdd,&ra,adCmdText);
m_pConnection->Close();
m_adodc1.SetRecordSource("select * from COURSE");
m_adodc1.Refresh();
UpdateData(FALSE);
}
//修改
void tercher_course::OnButton2()
{
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
//在ADO操作中建议语句中要常用到try...catch()来捕获错误信息
//因为它有时会经常出现一些想不到的错误
try
{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return;
}
//以下插入数据
_variant_t ra;
_bstr_t strAdd="UPDATE COURSE SET ";
strAdd=strAdd+" C_NAME = "+"'"+m_c_name+"',";
strAdd=strAdd+" C_TEACHER = "+"'"+m_c_teacher+"',";
strAdd=strAdd+" C_INTRO = "+"'"+m_c_intro+"',";
strAdd=strAdd+" C_BOOK = "+"'"+m_c_book+"',";
strAdd=strAdd+" C_CLASSROOM = "+"'"+m_c_classroom+"',";
strAdd=strAdd+" C_NUMBER = "+"'"+m_c_number+"',";
strAdd=strAdd+" C_CLASSTIME = "+"'"+m_c_classtime+"',";
strAdd=strAdd+" C_STATE = "+"'"+m_c_state+"'";
strAdd=strAdd+" where"+" C_ID = "+m_c_id+";";
m_pConnection->Execute(strAdd,&ra,adCmdText);
m_pConnection->Close();
//以下显示当前数据
m_adodc1.SetRecordSource(" SELECT * FROM COURSE ");
m_adodc1.Refresh();
AfxMessageBox("成功更新数据");
UpdateData(FALSE);
}
//删除
void tercher_course::OnButton4()
{
UpdateData(TRUE);
_ConnectionPtr m_pConnection;
::CoInitialize(NULL);
try{
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t
strConn="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Employee training management system;Data Source=520-002";
m_pConnection->Open(strConn,"","",adModeUnknown);
}
catch(_com_error e)
{
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return ;
}
_variant_t ra;
_bstr_t strAdd="delete from COURSE where C_ID=";
strAdd=strAdd+m_c_id;
m_pConnection->Execute(strAdd,&ra,adCmdText);
m_pConnection->Close();
m_adodc1.SetRecordSource("select * from COURSE");
m_adodc1.Refresh();
m_c_id=" ";