基于Java的企业进销存管理系统

基于JAVA的企业进销存管理系统

【摘   要】在市场经济中,销售是企业运作的重要环节。为了更好地推动销售,不少企业建立分公司或代理制,通过分公司或代理把产品推向最终用户。这些分公司或代理商大部分分布在不同的地理位置,跨空间、跨时间的频繁业务信息交流是这些企业业务活动的主要特点。在这种形势下,传统的依靠管理人员人工工作传递信息和数据的管理方式就无法满足企业日益增长的业务需求了。

本系统即为一个基本的进销存管理系统,就是利用信息化手段把先进的企业管理方法引入企业的实践,为企业的管理改革提供切实易行的途径。系统对企业中常见的   采购、库存、销售等商业活动以及相关的供应商和客户等基本信息进行管理。

本毕业设计(论文)以商品进销存管理系统的分析和设计为出发点,详细介绍了开发本系统的各个步骤:系统分析、系统设计、系统实现、系统维护。在系统分析中先后用数据流图、系统的功能结构图分析了系统所需的各种数据。在系统设计中,详细的展现了系统的各个功能模块。所需的数据库表、表字段以及菜单的设计等。在系统的实现中,给出了实现窗体中相应功能控件的示例和源代码,以及菜单实现的方法。文章中列出了本系统的主要功能运行界面图。本系统采用目前流行的Java Swing进行开发,后台数据库使用功能更强大操作便捷的SQL Server。

【关 键 字】销售,进销存管理系统,Java Swing,SQL Server

Saling and accounting management system

Abstract:Saling is an important part of enterprise management in market economy. In order to promote sale,many of them set up sub-company or agent system.They promote produce to customers through those sub-companies or agents.Most of them lie in different places.The frequent communication of information beyond space and time is the major feature.In this case,the traditional management conveying information and data by management personnels can’t satisfy the need of increasing business.

The system is basic in saling and accounting management.It introduces advanced management by utilizing information method.It offers practical access to the reform of enterprise’s management.This system manage business activities,such as buying,storing and saling,and the basic information of suppliers and customers.It use visual Basic which is very popular currently to develop.Backgroud database makes use of SQL Server,having strong function and converient operation.

     Key Words:Saling and accounting Manage System , Java Swing , SQL Server

目   录

   

第一章  

1.1、本课题的研究意义

1.2、本论文的目的、内容及作者主要贡献

第二章   管理信息系统概述

2.1 MIS的概念及解释

2.1.2  系统的组成

2.1.3 管理信息的要素

2.2 MIS的结构、特征

2.2.1   MIS的结构

2.2.2  MIS的特性

2.3   MIS的相关学科

2.4  MIS的划分

2.4.1   基于组织职能进行划分

2.4.2   基于信息处理层次进行划分

2.4.3   基于历史发展进行划分

2.4.4   基于规模进行划分

2.5   MIS的综合结构

2.6  MIS的开发

第三章  系统调研及可行性分析

3.1  系统调研

3.2  可行性分析概述

3.3  技术可行性分析

3.4系统用例图

3.4.1 进销存系统用例图

3.4.2 基本资料维护用例图

3.4.3 采购用例图

3.4.4 销售用例图

3.4.5 库存用例图

3.4.6 维护系统用例图

3.4.7 报表导出用例图

3.5系统类图

3.6系统状态图

3.7系统协作图

第四章  系统分析

4.1 系统需求分析

4.2 数据流程图与数据字典

第五章  系统功能的设计

5.1  MIS平台的确定

5.2  数据库产品选型原则

5.3  模块设计

第六章  数据库的设计

第七章 系统的实现

7.1文件夹组织结构

7.2系统预览

7.3主窗体设计

7.4  基础信息模块设计

第八章 系统测试

8.1 系统软件测试

8.1.1 测试的原则

8.1.2 模块测试

8.1.3 集成测试

8.2 测试总结

8.3 系统实施与维护

第九章   

   

参考文献

第一章 概 述

1.1、本课题的研究意义

进销存管理系统,就是利用信息化手段把先进的企业管理方法引入企业的实践,为企业的管理改革提供切实易行的途径。更重要的是,进销存管理系统可以及时通过信息技术把企业数据快速转化为企业信息,进而为相关管理者提供决策依据。我们的目标就是在于开发一个功能实用、操作方便,简单明了,具有普适性的进销存管理系统。

1.2、本论文的目的、内容及作者主要贡献

(1)目的:

进销存管理系统主要是充分发挥信息技术的优势,通过集中式的信息数据库,将企业的进、销、存等经营业务有机地结合起来,达到数据共享、降低成本、提高效率、改进服务的目的,进而提供企业的生产效率和管理水平。

(2)内容:

在这个进销存管理系统中,主要包含了以下几个功能:(1)采购入库单的自动生成;(2)出库单的自动生成;(3)根据采购信息和销售信息对库存定期进行盘点;(4)历史采购和销售记录的查询;(5)产品信息、客户信息和供应商信息的维护。

通过发上几个功能的实现,基本能够满足一般企业的进销存管理需要,为企业的管理现代化和运营信息化提供缋有力的支持。

 (3)作者的主要贡献:

本人针对进销存管理所需,独立完成了此课题的研究与开发,包括调研、分析、设计、编码、测试、文档编写等内容。

 第二章   管理信息系统概述

管理信息系统(Management Information Systems 简称MIS)在现代社会已深入到各行各业,由于计算机技术的迅速发展和普及,MIS 事实上已成为计算机MIS。

目前,由于开发高质量 MIS 的能力大大落后计算机硬件日新月异的进展,加上社会对MIS 发展和完善需求的增加以及对MIS开发过程中出现的错误认识和行为而导致MIS开发的失败,这些情况已严重妨碍了计算机技术的进步。因此对MIS 有关的内容进行深入研究,提高工作效率,提高MIS开发成功率已变得十分重要。

我国企业MIS建设随着国民经济信息化的进展,进入了一个新的阶段。一些中大型企业搞MIS已有五到十年的经验,不少新建企业正打算高起点地建立高水平的MIS。实际上,企业的信息系统集成化建设,也是国民经济信息化的有机组成部分。

国际上,信息设备不断降价,信息技术更加成熟,一大批企业在搞信息系统集成或重建;研究开发机构适应这种需要投入了很大力量,致力于解决信息系统集成的策略、方法和工具等问题;一些大的信息服务公司纷纷成立或加快发展,正在由设备供应商变为信息技术和企业信息系统建设整体方案的咨询服务者。这些都是我们可以借鉴、引进和运用的。

实现"两个根本转变"为企业MIS建设带来了新的压力、新的动力和真正的机会。站在新一轮起飞点上的企业,要想用好新的机遇和新的环境条件搞好MIS建设,就要求业务领导和信息负责人、管理人员和开发人员进一步提高信息化的认识,转变传统的信息系统建设的思维,总结经验与学习先进理论相结合,发挥自身主动性与运用技术市场相结合,明确提出企业信息化的概念和任务,搞好高层的构思和总体规划,并把它作为"九五"企业发展规划的重要组成部分,组织有计划、有步骤的开发实现。

2.1 MIS的概念及解释

MIS 是一个不断发展的新型学科,MIS的定义随着计算机技术和通讯技术的进步也在不断更新,在现阶段普遍认为MIS 是由人和计算机设备或其他信息处理手段组成并用于管理信息的系统。

2.1.1 MIS的对象就是信息

信息是经过加工的数据,信息是对决策者有价值的数据。信息的主要特征是来源分散,数量庞大。信息来源于生产第一线,来源于社会环境,来源于市场,来源于行政管理等部门。信息具有时间性。信息的加工方式有多种形式。

企业从信息管理的角度可划分为物流和信息流。生产过程是一个物流的投入产出过程,且是不可逆的过程。管理过程是信息流的过程,且具有信息反馈的特征。 

2.1.2  系统的组成

系统是由相互联系、相互作用的若干要素按一定的法则组成并具有一定功能的整体。系统有两个以上要素,各要素和整体之间,整体和环境之间存在一定的有机联系。系统由输入、处理、输出、反馈、控制五个基本要素组成。信息系统是输入的数据,经过处理,输出的是信息的系统。

2.1.3 管理信息的要素

管理信息由信息的采集、信息的传递、信息的储存、信息的加工、信息的维护和信息的使用五个方面组成。

任何地方只要有管理就必然有信息,如果形成系统就形成MIS。计算机设备使MIS更有效,尤其是现代社会,MIS已和计算机设备不可分离,因此一般来说MIS就是计算机MIS。MIS包括计算机、网络通讯设备等硬件成份,包括操作系统、应用软件包等软件成份。并随着计算机技术和通讯技术的迅速发展还会出现更多的内容。计算机设备并不是MIS的必要条件。

2.2 MIS的结构、特征

2.2.1   MIS的结构     

MIS由信源、信宿、信息处理、信息用户和信息管理者五个组成部分。

2.2.2  MIS的特性

完善的MIS具有以下四个标准:确定的信息需求、信息的可采集与可加工、可以通过程序为管理人员提供信息、可以对信息进行管理。

具有统一规划的数据库是MIS成熟的重要标志,它象征着MIS是软件工程的产物。通过MIS实现信息增值,用数学模型统计分析数据,实现辅助决策。MIS是发展变化的,MIS有生命周期。

MIS的开发必须具有一定的科学管理工作基础。只有在合理的管理体制、完善的规章制度、稳定的生产秩序、科学的管理方法和准确的原始数据的基础上,才能进行MIS的开发。

因此,为适应MIS的开发需求,企业管理工作必须逐步完善以下工作: 

管理工作的程序化,各部门都有相应的作业流程。

管理业务的标准化,各部门都有相应的作业规范。

报表文件的统一化,固定的内容、周期、格式。

数据资料的完善化和代码化。

2.3   MIS的相关学科 

MIS是一个交叉性综合性学科,组成部分有:计算机学科(网络通讯、数据库、计算机语言等)、数学(统计学、运筹学、线性规划等)、管理学、仿真等多学科。随着科学技术的高速发展,MIS涉及的范围还要扩大。

2.4  MIS的划分

2.4.1   基于组织职能进行划分  

MIS 按组织职能可以划分为办公系统、决策系统、生产系统和信息系统。

2.4.2   基于信息处理层次进行划分 

MIS基于信息处理层次进行划分为面向数量的执行系统、面向价值的核算系统、报告监控系统,分析信息系统、规划决策系统,自底向上形成信息金字塔。

2.4.3   基于历史发展进行划分 

第一代MIS 是由手工操作,使用工具是文件柜、笔记本等。第二代MIS 增加了机械辅助办公设备,如打字机、收款机、自动记账机等。第三代MIS 使用计算机、电传、电话、打印机等电子设备。 

2.4.4   基于规模进行划分 

  随着电信技术和计算机技术的飞速发展,现代MIS 从地域上划分已逐渐由局域范围走向广域范围。

2.5   MIS的综合结构 

MIS可以划分为横向综合结构和纵向综合结构,横向综合结构指同一管理层次各种职能部门的综合,如劳资、人事部门。纵向综合结构指具有某种职能的各管理层的业务组织在一起,如上下级的对口部门。

2.6  MIS的开发

创新原则,体现先进性。计算机技术的发展十分迅速,要及时了解新技术,使用新技术,使目标系统较原系统有质的飞跃。

整体原则,体现完整性。企业管理可以理解为一个合理的‘闭环’系统。目标系统应当是这个‘闭环’系统的完善。企业完整的实现计算机管理不一定必须在企业的各个方面同时实现,但必须完整的设计系统的各个方面。

不断发展原则,体现超前性。为了提高使用率,有效的发挥MIS的作用,应当注意技术的发展和环境的变化。MIS在开发过程中应注重不断发展和超前意识。

经济原则,体现实用性。大而全和高精尖并不是成功MIS的衡量标准。事实上许多失败的MIS正是由于盲目追求高新技术而忽视了其实用性。盲目追求完善的MIS而忽视了本单位的技术水平、管理水平和人员素质。 

MIS的开发方式有自行开发、委托开发、联合开发、购买现成软件包进行二次开发几种形式。一般来说根据企业的技术力量、资源及外部环境而定。 

第三章  系统调研及可行性分析

3.1  系统调研

正式开发管理信息系统之前进行调研是非常必要的,其必要性主要表现在以下几个方面。

(1)明确用户的要求,以根据调查结果进行可行性分析,确认系统的开发是否可行。

(2)提出新系统的人员并不都是系统研究人员,有些人对于的功能和处理数据的方法没有明确的认识。它们只是根据自己业务工作的需要提出了要求,系统开发人员要对此进行详细的调查和分析,确认用户的要求可以通过现有的计算机技术实现,保证开发的管理信息系统的功能与用户提出的要求相吻合。

(3)企业的现行系统可能是手工系统,也可能是使用和计算机的系统,无论是何种情况,都要详细地调查现行系统中信息处理的具体情况,系统内部功能结构,以便设计出一个合理的、好的新系统逻辑模型,为新系统的设计工作打好基础,保证整个系统开发的质量。

总之,有必要对现行系统进行详细的调查,明确用户需求,保证开发的新系统的功能与用户的要求相吻合,避免耗费大量的人力、物力、财力,新系统的开发却失败的悲剧发生。

3.2  可行性分析概述

可行性分析一般可定义为:可行性分析是在建设的前期对工程项目的一种考察和鉴定,对拟议中的项目进行全面与综合的技术、经济能力的调查,判断它是否可行。

(1)可行性分析阶段的主要工作包括以下几个方面:

①新系统目标可行性分析:

分析新系统的目标是否符合企业的现状和发展的需要。

②社会可行性分析:

社会可行性分析主要是指管理信息系统的开发是否符合国家法律、下策,是否能够与社会大系统实现良好的对接。

③技术可行性分析:

技术可行性分析是根据新系统的目标来衡量是否具备所需要的技术,包括系统开发人员数量和水平,硬件方面,软件方面及其它应用技术。

④经济可行性分析

经济可行性分析主要是对开发新系统所投入的资金与系统投入使用后所带来的经济效益进行比较,确认新系统是否会给企业带来一定的经济效益。

⑤管理可行性分析:

管理可行性分析主要是分析企业现行的管理体制和企业领导是否具有现代化的管理意识和管理水平。

3.3  技术可行性分析

技术可行性分析主要包括四个方面:目前有关的技术能否支持所开发的新系统;新系统开发人员的数量和水平,即人力资源;硬件和软件资源。

(1)技术支持:

首先根据新系统的目标,考虑目前有关的技术能否支持所开发的新系统。这里讨论的技术必须是已经普遍使用的,而不是待研究的或正在研究的。

(2)硬件资源:

开发管理信息系统所需的硬件资源包含以下两个方面:

系统开发人员在管理信息系统的开发过程中所需要的计算机设备及其有关的外部设备;管理信息系统开发成功投入使用后,使用单位所应具备的计算机设备及其有关的外围设备。对硬件资源进行可行性分析时主要考虑计算机的主机内存、类型、功能、联网能力、安全保护措施以及输入/输出设备,外存储器和联网数据通信设备的配置、功能、效率等指标是否符合系统方案设计要求,同时还要考虑计算机的性能/价格比。

(3)软件资源

软件资源的可行性分析主要考虑以下几点是否满足用户的要求:

①操作系统的选择;

②编译系统的选择;

③数据库管理系统的选择;

④高级编程语言的选择;

⑤汉字处理系统的选择;

⑥应用软件包的选择。

本系统在开发前,与相关部门的领导和企事业有关人员密切沟通,认真听取他们的意见,并吸收他们的积极观点,使本系统的开发在相当大的程度上具有一定的先进性和合理性。

3.4系统用例图

3.4.1 进销存系统用例图

图3-1 进销存系统总用例图

3.4.2 基本资料维护用例图

图3-2 基本资料维护用例图

3.4.3 采购用例图

图3-3 采购用例图


3.4.4 销售用例图

图3-4 销售用例图

3.4.5 库存用例图

图3-5 库存用例图

3.4.6 维护系统用例图

图3-6 维护系统用例图

3.4.7 报表导出用例图

图3-7 维护系统用例图

3.5系统类图

   

3.6系统状态图

入库状态图

出库状态图

查询状态图

3.7系统协作图

第四章  系统分析

4.1 系统需求分析

系统分析是开发管理信息系统的关键性阶段,是一个从不断认识和逐步细化的过程,是下一阶段的工作基础,是为下一阶段进行物理方案设计、解决“怎么做”提供依据,基关键性主要体现在“理解需求”和“表达需求”两方面。

通过对现行系统的详细调研,主要是从系统的角度理解用户的需要,确定新系统的综合要求,并提出这些需求的实现条件以及需求应达到的标准,也就是确定新系统要做什么,做到什么程度。这些需求包括:

(1)功能需求。确定新系统应做什么,这是最主要的需求。

(2)性能需求。给出所开发的新系统的技术性能指标,包括存储容量限制、运行时间限制、安全保密性等。

(3)环境需求。这是对系统运行以及所处环境的要求。例如,在硬件方面采用什么机型、有什么硬件设备等;在软件方面,采用什么支持系统运行的系统软件(指操作系统、数据库管理系统)。

(4)未来需求。这类要求是指目前不属于系统开发的范围,但将来随着外界环境的变化以及系统的发展可能会提出的要求。了解这类要求的目的是在开发过程中,可对系统将来可能的扩展与修改做准备。一旦需要时,就比较容易进行补充和修改了。

进销存管理系统充分发挥信息技术的优势,通过集中式的信息数据库,将企业的进、销、存等经营业务有机地结合起来,达到数据共享、降低成本、提高效率、改进服务的目的,进而提供企业的生产效率和管理水平。

    1. 数据流程图与数据字典

数据流程图是描述系统逻辑模型的主要工具,通过几个特定的符号,可以综合地反映出信息在系统中的使用、加工处理、传递、存储的整体情况。

数据流程图是系统结构化分析行之有效的工具,它抽象地描述了系统数据处理的情况,担却无法表达各个处理的详细内容,因此还要对数据流程图中出现的数据流和处理等做进一步的补充说明,这就是数据字典和变换逻辑说明。

数据字典的任务就是对数据流程图中的出现的所有被命名的图形元素在数据字典中作为一个条目加以定义,便得每一个图形元素的名字都有一个确切的解释。

数字是对数据流程图的补充说明,它的编制和维护是一项非常繁重的工作,一旦建立起来,从系统分析直至系统运行都用到它。

第五章  系统功能的设计

系统功能的设计是数据库管理系统开发中的重要一环。系统功能设计首先进行需求分析,根据用户的系统开发要求,初步调查,明确问题,解决目标系统做什么问题,最后确定出目标系统的功能模块。

5.1  MIS平台的确定

一个MIS应有一个调试可集成的系统开发平台。20世纪90年代以来,MIS平台已经发展成为把操作系统与其外部接口融为一体的集成平台。其软件系统可以包括操作系统、图形用户系统、网络通信、数据库管理系统和程序设计语言等。硬件平台可以把CPU与存储管理单元、协处理器、网卡等集成为一体,从而形成支持MIS应用开发与运行临近的一体化开发环境。

MIS平台确定应考虑用户投资,技术支持等诸多因素,就将硬件与软件平台统筹考虑。我们知道MIS平台主要有三种。主机模式、文件服务器模式和客户/服务器模式。

5.2  数据库产品选型原则

数据库是MIS中的重要支持技术,在MIS开发过程中,如何选择数据库管理是一个重要的问题,目前,数据库产品较多,每种产品都具有各自的特点和适用范围,因此,在选择数据库时,应考虑数据库应用的特点及适用范围,本系统选用的数据库语言是SQL Server2000,

    SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用

5.3  模块设计

根据需求分析,设计的进销存管理系统的模块组织结构如下图1所示。

             

图1    进销存管理系统模块组织结构图

下面对各模块的设计功能进行说明。

  1. 采购单:日常业务中需要频繁使用的功能,主要是对每笔采购入库业务进行记录,自动生成对应的采购凭证。采购单中的商品名称、供应商和经手人字段分别对应Product数据表、Supplier数据表和Users数据表中的相关字段,所以这里需要检验用户输入的合法性。为了管理的方便的规范。每笔采购单对应唯一采购单票号。
  2. 销售单:日常业务中需要频繁使用的功能,主要是对每笔销售出库业务进行记录,自动生成对应的销售凭证。销售单中的商品名称、客户和经手人字段分别对应Product数据表、Customer数据表和Users数据表中的相关字段,所以这里需要检测用户输入的合法性。为了管理的方便和规范,每笔销售单对应一个唯一销售单票号。
  3. 库存盘点:库存管理中的重要业务活动,主要是根据采购记录和销售记录对库存商品盘点,更新每种商品的库存量,为制定采购计划提供依据。计算库存时需要检索每一种商品的采购记录,汇总得到此种商品总共的采购数量,然后检索这种商品的销售记录,汇总得到此种商品总的销售数量,最后用总采购数量和总销售数量相减即可。
  4. 产品管理:库存管理中的辅助业务,主要是当有产品或者商品的属性数据改变时,需要在这里进行更新。
  5. 库存查询:统计查询功能中的一个模块,提供了对库存商品按照多种字段模糊查询的功能。
  6. 采购查询:统计查询功能中的一个模块,提供了对采购记录的多种字段的复合式查询功能。
  7. 销售查询:统计查询功能中的一个模块,提供了对销售记录的多种字段的复合式查询功能。
  8. 供应商管理:基础信息维护中的一个模块,主要用于对供应商信息进行查询和维护。为了方便对多个供应商的管理和比较,本系统中将此功能用Tab页的形式实现,既方便对单个供应商信息的查看和编辑,又利于对供应商总体的评价和比较。
  9. 客户管理:基础信息维护中的一个模块,主要用于对企业客户信息的查询和维护。为了方便对多个客户的管理和比较,本系统中也将此功能用Tab页的形式实现,既方便对单个供应商信息的查看和编辑,又利于对供应商总体的评价和比较。
  10. 密码设置:系统设置中的一个模块,主要用于为系统中现有的用户提供密码更改功能。
  11. 退出系统:用于退出本系统。为了防止用户的误操作,退出系统之前需要用户确认退出的操作。

整个系统运行的流程图大致如图2所示。

图2   系统流程图

第六章  数据库的设计

 考虑到系统的通用性和操作的便捷性,这里选用信息系统开发中广泛使用的Microsoft SQL Server2000作为后台数据库。

6.1数据表结构清单

    在这个系统中,设计了一个名称为PurchaseandSale的数据库。根据系统功能的需要,在其中总共设计了6个数据表,分别如下:

  1. Product表  用于存储产品的基本信息以及相应的库存信息;
  2. Supplier表  用于存储供应商的基本信息;
  3. Customer表   用于存储客户的基本信息;
  4. Users表   用于存储系统用户的基本信息;
  5. Purchase表   用于存储采购记录的基本信息;
  6. Sale表  用于存储销售记录的基本信息。

1、Product数据表结构

   Product数据表主要用于存储企业的产品或原材料信息,比如物品的名称、产地、规格、单位等。另外,根据销售记录和采购记录计算得出的每种商品的库存数量也存放在Product数据表的库存字段中。

表1       Product数据表结构

字段名

数据类型

长度

是否允许为空

说  明

商品名称

nvarchar

255

主键,唯一标识产品记录

产地

Nvarchar

40

规格

nvarchar

50

包装

nvarchar

50

单位

Nchar

19

库存

int

4

产品的库存量,系统计算得出,默认为0

2、Supplier数据表结构

  Supplier数据表主要用于存储企业的供应商信息,比如供应商的编号、供应商的名称、供应商的地址、联系方式、开户银行和银行帐号等。

  Supplier数据表的结构如表2所示。

表2      Supplier数据表结构

字段名

数据类型

长度

是否允许为空

说  明

供应商简称

nvarchar

10

主键,唯一标识供应商记录

供应商全称

Nvarchar

100

供应商单位全称

地址

nvarchar

100

邮政编码

nchar

6

电话

numeric

9

传真

int

9

联系人

nvarchar

30

联系人电话

numeric

9

开户银行

nvarchar

100

银行帐号

numeric

13

企业网址

nvarchar

50

3、Customer数据表结构

   Customer数据表主要用于存储企业的客户信息,比如客户的编号、客户的名称、客户的地址、联系方式、开户银行和银行帐号等。

                      表3     Customer数据表结构

字段名

数据类型

长度

是否允许为空

说  明

客户简称

nvarchar

10

主键,唯一标识客户记录

客户全称

Nvarchar

100

客户单位全称

地址

nvarchar

100

邮政编码

nchar

6

电话

numeric

9

传真

int

9

联系人

nvarchar

30

联系人电话

numeric

9

开户银行

nvarchar

100

银行帐号

numeric

13

企业网址

nvarchar

50

4、Users数据表结构

   Users数据表主要用于存储本系统的用户信息,包括用户的名称和系统登录密码。

   Users数据表结构如表4所示。

表4       User数据表结构

字段名

数据类型

长度

是否允许为空

说明

用户

nvarchar

10

主键,唯一标识系统用户

密码

nvarchar

10

用户密码,可以为空

5、Purchase数据表结构

   Purchase数据表主要用于存储企业的采购信息,比如采购商品的名称、价格、供应商编号、采购数量、采购日期、经手人等。

   Purchase数据表结构如表5所示。

                     

表5     Purchase数据表结构

字段名

数据类型

长度

是否允许为空

说明

商品名称

nvarchar

255

外键,对应Product表中商品名称

数量

int

4

每笔采购记录必须有采购数量

进价

money

8

每笔采购记录必须有采购进价

金额

money

6

由数量和进价计算得出

备注

nvarchar

9

供应商

nvarchar

9

外键,对应Supplier表中供应商简称

日期

smalldatetime

30

每笔采购记录必须有采购时间,默认为当天

经手人

nvarchar

9

外键,对应User表中操作员

票号

nvarchar

100

每笔采购记录必须有唯一的票号,系统自动生成

6、Sale数据表结构

   Sale数据表主要用于存储企业的销售信息,比如销售商品的名称、价格、客户编号、销售数量、销售日期、经手人等。

                       表6    Sale数据表结构

字段名

数据类型

长度

是否允许为空

说明

商品名称

nvarchar

255

外键,对应Product表中商品名称

数量

int

4

每笔采购记录必须有采购数量

单价

money

8

每笔采购记录必须有采购进价

金额

money

8

由数量和进价计算得出

备注

nvarchar

220

客户

nvarchar

10

外键,对应Customer表中客户简称

日期

smalldatetime

4

每笔采购记录必须有采购时间,默认为当天

经手人

nvarchar

9

外键,对应User表中操作员

票号

nvarchar

50

每笔采购记录必须有唯一的票号,系统自动生成

6.2各数据表的关系

实际进销存业务中的一些数据是在多个业务活动中共享的,比如采购单中的商品必须在Product数据表中有相关记录,所以在本系统中也对上述的6个数据表设置了对应的关系。

具体关系主要体现在以下几个方面:

  1. 采购单、销售单中的经手人必须是企业中的合法员工,本系统中要求经手人必须是在Users数据表中有相应的记录;
  2. 采购单、销售单中的产品必须在Product数据表中有相应的记录。如果采购一种新商品,必须先在Supplier数据表中增加这家供应商的信息;
  3. 销售单中的客户必须Customer数据表中有相应有记录。如果销售中发展了新的客户,必须先在Customer数据表中增加这家客户的信息。

这些关系可以在SQL Server中用关系图工具设计和查看。

第七章 系统的实现

7.1文件夹组织结构

7.2系统预览

登陆界面

进货账单

客户查询

商品管理

更改密码

7.3主窗体设计

主窗体界面也是该系统的欢迎界面。应用程序的主窗体必须设计层次清晰的系统菜单和工具栏,其中系统菜单包含系统中所有功能的菜单项,而工具栏主要提供常用功能的快捷访问按钮。企业进销存管理系统采用导航面板综合了系统菜单和工具栏的优点,而且导航面板的界面更加美观,操作更快捷。主窗体的运行结果如图3所示。

图3

详细代码:

public class MainFrame extends JFrame{

private JTree tree;

final JDesktopPane rightPanel;

final JLabel backgroundLabel;

String frameName;

JInternalFrame iframe;

JButton ShangPinGuanLi, GysGuanLi, KeHuGuanLi, JinHuoDan, KuCunPanDian,

JiaGeTiaoZheng, XiaoShouPaiHang, GengGaiMiMa;

public static void main(String args[]){

MainFrame frame = new MainFrame();

}

public MainFrame(){

super();

setResizable(false);

setTitle(" 企业进销存管理系统");

setBounds(0, 0, 1024, 768);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frameName = null;

iframe = null;

rightPanel = new JDesktopPane();// 右边面板

final JPanel topPanel = new JPanel();

topPanel.setLayout(new BorderLayout());

topPanel.setPreferredSize(new Dimension(0, 100));//设置最适大小

getContentPane().add(topPanel, BorderLayout.NORTH);

// logo图片标签

final JLabel label = new JLabel();

label.setHorizontalAlignment(SwingConstants.CENTER);// 设置标签内容沿 X 轴的对齐方式

URL resource = MainFrame.this.getClass().getResource("/img/logo.JPG");

ImageIcon icon = new ImageIcon(resource);

label.setIcon(icon);

label.setBorder(new TitledBorder(null, "",//设置边框

TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));

label.setPreferredSize(new Dimension(160, 0));

topPanel.add(label, BorderLayout.WEST);

final JPanel buttonPanel = new JPanel();// 创建工具栏面板

final GridLayout gridLayout = new GridLayout(1, 0);// 创建一个水平箱式布局管理器对象

gridLayout.setVgap(6);// 箱的垂直间隔为6像素

gridLayout.setHgap(6);// 箱的水平间隔为6像素

buttonPanel.setLayout(gridLayout);// 设置工具栏面板采用的布局管理器为箱式布局

buttonPanel.setBackground(new Color(90, 130, 189));// 设置工具栏面板的背景色

buttonPanel.setBorder(new TitledBorder(null, "",

TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));// 设置工具栏面板采用的边框样式

topPanel.add(buttonPanel, BorderLayout.CENTER);// 将工具栏面板添加到上级面板中

Hander hander = new Hander();

ShangPinGuanLi = new JButton();// 创建快捷按钮

resource = this.getClass().getResource("/img/1.JPG");

icon = new ImageIcon(resource);

ShangPinGuanLi.setIcon(icon);

ShangPinGuanLi.addActionListener(hander);

buttonPanel.add(ShangPinGuanLi);

GysGuanLi = new JButton();

resource = this.getClass().getResource("/img/2.JPG");

icon = new ImageIcon(resource);

GysGuanLi.setIcon(icon);

GysGuanLi.addActionListener(hander);

buttonPanel.add(GysGuanLi);

KeHuGuanLi = new JButton();

resource = this.getClass().getResource("/img/3.JPG");

icon = new ImageIcon(resource);

KeHuGuanLi.setIcon(icon);

KeHuGuanLi.addActionListener(hander);

buttonPanel.add(KeHuGuanLi);

JinHuoDan = new JButton();

resource = this.getClass().getResource("/img/4.JPG");

icon = new ImageIcon(resource);

JinHuoDan.setIcon(icon);

JinHuoDan.addActionListener(hander);

buttonPanel.add(JinHuoDan);

KuCunPanDian = new JButton();

resource = this.getClass().getResource("/img/5.JPG");

icon = new ImageIcon(resource);

KuCunPanDian.setIcon(icon);

KuCunPanDian.addActionListener(hander);

buttonPanel.add(KuCunPanDian);

JiaGeTiaoZheng = new JButton();

resource = this.getClass().getResource("/img/6.JPG");

icon = new ImageIcon(resource);

JiaGeTiaoZheng.setIcon(icon);

JiaGeTiaoZheng.addActionListener(hander);

buttonPanel.add(JiaGeTiaoZheng);

XiaoShouPaiHang = new JButton();

resource = this.getClass().getResource("/img/7.JPG");

icon = new ImageIcon(resource);

XiaoShouPaiHang.setIcon(icon);

XiaoShouPaiHang.addActionListener(hander);

buttonPanel.add(XiaoShouPaiHang);

GengGaiMiMa = new JButton();

resource = this.getClass().getResource("/img/8.JPG");

icon = new ImageIcon(resource);

GengGaiMiMa.setIcon(icon);

GengGaiMiMa.addActionListener(hander);

buttonPanel.add(GengGaiMiMa);

final JButton exitShortcutKeyButton = new JButton();

resource = this.getClass().getResource("/img/9.JPG");

icon = new ImageIcon(resource);

exitShortcutKeyButton.setIcon(icon);

exitShortcutKeyButton.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

System.exit(0);

}

});

buttonPanel.add(exitShortcutKeyButton);

//创建左边树面板

final JPanel leftPanel = new JPanel();

leftPanel.setBackground(new Color(90, 130, 189));

leftPanel.setLayout(new BorderLayout());

leftPanel.setBorder(new TitledBorder(null, "",

TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));

leftPanel.setPreferredSize(new Dimension(160, 0));

getContentPane().add(leftPanel, BorderLayout.WEST);

DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");// 创建树的根结点

DefaultMutableTreeNode baseManageTree = new DefaultMutableTreeNode("基础信息管理");// 创建树的一级子结点

baseManageTree.add(new DefaultMutableTreeNode("商品管理"));// 创建树的叶子结点并添加到一级子结点

baseManageTree.add(new DefaultMutableTreeNode("客户管理"));

baseManageTree.add(new DefaultMutableTreeNode("供应商管理"));

root.add(baseManageTree);// 向根结点添加一级子结点

DefaultMutableTreeNode stockManageTree = new DefaultMutableTreeNode("进货管理");

stockManageTree.add(new DefaultMutableTreeNode("进货帐单"));

stockManageTree.add(new DefaultMutableTreeNode("入库退货"));

root.add(stockManageTree);

DefaultMutableTreeNode sellManageTree = new DefaultMutableTreeNode("销售管理");

sellManageTree.add(new DefaultMutableTreeNode("销售账单"));

sellManageTree.add(new DefaultMutableTreeNode("销售退货"));

root.add(sellManageTree);

DefaultMutableTreeNode depotManageTree = new DefaultMutableTreeNode("库存管理");

depotManageTree.add(new DefaultMutableTreeNode("库存盘点"));

depotManageTree.add(new DefaultMutableTreeNode("价格调整"));

root.add(depotManageTree);

DefaultMutableTreeNode searchStatisticTree = new DefaultMutableTreeNode("查询统计");

searchStatisticTree.add(new DefaultMutableTreeNode("客户查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("商品查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("供应商查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("入库查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("销售查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("退货查询"));

searchStatisticTree.add(new DefaultMutableTreeNode("销售排行"));

root.add(searchStatisticTree);

DefaultMutableTreeNode sysManageTree = new DefaultMutableTreeNode("系统管理");

sysManageTree.add(new DefaultMutableTreeNode("操作员管理"));

sysManageTree.add(new DefaultMutableTreeNode("更改密码"));

sysManageTree.add(new DefaultMutableTreeNode("权限管理"));

root.add(sysManageTree);

DefaultTreeModel treeModel = new DefaultTreeModel(root);// 通过树结点对象创建树模型对象

tree = new JTree(treeModel);// 通过树模型对象创建树对象

tree.setBackground(Color.WHITE);// 设置树的背景色

tree.setRootVisible(false);// 设置不显示树的根结点,默认为显示,即true

tree.setRowHeight(24);// 设置各结点的高度为27像素

tree.setFont(new Font("宋体", Font.BOLD, 14));// 设置结点的字体样式

DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();// 创建一个树的绘制对象

renderer.setLeafIcon(null);// 设置叶子结点不采用图标

renderer.setClosedIcon(null);// 设置结点折叠时不采用图标

renderer.setOpenIcon(null);// 设置结点展开时不采用图标

tree.setCellRenderer(renderer);// 将树的绘制对象设置到树中

int count = root.getChildCount();// 获得一级结点的数量

for (int i = 0; i<count; i++) {// 遍历树的一级结点

DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i);// 获得指定索引位置的一级结点对象

TreePath path = new TreePath(node.getPath());// 获得结点对象的路径

tree.expandPath(path);// 展开该结点

}

tree.addTreeSelectionListener(new TreeSelectionListener(){// 捕获树的选取事件

public void valueChanged(TreeSelectionEvent e){

TreePath treePath = e.getPath();

String selectedNode = treePath.getLastPathComponent().toString();

String parentNode = treePath.getParentPath().getLastPathComponent().toString();

if (treePath.getPathCount()!=2) {

if (parentNode.equals("基础信息管理")) {

if (selectedNode.equals("商品管理")) frameName = "ShangPinGuanLi";

else if (selectedNode.equals("客户管理")) frameName = "KeHuGuanLi";

else if (selectedNode.equals("供应商管理")) frameName = "GysGuanLi";

}

else if (parentNode.equals("进货管理")) {

if (selectedNode.equals("进货帐单")) frameName = "JinHuoDan";

else if (selectedNode.equals("入库退货")) frameName = "JinHuoTuiHuo";

}

else if (parentNode.equals("销售管理")) {

if (selectedNode.equals("销售账单")) frameName = "XiaoShouDan";

else if (selectedNode.equals("销售退货")) frameName = "XiaoShouTuiHuo";

}

else if (parentNode.equals("库存管理")) {

if (selectedNode.equals("库存盘点")) frameName = "KuCunPanDian";

else if (selectedNode.equals("价格调整")) frameName = "JiaGeTiaoZheng";

}

else if (parentNode.equals("查询统计")) {

if (selectedNode.equals("客户查询")) frameName = "KeHuChaXun";

else if (selectedNode.equals("商品查询")) frameName = "ShangPinChaXun";

else if (selectedNode.equals("供应商查询")) frameName = "GongYingShangChaXun";

else if (selectedNode.equals("入库查询")) frameName = "RuKuChaXun";

else if (selectedNode.equals("销售查询")) frameName = "XiaoShouChaXun";

else if (selectedNode.equals("退货查询")) frameName = "XiaoShouTuiHuoChaXun";

else if (selectedNode.equals("销售排行")) frameName = "XiaoShouPaiHang";

}

else if (parentNode.equals("系统管理")) {

if (selectedNode.equals("操作员管理")) frameName = "CzyGL";

else if (selectedNode.equals("更改密码")) frameName = "GengGaiMiMa";

else if (selectedNode.equals("权限管理")) frameName = "QuanManager";

}

// 创建右边窗体

creatRightFrame(frameName);

}

}

});

leftPanel.add(tree);

resource = this.getClass().getResource("/img/back3.JPG");

icon = new ImageIcon(resource);

backgroundLabel = new JLabel();

backgroundLabel.setIcon(icon);

backgroundLabel.setVerticalAlignment(SwingConstants.TOP);

backgroundLabel.setHorizontalAlignment(SwingConstants.CENTER);

updateBackImage();

rightPanel.add(backgroundLabel, new Integer(Integer.MIN_VALUE));

getContentPane().add(rightPanel, BorderLayout.CENTER);

//

addComponentListener(new FrameListener());

this.setVisible(true);

}

private void updateBackImage(){

if (backgroundLabel!=null) {

int backw = rightPanel.getWidth();

int backh = rightPanel.getHeight();

backgroundLabel.setSize(backw, backh);

backgroundLabel.setText("<html><body><image width='"+backw+"' height='"

+(backh-110)+"' src="+MainFrame.this.getClass().getResource("/img/back3.JPG")

+"'></img></body></html>");

}

}

// 窗体监听器

private final class FrameListener extends ComponentAdapter{

public void componentResized(final ComponentEvent e){

updateBackImage();

}

}

// 创建并显示右边窗体方法

private void creatRightFrame(String fName){

try {

if (iframe!=null) rightPanel.remove(iframe);

}

catch (Exception ee) {}

JInternalFrame jf = new JInternalFrame();

try {

Class fClass = Class.forName("internalFrame."+fName);

Constructor constructor = fClass.getConstructor(null);

jf = (JInternalFrame) constructor.newInstance(null);

iframe = jf;

rightPanel.add(jf);

iframe.setVisible(true);

iframe.setSelected(true);

SwingUtilities.updateComponentTreeUI(rightPanel);

}

catch (Exception e1) {

e1.printStackTrace();

System.out.println("ringht frame false");

}

}

// 快捷按钮监听器

class Hander implements ActionListener{

public void actionPerformed(ActionEvent e){

if (e.getSource().equals(ShangPinGuanLi)) creatRightFrame("ShangPinGuanLi");

else if (e.getSource().equals(GysGuanLi)) creatRightFrame("GysGuanLi");

else if (e.getSource().equals(KeHuGuanLi)) creatRightFrame("KeHuGuanLi");

else if (e.getSource().equals(JinHuoDan)) creatRightFrame("JinHuoDan");

else if (e.getSource().equals(KuCunPanDian)) creatRightFrame("KuCunPanDian");

else if (e.getSource().equals(JiaGeTiaoZheng)) creatRightFrame("JiaGeTiaoZheng");

else if (e.getSource().equals(XiaoShouPaiHang)) creatRightFrame("XiaoShouPaiHang");

else if (e.getSource().equals(GengGaiMiMa)) creatRightFrame("GengGaiMiMa");

}}}

7.4  基础信息模块设计

基础信息模块用于管理企业进销存管理系统中的客户、商品和供应商信息,其功能主要是对这些基础信息进行添加、修改和删除。

企业进销存管理系统中的基础信息模块主要包括客户管理、商品管理和供应商管理3部分,由于它们的实现方法基本相似,本节将以供应商管理部分为主,介绍基础信息模块对本系统的意义和实现的业务逻辑。

供应商添加功能主要负责为系统添加新的供应商记录。在企业进销存管理系统中,商品是主要的管理对象,而系统中所有的商品都由不同的供应商提供,这就需要把不同的供应商信息添加到系统中,在商品信息中会关联系统中对应的供应商信息。供应商添加功能的程序界面如图4 所示。

图4

供应商的修改与删除功能主要用于维护系统中的供应商信息。在供应商的联系方式发生改变时,必须更新系统中的记录,以提供供应商的最新信息。另外,当不再与某家供应商合作时,需要从系统中删除供应商的记录信息。程序运行界面如图5所示。

                  

基础信息模块技术分析

基础信息模块中使用了Java Swing的JTabbedPane选项卡面板组件分别为客户信息管理、商品信息管理和供应商信息管理提供了多个操作界面,例如供应商信息管理中分别存在供应商添加和供应商修改与删除界面,而这两个界面都存在于一个窗体中,可以通过选择顶部的两个选项卡,在不同的界面中来回切换。

ActionListener接口:该接口是控件的动作监听器接口,实现该接口的类可以成为按钮和菜单项等控件的监听器。

actionPerformed():该方法是监听器ActionListener接口定义的方法,当事件产生时,将调用监听器实现类的actionPerformed()方法处理相应的业务逻辑。

w ActionEvent:该类是动作事件类,当用户单击按钮时,将产生该事件,这个事件会被监听器捕获并执行相应的业务逻辑。

创建TjActionListener类,该类是“添加”按钮的事件监听器,它必须实现ActionListener接口,并在actionPerformed()方法中实现用户输入的验证和供应商信息的保存。关键代码如下:

class TjActionListener implements ActionListener {//添加按钮的事件监听类

public void actionPerformed(final ActionEvent e) {

  if (diZhiF.getText().equals("") ||

quanChengF.getText().equals("")          //验证用户输入

|| chuanZhenF.getText().equals("")||

jianChengF.getText().equals("")

 || yinHangF.getText().equals("")||

bianMaF.getText().equals("")

|| diZhiF.getText().equals("")||

lianXiRenF.getText().equals("")

 || lianXiRenDianHuaF.getText().equals("")

|| EMailF.getText().equals("")||

dianHuaF.getText().equals("")) {

                        JOptionPane.showMessageDialog(GysTianJiaPanel.this,

"请填写全部信息");

   return;

    }

try {  //验证是否存在同名供应商

ResultSet haveUser = Dao.query("select * from tb_gysinfo

where name='" + quanChengF.getText().trim() + "'");

if (haveUser.next()) {                             

JOptionPane.showMessageDialog(GysTianJiaPanel.this,"供应商信息添加失败,存在同名供应商", "供应商添加信息",

JOptionPane.INFORMATION_MESSAGE);

return;

}

ResultSet set = Dao.query("select max(id) from

tb_gysinfo");//获取供应商的最大 ID 编号

String id = null;

if (set != null && set.next()) {//创建新的供应商编号

 String sid = set.getString(1).trim();

 if (sid == null)

id = "gys1001";

else { String str = sid.substring(3);

id = "gys" + (Integer.parseInt(str) + 1); }

TbGysinfo gysInfo = new TbGysinfo();//创建供应商实体对象

gysInfo.setId(id); //初始化供应商对象                    gysInfo.setAddress(diZhiF.getText().trim());                     gysInfo.setBianma(bianMaF.getText().trim());                    gysInfo.setFax(chuanZhenF.getText().trim());                      gysInfo.setYh(yinHangF.getText().trim());                     gysInfo.setJc(jianChengF.getText().trim());                      gysInfo.setName(quanChengF.getText().trim());                  gysInfo.setLian(lianXiRenF.getText().trim());                     gysInfo.setLtel(lianXiRenDianHuaF.getText().trim());

                        gysInfo.setMail(EMailF.getText().trim());                      gysInfo.setTel(dianHuaF.getText().trim());

Dao.addGys(gysInfo);                //调用addGys()方法存储供应商                   JOptionPane.showMessageDialog(GysTianJiaPanel.this,

"已成功添加客户","客户添加信息", JOptionPane.INFORMATION_MESSAGE);resetButton.doClick();                                   

//触发“重填”按钮的单击动作

 } catch (SQLException e1) {

 e1.printStackTrace();

                }}

供应商修改与删除实现过程

创建GysXiuGaiPanel类,用于实现本系统的供应商修改功能。在程序界面中有多个用于输入供应商信息的文本框,这些文本框的内容会根据所选供应商自动填充内容,修改部分或全部内容后,单击“修改”按钮将修改供应商数据。

编写initComboBox()方法,用于初始化选择供应商的下拉列表框。该方法调用Dao类的getGysInfos()方法获取数据库中所有的供应商信息,然后将供应商的ID编号和供应商名称封装成Item对象并添加到选择供应商的下拉列表框中,在下拉列表框中Item的toString()方法将显示供应商的名称。initComboBox()方法的关键代码如下:

public void initComboBox() { //初始化供应商下拉列表框的方法

     List gysInfo = Dao.getGysInfos();                                       //调用getGysInfos()方法获取供应商列表

List<Item> items = new ArrayList<Item>();                               

//创建Item列表

gys.removeAllItems(); //清除下拉列表框中原有的选项

for (Iterator iter = gysInfo.iterator(); iter.hasNext();) {

List element = (List) iter.next();

Item item = new Item();  //封装供应商信息

item.setId(element.get(0).toString().trim());

item.setName(element.get(1).toString().trim());

if (items.contains(item))                                        

//如果 Items 列表中包含该供应商的封装对象

continue;//跳出本次循环

items.add(item);

gys.addItem(item);                                               

//否则添加该对象到下拉列表框中

}

编写doGysSelectAction()方法,它在更改下拉列表框中的供应商信息时被调用,主要用于根据选择的供应商名称,把供应商的其他信息填充到相应的文本框中。关键代码如下:

id doGysSelectAction() {                                            

//处理供应商选择事件

 Item selectedItem;

 if (!(gys.getSelectedItem() instanceof Item)) {

 return; }

selectedItem = (Item) gys.getSelectedItem();//获取 Item 对象

TbGysinfo gysInfo = Dao.getGysInfo(selectedItem); //通过 Item 对象调用

getGysInfo() 方法获取供应商信息

        quanChengF.setText(gysInfo.getName());                            

//填充供应商信息到文本框中

        diZhiF.setText(gysInfo.getAddress());

        jianChengF.setText(gysInfo.getJc());

        bianMaF.setText(gysInfo.getBianma());

        dianHuaF.setText(gysInfo.getTel());

        chuanZhenF.setText(gysInfo.getFax());

        lianXiRenF.setText(gysInfo.getLian());

        lianXiRenDianHuaF.setText(gysInfo.getLtel());

        EMailF.setText(gysInfo.getMail());

        yinHangF.setText(gysInfo.getYh());}

创建ModifyActionListener类,该类是“修改”按钮的事件监听器,它必须实现ActionListener接口,并在actionPerformed()方法中获取所有文本框内容,其中包括修改后的信息,并通过调用updateGys()方法将这些供应商信息更新到数据库中。关键代码如下:

class ModifyActionListener implements ActionListener {                           

     //修改按钮的事件监听器

public void actionPerformed(ActionEvent e) {

Item item = (Item) gys.getSelectedItem();

TbGysinfo gysInfo = new TbGysinfo();//创建供应商实体对象

gysInfo.setId(item.getId());//初始化供应商实体对象

gysInfo.setAddress(diZhiF.getText().trim());

gysInfo.setBianma(bianMaF.getText().trim());

gysInfo.setFax(chuanZhenF.getText().trim());

gysInfo.setYh(yinHangF.getText().trim());

gysInfo.setJc(jianChengF.getText().trim());

gysInfo.setName(quanChengF.getText().trim());

gysInfo.setLian(lianXiRenF.getText().trim());             gysInfo.setLtel(lianXiRenDianHuaF.getText().trim());

gysInfo.setMail(EMailF.getText().trim());

gysInfo.setTel(dianHuaF.getText().trim());

if (Dao.updateGys(gysInfo) == 1)   //更新供应商信息

                                                                                  JOptionPane.showMessageDialog(GysXiuGaiPanel.this,

"修改完成");

else                       JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "修改失败");}}

创建DelActionListener类,该类是“删除”按钮的事件监听器,它必须实现ActionListener接口,并在actionPerformed()方法中获取当前选择的供应商,然后调用Dao类的delete()方法从数据库中把该供应商删除。关键代码如下:

class DelActionListener implements ActionListener {                              

//删除按钮的事件监听器

public void actionPerformed(ActionEvent e) {

Item item = (Item) gys.getSelectedItem();//获取当前选择的供应商

if (item == null || !(item instanceof Item))

return;

int confirm=JOptionPane.showConfirmDialog(//弹出确认删除对GysXiuGaiPanel.this, "确认删除供应商信息吗?");

if (confirm == JOptionPane.YES_OPTION) {  //如果确认删除

int rs = Dao.delete("delete tb_gysInfo where id='" + item.getId() + "'");

if (rs > 0) //显示删除成功对话框

JOptionPane.showMessageDialog(GysXiuGaiPanel.this, "供应商:" + item.getName() + "。删除成功");

gys.removeItem(item);} else { JOptionPane.showMessageDialog(GysXiuGaiPanel.this,"无法删除客户:" + item.getName() + "。");}}}}

第八章 系统测试

8.1 系统软件测试

软件测试是保证软件正确性及可靠性的重要环节。测试工作涉及到软件工程的各个开发阶段。

8.1.1 测试的原则

      在测试中我们遵守以下各项原则:

       (1)预先估计输出结果。

       (2)编程人员不测试本人程序。

       (3)测试例题的设计兼顾有效与无效输入,正确与错误输入。

(4)检查一个程序是否完成了所有的工作只是测试工作的一半,另一半是要检查程序是否还有预料之外的副作用。

(5)在假设系统有错的情况下进行测试。

8.1.2 模块测试

 模块测试主要对软件产品的每个模块单独的进行测试。

 一   登录账户测试

      模块一

测试用例

期望结果

实际结果

登录账户

用户名:admin

密码:admin

能以此账户登陆,并具有帐户所应有的权限

能以此账户登陆,拥有权限在模块2测试

                    

二   账户权限测试

模块二

测试用例

期望结果

实际结果

帐户  gg

添加各种信息

删除各种信息

修改各种信息

保存各种信息

条件查询

删除用户信息

退出登陆

实现账户具有的以上功能。

实现了账户具有的权限

8.1.3 集成测试

   集成测试即整体测试。在各个模块完成测试的基础上,把各个模块连接起来进行测试,力图发现设计阶段的隐患,完成下列任务:系统的所有功能和特性都包含在测试计划中,并进行测试;数据库的装载等方面的测试;系统接口,包括内部接口与外部接口的测试;错误状态处理的测试;与特定资源分布的一致性测试;完全装载的系统的实际和模拟测试;检查系统安全性的测试。

8.2 测试总结

把高级用户作为一个独立的用户,分别进行上面各个模块的操作,考虑各种操作的可能性,测试其各个模块的一致性和协作性。

8.3 系统实施与维护

系统实施阶段包括程序设计、程序和系统调试。

(一)程序设计 程序设计是工作量相当大的一项工作,编写计算机程序的依据是程序设计说明书。本系统主要依据的是Visual Basic 程序设计使用教程(第二版)。程序设计要求程序的语句间有着严密的逻辑性,有较强的可读性。

(二)程序和系统调试 程序调试包括语法调试和逻辑检查。进行逻辑检查时,需要输入一些测试数据,这些数据分为有错误的和无错误的两类,用以考察程序的正确性。功能测试,按功能模块进行测试,这种测试的目的是保证模块内部控制关系的正确和数据处理内容的正确。系统调试包括主控调度程序调试和系统程序总调,检查控制通路和参数传递的正确性,对系统的各种功能使用形态及其组合进行考察。

    系统维护作为系统研制生命周期中的最后一个阶段,其主要任务是对系统进行必要的修改和调整,以及对系统的运行状态进行检查和控制。本系统的维护包括硬件维护,软件维护和数据维护。其中硬件维护主要是对运行该管理系统的机器进行维护,使其运行速度加快。软件维护是对该管理软件进行维护,是在其运行时对其运行效率,出错情况进行纪录,然后对其进行相应的维护措施。数据维护是在系统运行时,对其运行产生的数据进行维护。系统维护是一个不断更迭的活动。是为了改正错误、完善系统或满足新的应用需求而修改系统的过程。

第九章  结 论

通过毕业设计教学环节的实践与锻炼,全面了解进销存作业中的各个环节。能够灵活运用所学专业知识,利用生命周期开发方法完成对MIS系统的设计与开发,独立完成毕业设计工作。此开发软件,通过调研超市进销存作业中的各个业务流程,分析进销存信息内容和信息流动过程,收集原始单据,根据实际情况及阅读相关文献,考虑如今多方面的因素,从主观与客观两个方面衡量了系统开发过程中的利弊。进行了详细的软件需求分析以及可行性分析。联系实际情况,并和现阶超市进销存问题做了多层次的对比,针对进销存作业中的进行管理,实现进销存信息管理的规范化、自动化。以友善的操作界面作为用户的操作平台,简单明快,清晰易学。现该软件可以为小型的公司进销存商品服务,提供其所需要的各种操作,满足了他们的愿望,实现了系统软件面向大众化的目的。

任何软件都不可能一步到位,我们也需要经过反复的客户反馈,来不断更新我们的产品,做到触类旁通,举一反三。这样也正是在前进之中求发展,逐步的去粗取精,把系统的错误及一些操作的弊端删除,增加一些实用的创意,使得软件内容更加丰富多彩。所以软件开发还有许多未能让用户满意的地方。请提出您的宝贵意见,我们会引以借鉴,不断更新开发。使我们的软件系统在双方面的共同努力下具有更加完善的功能,也让用户在新的系统软件中得到更多的实用价值。

致   谢

首先,我要感谢我的指导老师。他在百忙之中给我的无私的指导和帮助,他严谨的治学态度、一丝不苟的做事精神、渊博的专业知识和平易近人的工作作风使我受益匪浅。在我的这次课题设计中,老师大到论文选题细至论文中的文字、用语方面所给予的点拨和意见,将是我今后学习和工作中的一笔宝贵的财富。

在此我衷心的感谢领导给我们提供了舒适的学习、设计环境,并给予我们细心的关怀与指导,我从老师的身上学到了许多解决问题的方法,他们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他们无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮。在设计的同时,和同学们之间的相互探讨也使我获益匪浅。

最后对所有帮助过我的老师和同学表示衷心的感谢!

参考文献

1《程序设计院》,马力,北京大学出版社,2004-8-1

2《数据库编程宝典》,冯硕,费志博,电子工业出版社,2001-5-1

3、王守茂,《管理信息系统的分析与设计》,天津科技翻译出版公司,1993年

4、曹青、邱李华、郭志强,《程序设计教程》,机械工业出版社, 2002年

5、姜旭平,《信息系统开发方法》,清华大学出版社

6、王珊,《数据庫系统概述》,高等教育出版社

7、姚达,《数据庫设计》,高等教育出版社

8、王思波,《管理信息系统实用教程》,电子工业出版社

9、胡存,《局域网:组网技术与管理》,电子工业出版社

10、王珊、陈红,《数据库系统原理教程》,清华大学出版社,1999年

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值