资源描述
《数据库系统原理》课程设计报告
-----平面设计公司业务管理系统
姓 名:
学 号:
指导教师:
起始时间:
截止时间:
目录
概述 2
第一章 需求分析 3
§1.1信息要求 3
第二章 结构设计 4
§2.1概念结构设计 4
§2.2逻辑结构设计 6
第三章 主要模块设计及代码 7
§3.1数据库连接模块 7
§3.2认证登录模块 9
§3.3查询显示模块 9
§3.4添加,修改,删除模块 12
第四章 总结 14
第五章 参考文献 15
概述
编写目的
本报告作为软件使用的重要指南,可以方便用户使用。同时,也是一份重要的技术文档,方便开发人员继续完善各项功能,更新软件。为了更好地管理平面设计公司的各项工作,撰写此文档。
项目背景
订单管理是每所公司或工厂必须面对的工作,大量的订单管理给企业带来了沉重的负担。传统人手方式管理文件档案,已经无法满足当前业务量的正常需求。这种管理方式存在许多缺点:效率低,保密性差,另外随着进货数量的增加,这必然增加了订单管理者的工作量和劳动强度。同时,将产生大量的文件和数据,这给订单信息的查找,更新和维护都带来了不少困难。管理机制已经不能适应时代发展的需求,其管理方法将浪费人力物力。随着科技的不断提高,计算机科学与技术日渐成熟,这种传统的手工管理模式必然被以计算机为物质基础的信息管理方式所取代。
软件定义
图形化界面:人性化的界面,方便了员工的使用,对操作员技术要求不高。
数据存取:系统地保存数据,可以加快数据处理,提高工作量。可以同时进行多人对数据的操作,保证数据存取不出错。
开发环境
在Windows XP SP3 操作系统下,使用Visual C++进行开发。数据存取使用SQL Server 2000平台。
第一章 需求分析
§1.1信息要求
通过软件,可以查看,添加,保存,修改,删除各种业务信息。如登录账户的信息,员工的信息,客户的信息,订单信息,送货单信息,历史单信息。
§1.2处理要求
软件要灵活实现各种管理功能间的切换,减少麻烦的操作。对于数据的修改,保证不会出错,确保数据的正确性。在必要的地方,给予一定的提示,以防止误操作导致的数据异常。
图 1.1 功能模块图
§1.3安全性与完整性要求
登录安全:采用用户名,密码方式登录系统。不同职工具有的使用权限不同,管理员拥有最高权限。其他员工根据职务需要规定所需权限。
完整性要求:对于一些必须的信息,不能留空值。如编号,名称,日期等信息
第二章 结构设计
§2.1概念结构设计
账户ID
职工编号
登录账户
用户名
密码
员工
职工编号
员工姓名
性别
月薪
职位
各实体E-R图:
图2.3
稿件
稿件编号
长度宽度
规格
色数
客户名称
输出机型
页数
单价
小计
稿件名称
图 2.2图2.1
历史单
送货单编号
编号
送货单
编号
订单编号
送货日期
图 2.4
客户
客户名称
公司地址
联系人
邮箱
传真
联系人电话
客户编号
联系业务员
图 2.5
订单
订单编号
业务员
客户名
设计员
下单日期
送货员
图 2.6
账户
职工
历史单
客户
订单
送货单
稿件
拥有
决定
制定
联系
生成
生成
§2.2逻辑结构设计
图2.7 实体联系图
图2.7 数据关系表
第三章 主要模块设计及代码
§3.1数据库连接模块
为连接模块独自建立一个类,方便每次访问数据库时可以调用。类命名为ADOConn。采用ADO技术实现程序与数据库的连接。
用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。直接在Stdafx.h文件中加入下面语句来实现:
#import "c:\programfiles\commonfiles\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF") //实际上两行代码是在同一行显示,由于排版原因,分行显示//
以下为ADOConn类里重要成员函数的代码:
////////////////////////////////////////////////////////////////////////////
//函数名称:ADOConn
//功能:初始化COM环境
/////////////////////////////////////////////////////////////////////////////
void C ADOConn::ADOConn()
{
::CoInitialize(NULL);
try
{
pConn.CreateInstance("ADODB.Connection"); // 创建Connection对象
//设置字符连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=DsnCompany;Data Source=BEN-PC;";
//连接数据库的代码语句
pConn->Open(strConnect,"","",adConnectUnspecified);
}
catch(_com_error e) //捕捉异常信息
{
AfxMessageBox(e.ErrorMessage());
}
}
////////////////////////////////////////////////////////////////////////////
//名称:OpenRecordset
//功能:打开记录集
/////////////////////////////////////////////////////////////////////////////
_RecordsetPtr& CDataSource::OpenRecordset(CString sql)
{
ASSERT(!sql.IsEmpty()); //判断是否为空集
try
{
pRs.CreateInstance("ADODB.Recordset"); // 创建Recordset对象
pRs->Open(_bstr_t(sql),_variant_t(pConn,true),adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
return pRs;
}
void CADOConn::FreeData() //释放空间
{
if(pConn)
{
pConn->Close();
pRs.Release();
pConn.Release();
CoUninitialize();
}
}
§3.2认证登录模块
void CGraphicDsnDlg::OnOK() //确定按钮事件
{
// TODO: Add extra validation here
UpdateData();
CMainMngDlg dlg;
CString sql="select * from LogUser where UserName="+m_strUsername+" and PassWord='"+m_strPassword+"' ";
a.pRs=a.OpenRecordset(sql);//将记录加入到记录集
int n=a.pRs->RecordCount; //计算符合条目
if (n>0)
{
CDialog::OnOK(); //登陆成功
dlg.DoModal();
}
else
{
::AfxMessageBox("用户名或密码不正确!"); //登陆失败
return;
}
}
§3.3查询显示模块
BOOL CTickets::OnInitDialog() //订单管理类初始化函数
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
cn.ADOConn(); //连接数据库
Display();
//设置列表框控件的扩展风格
//整行选择/有表格线/表头/单击激活
DWORD dwExStyle=LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE;
//报表风格/单行选择/高亮显示选择行
m_List.ModifyStyle(0,LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS);
m_List.SetExtendedStyle(dwExStyle);
//设置列表框控件的颜色
// m_List.SetTextColor(RGB(200,200,0));
// m_List.SetBkColor(RGB(240,247,233));
//初始化列表,插入11列
m_ListDoc.InsertColumn(0,"",LVCFMT_CENTER,0,0);
m_ListDoc.InsertColumn(1,"稿件名称",LVCFMT_CENTER,120,0);
m_ListDoc.InsertColumn(2,"长度*宽度",LVCFMT_CENTER,90,0);
m_ListDoc.InsertColumn(3,"规格",LVCFMT_CENTER,65,0);
m_ListDoc.InsertColumn(4,"色数",LVCFMT_CENTER,65,0);
m_ListDoc.InsertColumn(5,"规格",LVCFMT_CENTER,65,0);
m_ListDoc.InsertColumn(7,"输出机型",LVCFMT_CENTER,90,0);
m_ListDoc.InsertColumn(8,"页数",LVCFMT_CENTER,65,0);
m_ListDoc.InsertColumn(9,"单价",LVCFMT_CENTER,70,0);
m_ListDoc.InsertColumn(10,"小计",LVCFMT_CENTER,80,0);
m_ListDoc.InsertColumn(11,"客户名称",LVCFMT_CENTER,137,0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CTicketsMngDlg::Show() //输出单据信息到列表控件框
{
CString DocName;
int index=m_oddno.GetCurSel();
if (index==CB_ERR)
{
AfxMessageBox(_T("出错!"));
return;
}
m_oddno.GetLBText(index,coursename);
CString s="select * from Documents where DocName='"+DocName+"'";
a.pRs=a.OpenRecordset(s); //把数据加到记录集
UpdateData();
CString sql="select * from Documents where CustomerName='"+CustomerName+"'";
a.pRs=a.OpenRecordset(sql); //打开数据到记录集
_variant_t DocNo,DocName,Length,Format,Color,OutputMacMac,Pagess,Price,,CustomerName;
//定义列表名变量
int i=0;
a.pRs=a.OpenRecordset(s);
int nIndex=m_List.GetItemCount();
LV_ITEM lvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=nIndex;
lvItem.iSubItem=0; //第nIndex行
lvItem.pszText=(char*)(LPCTSTR)DocName1; //第一列参数
for (a.pRs->MoveFirst();!a.pRs->adoEOF;a.pRs->MoveNext())
{
m_List.InsertItem(&lvItem);
DocName=a.pRs->GetCollect("DocName"); //取数据
Length=a.pRs->GetCollect("Length");
Format=a.pRs->GetCollect("Format");
Color=a.pRs->GetCollect("Color");
Pages=a.pRs->GetCollect("Pages");
Price=a.pRs->GetCollect("Price");
Subtotal=a.pRs->GetCollect("Subtotal");
Color=a.pRs->GetCollect("Color");
design=a.pRs->GetCollect("design");
CustomerName=a.pRs->GetCollect("CustomerName");
OutputMac=a.pRs->GetCollect("OutputMac");
DocName.ChangeType(VT_BSTR); //改变类型
Length.ChangeType(VT_BSTR);
Format.ChangeType(VT_BSTR);
Color.ChangeType(VT_BSTR);
Pages.ChangeType(VT_BSTR);
Price.ChangeType(VT_BSTR);
Subtotal.ChangeType(VT_BSTR);
Color.ChangeType(VT_BSTR);
CustomerName.ChangeType(VT_BSTR);
OutputMac.ChangeType(VT_BSTR);
DocName=DocName.bstrVal; //调用bstrval
Length=Length.bstrVal;
Format=Format.bstrVal;
Color=Color.bstrVal;
OutputMac1=OutputMac.bstrVal;
Pages=Pages.bstrVal;
Price=Price.bstrVal;
Color=Color.bstrVal;
CustomerName=CustomerName.bstrVal;
}
}
§3.4添加,修改,删除模块:
// 打开修改订单
void CTicketsManDlg::OnItemmanButton()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_Adodc.GetRecordset().GetEof())
{
MessageBox("请选择要修改的订单");
return;
}
// 设置ListItemManDlg对话框中的变量
CListItemManDlg dlg;
dlg.cRegId = m_Datagrid.GetItem(0);
// 打开ListItemManDlg对话框
if (dlg.DoModal() == IDOK)
RefreshData();
else
RefreshData();
}
//删除订单
void CTicketsManDlg::OnDelButton()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_Adodc.GetRecordset().GetEof())
{
MessageBox("请选择要删除的订单!");
return;
}
if (MessageBox("是否删除当前记录?","请确认", MB_YESNO + MB_ICONQUESTION) == IDYES)
{
CTickets reg;
reg.SqlDelete(m_Datagrid.GetItem(0));
RefreshData();
}
}
第四章 总结
通过本次设计,初步掌握了通过Visual C++ 中的MFC功能实现程序的开发。Visual C++提供了大量的控件功能,方便初学者设计程序。阅读了大量的C++编程的相关书籍,对这次设计起到了很大的帮助。尤其是C++语言不熟悉的地方,通过阅读,加深了理解。对于面向对象编程有了更深切的理解。模块化的代码,增加了程序的可移植性。
熟悉了程序通过API来与SQL数据库连接的代码。多种数据库连接技术各有各的优缺点。对于初学者,ADO技术相对简单一点,因为查询语句是可以直接通过函数使用的。这对于熟悉数据库操作的人是很方便的。
在本次试验中,也遇到了各种各样的问题:
由于MFC编程是通过控件的方法生成类代码,所以一个类添加完后,不能继续对其重命名,相关的变量,函数名的改变,将很容易使程序出错。导致编译无法通过,排解问题比较困难。
所以,无论是对数据库的设计,还是程序的设计,都需要先做全局考虑以减少不必要的出错。
在这一点看了,需求分析就显得很重要。它直接明确了设计的目标,要求,使得设计进度大大加快。
由于个人经验跟技术的不足,在开发的过程中遇到困难是很正常的。鉴于此原因,必须要对某些问题进行讨论,或请教别人。有时,请教别人的效率很高的,如果自己苦苦地看书,也不一定能完全解决问题。要勇于提问,积极交流,才能做出好的程序。
第五章 参考文献
《程序设计基础—C++》
《数据库系统概论》
《Visual C++ 权威剖析》
《Visual C++ 数据库通用模块》
《Visual C++ SQLServer应用实例》
3.1.202505:5805:58:0425.3.15时58分5时58分4秒3月. 1, 251 三月 20255:58:04 上午05:58:04
2025年3月1日星期六05:58:04
展开阅读全文