1、数据库课程设计 网上图书销售系统数据库课程设计上报告.doc 作者: 日期:2 个人收集整理 勿做商业用途数据库系统原理及其应用教程课程设计报告题目名称:网上图书销售系统 任课教师: 姓 名: 学 号: 2010年12月30日目 录摘 要31 引言32 需求分析32.1 功能需求32。2 数据描述52。3 数据库描述63 概要设计63.1 系统运行环境63.2 系统功能模块设计73.3 系统处理流程73。4 接口设计84 详细设计84。1 登录模块及主界面94.2 图书录入模块104.3 图书销售模块154.4 销售统计模块204.5 查询库存模块225 系统测试256 操作手册297 结论2
2、97。1 系统功能297.2 系统不足和改进297.3 总结30参考文献30评 语 31摘 要随着计算机的普及书店规模的不断扩大,使图书销售管理成为书店管理中的一个重要课题。通过图书销售管理系统可以解决书店管理中遇到的各种问题。本系统分析了市场需求和实际需要,利用VC+连接SQL数据库的方式,主要实现了书店的网上图书销售管理,该系统具有处理图书录入、图书销售、销售统计、查询库存等功能.关键词:图书;销售;库存1 引言 传统的图书销售管理方法,都是通过人工统计和计算的管理方式进行的。这样的管理方法不但费时费力,也容易产生计算上的错误和疏漏;计算机技术的全面普及,打破了书店管理的传统管理方法,提高
3、了管理效率的同时,克服了传统管理方法中易产生的问题,使管理员能够有序的、全面的对图书销售和库存进行管理。网上图书销售系统可以完成书店的日常管理,如图书录入、图书销售、销售统计、查询库存等功能,迅速准确地对已售图书和剩余库存进行统计和汇总工作,大大提高了书店的管理效率和准确性.2 需求分析2.1 功能需求2。1.1待开发软件的功能需求本系统是根据书店的实际需求而开发的,要求稳定、可靠的实现图书销售的自动化管理,通过本系统可以达到以下目标:1. 图书录入,包括图书的基本信息,如分类、进价、售价、作者等.2. 图书销售,包括图书的售价、折扣、销售日期,并实现对库存量的修改。3. 销售统计,包括按图书
4、类型、书名、作者、出版社等进行统计。4. 查询库存,对指定的某本图书剩余库存量进行查询.5. 售完图书查询,对已售完图书进行查询。2。1.2待开发软件的功能按照用户需求,要满足以上功能,我设计出了图书销售管理系统的系统功能图,如图2.1所示.图书销售管理系统图书录入查询库存图书销售销售统计售完图书查询图2.1 图书销售管理系统的系统功能图综合系统要求,对图2。1所示的系统功能解释如下:图书录入,包括图书的基本信息,如分类、进价、售价、作者等。图书销售,包括图书的售价、折扣、销售日期,并实现对库存量的修改.销售统计,包括按图书类型、书名、作者、出版社等进行统计。查询库存,对指定的某本图书剩余库存
5、量进行查询。售完图书查询,对已售完图书进行查询。通过以上分析,可以得到仓库管理系统的数据流图,如图2。2所示.管理员图书信息处理图书管理反馈信息图书信息反馈信息记录数据数据库 图2.2图书管理系统的数据流图2.2 数据描述2。2。1数据库概要说明数据库中包括管理员信息表、图书基本信息表、图书类型表、图书销售记录表等4个数据表.图2.3所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所有数据表.可以清晰地反应数据库信息。图2。3 数据表结构图2。2.2主要数据表的结构表2。1 Pwd(管理员信息表)字段名数据类型字段大小描述IDint4管理员帐号Passwordnvarchar5
6、0r密码表2。2 BookInfo(图书基本信息表)字段名数据类型字段大小描述BookIDint4图书编号BookNamenvarchar50图书名称CategoryIDint4图书类型编号Authornvarchar50作者Publishernvarchar50出版社PublishDatesmalldatetime4出版日期Purchasefloat8进价Pricefloat8售价Stockint4库存本数Discountint4折扣BarCodenvarchar50条形码表2。3 BookCategory(图书类型表)字段名数据类型长度描述CategoryIDint4图书类型编号Categ
7、oryNamenvarchar8图书类型名称表2。4 BookSale(图书销售记录表)字段名数据类型长度描述IDint4销售记录编号BookIDint4图书编号SalePricefloat8实际售价SaleDatesmalldatetime4销售日期2.3 数据库描述本软件采用SQL数据库.3 概要设计本系统是根据书店的实际需求而开发的,完全能够帮助书店实现高效、准确的图书销售自动化管理。在分析阶段,我们已经提出了系统的结构和数据字典。本节我们将对系统的使用环境作简要介绍,并对该系统作概要设计.3。1 系统运行环境PC机Windows操作系统Visual C+6。03。2 系统功能模块设计在
8、前面系统功能分析的基础上,结合Visual C+程序编制的特点,得到如图3.1所示的系统功能模块图.图书销售管理系统图书录入模块(M2)查询库存模块(M5)图书销售模块(M3)销售统计模块(M4)售完图书查询模块(M6)管理员登录模块(M1)图3.1图书销售管理系统功能模块图各模块功能分配如下:(1)用户登陆功能:管理员登陆模块(M1).(2)图书录入功能:图书录入模块(M2)。(3)图书销售功能:图书销售模块(M3)。(4)销售统计功能:销售统计模块(M4)。(5)查询图书库存功能:查询库存模块(M5)。(6)售完图书查询功能:售完图书查询模块(M6)。3.3 系统处理流程(1)系统启动,进
9、入身份验证.(2)初始化系统,导入数据库.(3)录入图书信息.(4)图书销售。(5)统计图书销售信息。(6)查询图书库存信息。(7)查询已售完图书信息。(8)退出系统。3.4 接口设计3。4。1 外部接口(1) 用户界面采用图形用户界面,包含菜单、按钮、对话框等元素。(2) 软件接口软件运行于Visual C+6。0平台上。(3) 硬件接口运行于PC机上.3。4.2 内部接口(1)用户登陆模块(M1):由相应事件驱动消息激活,完成用户登陆功能,之后进入消息循环状态.(2)图书销售模块(M3):由相应事件驱动消息激活,完成图书销售功能,之后进入消息循环状态。(3)销售统计模块(M4):由相应事件
10、驱动消息激活,完成销售统计功能,之后进入消息循环状态.(4)查询库存模块(M5):由相应事件驱动消息激活,完成查询库存功能,之后进入消息循环状态。(5)售完图书查询模块(M6):由相应事件驱动消息激活,完成售完图书查询功能,之后进入消息循环状态。4 详细设计该系统采用VC+6。0中的MFC连接SQL数据库的方式,使用图形用户界面,主要实现图书录入、图书销售等功能。下面具体对各模块进行介绍。4。1 登录模块及主界面在登录界面(如图4.1所示)中输入用户名和密码,登录成功后进入主界面。登陆框流程图如图4。2所示,系统主界面如图4.3所示,单击某个按钮就能弹出某个功能的界面。图4.1 系统登录界面输
11、入用户名开始验证密码是否正确输入密码登录成功进入主界面结束是否选择帐号类型图4.2登录模块流程图4.2 图书录入模块4.2。1 实现目标添加图书信息,图书录入对话框的设计如图4.4所示。“保存”按钮对应的方法为RAddBookDlg:OnSave(),流程图如图4.5所示.图4。4 图书录入对话框开始结束输入图书基本信息判断输入是否正确且完整添加该信息到关联表并写入数据库 是否图4。5 RAddBookDlg::OnSave()方法的流程图4.2。2 设计步骤(1)向项目中添加一个新Dialog资源,资源ID为IDD_ADDBOOK。在IDD_YGTJK对话框资源中单击鼠标右键,执行弹出快捷菜
12、单的“Properties”菜单命令,打开“Dialog Properties”对话框。在“Dialog Properties对话框中选择General选项卡,更改其“Caption文本框内容为“图书信息录入。(2)从Controls面板上向Dialog资源中添加所需控件,更改资源的属性,并为资源设置相对应的变量,如表4.1所示。表4.1 图书录入Dialog资源属性设置IDPropertiesMember VariablesTypeMemberIDC_BK_CATEGORY默认文本CategoryNameIDC_BK_NAME默认文本BookNameIDC_BK_AUTHOR默认文本Auth
13、orIDC_BK_PUBLISHER默认文本PublisherIDC_BK_DATE默认日期/时间PublishDateIDC_BK_PURCHASE默认数字PurchaseIDC_BK_PRICE默认数字PriceIDC_BK_PAYOFF默认数字PriceIDC_BK_STOCK默认数字StockIDC_BK_BARCODE默认文本BarCodeIDC_BK_DISCOUNT默认数字DiscountIDC_RESETCaption 重填IDC_SAVECaption 添加IDCANCELCaption 退出4。2.3 代码分析(1)打开ClassWizard窗口,添加在OnInitDial
14、og成员函数,向OnInitDialog添加代码如下:BOOL RAddBookDlg::OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereGetBookGategory();return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE(2)当用户单击“保存“按钮时,实现添加图书功能,其响应代码如下:void RAddBook
15、Dlg:OnSave() / TODO: Add your control notification handler code hereUpdateData(TRUE);if(!IsValidInput())return ;if(IDYES != AfxMessageBox(确定要保存吗?,MB_YESNO)) /放弃保存return ;if(SaveData())AfxMessageBox(保存成功!”);/保存后重置数据m_bHasNewBook = true;OnReset();GetDlgItem(IDC_BK_CATEGORY)SetFocus();elseAfxMessageBox
16、(保存失败!”);(3)判断输入信息是否正确的函数是IsValidInput(),其响应代码如下:bool RAddBookDlg::IsValidInput()CString str = 0123456789”;if(m_strBookCategory.IsEmpty() | m_strBookCategory。FindOneOf(str) != -1)AfxMessageBox(输入有误!图书类型不能为空或包含数字.”);GetDlgItem(IDC_BK_CATEGORY)-SetFocus();return false;if(m_strBookName。IsEmpty())AfxMes
17、sageBox(输入有误!书名不能为空。”);GetDlgItem(IDC_BK_NAME)-SetFocus();return false;if(m_strAuthor.IsEmpty() | m_strAuthor。FindOneOf(str) != -1)AfxMessageBox(”输入有误!作者名称不能为空或包含数字。”);GetDlgItem(IDC_BK_AUTHOR)-SetFocus();return false;if(m_strPublisher。IsEmpty()| m_strPublisher。FindOneOf(str) != 1)AfxMessageBox(输入有误
18、!出版社名称不能为空或包含数字.”);GetDlgItem(IDC_BK_PUBLISHER)SetFocus();return false;if(m_dPurchase = 0)AfxMessageBox(”图书进价应为正值!);GetDlgItem(IDC_BK_PURCHASE)-SetFocus();return false;if(m_dPrice = 0 )AfxMessageBox(”图书售价应为正值!”);GetDlgItem(IDC_BK_PRICE)SetFocus();return false;if( m_lDiscount 0 m_lDiscount 100)AfxMes
19、sageBox(”图书折扣应为0100之间正值!);GetDlgItem(IDC_BK_DISCOUNT)SetFocus();return false;if(m_lStock SetFocus();m_editDiscount。EnableWindow(FALSE);/CDialog:OnOK();(2)判断销售是否能够成功的函数是RSaleBookDlg::FindBook(),其代码如下:bool RSaleBookDlg::FindBook() / TODO: Add your control notification handler code hereUpdateData(TRUE)
20、;CString strSql ;_variant_t var;double dPurchase;if(!m_strBookName。IsEmpty()strSql.Format(SELECT FROM BookInfo WHERE BookName = ”s” and Stock 0”, m_strBookName);else if(!m_strBarCode.IsEmpty())strSql.Format(SELECT * FROM BookInfo WHERE BarCode = ”%s and Stock 0”, m_strBarCode);elseAfxMessageBox(请输入书
21、名或条码!”);GetDlgItem(IDC_SBK_NAME)SetFocus();return false;CRBookSaleApp* pApp = (CRBookSaleApp)AfxGetApp();trypApp-m_pRecordsetOpen(strSql。AllocSysString(),pAppm_pConnection。GetInterfacePtr()adLockOptimistic,adCmdText);if(pAppm_pRecordsetadoEOF)AfxMessageBox(”查无此书!请输入书名或条码无误。);pApp-m_pRecordset-Close(
22、);return false;var = pAppm_pRecordset-GetCollect(BookID);if(var.vt != NULL)m_lBookID = var.lVal;var = pApp-m_pRecordsetGetCollect(Discount);if(var.vt != NULL)m_lDiscount = var。lVal;var = pAppm_pRecordsetGetCollect(”Price”);if(var.vt != NULL)m_dPrice = var。dblVal;var = pApp-m_pRecordset-GetCollect(Pu
23、rchase”);if(var.vt != NULL)dPurchase = var。dblVal;var = pAppm_pRecordsetGetCollect(CategoryID”);if(var。vt != NULL)m_lCategory = var。lVal;pAppm_pRecordsetClose();catch(_com_error * e)AfxMessageBox(e-ErrorMessage());m_editDiscount.EnableWindow(m_dPrice = dPurchase);m_lDiscount = (m_dPrice = dPurchase)
24、 ? m_lDiscount :100;/售价小于进价时,不允许打折m_dSalePrice = m_dPrice * (double(m_lDiscount)/100); /计算折后价UpdateData(FALSE);return true; 4.4 销售统计模块4。4.1 实现目标实现对已销售的图书进行统计的功能,销售统计对话框如图4。8所示。图4.8 销售统计对话框4。4。2 设计步骤(1)向项目中添加一个新Dialog资源,资源ID为IDD_REPORT。在IDD_REPORT对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Prope
25、rties”对话框。在“Dialog Properties”对话框中选择General选项卡,更改其“Caption文本框内容为“销售统计。(2)从Controls面板上向Dialog资源中添加相应控件,更改资源的属性,并为资源设置相应的变量,如表4。3所示:表4。3用户信息管理Dialog资源属性设置IDPropertiesMember VariablesTypeMemberIDC_RADIO2默认单选框IDC_RADIO3默认单选框IDC_RADIO4默认单选框IDC_RADIO5默认单选框IDC_RADIO6默认单选框IDC_STATIC默认单选框IDOKCaption 确定IDCANC
26、ELCaption 取消4。4.3 代码分析查询函数为CRBookSaleView::OnSaleReport(),代码如下:void CRBookSaleView:OnSaleReport() / TODO: Add your command handler code hereRReportDlg dlg;dlg.m_iReportType = m_iReportType ;if(IDOK = dlg.DoModal())m_iReportType = dlg。m_iReportType;/设置销售报表标题/前2个标题类型为用户模式和书店管理模式,故此处加2int iTitleType =
27、0;switch(m_iReportType)case 0:/图书类型统计iTitleType = CATEGORY_REPORT_TITLE;break;case 1:/图书名称统计iTitleType = BOOKNAME_REPORT_TITLE;break;case 2:/图书作者统计iTitleType = AUTHOR_REPORT_TITLE;break;case 3:/出版社统计iTitleType = PUBLISHER_REPORT_TITLE;break;case 4:/全部销售记录统计iTitleType = SALE_REPORT_TITLE;break;defaul
28、t:break;SetTitle(iTitleType);ShowReport();4.5 查询库存模块4.5。1 实现目标实现对已销售的图书进行统计的功能,销售统计对话框如图4.9所示。图4。9 查询库存对话框4。5。2 设计步骤(1)向项目中添加一个新Dialog资源,资源ID为IDD_QUERY。在IDD_QUERY对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“Dialog Properties”对话框.在“Dialog Properties”对话框中选择General选项卡,更改其“Caption”文本框内容为“查询”.(2)从Controls面板
29、上向Dialog资源中添加相应控件,更改资源的属性,并为资源设置相应的变量,如表4。4所示:表4。4库存查询Dialog资源属性设置IDPropertiesMember VariablesTypeMemberIDC_BOOK_CATEGORY默认组合框IDC_BOOK_NAME默认文本BookNameIDC_BOOK_AUTHOR默认文本AuthorIDC_BOOK_PUBLISHER默认文本PublisherIDOKCaption 确定IDCANCELCaption 取消4。5.3 代码分析(1)“确定”按钮的函数为RQueryDlg::OnOK(),代码如下:void RQueryDlg:
30、:OnOK() / TODO: Add extra validation hereUpdateData(TRUE);/单独处理类型为全部的情况,0表示选择类型为全部m_ctrlCategory.GetLBText(m_ctrlCategory.GetCurSel(),m_strCategory);if(m_strCategory = _T(全部))m_strCategory = _T();CDialog::OnOK();(2)组合框根据图书类型查询的函数为RQueryDlg::GetBookGategory(),代码如下:void RQueryDlg::GetBookGategory()int
31、 num = 0;CString strSql;_variant_t var;m_ctrlCategory。ResetContent();/清空组合框中原有数据/生成SQL查询语句,在数据苦中查找图书类型strSql。Format(SQL_SELECT_CATEGORYNAME);CRBookSaleApp* pApp = (CRBookSaleApp)AfxGetApp();trypApp-m_pRecordsetOpen(strSql.AllocSysString(),pAppm_pConnection。GetInterfacePtr(),adOpenDynamic,adLockOptim
32、istic,adCmdText);/遍历数据库中BookCategory表,获取全部图书类型while(!(pAppm_pRecordset-adoEOF)var = pAppm_pRecordset-GetCollect(CategoryName);if(var。vt != NULL)m_ctrlCategory。AddString((LPCSTR)_bstr_t(var);pApp-m_pRecordsetMoveNext();num+;m_ctrlCategory.AddString(全部);pAppm_pRecordsetClose();catch(_com_error * e)Afx
33、MessageBox(e-ErrorMessage();/设置当前选择类型为全部m_ctrlCategory。SetCurSel(num);5 系统测试进入VC+6。0,打开工程RBookSale.dsw,然后进入源程序,接着编译和运行即可运行。下面将给出系统运行的过程.(1)打开程序后,选择“使用书店身份登录”,输入密码“111”,进入主对话框,如图5。1.图5.1 主对话框(2)在功能菜单下选择图书录入功能,添加一本新的图书信息,如图5.2。图5.2 添加图书信息(3)点击“返回按钮后,系统会自动显示现有图书信息,如图5.3。图5。3 系统自动显示现有图书信息(4)在功能菜单下进入图书销售
34、对话框,卖出一本C+教程,如图5。4。点击返回按钮后,系统会显示当前所有图书剩余库存信息,如图5。4.图5。4 图书销售(5)点击结束销售后,系统会自动显示当前所有图书的库存信息,C+教程的库存量已减少一本,如图5.5。图5。5 完成销售后的库存信息 (6)在功能菜单下进入销售统计对话框,查询全部销售清单,并给出已售出图书总本数,如图5。6。图5.6 查询所有图书销售清单(7)在功能菜单下进入查询库存对话框,查询魅力何来这本书的库存信息,如图5。7。图5。7 查询图书库存信息(8)再售出魅力何来2本后,在功能菜单下进入售完图书列表功能,查询已售完的图书的信息如图5.8。图5。8 查询售完图书列
35、表(9)在出售图书时,若无对应图书信息或图书库存为零,将出售失败,并给出提示信息,如图5。9。图5。9图书销售失败6 操作手册首先将date文件夹下的两个数据库文件附加到本地的SQL数据库中,然后进入VC+6。0,打开工程RBookSale.dsw,进入源程序后,接着编译和运行即可。7 结论7。1 系统功能本系统为图书销售管理系统,主要实现图书录入、图书销售、销售统计、查询库存等功能。该系统中采用图形用户界面,直观、清晰,方便用户操作。图书销售管理系统可以完成书店的日常管理,迅速准确地对已售图书和剩余库存进行统计和汇总工作,大大提高了书店的管理效率和准确性。7。2 系统不足和改进我在同学的帮助
36、和老师的悉心指导下完成了该图书销售管理,但程序还是存在一些不足之处。比如程序没有直接提供修改密码的功能,系统管理员密码保存在数据库的Pwd表中,若要修改密码,可以到数据库中直接修改。由于时间仓促,没有优化设计,还存在一些垃圾和重复代码,也没有进行全面的测试,需要进一步的改进。本系统规模小,实现的功能简单,但稍加改动和完善,完全可以应用到普通书店的销售管理中。7。3 总结本次课程设计完成的是图书销售管理系统,我基本完成了所要求的几个功能,包括图书录入、图书销售、销售统计、查询库存等功能。通过本次课程设计,自己对Visual C+6。0的基本知识有了一个很好的巩固和学习,特别是Visual C+6。0中的MFC,它的功能是非常强大的,使用它制作图形界面很方便。而且自己还进一步熟悉了SQL数据库的知识,包括建表、查询、修改等操作,以及学习了Visual C+6.0怎样连接数据库。开始做这个课