资源描述
吉林省明日科技有限公司监制
目录
工资管理系统
目录
摘要
0 引言
1 系统需求分析
2 总体设计
1 项目规划
2 系统功能结构
3 设计目标
3 系统设计
1 开发及运行环境
2 数据库设计
4 主要功能模块设计
1 建立工程框架
2 封装数据库
3 主窗口设计
4 登录模块设计
5 员工录入模块设计
6 总体查询模块设计
7 员工工资添加模块设计
8 用户管理模块设计
附录A 参考文献
附录B 数据表
– 3 –
吉林省明日科技有限公司监制
摘要
【摘要】
随着我国国民经济建设的蓬勃发展和具有中国特色的社会主义市场经济体制的迅速完善,各个行业都在积极使用现代化的管理工具,不断改善企业的服务质量,提高工作效率。无论是行政职能,还是生产运作的管理要求的不断提高,在很大程度上使企业不得不改变传统的经营管理方式以适应快速发展的社会主义市场经济,改变企业管理方式、方法已经成为企业发展的先决条件。建设一个科学高效的信息管理系统是解决这一问题的必由之路。
对企业内部的财务运用现代化技术进行管理,是提高工作效率的有效手段。工资管理作为企业内部财务管理的一个重要方面,也逐步被企业管理者所重视,由于企业的规模的不断扩,大企业职工人数的不断增多,使工资发放成为企业管理中的一个重课题;再加上每一位职工的具体实际情况相同,规章章制度的不断完善,增大了个人工资发放难度;每个人每月的工资都要通过工资制度的审核,这大大增加了管理人员的工作量,通过计算机管理系统对员工工资进行全面的统计与管理,全面解决了工资管理过程中所遇到的各种问题,并且克服了传统管理方式中的易出错等问题。工资管理系统成为企业现代化管理中的首选管理工具。
【关键词】工资管理系统
– 39 –
吉林省明日科技有限公司监制
0 引言
传统的工资管理方法,都是通过人工统计和计算的管理方式进行的。这样的管理方法不但费时费力,也容易产生计算上的错误和疏漏;计算机技术的全面普及,打破了财务管理的传统管理方法,提高了管理效率的同时,克服了传统管理方法中易产生的问题,使管理员能够有序的、全面的对每一位职工进行管理,严格按照工资条款及发放制度计算并发展员工工资。
企业工资管理系统可以完成日常工资的管理,如查询、修改、增加、删除以及存储等操作,迅速准确地完成各种工资数据的的统计和汇总工作,快速打印出工资报表等,大大提高了企业的管理效率。
1 系统需求分析
根据市场的需求,要求系统具有以下功能:
q 对单位人员的变动进行处理。
q 对职工的工资进行计算、修改。
q 查询统计功能。
q 报表打印功能。
2 总体设计
2.1 项目规划
工资管理系统是由基本信息管理、工资查询、工资管理、系统管理和帮助等几个功能模块组成,规划系统功能模块如下:
q 基本信息管理模块
基本信息管理模块主要包括员工录入、员工删除2部分。
q 工资查询模块
工资查询模块主要包括基本工资查询、浮动工资查询、加班/休假查询、总体查询4个部分。
q 工资管理模块
工资管理模块主要包括工资发放管理、基本工资管理、浮动工资管理3个部分。
q 系统管理模块
系统管理模块主要包括用户管理、修改密码、退出系统3个部分。
q 帮助模块
帮助模块主要包括关于1个部分。
2.2 系统功能结构
工资系统的功能结构如图1所示。
图1 系统功能图
2.3 设计目标
本系统是根据中小企业的实际需求而开发的,完全能够实现企业对客户的自动化管理,通过本系统可以达到以下目标:
q 系统运行稳定,安全可靠。
q 界面设计美观,人机交互界面友好。
q 信息查询灵活、方便、快捷、准确,数据存储安全可靠。
q 满足键盘和鼠标的双重操作,完全支持回车键。
q 采用多种方式查询数据。
q 操作员可以随时修改自己的口令。
q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
q 数据保密性强,为每个用户设置相应的权限级别。
3 系统设计
3.1 开发及运行环境
1.硬件要求
CPU:300MHz以上的处理器。
内存:128MB,推荐256MB。
硬盘:150MB以上剩余空间。
显示像素:最低800*600,最佳效果1024*768。
2.软件要求
操作系统:Windows2000/NT/XP/CE。
数据库:SQL Server2000。
3.2 数据库设计
1.数据库概要说明
数据库GZFFXT中包括员工基础信息表、员工基本工资表、员工浮动工资表、员工加班/休假表、工资发放明细表、用户表6个数据表。
图2所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所有数据表。可以清晰地反应数据库信息。
图2 数据库概要说明
2.主要数据表的结构
数据库中的数据表请参见附录B。
4 主要功能模块设计
4.1 建立工程框架
在Visual C++中建立文档管理系统的基本框架,步骤如下:
(1)单击菜单“File-->New”命令,打开“New”对话框,单击“Projects”选项卡,选择“MFC AppWizard(exe)”,输入工程名,并设置路径,如图3所示。
图3 “New”对话框
(2)单击“OK”按钮,“MFC AppWizard-Step1”对话框已经打开,如图4所示,选项“Dialog base”,接着单击“Next”按钮。
图4 “MFC AppWizard-Step 1”对话框
(3)在弹出的“MFC AppWizard-Step 2 of 4”对话框中,输入对话框标题,如图5所示。
图5 “MFC AppWizard-Step 2 of 4”对话框
(4)在接下来的对话框中保持默认的选项。设置好的属性如图6所示,单击“OK”按钮后,就完成了新建工程。
图6 设计好的工程属性
4
4.2 主窗口设计
1.菜单资源设计
主窗口菜单设置的主要步骤如下:
(1)单击“ResourceView”选项卡,右键单击“GZGLXT Resources”选项,选择“Insert”菜单项,打开“Insert Resource”窗口,如图7所示。
图7 “Insert Resource”窗口
(2)选择“Menu”文件夹,单击“New”按钮,在GZGLXT Resources目录下新增一个Menu目录项,菜单ID为IDR_MENU1。双击此菜单,对此菜单项的属性进行设计。如图8所示。
图8 设计菜单属性图
2.客户区设计
(1)打开对话框IDD_GZGLXT_DIALOG属性窗口,在对话框中添加1个Picture控件,用来存放图片。在Menu组合框中选择IDR_MENU1。如图9所示。
图9 系统主界面
(2)预先在下边留出状态栏,声明CTime、CstatusBarCtrl类对象实体代码如下。
CTime t;
CStatusBarCtrl m_StatusBar;
引用的外部变量
extern CCzyxxb ffxxb;
(3)在OnInitDialog成员函数中添加状态栏。
// TODO: Add extra initialization here
t=CTime::GetCurrentTime();
m_StatusBar.EnableAutomation();
m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,0);//ID_STATUSBAR);
int width[]={200,370,500};
m_StatusBar.SetParts(4, &width[0]);
m_StatusBar.SetText("吉林省明日科技有限公司",0,0);
CString StatusText;
StatusText.Format("当前用户:%s",ffxxb.GetCzyName());
m_StatusBar.SetText(StatusText,0,1);
CString strdate;
strdate.Format("当前时间:%s",t.Format("%y-%m-%d"));
m_StatusBar.SetText(strdate,0,2);
return TRUE; // return TRUE unless you set the focus to a control
(4)打开ClassWizard窗口,为菜单项ID_EXIT添加代码。程序调用OnOK()函数关闭对话框,退出系统。
void CGZGLXTDlg::OnExit()
{
// TODO: Add your command handler code here
OnOK();
}
4.3 登录模块设计
1.实现目标
登录模块功能是完成用户登录本系统的操作,用户登录对话框的设计如图10所示
图10 登录对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源ID为IDD_LOGIN。在IDD_LOGIN对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“用户登录”。
(2)从Controls面板上向Dialog资源中添加2个Static、1个Picture、2个Edit,更改资源的属性,并为资源设置相对应的变量,如表1所示。
表1 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_name
IDC_ EDIT2
PassWord TRUE
CString
m_pwd
IDOK
Caption 登录
IDCANCEL
Caption 退出
IDC_STATIC
Type Bitmap
3.代码分析
(1)引用的外部变量。
extern CCzyxxb ffxxb;
(2)响应“登录”按钮的代码。
void CLogin::OnOK()
{
// TODO: Add extra validation here
//将对话框中编辑框的数据读取到成员变量中
UpdateData(true);
if(m_name=="")
{
MessageBox("请输入用户名");
return;
}
//如果读取数据和用户输入不同,则返回
if(ffxxb.HaveCzy(m_name,m_pwd)!=1)
{
MessageBox("用户名或密码错误!");
return;
}
ffxxb.SetCzyName(m_name);
jb="1";
//判断当前用户级别
if(ffxxb.HaveCzyjb(m_name,m_pwd,jb)==1)
{
ffxxb.SetCzyjb(jb);
}
CDialog::OnOK();
}
下面在主对话框中添加代码,使对话框在启动时首先打开登录对话框。在主窗口选择OnInitDialog函数,该函数将打开登录对话框,如果用户不是通过单击“登录”按钮关闭对话框,则调用OnOK函数关闭主对话框,具体代码如下:
BOOL CWordGLXTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
// TODO: Add extra initialization here
CLogin gin;
if(gin.DoModal()!=IDOK)
OnOK();
......
return TRUE; // return TRUE unless you set the focus to a control
}
4.4 员工录入模块设计
1.实现目标
添加员工信息,员工录入对话框的设计如图11所示
图11 员工录入对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源ID为IDD_YGTJK。在IDD_YGTJK对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“员工录入”。
(2)从Controls面板上向Dialog资源中添加4个Static、2个Combo、2个Edit,更改资源的属性,并为资源设置相对应的变量,如表2所示。
表2 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_id
IDC_ EDIT2
默认
CString
m_name
IDC_COMBO1
Type Bitmap
CComboBox
m_sex
IDC_COMBO2
Caption 退出
CComboBox
M_whcd
IDOK
Caption 添加
IDCANCEL
Caption 退出
3.代码分析
(1)打开ClassWizard窗口,添加在OnInitDialog成员函数,向OnInitDialog添加代码如下。
BOOL CYgjctjdlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetIcon(m_hIcon, TRUE);
m_sex.AddString("男");
m_sex.AddString("女");
m_whcd.InsertString(0,"专科");
m_whcd.InsertString(1,"本科");
m_whcd.InsertString(2,"研究生");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
(2)当用户单击“添加“按钮时,实现添加员工功能,其响应代码如下
void CYgjctjdlg::OnOK()
{
// TODO: Add extra validation here
CYgjcxxb xxb;
UpdateData(true);
if(m_id=="")
{
MessageBox("编号不能为空");
return;
}
if(m_name=="")
{
MessageBox("姓名不能为空");
return;
}
if(xxb.HaveId(m_id)==1)
{
MessageBox("员工编号已存在");
return;
}
xxb.SetYGid(m_id);
xxb.SetYGxm(m_name);
CString sex,whcd;
m_sex.GetWindowText(sex);
if(sex=="")
{
MessageBox("性别不能为空");
return;
}
//从组合框中读取文本
m_sex.GetLBText(m_sex.GetCurSel(),strsex);
xxb.SetSex(strsex);
m_whcd.GetWindowText(whcd);
if(whcd=="")
{
MessageBox("文化程度不能为空");
return;
}
m_whcd.GetLBText(m_whcd.GetCurSel(),strwhcd);
xxb.SetWHcd(strwhcd);
xxb.sql_insert();
//向浮动工资表添加编号、姓名
CYgfdgzxmb xmb;
xmb.SetYGid(m_id);
xmb.SetYGxm(m_name);
xmb.sql_insert();
//向基本工资表添加编号、姓名
CYgjbgzb gzb;
gzb.SetYGid(m_id);
gzb.SetYGxm(m_name);
gzb.sql_insert();
//向加班休假表添加编号、姓名
CYgjbsjb sjb;
sjb.SetYGid(m_id);
sjb.SetYGxm(m_name);
sjb.sql_insert();
CDialog::OnOK();
}
4.5 员工工资添加模块设计
1.实现目标
添加员工实际发放的工资情况,员工工资添加对话框设计如图12所示。
图12 员工工资添加对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源ID为IDD_YGGONGZITJ。在IDD_YGGONGZITJ对话框资源中单击鼠标右键,执行弹出快捷菜单的 “Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“员工工资添加”。
(2)从Controls面板上向Dialog资源中添加19个Static、17个Edit、2个Button控件,更改资源的属性,并为资源设置相对应的变量,如表3所示。
表3 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_id
IDC_EDIT2
默认
CString
m_name
IDC_EDIT3
默认
int
m_jbgz
IDC_EDIT4
默认
int
m_zwgz
IDC_EDIT5
默认
int
m_glgz
IDC_EDIT6
默认
int
m_zfbz
IDC_EDIT7
默认
int
m_shbz
IDC_EDIT8
默认
int
m_bxf
IDC_EDIT9
默认
int
m_jiabts
IDC_EDIT10
Read-only TRUE
CEdit
m_jiabgz
IDC_EDIT11
默认
int
m_sjts
IDC_EDIT12
Read-only TRUE
CEdit
m_sjgz
IDC_EDIT13
默认
int
m_ylbxj
IDC_EDIT14
默认
int
m_grsds
IDC_EDIT15
默认
int
m_sfgz
IDC_EDIT16
Read-only TRUE
CEdit
m_yfgz
IDC_EDIT17
Read-only TRUE
CEdit
m_syye
IDOK
Caption 添加
IDCANCEL
Caption 退出
IDC_BUTTONsyye
Caption 上月余额
IDC_BUTTONyfgz
Caption 应发工资
3.代码分析
(1)双击“IDC_EDIT9”控件,自动生成OnChangeEdit9函数,实现用户添加加班天数时,加班工资自动计算并显示,具体代码如下:
void CYggztjdlg::OnChangeEdit9()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
UpdateData(true);
CString str;
str.Format("%d",m_jiabts*40);
m_jiabgz.SetWindowText(str);
UpdateData(false);
// TODO: Add your control notification handler code here
}
(2)双击“上月余额”按钮,系统自动添加消息响应函数OnBUTTONsyye,具体代码如下。
void CYggztjdlg::OnBUTTONsyye()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_id=="")
{
MessageBox("请先填写员工编号");
return;
}
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
t = CTime::GetCurrentTime();
int m,y;
CString str;
m=t.GetMonth()-1;
y=t.GetYear();
if(m==0)
{
m=12;
y=y-1;
}
CGzffmxb mxb;
if(mxb.Havesyye(m_id,y,m)==1)
{
CString sql;
sql.Format("select * from gzffmxb where ygid='%s' and year(sjian)='%i' and month(sjian)='%i'",m_id,y,m);
m_AdoConn.GetRecordSet((_bstr_t)sql);
str=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("Yu_E");
m_syye.SetWindowText(str);
}
else
{
m_syye.SetWindowText("0");
}
UpdateData(false);
m_AdoConn.ExitConnect();
}
在头文件中添加下列代码。
CTime t;
(3)双击“应发工资”按钮,系统自动添加消息响应函数OnBUTTONyfgz,具体代码如下:
void CYggztjdlg::OnBUTTONyfgz()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CString syye;
m_syye.GetWindowText(syye);
if(syye=="")
{
MessageBox("请先添加上月余额");
return;
}
int yfgz;
yfgz=atoi(syye)+m_jbgz+m_glgz+m_zwgz+m_shbz+m_zfbz-m_ylbxj;
yfgz+=(-m_bxf+m_jiabts*40-m_sjts*40-m_grsds);
CString str;
str.Format("%d",yfgz);
m_yfgz.SetWindowText(str);
}
(4)为“添加”按钮添加代码,实现添加员工工资功能,代码如下:
void CYggztjdlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(true);
CYgjcxxb xxb;
CString yfgz;
m_yfgz.GetWindowText(yfgz);
if(m_id=="")
{
MessageBox("编号不能为空");
return;
}
if(xxb.HaveId(m_id)!=1)
{
MessageBox("员工编号不存在");
return;
}
if(m_name=="")
{
MessageBox("姓名不能为空");
return;
}
if(xxb.Havename(m_id,m_name)!=1)
{
MessageBox("员工不存在");
return;
}
if(yfgz=="")
{
MessageBox("应发工资不能为空");
return;
}
CGzffmxb mxb;
mxb.SetYGid(m_id);
mxb.SetYGxm(m_name);
mxb.SetGLgz(m_glgz);
mxb.SetJBgz(m_jbgz);
mxb.SetYLbxj(m_ylbxj);
mxb.SetZWgz(m_zwgz);
mxb.SetBXf(m_bxf);
mxb.SetGRsds(m_grsds);
mxb.SetSHbz(m_shbz);
mxb.SetZFbz(m_zfbz);
mxb.SetJiaBts(m_jiabts);
int jiabgz;
jiabgz=m_jiabts*40;
mxb.SetJiaBgz(jiabgz);
mxb.SetSjts(m_sjts);
int sjkk;
sjkk=m_sjts*40;
mxb.SetSJkk(sjkk);
mxb.SetYFje(atoi(yfgz));
mxb.SetSFje(m_sfgz);
mxb.sql_insert();
CYgjbsjb sjb;
sjb.SetJiaBts(m_jiabts);
sjb.SetJiaBgz(jiabgz);
sjb.SetSjts(m_sjts);
sjb.SetSJkk(sjkk);
sjb.sql_update(m_id);
CDialog::OnOK();
}
4.6 用户管理模块设计
1.实现目标
实现新建、删除用户功能,用户管理对话框设计如图13所示。
图13 用户管理对话框
2.设计步骤
(1)向项目中添加一个新Dialog资源,资源ID为IDD_XINJYH。在IDD_XINJYH对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“用户管理”。
(2)从Controls面板上向Dialog资源中添加4个Static、1个Combo、3个Edit、1个Button控件,更改资源的属性,并为资源设置相对应的变量,如表4所示
表4 资源设置
ID
Properties
Member Variables
Type
Member
IDC_EDIT1
默认
CString
m_name
IDC_EDIT2
Password true
CString
m_pwd
IDC_EDIT3
Password true
CString
m_pwd1
IDC_COMBO1
默认
CComboBox
m_jb
IDOK
Caption 添加
IDC_BUTTON1
Caption 删除
IDCANCEL
Caption 退出
3.代码分析
(1)添加OnInitDialog()函数,初始化Combo控件,集体代码如下:
BOOL CXinjyhdlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetIcon(m_hIcon, TRUE);
m_jb.AddString("系统管理员");
m_jb.AddString("普通管理员");
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
(2)为“添加”按钮添加消息响应函数,代码如下:
void CXinjyhdlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(true);
if(m_name=="")
{
MessageBox("请输入用户名");
return;
}
CString jb;
m_jb.GetWindowText(jb);
if(jb=="")
{
MessageBox("级别不能为空");
return;
}
if(m_pwd=="")
{
MessageBox("请输入密码");
return;
}
if(m_pwd1=="")
{
MessageBox("请确认密码");
return;
}
if(m_pwd!=m_pwd1)
{
MessageBox("两次密码不同");
return;
}
CCzyxxb xxb;
if(xxb.Havename(m_name)==1)
{
MessageBox("用户以存在,请重新输入");
return;
}
xxb.SetCzyName(m_name);
xxb.SetPwd(m_pwd);
m_jb.GetLBText(m_jb.GetCurSel(),strjb);
if(strjb=="系统管理员")
strjb="1";
else
strjb="0";
xxb.SetCzyjb(strjb);
xxb.sql_insert();
CDialog::OnOK();
}
(3)为“删除”按钮添加消息响应函数,代码如下:
void CXinjyhdlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(MessageBox("是否删除当前记录","请确认",MB_YESNO)==IDYES)
{
CCzyxxb xxb;
xxb.sql_delete(m_name);
}
}
(4)当用户单击主界面菜单中的“用户管理”菜单项时,将执行OnMenuyhgl函数,具体代码如下:
void CGZGLXTDlg::OnMenuyhgl()
{
// TODO: Add your command handler code here
if(ffxxb.GetCzyjb()=="1")
{
CXinjyhdlg dlg;
dlg.DoModal();
}
else
{
MessageBox("没有权限");
return;
}
}
附录A 参考文献
1.《Visual Basic精彩编程200例》机械工业出版社 赛奎春、高春艳等
2003年1月
2.《Visual Basic数据库开发实例解析》机械工业出版社 刘志铭、高春艳等
2003年8月
3.《Visual FoxPro数据库开发实例解析》机械工业出版社 王晶莹、王国辉等
2003年9月
4.《Power Builder数据库开发实例解析》机械工业出版社 华传铭、张振坤等
2003年9月
5.《Delphi数据库开发实例解析》机械工业出版社 赛奎春、郑骁鹏等
2004年2月
6.《PowerBuilder 精彩编程200例》机械工业出版社 张振坤、李文立等
2004年9月
7.《Visual FoxPro 精彩编程200例》机械工业出版社 王国辉、董韶华等
2004年9月
8.《ASP数据库开发实例解析》机械工业出版社 李严、于亚芳、王国辉 2004年12月
9.《Delphi工程应用与项目实践》机械工业出版社 宋坤、赵智勇等
2005年1月
10.《Visual Basic工程应用与项目实践》机械工业出版社 高春艳、李俊民等
2005年1月
11.《Visual C++工程应用与项目实践》机械工业出版社 张雨、阮伟良等
2005年1月
12.《JSP工程应用与项目实践》机械工业出版社 陈威、白伟明、李楠
2005年2月
13.《ASP工程应用与项目实践》机械工业出版社 王国辉、牛强、李南南
2005年4月
14.《Visual Basic 信息系统开发实例精选》机械工业出版社 高春艳、李俊民、张耀庭等
2005年7月
15.《ASP 信息系统开发实例精选》机械工业出版社 王国辉、牛强、李南南等
2005年7月
16.《Delphi 信息系统开发实例精选》机械工业出版社 宋坤、赵智勇、刘强等
2005年7月
17.《Visual foxpro数据库开发关键技术与实例应用》人民邮电出版社 周桓、张雨、王国辉
2004年5月
18.《Power Builder数据库开发关键技术与实例应用》人民邮电出版社 刘志铭、张振坤、冯文萃 2004年5月
19.《Delphi数据库开发关键技术与实例应用》人民邮电出版社 赛奎春、陈紫鸿、宋昆
2004年5月
20.《Visual basic数据库开发关键技术与实例应用》人民邮电出版社 高春艳、李艳
2004年5月
21.《Visual C++ 管理信息系统完整项目实例剖析》人民邮电出版社 明日科技
2005年7月
22.《Visual Basic 管理信息系统完整项目实例剖析》人
展开阅读全文