北京理工大学现代远程教育学院
毕业设计(论文)
层 次 专 业 姓 名 毕业时间 专升本 计算机科学与技术 钟玲 2003.7
第1页
北京理工大学 现代远程教育学院
毕业设计任务书
专业名称 计算机科学与技术 班号(教学站) 2000级(北船院教学站) 姓 名 钟玲
毕业设计题目 商品信息管理系统 指导教师 宋晔
负责人签字 陈琪
2003年6
月8 日
第2页
内容和要求:
内容:1.应用软件工程的概念,进行系统分析和设计。
2.应用数据库的基本知识,进行数据库的设计.
3.应用PowerBuilder数据库应用系统开发工具完成代码设计与实现。
要求:1.熟悉软件工程的系统分析及设计方法。
2.掌握数据库设计的基本原理。 3.熟练掌握PowerBuilder数据库开发工具. 第3页
毕业设计(论文)评语表(一)
指导教师对毕业设计(论文)评语: 钟玲同学圆满地完成了毕业设计任务,该生所完成的“商品信息管理系统”课题集中了数据库技术、办公自动化等先进技术,本课题以PB为数据库应用系统的开发工具,设计与实现了\"数据维护、检索、报表处理模块“,解决了对商品信息进行管理等实际问题,表明作者在计算机应用领域具有扎实的理论基础和专业知识以及独立从事科研的能力。 论文立论正确,内容充实,具有一定的实用参考价值。 指导教师 松哗 (签字) 2003年 6月 6日 评阅人对毕业设计(论文)的评语: 该同学在对商品信息管理需求分析基础上,运用当前先进的计算机技术,设计了数据维护、检索、报表处理等模块,较好地解决了商品信息的管理问题。论文叙述清楚,内容充实,实用性强,已达到了对毕业设计的要求和内容。 评阅人 史万明 (签字) 2003 年 6 月 7日 第4页
毕业答辩情况
答辩委员会(小组)成员 姓 名 宋晔 史万明 丁铁麟 李乃超 刘振亚 职 称 副教授 教授 教授 副教授 副教授 工 作 单 位 北京理工大学计算机系 北京理工大学计算机系 北京船舶管理干部学院 北京船舶管理干部学院 北京船舶管理干部学院 备 注 答辩中提出的主要问题及回答的简要情况: 1. 概述第三范式内容. 2. 面向对象开发的特点。 3. 对连锁店应用环境有何设计。 4. 数据输入方式. 回答问题正确. 第5页
毕业设计(论文)评语表(二) 答辩委员会的评语及给定的成绩: 论文立论正确,表达清晰,回答问题正确,按时圆满地完成了毕设任务。 答辩委员会一致通过论文答辩,成绩为优。 毕业设计(论文)起止日期2003 年2 月 17 日至2003 年 6 月 7 日 毕业设计(论文)答辩日期2003 年 6 月8 日 第6页
论文题目:商品信息管理系统
目录
摘要 ................................................................................................................................ 9 前言 .............................................................................................................................. 11 第一章
1。1
绪论 ......................................................................................................... 12 课题研究内容 ......................................................................................... 12
1。1.1 问题的提出 ...................................................................................... 12 1。1.2 课题背景及意义 .............................................................................. 12 1。2 第二章
2.1 2。2
课题研究的软硬件环境 ......................................................................... 13 开发环境及开发工具 ............................................................................. 13 开发环境 ................................................................................................. 13 开发工具 ................................................................................................. 13
Builder
的
概
述
2。2。1Power
13
2.2。2 Power Builder7.0的新特性 ......................................................... 14
第三章
3。1 3。2
系统需求分析 ......................................................................................... 16 系统开发策略 ......................................................................................... 16 系统功能需求分析 ................................................................................. 16
需求分析的任务 .............................................................................. 16
品
信
息
管
理
系
统
的
需
求
分
析
3.2.1
3。2。2商
17
3。2。3商
第四章
4。1
18
品信息管理系统的业务流程图
系统分析与设计 ..................................................................................... 19 系统功能模块设计 ................................................................................. 19
商品信息管理系统功能模块图 ............................................... 19
4.1。1 4。2
数据库设计 ............................................................................................. 20
第7页
4。2。1 4。2.2 4.2。3 4。2.4 4。2.5 4。2.6
第五章
5。1 5。2 5。3 5。4 5。5 5。6 5.7 第六章
6。1 6。2
概念结构设计 ........................................................................... 20 E—R模型 ............................................................................................. 21 范式 ........................................................................................... 21 商品信息管理系统E—R图 ..................................................... 22 系统数据流图 ........................................................................... 26 系统数据字典 ........................................................................... 27
代码设计与实现 ..................................................................................... 35 定义库表关联 ......................................................................................... 35 总体菜单功能设计 ................................................................................. 36 对象与库表的关联性 ............................................................................. 37 功能界面的设计 ..................................................................................... 41 软件调试 ................................................................................................. 57 可执行文件的生成 ................................................................................. 58 分发应用程序 ......................................................................................... 59 研究成果及软件测试 ............................................................................. 61 研究成果 ................................................................................................. 61 软件测试 ................................................................................................. 61
盒
测
试
和
白
盒
测
试
6。2。1黑 6。3 第七章
7。1 7。2
61
商品信息管理系统测试 ......................................................................... 62 技术难点及解决方案 ............................................................................. 72 DropDownDW编辑样式 ............................................................................ 72 以下拉列表框实现的动态操作 ............................................................. 73
致谢 .............................................................................................................................. 76 附录 .............................................................................................................................. 76 参考文献 ...................................................................................................................... 76
第8页
摘要
本课题是以一个百货连锁总部的商品信息管理为基础,结合集团商品部工作的实际需求,详细阐述了《商品信息管理系统》软件设计、开发的全过程,并对技术难点作出分析,提出解决方法。使“商品信息管理系统\"最终具有数据维护、数据检索和报表处理的功能。
本系统后台以Adaptive Server Anywhere 6.0(ASA6。0)作为数据库系统的客户端软件,前台采用基于C/S的应用系统开发工具Power Builder7。0,从而快捷方便的实现了系统的开发.
本系统主要功能模块有:
数据维护:实现新建、修改、删除、存储功能
数据检索:实现按不同要求分类模糊查询,组合查询功能 报表处理:根据查询方式不同,选择输出检索信息
本系统将信息检索作为研究重点,力求通过关键字段实现模糊检索功能,使信息查询更加简单灵活,即使第一次接触系统的人也可轻松操作,快速的找到所需信息.同时,在操作界面的设计上,按照数据间的关系在同一界面中系统根据不同操作激活相应操作对象,使直观视觉上更加符合传统习惯。此外本系统以下拉数据窗口(DropDownDW)方式为数据编辑风格,从而保证了数据录入的规范性,比传统的下拉列表框方式更加灵活简便。
关键字:商品档案、信息管理系统、数据检索、操作界面
第9页
Abstract
This project is based on the Products Information Management System of a chain stores head office, and focusing on the software development for products basic information management,with a view of the practical requirements of the business in Merchandising Department. This study will explain in detail the whole process of the software design and development of the 〈〈Products Information Management System〉〉, the technical difficulties will be analyzed, and the solution will be raised here。 Finally, integrate the following functions into this system: Datum Maintenance, searches and report forms processing。
Client/Server(C/S) mode has been used in the system。The client software of the host database system is \"Adaptive Server Anywhere 6。0(ASA6。0)”, and using the \"Power Builder 7。0\" application developement tools in the front end, which facilities the development of the whole system。
The main function modules are made up of the following: 。Datum Maintenance:
with \"New”,”Modify”,\"Delete”,”Save” functions
.Datum Searches: with ”Fuzzy search\ 。Report forms Processing: filter the search result according to search mode.
This system emphasizes on the information searching, trys to realize the fuzzy search function by the KEY fields, which will simplify the searching work, user friendly and allowed easy acessment.As to the user interfaces, the system can activate the appropriate object according to different operations, considering the relationship among datums, which makes it looks more accordant with the traditional style. Besides, the DATA EDIT STYLE of the system is ”DropDownDataWindow”, which ensure the normative of data recording, and it is more flexible compare to the traditional style。
KEY WORDS:
Products Basic Information,Datum Searches ,Information Management System, UI(User
Interface)。
第10页
前言
在信息时代的今天,计算机以其快速、准确的信息处理功能渗透于我们周围的方方面面,同时随着网络技术和软件技术的飞速发展,当今社会也正快速向信息化社会前进,信息系统的作用也越来越大,商业经营管理也日渐体现出运用计算机的优越性。
我从事商业工作多年,使用过很多商品查询、管理系统,发现其中或多或少的存在一些漏洞,特别是随着数据量的增大,系统的信息管理变得更加困难,查询时间也变的无法接受。因此,在这次毕业设计中,我运用所学的软件工程及数据库知识,采用目前流行的基于客户机/服务器的开发工具Power Builder7。0,利用面向对象的可视化设计方法,结合自己日常的工作需求,开发了《商品信息管理系统》.
任何软件系统本质上都是信息处理系统,因此,《商品信息管理系统》的主要功能就是对商品三大基本信息(即供应商信息、品牌信息及单品信息)的建立、删除及数据维护,并可为用户提供多表交叉组合的模糊查询方式,对数据检索提供了快捷的方式.
本系统主要功能模块有: 数据维护 数据检索 报表处理
通过这次毕业设计的系统开发,使自己对软件工程生命周期的各阶段有了更为深刻的认识,同时对面向对象的可视化图形界面的数据库应用系统开发工具的开发使用,有了一次全面实践的机会。
在毕业设计过程中,我得到了宋晔老师的热情指导,在此我衷心感谢培养教育我的各位老师.
第11页
第一章 绪论
1.1 课题研究内容 1.1.1 问题的提出
随着全球经济一体化和电子商务浪潮的冲击,特别是我国加入WTO后,我国企业生存与发展的环境面临重大变化。企业面对激烈的市场竞争,不仅要努力提高自身的技术能力,更要在管理上下功夫。为使公司商品部人员能够方便快捷地共享信息、交流信息,高效地协同工作;同时又实现迅速、全方位的信息采集、信息处理,为管理和决策提供科学的依据,使各项管理工作更加规范化、标准化。为此提出《商品信息管理系统》开发的课题。 1.1.2 课题背景及意义
我现从事商品市场分析工作,向公司决策层提供各种市场信息。其中包括供应商支持、产品结构决策、市场拓展等。
我们利用市场信息,了解提供企业主营商品的其他供应商及同类或替代产品的情况,并与现有供应商及其产品进行对比,从中发掘新的供应商或新产品,为拓展采购渠道,开发新商品提供信息.并向公司提交:供应商对比分析、产品对比分析等报告.
我公司目前使用的系统过于庞大,它含盖了物流、信息流、资金流各个方面,大而全,但对于商品部的工作缺乏针对性,无用信息量大,使用及维护都很不便.为此,本课题结合我的工作内容,以信息流为切入点,提出了以应用面向对象的数据库应用开发技术-—PowerBuilder为依据的《商品信息管理系统》的开发课题,开发一种针对性更强的简单实用的查询系统,可以排除大量无用信息,减小工作强度,提高工作效率和工作质量,为决策层及时提供准确的信息。
第12页
1.2 课题研究的软硬件环境
在当今的信息时代,仅仅依靠本企业的内部资源,不可能有效地参与市场竞争,必须把经营过程中的相关环节:供应商、制造商、分销网络、客户等纳入一个紧密的供应链中,才能有效地安排企业的供、销活动.企业只有利用社会的一切市场资源,才能快速高效地满足市场需求,提高自我经营效率,并在市场上获得竞争优势.《商品信息管理系统》力求满足这种市场需求,实现对供应链的基本管理与查询,特别为适应连锁经营的企业决策,满足信息时代市场竞争的需要。
第二章 开发环境及开发工具
2.1 开发环境
在Power Builder中可创建的数据库依赖于系统所安装的数据库客户软件及相应的驱动程序,只有安装了各种数据库管理系统的客户端应用软件,创建了数据库,才能在Power Builder开发环境中连接到数据库,并通过Power Builder访问数据库.
Adaptive Server Anywhere 6.0数据库系统既能运行在数据库服务器上,又能运行在客户机上作为本地数据库系统来使用,且在Power Builder中的操作又完全一致。它可以和Power Builder7。0实现无缝对接,对ASA数据库的操作由Power Builder7。0中所提供的专门接口完成。
基于以上ASA6.0的特性,本系统以此平台作为后台数据库使用。 2.2 开发工具
2.2.1 Power Builder 的概述
Power Builder(简称PB)是由著名的数据库公司Sybase提供的一种客户/服务器前端应用程序开发工具;可以在Windows环境下运行,采用的图形界面可以快速开发出独立的应用程序对象,对象可以重复使用及共享;它不但可以从个人计
第13页
算机上读取数据,还可以通过内建的驱动程序直接连接大型数据库.Power Builder作为集成强大且易于使用的第四代编程语言(4GL),可以使开发人员的开发进程更快、成本更低、质量更高、功能更强,为应用开发提供了全面综合的支持。 2.2.2 Power Builder7.0的新特性
Power Builder 7。0新功能主要表现在用户接口和开发方法的改进和增强、组件开发和配置方法的更新、对数据库连接的增强与扩充等方面。 1. 全新的用户接口可开发界面
在Power Builder7。0中对用户接口和开发界面作了较大的改进,改进后的用户接口和开发界面使应用程序创建更容易,更高效。 ① 崭新的主界面
在Power Builder7。0中,用户始终工作在应用程序背景下.Power Builder7。0的另一个用户接口新特性是PowerBar工具栏具有更加简洁的工具按纽. ② 以对象为中心的开发环境
Power Builder7.0以对象为中心,PowerBar工具栏中的New、Inherit、Open、Run和Preview按钮不再从属于特定的画板,而是在任务之间进行切换。 ③ 非模态的开发视图区
Power Builder7。0的画板一般是一个拥有多个视窗(view)的画板窗口,每个视窗提供查看和修改对象的特定方式或者显示与对象相关的某种信息,用户可以同时进行多项任务。
Power Builder7.0在界面方面的改进包括: 允许用户自定义键盘快捷键
增加To-Do List(操作历史列表)用于跟踪用户操作 记录最近访问过的应用程序 2. 支持开发和配置更多类型的组件
在Power Builder7.0增加了可开发的组件类型,对于每种组件都提供了向导,通过向导的运行可迅速的创建某一类型组件的基本框架,然后将这一框架加以丰
第14页
富完善就可以创建完整的组件,各种组件的创建工具都是自定义用户对象类开发工具。Power Builder7。0支持创建控制Power Builder虚拟机的Jaguar组件,Com/MTS组件,并支持远程调试。 3. 数据库连接新特性:
在Power Builder7.0中增加了对新数据库类型连接的支持,减少了对不常用数据库的支持,对旧数据库也作了较大改进:
导入和导出数据库描述文件(PROFILES):在Power Builder7.0中每
一个数据库接口都增加了导入和导出数据库描述文件的选项。导入选项可以直接导入相应数据库接口以前所定义的描述文件,导出选项也可导出描述文件供其他接口使用。 增加访问数据库的使用工具
Power Builder7。0在Database画板的Objects视窗中列出了每一种数据库接口中可使用的使用工具,在Database Frofiles对话框中可以配置和测试软件. 4. 其他新特性
对ActiveX和OLE的支持
新增了Tracbar,Progressbar,StatixHyperLink和PictureHyperLink空件 允许存储过程更新数据库
支持ActiveX和DataWindow Web控件
第15页
第三章 系统需求分析
3.1 系统开发策略
由于本系统属于商业数据处理系统,是直接面向终端用户,因此它的开发方法是应该有区别于传统方法学的一种快速、灵活、交互式的模式。
快速原型法的提出,打破了传统自顶向下的开发模式,通过“试用-反馈-修改”的多次反复,开发出真正符合用户需要的应用系统,如图3—1所示。
需求分析构造原型运行原型不可行评价原型不满意修改原型 图3-1
快速原型法的开发过程
3.2 系统功能需求分析 3.2.1 需求分析的任务
需求分析是软件定义时期的最后一个阶段,也是设计数据库的一个起点,它确定了系统必须完成哪些工作,提出完整、准确、清晰和具体的要求,直接影响到后面各个阶段的设计,及设计结果是否合理和实用.
第16页
需求分析的任务是通过详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统(手工系统/计算机系统)工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能.新系统必须充分考虑今后可能的扩充和改变,不能仅仅按当前应用需求来设计系统.
其主要解决的问题:
信息要求:用户希望从数据库中获取什么数据,并由此决定在数据库中
存储哪些数据.
处理要求:明确用户对数据有什么样的处理要求,从而确定数据之间的相
互关系。
安全性与完整性要求:确定用户的最终需求是一件很困难的事情,用户
缺少计算机知识,不能准确表达自己的需求,所提出的需求往往经常变化。设计人员缺少用户的专业知识,不易理解用户的真正需求。因此在需求分析阶段要求客户的广泛参与,设计人员也要去熟悉客户的业务工作,才能逐步确定用户的实际需求.
3.2.2 商品信息管理系统的需求分析
商品信息管理系统是一个基于全国连锁制管理的百货店统一集团内部商品档案的管理工具,以实现信息共享、规范管理。此商品信息管理系统完成以下主要任务:
商品基本档案维护(新建、查询、统计)
商品基本档案的数据检索(按不同要求分类模糊查询,组合查询) 报表处理(以不同选择方式,输出基本档案信息)
第17页
3.2.3 商品信息管理系统的业务流程图 如图3-2所示
业务部门新品上架需求填写商品信息处理表系统操作人员查询数据库建立系统新商品的基本档案显示已建立的商品信息显示已建立的商品信息使用标准信息进行业务销售管理使用标准信息进行业务销售管理
图3—2 商品信息管理系统业务流程图
第18页
第四章 系统分析与设计
4.1 系统功能模块设计
4.1.1 商品信息管理系统功能模块图
商品信息管理系统主要实现的是档案数据的查询功能,它采用模块化程序设计,共有三大主要功能模块,如图4-1所示
商品信息管理系统数据维护数据检索报表处理系统新建基本档案新建商品分类密码修改排序查询打印退出 图4-1
I. 数据维护
商品管理信息系统功能模块图
对三大基本档案信息(供应商、品牌、单品)进行新建、删除、查
询、更新的维护
对商品分类信息(部门、分类、次分类)进行数据维护 II. 数据检索
对供应商档案的查询,提供按供应商主档查询、按单品查找和按品
牌查找供应商主档信息,并提供排序功能
第19页
对品牌查询,提供按品牌主档查询和按供应商查找品牌主档信息和
合作信息,并提供排序功能
对单品查询,提供按单品主档查询和供应商查找单品主档信息和合
作信息,并提供排序功能
III. 报表处理
按不同的检索条件产生不同的主档信息
4.2 数据库设计 4.2.1 概念结构设计
概念结构设计是将分析得到的用户需求抽象为信息结构(即概念模型)的过程,它是整个数据库设计的关键。
概念结构的主要特点是:
1. 能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用
户对数据的处理要求.是对现实世界的一个真实模型。
2. 易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参
与是数据库的设计成功的关键
3. 易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。 4. 易于向关系、网状、层次等各种数据模型转换。
概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定.
为了把用户的数据要求清晰明确的表达出来,通常要建立一种面向问题的数据模型,按照用户的观点来对数据和信息建模。最常用的概念性数据模型就是ER模型。
第20页
4.2.2 E—R模型
ER模型中包含“实体”、“联系”和“属性”等三个基本成分. 1) 实体
实体是客观世界存在的且可相互区分的事物。它可以是人也可以是动物;可以是具体事物也可以是抽象概念。 2) 联系
联系是指客观世界中各事物彼此间的联系。联系分为三类:一对一的关系,一对多的关系,多对多的关系. 3) 属性
属性是实体或联系所具有的性质,通常一个实体用若干属性来刻画。 人们通常就是用实体、联系和属性这三个概念来理解现实问题,因此,ER模型比较接近人的思维方式.此外,ER模型使用简单的图形符号表示系统分析员对问题的理解,不熟悉计算机的人也能理解它,因此,ER模型可以作为用户与系统分析员之间的交流工具。 4.2.3 范式
通常用“范式(Normal Forms)\"定义消除数据的冗余程度。第一范式冗余程度最大,第五范式冗余程度最小。但是,范式级别越高,存储同样数据就需要分解成更多的表,因此,“存储自身”的过程也就越复杂。第二,随着范式级别的提高,数据的存储结构与基于问题域的结构间的匹配程度也随之下降,因此,在需求变化时数据的稳定性较差.第三,范式级别提高则需要访问的表就越多,因此,性能(速度)将下降。从实用角度来看,大多数场合下,选用第三范式比较合适.
第21页
第一范式(不可分性)
每个属性值都必须是原子值,即仅仅是一个简单值而不含内部结构。 第二范式(依赖性和从属性)
满足第一范式条件,而且每个非关键字属性都由整个关键字决定. 第三范式(不依赖性或独立性)
符合第二范式的条件,每个非关键字有关键字决定,而且一个非关键字属性不能是对另一个非关键字属性的进一步描述。 4.2.4 商品信息管理系统E-R图 1. 实体关系E—R图
如图4-2所示
供应商NM提供M单品N品牌N归属1归属NN1部门次分类归属1分类
图4—2 商品信息管理系统实体关系E—R图
第22页
2. 实体属性图:
1) 供应商实体属性E—R分图,如图4-3所示
供应商名称供应商编码Pk税号unique index银行名称银行帐号电话地址经营方式供应商供应商结构公司性质注册资金营业执照号接洽人 图4-3 商品信息管理系统供应商实体属性E—R分图
2) 品牌实体属性E-R分图,如图4-4所示
部门编码Fk品牌编码Pk普通折扣率品牌名称品牌会员折扣率员工折扣率
图4-4 商品信息管理系统品牌实体属性E—R分图
第23页
3) 单品实体属性E—R分图,如图4—5所示
单品编码Pk原条码unique index次分类编码Fk单品名称单品单品类别规格销售单位产地售价
图4-5 商品信息管理系统单品实体属性E-R分图
4) 供应商— 品牌实体属性E—R分图,如图4—6所示
倒扣率保证金品牌编码Pk,Fk供应商编码Pk,Fk供应商—品牌普通折扣承担会员折扣承担员工折扣承担 图4-6 商品信息管理系统供应商— 品牌实体属性E-R分图
5) 供应商-单品实体属性E—R分图,如图4—7所示
单品编码Pk,Fk供应商编码Pk,Fk含税标志员工折扣率订购单位进项税率销项税率供应商-单品普通折扣率会员折扣率单品成本 图4—7 商品信息管理系统供应商—单品实体属性E-R分图
第24页
6) 部门实体属性E—R分图,如图4-8所示
部门部门编码Pk部门名称 图4—8
商品信息管理系统部门实体属性E—R分图
7) 分类实体属性E—R分图,如图4-9所示
分类分类编码Pk部门编码Fk分类名称 图4—9 商品信息管理系统分类实体属性E—R分图
8) 次分类实体属性E—R分图,如图4—10所示
次分类次分类编码Pk分类编码Fk次分类名称 图4-10 商品信息管理系统次分类实体属性E-R分图
逻辑结构设计的任务就是把概念结构设计阶段设计的基本E—R图转换为数据库系统所支持的实际数据模型。
把实体的属性定义为关系模型(表)的属性,实体或实体之间关系的主键就是关系模型的主键,商品信息管理系统E—R图中的实体和实体之间关系转化为如下的关系模型:
第25页
1) GYSDA(vdr_id*,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,
p
acct_no,tel_no,cntctr,wrk_md)
2) CFLPPDA(brd_id*,dep_id*,brd_nm,nml_dis_rt,vip_dis_rt,emp_dis_rt)
p
f
3) DPDA(gds_id*,subcls_id*,gds_nm,gds_tp,sl_prc,unt_id,stand,bar_cd,
p
f
prd_ara)
4) GYSPPDZ(vdr_id**,brd_id**,dis_rt,bas_mny,nml_shr_rt,vip_shr_rt,
p,
f
p,f
emp_shr_rt)
5) GYSDPDZ(vdr_id**,gds_id**,od_unt_id,in_tax_rt,out_tax_rt,nml_dis_rt,
p,
f
p,f
vip_dis_rt,emp_dis_rt,gds_cst,tax_flg)
6) BMDA(dep_id*,dep_nm)
p
7) CFLDA(subcls_id*,cls_id*,subcls_nm)
p
f
8) FLDA(cls_id*,dep_id*,cls_nm)
p
f
注:加”*”号的为该表的主键。 4.2.5 系统数据流图
数据流图描绘系统的逻辑模型,图中没有任何具体的物理元素,只是描绘信息在系统中流动和处理的情况。因为数据流图是逻辑系统的图形表示,即使不是专业的计算机技术人员也容易理解,所以是极好的通信工具。此外,设计数据流图只需要考虑系统必须完成的基本逻辑功能,完全不需要考虑如何具体地实现这些功能,所以它也是软件设计很好的出发点.
商品信息管理系统的数据流图,如图4-11所示:
第26页
业务人员D1.1.1P1D2.1.1查询商品信息数据库系统操作员 P2.1录入供应商信息系统操作员 P2.2 录入商品信息系统操作员D2.2.2D2.2.3D2.1.2D2.2.1F1供应商基本档案F2商品基本档案D4.1P4查询报表业务人员D4.2P3更新商品信息库D3.1D3.2
图4-11 商品信息管理系统的数据流图
4.2.6 系统数据字典
数据字典是关于数据信息的集合,也就是对数据流图中包含的所有元素的定义的集合.
任何字典最主要的用途都是供人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。
数据流图和数据字典共同构成系统的逻辑模型,没有数据字典数据流图就不严格,然而没有数据流图数据字典也难于发挥作用。只有数据流图和对数据流图中每个元素的精确定义放在一起,才能共同构成系统的规格说明. 1. 数据字典的内容
一般说来,数据字典应该由四类元素组成:
第27页
数据流
数据元素(数据项) 数据存储 处理 2. 数据字典的用途
数据字典最重要的用途是作为分析阶段的工具.在数据字典中建立的一组严密一致的定义很有助于改进分析员和用户之间的通信,也有助于改进在不同的开发人员或不同的开发小组之间的通信。
数据字典中包含的每个数据元素的控制信息是很有价值的。它列出了使用一个给定的数据元素的所有程序(或模块),能很容易估计改变一个数据将产生的影响,并能对所有受影响的程序或模块作出相应的改变。数据字典是开发数据库的第一步,而且是很有价值的一步。
第28页
3. 商品信息管理系统数据字典
1) 数据流,如表4—1所示
编号 D1。1。1
名称
组成
供应商编码+供应商名称+供应商结构
来源
去向
供应商档案 +公司性质+注册资金+营业执照号+地
址+税号+银行名称+银行帐号+电话+接洽人+经营方式
业务人员 系统操作员
品牌档案 次分类品牌编码+部门编码+品牌名称
+普通折扣率+会员折扣率+员工折扣率
单品档案 单品编码+次分类编码+单品名称+单
品类别+售价+销售单位+规格+原条码+产地
D2.1。1 供应商档案 供应商编码+供应商名称+供应商结构系统操作员 系统操作员
+公司性质+注册资金+营业执照号+地址+税号+银行名称+银行帐号+电话+接洽人+经营方式
D2。1.2 供应商档案 供应商编码+供应商名称+供应商结构系统操作员
+公司性质+注册资金+营业执照号+地址+税号+银行名称+银行帐号+电话+接洽人+经营方式
D2.2.1
供应商档案 供应商编码+供应商名称+供应商结构
+公司性质+注册资金+营业执照号+地址+税号+银行名称+银行帐号+电话+接洽人+经营方式
D2.2。2
品牌档案 次分类品牌编码+部门编码+品牌名称系统操作员
+普通折扣率+会员折扣率+员工折扣率
D2。2。3 经销单品档案 单品编码+次分类编码+单品名称+单系统操作员
品类别+售价+销售单位+规格+原条码
第29页
信息库
信息库 系统操作员
信息库
信息库
+产地
D3.1
供应商品牌对供应商编码+品牌编码+倒扣率+保证
照
金+普通折扣承担比+会员折扣承担比+员工折扣承担比
D3。2 供应商单品对供应商编码+单品编码+订购单位+进
照
项税+销项税+普通折扣率+会员折扣率+员工折扣率+订购成本+含税标志
D4。1
供应商档案 供应商编码+供应商名称+供应商结构
D4。2
+公司性质+注册资金+营业执照号+地址+税号+银行名称+银行帐号+电话+接洽人+经营方式
信息库
业务人员
信息库
信息库
信息库
信息库
品牌档案 次分类品牌编码+部门编码+品牌名称
+普通折扣率+会员折扣率+员工折扣率
单品档案 单品编码+次分类编码+单品名称+单
品类别+售价+销售单位+规格+原条码+产地
表4-1 商品信息管理系统数据流
第30页
2) 数据处理
编号:P1 名称:查询处理 输入信息:D1。1。1
输出信息:D2。1。1 ,D4.1 激发条件:业务人员通知业务 简要说明:系统操作人员接受业务部门的新品上架业务需求 加工逻辑:系统操作人员查询商品信息库是否有已维护的信息记录 出错处理:出错后提示用户
编号:P2 名称:记录建档 输入信息:D2.1。1,D.2。2。1 文件信息:F1,F2
输出信息:D3。1,D3。2 激发条件:系统操作员执行建档操作 简要说明:系统操作员执行建档操作
加工逻辑:系统操作员对未查询到的新记录,键入商品信息库 出错处理:出错后提示用户
编号: P3 名称:商品信息库更新商品记录 输入信息:D3.1,D3.2
输出信息:D4。2 激发条件:新建商品档案 简要说明:对新建入的记录自动更新
加工逻辑:系统对于新建立的商品产生标准编码,对新调整的供货关系改变主档对照关系表
出错处理:出错后提示用户
编号: P4 名称: 查询处理 输入信息:D3。1,D3.2
输出信息:D4。1,D4。2 激发条件:执行查询操作 简要说明:业务人员根据需要执行各类查询操作
加工逻辑:将各类查询结果在数据窗口中显示,并打印输出 出错处理:出错后提示用户
第31页
4. 数据库文件
1) 供应商档案GYSDA表结构
字段名称 VDR_ID VDR_NM VDR_TP
字段类型 字段长度 CHAR CHAR CHAR
10 50 2
是否为空 not null not null not null
字段释意 供应商编码 供应商名称 供应商结构
备注
primary key
1—股份有限公司2—有限责任公司3—国有独资公司4—非公司
VDR_PRY
CHAR
2
not null
公司性质
1—生产厂商2-总代理3—分销商
REG_MNY PMT_CD VDR_ADR TAX_NO BANK ACCT_NO TEL_NO CNTCTR WRK_MD
CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR CHAR
10 30 70 15 40 30 15 10 1
not null not null not null not null not null not null not null not null not null
注册资金 营业执照号 地址 税号 银行名称 银行帐号 电话 接洽人 经营方式
万元
Unique index
1—经销 2-联销
2) 品牌档案CFLPPDA表结构
字段名称 BRD_ID
字段类型 字段长度 是否为空 CHAR
10
not null
字段释意 品牌编码
备注 primary key
DEP_ID
BRD_NM NML_DIS_RT VIP_DIS_RT EMP_DIS_RT
CHAR
CHAR FLOAT FLOAT FLOAT
3
40
not null 部门编码
not null not null not null not null
品牌名称 普通折扣率 会员折扣率 员工折扣率
foreign key
第32页
3) 单品档案DPDA表结构
字段名称 GDS_ID SUBCLS_ID GDS_NM GDS_TP SL_PRC UNT_ID STAND BAR_CD PRD_ARA
字段类型 字段长度 是否为空 CHAR CHAR CHAR CHAR DECIMAL CHAR CHAR CHAR CHAR
12 6 40 1 12,4 5 35 20 5
not null not null not null not null not null not null not null not null not null
字段释意 单品编码 次分类编码 单品名称 单品类别 售价 销售单位 规格 原条码 产地
备注 primary key foreign key
1超市2百货
Unique index
4) 供应商品牌对照GYSPPDZ表结构
字段名称 VDR_ID
字段类型 字段长度 是否为空 CHAR
10
not null
字段释意 供应商编码
备注
primary key, foreign key primary key, foreign key
BRD_ID DIS_RT BAS_MNY NML_SHR_RT VIP_SHR_RT EMP_SHR_RT
CHAR FLOAT DECIMAL FLOAT FLOAT FLOAT
10
not null not null
品牌编码 倒扣率 保证金 普通折扣承担 会员折扣分担 员工折扣分担
(16,2) not null
not null not null not null
第33页
5) 供应商单品对照GYSDPDZ表结构
字段名称 VDR_ID
字段类型 字段长度 是否为空 CHAR
10
not null
字段释意 供应商编码
备注
primary key, foreign key primary key, foreign key
GDS_ID OD_UNT_ID IN_TAX_RT OUT_TAX_RT NML_DIS_RT VIP_DIS_RT EMP_DIS_RT GDS_CST TAX_FLG
CHAR CHAR CHAR CHAR FLOAT FLOAT FLOAT DECIMAL CHAR
12 5 2 2
not null not null not null not null not null not null not null
单品编码 订购单位 进项税率 销项税率 普通折扣率 会员折扣率 员工折扣率 单品成本 含税标志
(12,4) not null 1
not null
6) 部门档案表BMDA表结构
字段名称 DEP_ID DEP_NM
字段类型 字段长度 是否为空 CHAR CHAR
3 40
not null not null
字段释意 部门编码 部门名称
备注 primary key
7) 经销次分类档案CFLDA表结构
字段名称 SUBCLS_ID CLS_ID SUBCLS_NM
字段类型 字段长度 是否为空 CHAR CHAR CHAR
6 3 40
not null not null not null
字段释意 次分类编码 分类编码 次分类名称
备注 primary key foreign key
8) 分类档案FLDA表结构
字段名称 CLS_ID DEP_ID CLS_NM
字段类型 字段长度 是否为空 CHAR CHAR CHAR
3 3 40
not null not null not null
第34页
字段释意 分类编码 部门编码 分类名称
备注 primary key foreign key
第五章 代码设计与实现
商品信息管理系统是采用面向对象的Power Builder开发数据库应用系统进行的开发. 5.1 定义库表关联
各库表之间关联关系,如图5-1所示
图5-1 库表关联图
第35页
5.2 总体菜单功能设计
商品信息管理系统总菜单,如图5—2所示
图5-2 系统菜单
第36页
5.3 对象与库表的关联性
商品信息管理系统各对象与库表的关联关系,如表5—1所示
窗口 w_main w_login 名称 数据窗口 无 无 无 dw_1 数据窗口对象 无 无 无 d_gys_detail 数据源 无 无 无 q_gys 库表 无 无 无 GYSDA 无 无 无 vdr_id*,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,acct_no,tel_no,cntctr,wrk_md brd_id*,dep_id,brd_nm,nml_dis_rt,vip_dis_rt,emp_dis_rt vdr_id*,brd_id*,dis_rt,bas_mny,nml_shr_rt,vip_shr_rt,emp_shr_rt gds_id*,subcls_id*,gds_nm,gds_tp,sl_prc,unt_id,stand,bar_cd,prd_ara vdr_id*,gds_id*,od_unt_id,in_tax_rt,out_tax_rt,nml_dis_rt,vip_dis_rt,emp_dis_rt,gds_cst,tax_flg dep_id*,dep_nm cls_id*,dep_id,cls_nm subcls_id*,cls_id,subcls_nm 列字段 登录 密码确认 w_modify 主界面 w_gys 供应商档案维护窗口 w_pp 品牌档案维护窗口 tab_1.tabpage_1。dw_1 tab_1。tabpage_2。dw_2 d_cflpp d_gyspp q_pp q_gyspp CFLPPDA GYSPPDZ w_dp 单品档案维护窗口 tab_1.tabpage_1.dw_1 tab_1。tabpage_2.dw_2 d_dp d_gysdp q_dp q_gysdp DPDA GYSDPDZ w_spfl 商品分类档案维护窗口 dw_1 d_bm d_fl d_subcls q_bm q_fl q_subcls BMDA FLDA CFLDA 第37页
w_change密码修_passwor改 d w_gys_cx 供应商基本信息查询窗口 无 无 无 无 无 tab_1。tabpage_1.dw_1 tab_1。tabpage_1。dw_2 tab_1.tabpage_2.dw_3 tab_1.tabpage_2。dw_4 tab_1。tabpage_3。dw_5 tab_1。tabpage_3。dw_6 d_gys_master d_gys_detail d_gys_dp_master d_gys_dp_detail d_gys_pp_master d_gys_pp_detal q_gys q_gys q_dpgys q_dpgys q_ppgys q_ppgys GYSDA DPDA GYSDA GYSDPDZ CFLDA GYSDA CFLPPDA GYSPPDZ w_pp_cx 品牌基本信息查询窗口 dw_1 dw_2 dw_1 dw_2 d_cflpp_master1 d_cflpp_gysdz22 d_cflpp_gys_master d_cflpp_gysdz33 第38页
q_cflpp q_gysppdz q_cflpp_gys q_gysppdz1 CFLPPDA BMDA GYSDA BMDA CFLPPDA GYSPPDZ GYSDA BMDA CFLPPDA GYSPPDZ GYSDA BMDA vdr_id*,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,acct_no,tel_no,cntctr,wrk_md gds_nm,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,acct_no,tel_no,cntctr,wrk_md brd_nm,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,acct_no,tel_no,cntctr,wrk_md brd_id*,dep_id,brd_nm,nml_dis_rt,vip_dis_rt,emp_dis_rt, dep_nm vdr_nm,brd_id,brd_nm,dis_rt,bas_mny,nml_shr_rt,vip_shr_rt,emp_shr_rt vdr_id,vdr_nm,dep_nm,brd_id,brd_nm,nml_dis_rt,vip_dis_rt,emp_dis_rt CFLPPDA GYSPPDZ w_dp_cx 单品基本信息查询窗口 dw_1 dw_2 dw_1 dw_2 d_cfldp_master1 d_dp_gysdz22 d_cfldp_gys_master1 d_dp_gysdz33 q_cfldp q_dp_gysdz22 q_gysdpda q_gysdpdz CFLDA DPDA CFLDA DPDA GYSDA GYSDPDZ CFLDA DPDA GYSDA GYSDPDZ CFLDA DPDA GYSDA GYSDPDZ w_select_report w_filter_condition 报表类无 型选择 检索条无 件 无 无 无 无 无 无 vdr_nm,dep_nm,brd_nm,vdr_id,brd_id,dis_rt,bas_mny,nml_shr_rt,vip_shr_rt,emp_shr_rt gds_id*,subcls_nm*,gds_nm,gds_tp,sl_prc,unt_id,stand,bar_cd,prd_ara gds_nm,vdr_nm,gds_id*,od_unt_id,in_tax_rt,out_tax_rt,nml_dis_rt,vip_dis_rt,emp_dis_rt vdr_id,vdr_nm,gds_id,gds_nm,subcls_nm,gds_tp,sl_prc,unt_id,stand,bar_cd,prd_ara vdr_id*,gds_id*,od_unt_id,in_tax_rt,out_tax_rt,nml_dis_rt,vip_dis_rt,emp_dis_rt,gds_cst,tax_flg,subcls_nm,gds_nm,vdr_nm 无 无 第39页
w_filter_report 查询报dw_1 表窗口 w_sort_report 排序报dw_1 表窗口 d _ dp_bb d_gys_bb d_pp _bb q _ dp q _ gys q_pp DPDA GYSDA CFLPPDA gds_id*,subcls_id*,gds_nm,gds_tp,sl_prc,unt_id,stand,bar_cd,prd_ara vdr_id*,vdr_nm,vdr_tp,vdr_pry,reg_mny,pmt_cd,vdr_adr,tax_no,bank,acct_no,tel_no,cntctr,wrk_md brd_id*,dep_id,brd_nm,nml_dis_rt,vip_dis_rt,emp_dis_rt 表5-1 对象与库表关联
第40页
5.4 功能界面的设计
“商品信息管理系统\"整体的功能界面,是以点击主菜单各菜单项内容,打开相应功能窗口界面而实现。应用程序对象spgl.pbl的open事件代码,详见附录-1。
系统运行,屏幕首先显示友好的主窗口界面,分为“系统操作员\"和“业务操作员”两种用户登录方式,以实现按不同的访问级别进行统一定义和管理,保证了数据的安全性和共享性。“登录”w_main窗口各对象源代码,详见附录-2。在窗口中放置了3个控件,如图5—3所示
控件名称 rb_1 rb_2 p_1 控件显示文字 系统操作员 业务操作员 控件类型 RadioButton RadioButton Picture
图5-3 系统登录窗口
第41页
点击“系统操作员”,登录系统,屏幕将显示密码确认窗口,用以检验用户帐户和密码的正确性。“密码确认”w_login窗口各对象源代码,详见附录—3。在窗口中放置了7个控件,如图5—4所示。
控件名称 p_1 st_1 st_2 sle_1 sle_2 cb_1 cb_2 操作员帐号: 操作员密码: 确认 取消 控件显示文字 控件类型 Picture StaticText StaticText SingleLineEdit SingleLineEdit CommandButton CommandButton
图5—4 密码确认窗口
输入正确的用户帐号和密码,确认通过后,将登录到主菜单窗口,开始进行正常的业务操作。主界面w_modify各菜单项的源代码,详见附录—4。在窗口中只关联了m_frame菜单,如图5—5所示:
图5-5 主界面菜单窗口
第42页
其中“数据维护”、“数据检索\"、“报表处理”菜单项的下拉菜单内容如下:
单击不同的菜单内容,将展现不同的操作窗口界面。
在各操作窗口界面均设有“返回”按钮,单击“返回”按钮,即可关闭该活动窗口,并返回主菜单窗口。 1. 数据维护模块
“数据维护”模块主要实现对三大基本档案信息(供应商、品牌、单品)进行新建、删除、查询、更新的维护,以及对商品分类信息(部门、分类、次分类)进行数据维护.其部分界面内容如下:
供应商档案维护w_gys窗口各对象源代码,详见附录-5。在窗口中放置了23个控件,如图5—6所示。
控件名称 dw_1 cb_1 cb_2 cb_3 cb_4 cb_5 cb_6 cb_7 保存 返回 查询 取消 新建 删除 第一条 控件显示文字 控件类型 DataWindow CommandButton CommandButton CommandButton CommandButton CommandButton CommandButton CommandButton 第43页
cb_8 cb_9 cb_10 gb_1 gb_2 st_1 st_2 st_3 st_4 st_5 st_6 st_7 st_8 sle_id sle_name 前一条 后一条 最后一条 查询 第 共 供应商编码 供应商名称 条 条 CommandButton CommandButton CommandButton GroupBox GroupBox StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText SingleLineEdit SingleLineEdit
图5—6 供应商档案维护窗口
由于品牌信息的维护内容包括两部分:品牌档案的属性信息和品牌与供应商
第44页
的合作信息,因此在界面实现上,采取了标签控件进行开发。品牌档案维护w_pp窗口与供应商维护窗口的实现功能一致,因此就不再列举各窗口控件的脚本代码。在窗口中放置了个42控件,如图5-7所示。
控件名称 tab_1 tabpage_1 dw_1 cb_1 cb_2 cb_3 cb_4 cb_5 cb_6 st_1 st_2 st_3 st_4 st_9 st_10 st_11 st_12 sle_id sle_name gb_1 cb_12 cb_13 cb_14 cb_15 tabpage_2 查询 取消 新建 删除 保存 返回 品牌编码: 品牌名称: 第 共 条 条 查询 第一条 前一条 后一条 最后一条 控件显示文字 Tab UserObject DataWindow CommandButton CommandButton CommandButton CommandButton CommandButton CommandButton StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText SingleLineEdit SingleLineEdit GroupBox CommandButton CommandButton CommandButton CommandButton UserObject 控件类型 第45页
dw_2 gb_2 st_5 st_6 st_7 st_8 st_13 st_14 st_15 st_16 sle_vdr sle_brd cb_7 cb_8 cb_9 cb_10 cb_11 查询 供应商编码: 品牌编码: 第 共 条 条 查询 取消 新建 删除 保存 DataWindow GroupBox StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText SingleLineEdit SingleLineEdit CommandButton CommandButton CommandButton CommandButton CommandButton
第46页
图5-7
品牌档案维护窗口
图5-7
品牌档案维护窗口
商品分类档案维护窗口,通过下拉菜单中选择不同的表名,来实现在同一数据窗口控件中关联不同的数据窗口对象。在表名中选择“次分类编码表\数据窗口中将显示次分类档案信息,点击“新建\"按钮,将增加一条新的空白记录,在进行“分类编码”信息维护时,以下拉菜单方式进行编辑,且该菜单内容可进行用户维护,具体的解决方法将在第七章“技术难点及解决方案”中论述.
商品分类档案维护w_spfl窗口各对象源代码,详见附录—6。在窗口中放置了21个控件,如图5—8所示。
控件名称 ddlb_1 dw_1 cb_1 cb_2 cb_3 保存 返回 查询 第47页
控件显示文字 控件类型 DropDownListBox DataWindow CommandButton CommandButton CommandButton cb_4 cb_5 cb_6 st_1 st_2 st_3 st_4 st_5 st_6 st_7 st_8 st_9 gb_1 gb_2 sle_id sle_name 取消 新建 删除 第 编码 名称 表名: 条 共 条 查询 CommandButton CommandButton CommandButton StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText GroupBox GroupBox SingleLineEdit SingleLineEdit
图5-8
商品分类档案维护窗口
密码修改窗口可以提供为用户提供密码修改功能.密码修改w_change_password窗口各对象源代码,详见附录-7。在窗口中放置了11个控
第48页
件,如图5-9所示。
控件名称 p_1 st_1 st_2 St_3 St_4 sle_1 sle_2 sle_3 sle_4 cb_1 cb_2 账号 旧密码 新密码 确认密码 确认 取消 控件显示文字 控件类型 Picture StaticText StaticText StaticText StaticText SingleLineEdit SingleLineEdit SingleLineEdit SingleLineEdit CommandButton CommandButton
图5—9 密码修改窗口
第49页
2. 数据检索模块
“数据检索”模块主要实现对三大基本信息的主档查询,并可以为用户提供基本信息的交叉组合模糊查询。其部分界面内容如下:
供应商基本信息查询窗口,提供按供应商主档查询、按单品查找和按品牌查找供应商主档信息的功能,同时还可按编码、名称方式进行排序.供应商基本信息查询w_gys_cx窗口各对象源代码,详见附录—8。在窗口当前标签卡中放置了23个控件,其它标签卡控件内容与此相同,这里就不再一一列举,如图5-10所示。
控件名称 tab_1 tabpage_1 gb_1 gb_2 dw_1 dw_2 st_1 st_2 st_4 st_3 st_5 st_6 st_7 st_8 st_9 sle_1 sle_2 ddlb_1 cb_1 查询 排序 供应商编码 供应商名称 公司性质 第 条 共 条 查询 第50页
控件显示文字 Tab 控件类型 UserObject GroupBox GroupBox DataWindow DataWindow StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText SinglineEdit SinglineEdit DropDownListBox CommandButton cb_2 cb_3 rb_1 rb_2 取消 返回 编码 名称 CommandButton CommandButton RadioButton RadioButton
图5-10 供应商基本信息查询窗口
品牌基本信息查询窗口,提供按品牌主档查询和按供应商查找品牌主档信息和合作信息,同时还可按不同方式进行排序.通过下拉菜单选择不同的表名,实现在同一数据窗口控件中关联不同的数据窗口对象,同时还将触发“查询”标签选中不同的标签卡内容,且未选中的标签卡也将禁止用户使用;排序组框内也将根据选择的不同表,而显示不同的排序条件。具体的解决方法将在第七章“技术难点及解决方案\"中论述.品牌基本信息查询w_pp_cx窗口各对象源代码,详见附录-9。在窗口中放置了26个控件,如图5—11所示.
第51页
控件名称 tab_1 tabpage_1 tabpage_2 gb_1 gb_2 dw_1 dw_2 cb_1 cb_2 cb_3 st_1 st_2 st_3 st_4 st_5 st_6 st_7 st_8 st_9 St_10 ddlb_1 rb_1 rb_2 sle_brd sle_dep sle_vdr 查询 排序 查询 取消 返回 品牌名称 部门名称 供应商名称 表名 第 条 共 条 控件显示文字 Tab UserObject UserObject GroupBox GroupBox DataWindow DataWindow CommandButton CommandButton CommandButton StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText StaticText DropDownListBox RadioButton RadioButton SinglelineEdit SinglelineEdit SinglelineEdit 控件类型
第52页
图5—11
3. 报表处理
“报表处理\"模块主要实现的功能是按不同的报表类型产生不同的主档信息内容,并进行输出打印.单击“报表处理”下拉菜单中的处理信息(供应商档案,品牌档案,单品档案),除了打开“报表类型选择\"窗口外,还将根据所点击的内容通过TriggerEvent函数触发“数据窗口切换”相应的单选按钮,以备关联到所需的数据窗口对象。其部分界面如下:
报表选择w_select_report窗口各对象源代码,详见附录—10.在窗口中放置了10个控件,如图5—12所示.
品牌基本信息查询窗口
第53页
控件名称 gb_1 gb_2 rb_1 rb_2 rb_3 rb_4 rb_5 ddlb_1 cb_1 cb_2 控件显示文字 检索条件 数据窗口切换 按排序产生报表 按查询产生报表 供应商档案 品牌档案 单品档案 确定 返回 控件类型 GroupBox GroupBox RadioButton RadioButton RadioButton RadioButton RadioButton DropDownListBox CommandButton CommandButton
图5—12 报表类型选择窗口
为检索条件组框内单选按钮定义了窗口级函数wf_select(who),来确定激活排序或查询单选按钮。
第54页
按排序产生报表,如图5-13所示。排序报表w_sort_report窗口各对象源代码,详见附录—11。在窗口中放置了8个控件,如下.
控件名称 gb_1 dw_1 cb_1 cb_2 cb_3 cb_4 cb_5 cb_6 控件显示文字 打印 首页 尾页 上页 下页 打印 返回 控件类型 GroupBox GroupBox CommandButton CommandButton CommandButton CommandButton CommandButton CommandButton
图5-13 排序报表窗口
第55页
检索条件w_filter_condition窗口各对象源代码,详见附录—12。在窗口中放置6了个控件,如图5-14所示。
控件名称 gb_1 st_1 st_2 st_3 控件显示文字 查询 名称 编码 若不输入查询条件,则显示全部信息 sle_id sle_name cb_1 cb_2 确认 返回 SingleLineEdit SingleLineEdit CommandButton CommandButton 控件类型 GroupBox StaticText StaticText StaticText
图5—14 检索条件窗口
第56页
查询报表w_filter_report窗口各对象源代码,详见附录-13.在窗口中放置了3个控件,如图5—15所示。
控件名称 控件显示文字 控件类型 dw_1 cb_1 cb_2
打印 返回 DataWindow CommandButton CommandButton
图5—15
查询报表窗口
5.5 软件调试
应用程序的调试和运行是开发过程中必不可少的步骤,对应用程序必须经过调试来改正错误,在验证程序的正确性后,才能生成脱离Power Builder开发环境独立运行的可执行程序。
调试的基本过程:
第57页
在应用程序中可能会出现问题的控制语句处设置断点 在调试状态下运行应用程序
当执行到断点挂起时可以检查或更新变量的值 若需要则可以单步执行代码
根据需要在运行程序中添加或修改断点 当发现问题时正确纠正错误代码
以上步骤并非一成不变,可以根据实际情况,进行调整. 5.6 可执行文件的生成
应用程序经过设计、开发、调试,排除了明显与潜在的错误并达到预期功能后,就到了向用户交付应用程序的时候,这样就必要生成可脱离Power Builder开发环境独立运行的可执行文件。
分发应用程序前需要将要提供给用户的全部应用程序和环境部件打包,打包的内容包括:外部函数、位图和图形、声音文件等。
可执行文件所需要的文件有: 1. 可执行文件
可执行文件分成两类:伪代码格式(P—Code)和机器代码.两者的主要差别在于:
伪代码是Power Builder编译对象时生成的一种中间代码,它保存在应
用库中,运行时Power Builder虚拟机(由一组DLL组成)解释并执行中间代码.
机器代码是Power Builder生成的真正二进制文件,Power Builder的
运行库(。DLL)根据需要装入该二进制文件. 2. 动态连接库
第58页
Power Builder 动态库包括PBD和DLL,动态库中包含了相应Power Builder库文件中所有编译好的代码。PBD文件只能与伪代码格式的可执行文件一起使用,并且需要放置在库搜索路径指定的路径上。利用动态库可以在多个应用程序之间共享代码,避免了相同代码的重复分发.
3. 资源文件(PBR文件)
资源文件是一种ASCII码文件,由需要编译到可执行文件或动态库中的每个对象(位图、图标、指针、数据窗口等)的名称组成。
在创建可执行文件时,需要确认该应用程序为当前应用程序,且所有必要的PBL文件都必须包含在应用程序搜索路径中。如果用PBR,则必须确认它已经创建。
创建商品信息管理系统可执行文件步骤,如下: 1. 创建Project(工程)对象
2. 指定库文件名(D:\\zl\\毕设\\spgl。pbl) 3. 指定工程应用名(P_spgl) 4. 选择生成应用类型 5. 选择是否生成机器代码 6. 选择是否生成动态库文件
7. 单击”Finish\"按钮,生成一个工程对象 8. 打开工程对象名P_spgl
9. 打开该工程对象,单击工程画笔工具栏中的
图标进行工程的编译
5.7 分发应用程序
在Power Builder中编译生成的.exe文件不是一个完全独立执行的程序,它必须与Power Builder提供的一组动态连接库同时提供给用户才能真正脱离Power
第59页
Builder环境独立运行。
商品信息管理系统编译通过后,生成可执行文件spgl.exe 离开Power Builder开发环境,返回操作系统环境
为编译生成的spgl.exe文件建立一个独立的目录,并将应用程序拷贝到该目录下
在独立的目录下运行应用程序,若执行不成功,则应用程序会提示找不到哪个动态连接库从而不能运行的信息。
查找所需要的动态连接库,并逐次拷贝至应用程序同一目录下
libjcc.dll pb。ini pbadd70。dll pbdwe70。dll pbodb70.ini pbodb70。dll pbvm70。dll spgl。dll
第60页
第六章 研究成果及软件测试
6.1 研究成果
目前《商品信息管理系统》已经具备了数据的建立、删除及数据维护、查询等用户所需的基本功能,并能保证数据操作中的规范性,同时实现了数据的模糊检索,下拉数据窗口的设计最大限度地简化系统日常维护工作。 6.2 软件测试
软件测试不同于程序测试,是为了发现错误而执行程序的过程,它贯穿于软件定义与开发的整个期间.软件测试的目的是发现程序中的错误,是为了证明程序有错,而不是证明程序无错,因此,它是保证软件质量,提高软件可靠性的关键。
软件测试阶段的工作步骤:
1. 单元测试: 即模块测试,检验每个模块能否单独工作 2. 子系统测试:检验概要设计中模块接口设计问题
3. 系统测试: 综合检验。把经过测试的子系统装配成一个系统进行测试,不仅
应该发现设计和编码的错误,还应验证系统确实能提供需求说明书中的功能(子系统测试和系统测试,统称集成测试)
4. 验收测试: 把软件系统作为单一实体进行测试,在用户的积极参与使用实际
数据进行测试
6.2.1 黑盒测试和白盒测试
测试任何产品都有两种方法:
如果已经知道了产品已具有的功能,可以通过测试来检验是否每个功能
都能正常使用
第61页
如果知道了产品的内部工作过程,可以通过测试来检验内部动作是否按
照规格说明书的规定正常进行
白盒测试:也称为结构测试,根据程序内部逻辑结构进行测试
黑盒测试:也称为功能测试,从用户观点,按规格说明书要求的输入数据和
输出数据的对应关系设计测试用例,是程序外部特征进行的测试
无论黑盒测试还白盒测试都不可能作到穷尽测试,因为不可能作到穷尽测试,所以软件测试中的不可能发现程序中的所有错误。我们的目的就是要通过测试保证程序的可靠性,因此必须仔细设计测试方案,力争用可能少的测试发现尽可能多的错误。
6.3 商品信息管理系统测试
由于本系统的功能明确,因此采用黑盒测试的方法进行测试,并采取商业模拟测试使用类似真实的数据,去执行在日常的工作环境中所做的工作,这样可以发现软件测试难以捕捉到的错误。测试步骤如下:
登录窗口测试
数据维护模块测试(品牌、次分类数据维护) 数据检索模块测试(供应商、单品基本信息查询) 报表处理测试(供应商档案报表处理) 1. 登录窗口测试
运行可执行文件spgl.exe,屏幕窗口显示“欢迎使用商品信息管理系统\"窗口,如图6—1所示.
第62页
图6-1 系统登录界面
点击‘系统操作员'单选按钮,进入密码确认窗口,如图6—2所示.
图6-2 密码确认
第63页
输入操作员帐号及密码,点击‘确认’按钮,进入系统主菜单窗口,如图6—3所示.
图6—3
2. 数据维护模块测试
主菜单窗口
数据维护模块的功能是对商品三大主档信息(供应商、品牌、单品)及商品分类进行日常的建档、删除、修改,同时可按编码、名称进行查询,排除同一记录多次建立的误操作,从而保证了数据的唯一和标准性。(以品牌、次分类为例,进行测试)
单击数据维护菜单‘品牌’/‘商品分类’菜单项,进入品牌 / 商品分类档
案维护界面,点击‘新建’按钮,可插入新记录
查询需删除的记录,单击选中,并点击‘删除'按钮,系统提示删除确认信
息
在维护窗口中,可按编码/名称,进行各主档信息的复合、模糊查询
部分测试结果如下:
进入‘品牌档案’维护窗口,新建记录,如图6—4所示.
第64页
图6—4 新建记录
在品牌名称单行编辑框中输入“美\"字进行单项模糊查询,如图6—5所示.
图6-5
第65页
模糊查询
点击‘后一条’按钮,可以查看查询到的另一记录,如图6—6所示.
图6—6 下一条记录
按品牌名称、品牌编码进行组合模糊查询,如图6—7所示。
图6-7 组合模糊查询
第66页
点击‘删除’按钮,显示确认信息,如图6-8所示。
图6—8 删除记录信息确认
“商品分类档案”维护窗口,如图6-9所示.
图6—9 商品分类档案维护窗口
第67页
从‘表名’下拉框中选择‘次分类编码表’,如图6-10所示.
图6—10 选择“次分类编码表”
点击‘新建'按钮,在‘分类编码’信息项内,以下拉数据窗口方式,进行选择输入,如图6—11所示。
图6-11 新建记录
第68页
3. 数据检索模块测试(供应商、单品基本信息查询)
对供应商基本信息可以按供应商编码、名称和公司性质进行模糊组合查询,同时还可对查询结果进行编码和名称的排序,在主表窗口中点击所需信息,在明细表窗口中显示相应的基本信息,如图6—12所示.
图6—12 按供应商进行信息查询
对供应商基本信息还可以交叉表的方式进行查询,按单品名称/品牌名称,查询提供某一商品的供应商信息资料。同时还可对查询结果进行编码和名称的排序,在主表窗口中点击所需信息,在明细表窗口中显示相应的基本信息,如图6-13所示。在界面实现上,以标签页的展现方式进行开发.
第69页
图6-13 按单品进行信息查询
单品基本信息可以通过对次分类单品或供应商单品两种表进行查询,通过选择不同的表名,在同一数据窗口中调用不同的数据窗口对象;查询条件组框内的标签控件将根据不同表而选中不同的标签卡内容;排序组框内也将显示不同的排序条件。
当选择“次分类单品\"表,进行用户需求查询,在主窗口内显示满足查询条件的次分类单品信息(即单品主档属性信息),点击目标记录,在明细窗口中将显示提供该单品所有供应商的合作信息,如图6—14所示.
第70页
图6—14 按次分类单品表进行查询
当选择“供应商单品”表,进行用户需求查询,在主窗口内显示满足查询条件的供应商单品信息(即供应商与单品的对照信息),点击目标记录,在明细窗口中将显示提供该单品与供应商具体的合作信息,如图6—15所示。
图6-15 按供应商单品进行信息查询
第71页
第七章 技术难点及解决方案
7.1 DropDownDW编辑样式
采用DropDownDW数据编辑风格,实现数据维护的规范性 解决方案:
1. 定义数据编辑风格的名称为cls_id ,类型为DropDownDW,如图7—1所示。
图7—1 定义数据编辑风格DropDownDW
2. 为数据窗口对象的列字段cls_id指定编辑风格为DropDownDW,如图7—2
所示
第72页
图7—2 定义数据窗口对象列字段的编辑风格
功能实现,如图7-3所示。
图7—3
以下拉数据窗口的方式维护信息
心得体会:以下拉DataWindow编辑样式进行数据维护,可以避免从其他信息源
查询,具有即时、精确的优点,同时也是为一种人性化的界面操作,可以从用户实际操作的方便性入手,进行程序开发。
7.2 以下拉列表框实现的动态操作
以下拉列表框选择不同内容形式,实现以下三种功能: 同一数据窗口关联不同的数据窗口对象 标签控件打开不同的标签卡内容 修改静态文本控件的内容 解决方案:窗口界面设计,如图7—4所示.
第73页
动态关联数据窗口对象
动态打开标签卡内容
动态显示静态文本内容 图7-4 下拉列表框动态激活不同对象
在窗口中填加‘表名’下拉列表框ddlb_1对象,编辑selectionchanged事件代码,具体的解决方案:
string t1 t1=ddlb_1。text choose case t1
//定义开关变量t1,以实现通过变量的选择,而动态关联不同的数据窗口对象
case \"次分类单品\"
dw_1。dataobject=\"d_cfldp_master1\" dw_2。dataobject=”d_dp_gysdz22”
tab_1.SelectedTab = 1 //指定tab_1标签打开第一个标签卡内容 tab_1.tabpage_1。sle_gds。setfocus() tab_1.tabpage_1.enabled=true tab_1.tabpage_2.enabled=false
//使tab_1。tabpage_1控件有效,使tab_1。tabpage_2无效
rb_1。text='次分类名称’ rb_2.text='单品名称'
//指定静态文本控件text属性显示值
第74页
case ”供应商单品\"
dw_1。dataobject=”d_cfldp_gys_master1\" dw_2.dataobject=”d_dp_gysdz33”
tab_1。SelectedTab = 2 //指定tab_1标签打开第二个标签卡内容 tab_1.tabpage_2.sle_vdr。setfocus() tab_1。tabpage_2。enabled=true tab_1.tabpage_1。enabled=false
//使tab_1。tabpage_1控件有效,使tab_1。tabpage_2无效
rb_1。text=’单品名称’ rb_2。text='供应商名称’
//指定静态文本控件text属性显示值
case \"请选择”
dw_1.dataobject=\"” dw_2。dataobject=\"\" rb_1。text=’’ rb_2。text='’
end choose
dw_1.settransobject(sqlca) dw_1.retrieve()
st_9。text=string(dw_1。RowCount())
//在st_9静态文本控件text属性显示dw_1数据窗口的总行号
st_6.text=string(dw_1.GetRow())
//在st_6静态文本控件text属性显示在dw_1数据窗口中获取到的当前行号 心得体会:为使操作界面能够体现数据间的关系,在同一界面中,根据不同操作,
激活相应操作对象,最大限度的满足视觉上的统一。
第75页
致谢
我的毕业设计到目前为止已初步完成。在这次毕业设计过程中,我得到了宋晔老师的热情帮助和指导,并对我的毕业设计提供了大量资料和宝贵意见,对此我深表感谢。
由于《商品信息管理系统》是我开发的第一个实用软件,无论在界面设计还是脚本编写风格上,都有很多需要进一步改进的地方,但这足以使我得到了锻炼。通过这次毕业设计的实际开发,使我三年来所学到的软件工程、数据库相关知识,进行了一次很好的综合提炼,使我对数据库的开发与应用有了更新的认识,这对我今后的工作和学习都是宝贵的经验积累。
最后我要再一次衷心感谢直接参与毕设指导的宋晔老师,和几年来培养教育我的各位老师。 附录
《商品信息管理系统》源代码 参考文献
1. 《Power Builder 实用教程》—-——数据库应用系统开发
宋晔 张弘编著 北京理工大学出版社 2002年8月出版 2. 《数据库系统概论》第三版
范师煊 王珊编著 3. 《软件工程导论》
张海藩编著
清华大学出版社
2002年1月出版
高等教育出版社
2002年2月出版
4. 《Power Builder 6。0 开发人员指南》
张长富 李匀等编著
北京希望电脑公司 1998年10月出版
第76页
附录:《商品信息管理系统》源代码
1. spgl.pbl应用程序对象open事件代码:
// Profile goods1
SQLCA。DBMS = \"ODBC” SQLCA。AutoCommit = False
SQLCA。DBParm = ”ConnectString='DSN=goods;UID=dba;PWD=sql’\" CONNECT USING SQLCA; IF SQLCA.SQLCODE<〉0 THEN MESSAGEBOX(”无法连接数据库\",SQLCA.SQLERRTEXT) HALT END IF
OPEN(w_main)
2. 登录w_main窗口 :
w_main窗口的open事件代码-〉 //---—窗口置于屏幕中央 Environment l_env
int l_ScrWidth,l_ScrHeight //定义坐标变量 //关闭窗口刷新 setredraw(false)
//取得屏幕的高度和亮度 GetEnvironment(l_env)
l_ScrWidth=PixelsToUnits(l_env。ScreenWidth,XpixelsToUnits!) l_ScrHeight=PixelsToUnits(l_env。ScreenHeight,YpixelsToUnits!) //移动窗口到屏幕中间
Move((l_ScrWidth — this.width)/2,(l_ScrHeight — this。height)/2) //打开窗口刷新 setredraw(true)
//将窗口置于屏幕中央
“系统管理员\"rb_1单选按钮clicked事件代码-〉 open(w_login) close(w_main)
“业务操作员”rb_2单选按钮clicked事件代码—> open (w_modify)
m_frame.m_sjwh。enabled=false close(w_main)
3. 密码确认w_login窗口:
“操作员密码”sle_2单行编辑框getfocus事件代码—〉 string password2,account
account=trim (sle_1。text) select \"acc_pass\"。”password\" into:password2
第77页
from ”acc_pass” where ”acc_pass”。\"account\"=:account; if password2='’then messagebox(’账号错误’,'此账号不存在,请重新输入!') sle_1。setfocus() sle_1.text='’ end if
“确认”cb_1命令按钮clicked事件代码-> string password,account,password2 password2=trim(sle_2.text) if password2='’then messagebox('密码错误!','操作员密码为空值,请重新输入!’) sle_2。setfocus() else account=trim(sle_1。text) select ”acc_pass\"。\"password” into:password from \"acc_pass” where ”acc_pass\".”account\"=:account; if password=trim (sle_2.text) then open(w_modify) close(w_login) else messagebox('密码错误!','请重新输入!') sle_2。setfocus() sle_2。text=’’ end if end if
“取消”cb_2命令按钮clicked事件代码—〉 open(w_main) close(w_login)
4. 主界面w_modify窗口:
各菜单项代码:
数据维护—>供应商:open(w_gys) 数据维护—〉品牌:open(w_pp) 数据维护-〉单品:open(w_dp)
数据维护—〉商品分类:open(w_spfl)
数据维护—>密码修改:open (w_change_password) 数据检索->供应商基本信息:open(w_gys_cx) 数据检索-〉品牌基本信息:open(w_pp_cx) 数据检索->单品基本信息:open(w_dp_cx) 报表处理—〉供应商档案: open (w_select_report)
w_select_report。rb_3.triggerevent(clicked!) w_select_report。rb_3。checked=true
第78页
报表处理-〉品牌档案: open (w_select_report)
w_select_report。rb_4。triggerevent(clicked!) w_select_report.rb_4.checked=true 报表处理—〉单品档案: open (w_select_report)
w_select_report。rb_5。triggerevent(clicked!) w_select_report。rb_5.checked=true 系统—>关闭:close(w_modify)
5. 供应商档案维护w_gys窗口:
w_gys窗口的open事件代码-〉 //——-—窗口置于屏幕中央 Environment l_env
int l_ScrWidth,l_ScrHeight //定义坐标变量 //关闭窗口刷新 setredraw(false) //取得屏幕的高度和亮度 GetEnvironment(l_env)
l_ScrWidth=PixelsToUnits(l_env.ScreenWidth,XpixelsToUnits!) l_ScrHeight=PixelsToUnits(l_env.ScreenHeight,YpixelsToUnits!) //移动窗口到屏幕中间
Move((l_ScrWidth - this.width)/2,(l_ScrHeight - this.height)/2) //打开窗口刷新 setredraw(true)
//将窗口置于屏幕中央
dw_1。settransobject(sqlca) dw_1.retrieve()
dw_1。scrolltorow(dw_1.rowcount()) w_gys窗口的closequery事件代码-〉 Integer li_ret
if dw_1.modifiedcount()+dw_1。deletedcount()〉0 then
li_ret=messagebox(’注意!','数据已经改变,是否需要保存?’,& Question!,yesnocancel!) choose case li_ret case 1
cb_1。triggerevent(clicked!) case 2 case 3
message。returnvalue=1 end choose end if
dw_1数据窗口dberror事件代码—〉
messagebox(’警告!’,'发生数据库错误码’+string(sqldbcode)+'的错误信息'+&
第79页
’错误原因:’+sqlerrtext,stopsign!,ok!) return 1
dw_1数据窗口rowfocuschanged事件代码—〉 st_5.text=string(dw_1。GetRow()) st_6.text=string(dw_1.RowCount())
“第一条”命令按钮clicked事件代码-〉 dw_1。ScrollToRow(1) “前一条”命令按钮clicked事件代码-〉 dw_1.ScrollPriorRow() “后一条”命令按钮clicked事件代码—〉 dw_1。ScrollNextRow()
“最后一条”命令按钮clicked事件代码—〉 dw_1.ScrollToRow(dw_1.RowCount())
“查询\"cb_3命令按纽clicked事件代码—〉 String a1,a2
a1=\"(vdr_id like ’”+\"%\"+trim(sle_id.text)+”%\"+”’)”
a2=\"(vdr_nm like ’”+”%”+trim(sle_name。text)+\"%”+”’)\" If sle_id.text〈〉’' and sle_name.text=’’ then dw_1。setfilter(a1)
Elseif sle_id。text=’’ and sle_name。text〈>’’ then dw_1.setfilter(a2)
Elseif sle_id。text〈>’’ and sle_name.text〈>’' then dw_1.setfilter(a1 +” and ”+ a2) Else
messagebox(’提示’,'请输入查询条件’) End if
dw_1.filter() dw_1。setfocus()
st_5。text=string(dw_1。GetRow()) st_6。text=string(dw_1。RowCount()) “取消\"cb_4命令按钮clicked事件代码-〉 dw_1。setfilter(’') dw_1。retrieve() sle_id.text=’' sle_name.text='’ st_5。text=’’ st_6。text=’’
“新建\"cb_5命令按钮clicked事件代码-〉 int n
n=dw_1.getrow() dw_1。insertrow(n+1) dw_1。scrollnextrow() dw_1。setfocus()
“删除”cb_6命令按钮clicked事件代码—〉
if messagebox(”删除”,\"您确实要删除此项记录吗?\)=1 then dw_1。deleterow(0) dw_1。update()
第80页
end if
“保存”cb_1命令按钮clicked事件代码-〉 IF dw_1。update()>0 then commit; ELSE
messagebox(’错误!’,'对不起!数据无法保存’) rollback; END IF
“返回”cb_2命令按钮clicked事件代码—> close(w_gys)
6. 商品分类档案维护w_spfl窗口:
dw_1窗口clicked事件代码—〉 dw_1.selectrow(0,false)
//把前面所选的所有行清除高亮显示 dw_1。selectrow(row,true) //把所选的当前行设置为高亮显示 dw_1窗口dberror事件代码-〉
messagebox('警告!’,’发生数据库错误码’+string(sqldbcode)+'的错误信息’+& ’错误原因:'+sqlerrtext,stopsign!,ok!) return 1
dw_1窗口rowfocuschanged事件代码-> st_8。text=string(dw_1。RowCount()) st_2.text=string(dw_1。GetRow())
“表名”下拉列表框selectionchanged事件代码—〉 string t1
t1=ddlb_1。text choose case t1
case ”部门编码表\"
dw_1。dataobject=\"d_bm” case \"分类编码表”
dw_1.dataobject=”d_fl\" case \"次分类编码表”
dw_1。dataobject=”d_subcls” end choose
“表名”下拉列表框Items属性值:
第81页
“查询”cb_3命令按钮clicked事件代码—〉 String a1,a2,a3,a4,a5,a6 int n
a1=”(dep_id like ’”+”%”+trim(sle_id。text)+”%”+”')” a2=”(dep_nm like ’”+”%”+trim(sle_name.text)+\"%\"+”’)” a3=”(cls_id like ’”+\"%\"+trim(sle_id。text)+”%\"+”')\" a4=\"(cls_nm like '”+”%\"+trim(sle_name。text)+”%\"+”’)” a5=”(sublcs_id like ’”+\"%\"+trim(sle_id。text)+”%”+”')” a6=\"(subcls_nm like ’”+\"%\"+trim(sle_name。text)+”%”+\"’)” If sle_id。text<〉'’ and sle_name.text='’ then n=1
Elseif sle_id。text='' and sle_name.text〈〉’’ then n=2
Elseif sle_id。text<〉’’ and sle_name.text〈〉’' then n=3 else n=4 End if
choose case n case 1
if dw_1.dataobject=”d_bm” then dw_1.setfilter(a1)
Elseif dw_1。dataobject=”d_fl” then dw_1。setfilter(a3)
Elseif dw_1。dataobject=”d_subcls” then dw_1。setfilter(a5) End if case 2
if dw_1。dataobject=”d_bm\" then dw_1。setfilter(a2)
Elseif dw_1。dataobject=”d_fl\" then dw_1。setfilter(a4)
Elseif dw_1。dataobject=”d_subcls” then dw_1。setfilter(a6) End if case 3
if dw_1。dataobject=”d_bm” then dw_1。setfilter(a1 +\"and”+ a2) Elseif dw_1。dataobject=\"d_fl” then dw_1.setfilter(a3 +”and\"+ a4)
Elseif dw_1。dataobject=”d_subcls” then dw_1。setfilter(a5 +\"and\"+ a6) End if case 4
messagebox(’提示','请输入查询条件') End choose
第82页
dw_1.filter() dw_1。setfocus()
st_8.text=string(dw_1。RowCount()) st_2。text=string(dw_1。GetRow())
其余各控件与供应商档案维护窗口的实现功能一致,这里不再列举各控件的脚本代码.
7. 密码修改w_change_password窗口:
“旧密码”sle_2单行编辑框getfocus事件代码—〉 //确认帐户是否存在
string password1,account account=trim(sle_1。text)
select ”acc_pass\"。\"password” into:password1 from ”acc_pass\"
where ”acc_pass”。”account\"=:account; if password1=''then
messagebox(’账号错误!’,’此账号不存在,请重新输入!’) sle_1.text='' sle_1。setfocus() end if
“旧密码”sle_2单行编辑框losefocus事件代码-〉 string password1,account int reinput
account=trim(sle_1.text)
select \"acc_pass\"。”password” into :password1 from ”acc_pass”
where \"acc_pass”.”account\"=:account; if password1=trim(sle_2。text) then sle_3.setfocus() else
reinput=messagebox(”密码错误!”,\"您不是管理员!不能进行修改,要重新输入吗?”,question!,yesno!) if reinput=1 then
sle_2。setfocus() sle_2.text=”\" return 0
elseif reinput=2 then cb_2。setfocus() end if end if
“新密码”sle_3单行编辑框getfocus事件代码-> //确认必须输入旧密码
第83页
string password3 int reinput
password3=trim(sle_2.text) if password3=’’ then reinput=messagebox(’错误!','必须输入旧密码!是否继续?',question!,yesno!) if reinput=1 then sle_1.text=’' sle_1。setfocus() return 0
elseif reinput=2 then cb_2。setfocus() end if end if
“确认密码”sle_4单行编辑框losefocus事件代码—> //确认两次新密码的一直性 int reinput
if trim(sle_3.text) 〈> trim(sle_4。text) then
reinput=messagebox(’密码错误!',’两次密码不一致,是否重新输入?’,question!,yesno!,1) else
cb_1.setfocus() end if
if reinput=1 then sle_3.text=’’ sle_4。text='' sle_3。setfocus() elseif reinput=2 then cb_2。setfocus() end if
“确认”cb_1命令按钮clicked事件代码—〉 //确认两次新密码的一直性 int reinput
if trim(sle_3.text) 〈〉 trim(sle_4。text) then
reinput=messagebox(’密码错误!',’两次密码不一致,是否重新输入?’,question!,yesno!,1) else
cb_1.setfocus() end if
if reinput=1 then sle_3.text='’ sle_4.text=’’ sle_3。setfocus() elseif reinput=2 then cb_2.setfocus()
第84页
end if
“取消”cb_2命令按钮clicked事件代码—〉 close(w_change_password)
8. 供应商基本信息查询w_gys_cx窗口:
w_gys_cx窗口open事件代码—〉 //—-—-窗口置于屏幕中央 Environment l_env
int l_ScrWidth,l_ScrHeight //定义坐标变量 //关闭窗口刷新 setredraw(false) //取得屏幕的高度和亮度 GetEnvironment(l_env)
l_ScrWidth=PixelsToUnits(l_env.ScreenWidth,XpixelsToUnits!) l_ScrHeight=PixelsToUnits(l_env.ScreenHeight,YpixelsToUnits!) //移动窗口到屏幕中间
Move((l_ScrWidth — this。width)/2,(l_ScrHeight — this。height)/2) //打开窗口刷新 setredraw(true) //将窗口置于屏幕中央
tab_1。tabpage_1.dw_1.settransobject(sqlca) tab_1.tabpage_1。dw_1。retrieve()
tab_1。tabpage_1.dw_1.selectrow(tab_1。tabpage_1。dw_1。getrow(),true) tab_1。tabpage_1.dw_1.sharedata(tab_1。tabpage_1。dw_2) tab_1.tabpage_1。ddlb_1.text='请选择’
tab_1.tabpage_2。dw_3.settransobject(sqlca) tab_1。tabpage_2。dw_3。retrieve()
tab_1。tabpage_2.dw_3.selectrow(tab_1。tabpage_2.dw_3。getrow(),true) tab_1。tabpage_2.dw_3。sharedata(tab_1。tabpage_2。dw_4) tab_1。tabpage_3。dw_5。settransobject(sqlca) tab_1。tabpage_3。dw_5.retrieve()
tab_1。tabpage_3。dw_5。selectrow(tab_1.tabpage_3.dw_5。getrow(),true) tab_1。tabpage_3。dw_5。sharedata(tab_1。tabpage_3。dw_6)
“查询”tab_1。tabpage_1。cb_1命令按钮clicked事件代码—> String a1,a2,a3,a4,a5 int n
a1=”(vdr_id like ’”+”%”+trim(tab_1。tabpage_1。sle_1。text)+\"%”+\"')\" a2=”(vdr_nm like ’\"+”%\"+trim(tab_1.tabpage_1.sle_2。text)+”%”+”’)” a3=”(vdr_pry = ’1’)\" a4=”(vdr_pry = ’2’)\" a5=”(vdr_pry = ’3')”
If tab_1。tabpage_1.sle_1。text〈〉'' and tab_1。tabpage_1。sle_2。text=’’& and tab_1。tabpage_1.ddlb_1。text=’请选择’ then n=1
Elseif tab_1.tabpage_1.sle_1。text=’’ and tab_1。tabpage_1。sle_2。text〈〉’'
第85页
&
and tab_1。tabpage_1.ddlb_1.text=’请选择’ then n=2
Elseif tab_1。tabpage_1.sle_1。text=’’ and tab_1。tabpage_1。sle_2。text=’’& and tab_1.tabpage_1.ddlb_1。text='生产厂家’ then n=3
Elseif tab_1.tabpage_1.sle_1。text='’ and tab_1.tabpage_1.sle_2.text=''& and tab_1。tabpage_1.ddlb_1。text=’总代理’ then n=4
Elseif tab_1.tabpage_1。sle_1。text=’’ and tab_1。tabpage_1.sle_2。text=’’& and tab_1。tabpage_1.ddlb_1。text='分销商’ then n=5
Elseif tab_1.tabpage_1。sle_1。text〈〉'’ and tab_1.tabpage_1。sle_2。text<>'’&
and tab_1.tabpage_1。ddlb_1。text='请选择’ then n=6
Elseif tab_1。tabpage_1。sle_1。text<>'’ and tab_1。tabpage_1。sle_2。text='’&
and tab_1。tabpage_1.ddlb_1。text=’生产厂家’ then n=7
Elseif tab_1。tabpage_1.sle_1。text<〉’' and tab_1.tabpage_1。sle_2.text=’’& and tab_1。tabpage_1。ddlb_1。text=’总代理’ then n=8
Elseif tab_1.tabpage_1。sle_1.text〈〉’’ and tab_1.tabpage_1。sle_2。text=’'& and tab_1。tabpage_1.ddlb_1。text='分销商’ then n=9
Elseif tab_1。tabpage_1。sle_1.text='’ and tab_1。tabpage_1.sle_2。text<>'’& and tab_1.tabpage_1。ddlb_1。text=’生产厂家’ then n=10
Elseif tab_1.tabpage_1.sle_1.text='’ and tab_1.tabpage_1.sle_2。text〈>’'& and tab_1。tabpage_1.ddlb_1.text='总代理' then n=11
Elseif tab_1。tabpage_1。sle_1.text=’' and tab_1。tabpage_1.sle_2。text<〉’’&
and tab_1.tabpage_1.ddlb_1。text=’分销商’ then n=12
Elseif tab_1。tabpage_1。sle_1.text〈〉'’ and tab_1.tabpage_1。sle_2.text<〉’'&
and tab_1。tabpage_1。ddlb_1。text='生产厂家’ then n=13 Elseif tab_1.tabpage_1。sle_1。text〈〉'’ and tab_1。tabpage_1。sle_2。text〈>’’&
and tab_1。tabpage_1.ddlb_1.text=’总代理’ then n=14
Elseif tab_1。tabpage_1。sle_1。text<〉'' and tab_1.tabpage_1。sle_2.text〈>’'& and tab_1。tabpage_1。ddlb_1。text=’分销商’ then
第86页
n=15 Else
messagebox('提示’,’请输入查询条件’) End if
choose case n case 1
tab_1.tabpage_1.dw_1。setfilter(a1) case 2
tab_1.tabpage_1.dw_1.setfilter(a2) case 3
tab_1.tabpage_1。dw_1.setfilter(a3) case 4
tab_1.tabpage_1。dw_1.setfilter(a4) case 5
tab_1.tabpage_1。dw_1。setfilter(a5) case 6
tab_1。tabpage_1.dw_1.setfilter(a1 +”and”+ a2); case 7
tab_1。tabpage_1.dw_1.setfilter(a1 +”and\"+ a3); case 8
tab_1。tabpage_1。dw_1。setfilter(a1 +”and”+ a4); case 9
tab_1。tabpage_1。dw_1。setfilter(a1 +\"and”+ a5); case 10
tab_1。tabpage_1。dw_1。setfilter(a2 +”and”+ a3); case 11
tab_1.tabpage_1。dw_1.setfilter(a2 +”and\"+ a4); case 12
tab_1。tabpage_1。dw_1。setfilter(a2 +”and\"+ a5); case 13
tab_1。tabpage_1。dw_1。setfilter(a1 +”and\"+ a2 +”and”+ a3); case 14
tab_1。tabpage_1。dw_1。setfilter(a1 +”and”+ a2 +”and”+ a4); case 15
tab_1.tabpage_1。dw_1。setfilter(a1 +”and\"+ a2 +”and”+ a5); end choose
tab_1.tabpage_1.dw_1。filter()
st_8。text=string(tab_1。tabpage_1。dw_1。GetRow()) st_9.text=string(tab_1.tabpage_1。dw_1。RowCount())
排序组框内“编码”tab_1。tabpage_1.rb_1单选按纽clicked事件代码—〉 tab_1.tabpage_1.dw_1。setsort(\"vdr_id”) tab_1.tabpage_1。dw_1。sort()
第87页
排序组框内“名称”tab_1。tabpage_1.rb_2单选按纽clicked事件代码—〉 tab_1。tabpage_1.dw_1.setsort(”vdr_nm”) tab_1。tabpage_1.dw_1.sort()
主窗口tab_1。tabpage_1.dw_1控件clicked事件代码—〉 tab_1。tabpage_1.dw_1。selectrow(0,false) //把前面所选的所有行清除高亮显示
tab_1。tabpage_1。dw_1。selectrow(row,true) //把所选的当前行设置为高亮显示
tab_1。tabpage_1。dw_2.scrolltorow(row) //将显示细节的窗口滚动到所选择的当前行 该控件rowfocuschanged事件代码-〉 st_8。text=’’ st_9.text=''
st_8。text=string(tab_1。tabpage_1。dw_1.GetRow()) st_9。text=string(tab_1。tabpage_1。dw_1.RowCount())
9. 品牌基本信息查询w_pp_cx窗口:
dw_1数据窗口clicked事件代码—> dw_1。selectrow(0,false)
//把前面所选的所有行清除高亮显示 dw_1.selectrow(row,true)
//把所选的当前行设置为高亮显示 String s1,s2 Int c_row
c_row=GetRow(dw_1)
// 提取当前数据窗口的行号 if c_row〈1 then Return
//若点击在数据窗口范围之外则返回
if dw_1.dataobject=”d_cflpp_master” then
s1=dw_1.GetItemString (row,”cflppda_brd_id”) elseif dw_1.dataobject=”d_cflpp_gys_master” then s1=dw_1.GetItemString (row,”gysda_vdr_id\") s2=dw_1。GetItemString (row,\"cflppda_brd_id\") end if
dw_2。Settransobject (SQLCA)
//建立数据窗口控件dw_2与数据对象SQLCA的连接 dw_2。Retrieve(s1,s2)
st_9.text=string(dw_1.RowCount()) st_6.text=string(dw_1。GetRow())
“表名” ddlb_1下拉列表框selectionchanged事件代码—〉 string t1
t1=ddlb_1.text
第88页
choose case t1
case ”部门品牌\"
dw_1。dataobject=\"d_cflpp_master\" dw_2。dataobject=”d_cflpp_gysdz22” rb_1。text=’部门名称’ rb_2.text=’品牌名称’ tab_1.SelectedTab = 1
tab_1。tabpage_1。sle_brd.setfocus() tab_1.tabpage_1。enabled=true tab_1.tabpage_2.enabled=false case \"供应商品牌\"
dw_1.dataobject=”d_cflpp_gys_master\" dw_2.dataobject=”d_cflpp_gysdz33” rb_1。text=’品牌名称’ rb_2。text=’供应商名称' tab_1.SelectedTab = 2
tab_1。tabpage_2。sle_vdr。setfocus() tab_1。tabpage_1.enabled=false tab_1.tabpage_2。enabled=true case \"请选择”
dw_1。dataobject=”” dw_2。dataobject=\"” rb_1.text=’’ rb_2。text='’ end choose
dw_1。settransobject(sqlca) dw_1。retrieve()
st_9.text=string(dw_1。RowCount()) st_6。text=string(dw_1.GetRow())
“查询”cb_1命令按纽clicked事件代码—〉 String a1,a2,a3 int n
if tab_1.SelectedTab = 1 then n=1
elseif tab_1。SelectedTab = 2 then n=2 end if a1=”(cflppda_brd_nm like '\"+”%\"+trim(tab_1。tabpage_1。sle_brd。text)+\"%\"+”')” a2=\"(bmda_dep_nm like ’”+\"%”+trim(tab_1。tabpage_1。sle_dep。text)+”%\"+\"’)\" a3=”(gysda_vdr_nm like '”+”%\"+trim(tab_1.tabpage_2。sle_vdr。text)+”%\"+”’)”
第89页
choose case n case 1
If tab_1。tabpage_1.sle_brd。text<>’’ and &
tab_1。tabpage_1。sle_dep.text=’’ then
dw_1.setfilter(a1)
Elseif tab_1。tabpage_1.sle_brd.text='’ and &
tab_1。tabpage_1。sle_dep。text〈〉'' then
dw_1.setfilter(a2)
Elseif tab_1.tabpage_1.sle_brd。text〈〉’' and&
tab_1。tabpage_1。 sle_dep.text〈>'’ then
dw_1。setfilter(a1 +” and \"+ a2) else
messagebox('提示’,’请输入查询条件’) end if case 2
if tab_1。tabpage_2。sle_vdr.text〈〉’’ then dw_1.setfilter(a3) else
messagebox('提示’,’请输入查询条件') end if end choose
dw_1。filter() dw_1。setfocus()
st_9。text=string(dw_1。RowCount()) st_6.text=string(dw_1。GetRow())
单品基本信息查询w_dp_cx窗口与品牌基本信息查询w_pp_cx窗口口的实现功能一致,这里就不再列举各窗口控件的脚本代码。
10. 报表类型选择w_select_report窗口:
“确定”cb_1命令按纽clicked事件代码—〉 choose case is_select case 'a’
open(w_sort_report) case 'b’
open(w_filter_condition) end choose
定义窗口函数wf_select(who)
第90页
定义窗口实例变量 string is_select
编写窗口函数wf_select()代码—> //定义函数wf_select(who) choose case who case rb_1
ddlb_1.enabled=true
//\"is_select\"是在当前窗口的declare instance varibles视窗中定义的字符型窗口实例变量
is_select=’a’ case rb_2
ddlb_1.enabled=false is_select='b’
//用变量a和b分别控制打开不同的窗口 end choose
11. 排序报表w_sort_repost窗口:
w_sort_report窗口open事件代码->
if w_select_report。rb_3.checked=true then dw_1.dataobject=’d_gys_bb' dw_1.settransobject(sqlca) dw_1。retrieve()
w_sort_report.title='供应商档案’
if w_select_report。ddlb_1.text='编码’ then dw_1。setsort(’vdr_id') else
dw_1。setsort('vdr_nm’) end if
elseif w_select_report。rb_4.checked=true then dw_1.dataobject=’d_pp_bb' dw_1.settransobject(sqlca) dw_1。retrieve()
w_sort_report。title='品牌档案’
if w_select_report.ddlb_1。text=’编码' then dw_1。setsort(’brd_id') else
dw_1.setsort(’brd_nm’) end if
elseif w_select_report.rb_5。checked=true then
第91页
dw_1。dataobject=’d_dp_bb' dw_1.settransobject(sqlca) dw_1.retrieve()
w_sort_report。title=’单品档案’
if w_select_report。ddlb_1.text='编码’ then dw_1.setsort('gds_id’) else
dw_1.setsort('gds_nm') end if end if
dw_1.sort()
“首页”cb_1命令按纽clicked事件代码—〉dw_1.scrolltorow(0)
“尾页\"cb_2命令按纽clicked事件代码-〉dw_1。scrolltorow(9999999) “上页\"cb_3命令按纽clicked事件代码—〉dw_1。scrollpriorpage() “下页”cb_4命令按纽clicked事件代码—>dw_1。scrollnextpage() “打印\"cb_5命令按纽clicked事件代码—〉dw_1。print() “返回\"cb_6命令按纽clicked事件代码-〉close (parent)
12. 检索条件w_filter_condition窗口:
“确认”cb_1命令按纽clicked事件代码->open (w_filter_report) “返回\"cb_2命令按纽clicked事件代码-〉close (w_filter_condition)
13. 查询报表w_filter_report窗口:
w_filter_report窗口open事件代码—〉
if w_select_report.rb_3。checked=true then dw_1.dataobject=”d_gys_bb”
w_filter_report.title=’供应商档案' dw_1。settransobject(sqlca) dw_1.retrieve()
elseif w_select_report。rb_4。checked=true then dw_1.dataobject=”d_pp_bb”
w_filter_report。title='品牌档案' dw_1。settransobject(sqlca) dw_1。retrieve()
elseif w_select_report。rb_5.checked=true then dw_1.dataobject=\"d_dp_bb”
w_filter_report。title='单品档案’ dw_1.settransobject(sqlca) dw_1。retrieve() end if
String a1,a2,a3,a4,a5,a6 int n
第92页
a1=”(vdr_id like '\"+”%\"+trim(w_filter_condition。sle_id。text)+”%”+”’)” a2=\"(vdr_nm like ’”+\"%”+trim(w_filter_condition.sle_name。text)+”%\"+\"')” a3=”(cflppda_brd_id like ’”+”%”+trim(w_filter_condition。sle_id。text)+”%”+\"’)” //加上表名
a4=\"(cflppda_brd_nm like '”+”%”+trim(w_filter_condition。sle_name.text)+\"%\"+”’)” //加上表名
a5=”(gds_id like ’”+\"%”+trim(w_filter_condition。sle_id。text)+\"%”+”')\" a6=\"(gds_nm like '”+\"%”+trim(w_filter_condition。sle_name.text)+”%”+”’)\"
If w_filter_condition。sle_id。text<〉’’&
and w_filter_condition。sle_name。text=’' then n=1
Elseif w_filter_condition。sle_id。text=’’&
and w_filter_condition。sle_name.text〈〉'' then n=2
Elseif w_filter_condition。sle_id.text〈>’’&
and w_filter_condition.sle_name.text<〉’’ then n=3 Else n=4 End If
choose case n case 1
If dw_1.dataobject=”d_gys_bb” then dw_1。setfilter(a1)
Elseif dw_1。dataobject=”d_pp_bb” then dw_1.setfilter(a3)
Elseif dw_1。dataobject=”d_dp_bb” then dw_1.setfilter(a5) End If case 2
if dw_1。dataobject=”d_gys_bb” then dw_1。setfilter(a2)
Elseif dw_1。dataobject=”d_pp_bb” then dw_1。setfilter(a4)
Elseif dw_1。dataobject=”d_dp_bb\" then dw_1。setfilter(a6) End if case 3
if dw_1.dataobject=”d_gys_bb\" then dw_1.setfilter(a1 +”and\"+ a2) Elseif dw_1.dataobject=\"d_pp_bb” then
第93页
dw_1.setfilter(a3 +”and”+ a4) Elseif dw_1。dataobject=”d_dp_bb\" then dw_1。setfilter(a5 +”and”+ a6) End if // case 4
// messagebox(’提示',’请输入查询条件’) End choose
dw_1。filter() //dw_1.setfocus()
第94页
因篇幅问题不能全部显示,请点此查看更多更全内容