进销存管理系统的介绍、设计与实现


学习进销存管理系统知识

电子商务的发展和市场竞争的加剧将企业推上了风口浪尖,中小企业除了积极迎接挑战之外,别无选择。


网络的兴起与电子商务的发展带来了时空界限的突破、贸易方式的变革和经济活动的革命,
从某种意义上来讲,这些变化为中小企业创造了与大型企业、国外企业平等竞争的有利条件。


然而,管理水平的差异会弱化这种平等的实际意义。具体而言,中小企业在进、销、
存等
环节的管理上都存在着一定程度的不足,而这些不足无疑将使其在市场竞争中陷入被动的境地。在网络经济的时代背景下,
进行有效的进销存管理已经成为中小企业存身立业的头等要事。然而对于一贯疏于管理的中小企业而言,
实现有效的进销存管理必然存在着一定的难度,因此必须借助现代化的管理方法和管理技术——计算机进销存管理系统。

本章将向用户全面剖析进销存管理的内容,并由此得出通用进销存管理系统的需求分析和数据建模,
并最终演示如何利用Delphi完成系统的制作。同时还向用户介绍特殊行业进销存系统(如医药行业、服装行业等)
与通用进销存系统的区别,从而使用户可以迅速掌握这些行业进销存系统的实现方法。
--------------------------------------------------------------------

1进销存管理

在市场经济中,销售是企业运作的重要环节,为了更好地推动销售,不少企业建立分公司或代理制,
通过分公司或代理把产品推向最终用户。这些分公司或代理商大多分布在全国各地,甚至是在国外,
远距离频繁的业务信息交流构成了这些企业业务活动的主要特点。在传统方式上,公司之间通常采用电传、
电报、电话等方式传递订货、发货、到货、压货、换货、退货等信息,总公司的商务部门在接到分公司或
代理商传来的订单和银行汇款单据传真件后,开具产品出库通知,然后把相关的进、销、存信息手工存档,
再对这些信息进行统计分析,才能了解到整个公司的生产、销售和库存情况。

这种信息传递和管理的方式不仅效率低,可靠性、安全性和保密性都无法满足要求,而且数据统计时间严重滞后,
往往是当领导了解到企业的“进、销、存”环节出现问题时,就已经远离了问题出现的时间和地点。
即便是没有分公司的企业,使用传统的手工方式管理也存在同样的问题。通过进销存管理系统,
及时通过网络把决策信息传递给相关决策人,从而可以及时发现问题、解决问题,从而更好地把握机会。
------------------------------------------------------------------------

1.1 进销存管理的任务

进销存管理工作的主要任务有:
l
企业的采购管理
l
企业的销售管理(批发、零售、连锁)
l
企业各部门的商品配送管理
l
企业库存商品的管理
l
企业应收款、应付款的管理
l
企业经营状况分析与决策
由于企业经营的商品种类经常会很多,例如一个超市可能会经营上万种商品,因此按照传统的人工管理方式,会存在以下问题。
(1) 各种物资种类繁多、品种齐全,保管管理困难。
有的物资超储备或库存积压现象严重,采购成本居高不下;有的物资严重短缺,导致销售时才发现没有库存;
有的商品由于没有及时盘点,到月末时才发现库存缺失,却查不出原因;有的在入库、领用时找不到商品的存放地点等。
(2) 无法进行准确及时的成本、毛利核算。
成本管理永远是企业管理的主题,特别是现在面对多变的市场环境,如何及时满足用户的多品种需求,
进行科学合理的成本预测、成本分析及成本控制,及时、准确地为企业管理者提供经营决策信息,
越来越显得至关重要。传统的成本核算方法(加权平均法和移动平均法)及核算工具只是粗放地进行成本核算及成本管理,
很难满足管理的需要。至于成本核算到工序、核算到产品的思路(先进先出法),在手工操作方式下更是无从谈起。
(3) 管理信息相互独立,市场预测手段、方法落后,严重影响企业科学决策,建立科学的市场信息反馈系统已迫在眉睫。
手工财务数据相互独立,财务信息传递也只是通过逐层地统计报表来完成的,因此常常出现数字不符、报表不详的情况,
难以满足统计数据的及时性、准确性、相关性要求。集团决策层、领导层很难及时地把握来自市场的准确信息,
也就无法快速对市场作出正确的决策和预测。市场反馈信息系统已严重滞后于企业管理的需要。
(4) 应收帐款居高不下,占用了大量资金,严重影响了企业资产运作效率,增加了企业的经营风险。
手工管理很难适应企业销售规模增大、销售业务复杂的形势,普遍存在着应收帐款管理不细、帐龄分析和催款通知不及时、
不到位的问题;催款力度及相应催款政策不够。
(5) 在生产和销售环节,不能准确地掌握质量的变化,尤其一些客户投诉或降级使用的产品,无法做到全程跟踪,
从而影响市场的销售。

自动化程度低,信息不畅通,不能在整个企业共享资源,各种等级的成品的管理不能做到准确无误。
缺乏质量跟踪、投诉处理监控机制。
(6) 不能有效管理异地仓库和办事处销售业务。
办事处一般通过传真或电话的方式每月上报销售数据和异地仓库的收发存数据,工作量大,
并且上报的信息存在信息延迟和不准确的现象,严重影响到企业领导层的决策工作。
------------------------------------------------------------------------

1.2 进销存管理系统的作用

进销存管理系统是基于先进的软件和高速、大容量的硬件基础上的新型进销存管理模式,
通过集中式的信息数据库,将企业的进、销、调、存、转、赚等企业的经营业务有机地结合起来,
达到数据共享、降低成本、提高效率、改进服务等目的。一般来说,利用进销存管理系统可以在以下几方面提高企业管理的水平:
l
提高管理效率降低人工成本。
l
降低采购成本。
l
及时调整营销策略,防止价格流失。
l
防范陈呆死帐,降低应收帐款。
l
减少仓储面积,提高房产综合利用率。
l
降低储备资金占用。
l
加快资金周转实现的经济效益。
l
强化财务监控制实现的经济效益。
l
商业数据智能分析。
l
高效决策。
--------------------------------------------------------------

2 进销存管理系统需求分析(1)

根据以上对进销存管理内容和进销存管理系统的分析,
一个标准的进销存管理系统应该包括如图2.1所示的几大功能。
图2.1进销存管理系统应包括的基本功能
其中每个功能都由若干相关联的子功能模块组成。下面将对这些模块一一进行介绍。
----------------------------------------------------------------------------------------

2.1 资料管理

企业经营的基础资料是一个企业最基本、最重要的信息,脱离了基础资料(包括商品资料、供货商资料和客户资料等)
进销存系统就无法运行。“资料管理”功能模块就用于维护这些基础资料,其中所包含的子功能模块如图2.2所示。




“商品编码设置”用于设置商品编码的方法。进销存系统的每一条商品信息都具有惟一的一个编码,
作为该商品信息的主键,一般来说,该编码具有一定的规律,例如药品进销存系统,商品的编码可能有两级,
第一级为药品的类别(中药,西药、保健品、器械等),第二级为药品的剂型(针剂、片剂、丸剂等)
该功能设置商品编码分类的方法,从而实现商品资料维护中自动生成编码的功能。
例如该商品属于西药的丸剂,而西药的编码是2,丸剂的编码是02,该商品的编码就是202****
后面部分由系统根据该类别里现有编码的最大值加1自动生成。

图2.2“资料管理”功能模块

“商品资料维护”用于维护(增加、修改、删除、查询)企业经营商品的基本信息,内容包括货号、
条形码、商品名、拼音编码、规格、单位、产地、类别、进货价、销售价1、销售价2、最低售价等
其中拼音编码是商品名称的拼音简称,目的是使程序可以通过拼音编码方便地查询到所需要的商品。
不同行业的进销存商品资料的属性差别很大,我们将在后面加以说明。


“供货商资料维护”用于维护企业供货商的基本信息,内容包括供货商号、拼音编码、简称、名称、
地址、邮编、区号、地区、类型、电话、传真、电报、开户行、开户行邮编、银行帐号、税号、库房地址、
库房电话、业务员、业务部门等。


“客户资料维护”用于维护企业客户的基本信息,内容包括客户编号、拼音编码、简称、名称、联系人、
地址、邮编、区号、地区、电话、传真、电报、开户行、开户行邮编、银行帐号、税号、性质、
业务员、业务部门、授信额度等。


“业务员信息维护”用于维护企业销售业务员的基本信息,内容包括业务员号、姓名、性别、电话、
手机、地址、邮编、身份证号、类别等。在销售开票时,业务员属性可以直接从业务员清单中获取
所有业务员的名字作为辞典供用户选择。


“仓库信息维护”用于维护企业的仓库信息,内容包括仓库号、仓库名、类别、备注等。
企业的商品一般都是存放在不同的仓库或同一仓库的不同货位中,这样在填写商品进货单和
销售单时用户需要指定入库或出库的是哪个仓库的货物。


“采购合同管理”用于维护企业与供货商签订的采购合同,内容包括供货商号、货号、
进价、付款方式、帐期、签订日期、合同期限等。合同的内容对业务可以产生影响,
例如合同规定了进价,在填写采购单时系统就会自动生成进价。


“销售合同管理”用于维护企业与客户签订的销售合同,内容包括客户编号、
货号、售价、付款方式、帐期、签订日期、合同期限等。


小知识:数据库设计范式
数据库的设计有一定的规范,按照等级划分为1NF2NF3NFBCNF4NF5NF6个范式。
这些范式主要用来减少数据库中的数据冗余,每个范式都有自己严格的数学定义,
下面我们用通俗的语言解释第一范式和第二范式。1NF指关系中的每个字数都必须是原子的,
即每个字段都是不可再分的原子数据项,例如业务员信息表需要记录业务员的地址和邮编,
如果使用字段Address_Zip,这就是不符合第一范式的,应该分两个字段(AddressZip)存放信息。
2NF定义为:如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,
则称关系R属于第二范式。举例来说,在系统中填写进货单时需要指定进货的商品,
如果每次进货都填写进货商品的品名、单位等信息,就会造成很大的数据冗余。
根据第二范式的要求,可以把商品的信息提炼出来,单独存放在一张表中,
将商品的编码(货号)作为关键字,进货时只需要指定进货商品的货号就可以了,
而其他信息可以通过关联的方法从商品表中获取。需要注意的是,并不是数据库设计时满足
的范式层次越高数据库就越合理,一般满足第二范式就可以了,过于追求数据的精简反而增加操作的复杂程度。
----------------------------------------------------------------------------------------

2.2 采购管理

“采购管理”功能模块用于管理企业的采购业务,所包含的子功能模块如图5.3所示。
图2.3“采购管理”功能模块

“采购订单”用于录入企业的采购订单。一般来说,采购订单、入库单、销售单等单据根据第二范式都分为
主从两张表来存放数据,主表“采购订单”的内容包括编号、供货商号、订货日期、有效起日、有效止日、
业务员、制单人、税价合计、不含税价、税额等,从表“采购订单明细”的内容包括编号、订单号、货号、
订货数量、进价、税价合计、扣率、税率、不含税价、税额等。




“进货单”用于录入企业的进货单,也分为主从两张表,主表“进货单”内容包括编号、供货商号、
进货日期、业务员、制单人、验收员、保管员、税价合计、不含税价、税额、订单号等,
从表“进货单明细”内容包括编号、进货单号、货号、进货数量、进价、税价合计、扣率、税率、
不含税价、税额、仓库、货物质量等。根据企业的规模和管理方法,可以直接作进货单而不用作采购订单,
但对于较大规模的企业,采购部门和库房部门一般是分开的,由采购部门填写采购订单,
货物运输到库房后由库房验收人员填写进货单。填写进货单后商品的库存才会增加并产生应付款。




“退货管理”用于录入企业进货时的退货单。进货的退货有两种方法,一是直接在进货单中填写负数的进货数量,
另一种是填写进退货单,一般采用前一种方法。




“进货价格调整”用于调整历史进货单的价格,内容包括内部编号、编号、进货数量、原进价、新进价、调整日期、制单人等。
“进货单位调整”用于调整历史进货单的供货商,内容包括内部编号、编号、原供货商、新供货商、调整日期、制单人等。
“历史查询”用于查询商品采购、进货的历史。一般可以让用户按照任何条件查询,如按照供货商、日期、商品货号、商品拼音等
------------------------------------------------------------------------------------------

2.3 销售管理

“销售管理”功能模块用于管理企业的销售业务,所包含的子功能模块如图2.4所示。
图2。4“销售管理”功能模块

“销售订单”用于录入企业的销售订单。主表“销售订单”的内容包括编号、客户编号、销售日期、
有效起日、有效止日、业务员、制单人、税价合计、不含税价、税额等,从表“销售订单明细”
的内容包括编号、订单号、货号、销售数量、销售价、税价合计、扣率、税率、不含税价、税额等。




“销售单”用于录入企业的销售单,主表“销售单”内容包括编号、客户编号、销售日期、业务员、
制单人、保管员、税价合计、不含税价、税额、订单号等,从表“销售单明细”内容包括编号、
销售单号、货号、销售数量、销售价、税价合计、扣率、税率、不含税价、税额、出货仓库等。




“销售退货单”用于录入企业销售退货单,内容包括编号、销售单编号、货号、退货数量、
销售价、税价合计、扣率、税率、不含税价、税额、退货仓库等。
“调整历史售价”用于调整历史销售单的价格,内容包括内部编号、编号、销售数量、
原销价、新销进价、调整日期、制单人等。
“历史查询”用于查询商品销售的历史。一般可以让用户按照任何条件查询,如按照客户、
日期、商品货号、商品拼音、业务员等信息查询。
---------------------------------------------------------------------------------------

2.4 库存管理

“库存管理”功能模块用于管理企业的库存信息,所包含的子功能模块如图2.5所示。
“库存查询”用于查询企业商品的库存,可以查询总库存和各分仓库库存。
“库存转库”用于将一个仓库的商品转移到另一个仓库,或者连锁店之间的商品调拨,
内容包括编号、源部门、目的部门、货号、数量、单价、合计金额、调拨日期、制单人、调货原因等。
图2.5“库存管理”功能模块

“库存盘点”用于管理企业的库存盘点工作,将实际盘存的商品数量输入计算机,计算机自动与
数据库中的库存数量进行核对,并产生盘盈盘亏统计信息。
“报损报溢”用于管理企业商品库存的损溢,内容包括编号、货号、仓库、数量、库存单价、
金额、日期、责任人、制单人等。
“上下限设定”用于设置库存的上限和下限,当商品库存的数量超出指定的范围时系统可以自动报警,
内容包括序号、仓库号、货号、上限、下限、最佳存量、备注等。




“库存上下限报警”根据当前商品库存和指定的库存上下限自动列出低于下限或高于上限的商品,
并可以直接根据最佳库存量直接生成采购订单。
“历史查询”用于查询各种转库、盘点、损溢的历史数据。
---------------------------------------------------------------------------------------

2.5 应付款管理

“应付款管理”功能模块用于管理企业的应付款业务,包含的子功能模块如图2.6示。
图2.6“应付款管理”功能模块

“预付款管理”用于管理企业的预付款信息,内容包括供货商号、预付款总额等。填写付款单时可以选择付款的方式,
如果是“减预付款”,则“预付款”表中的“预付总额”将自动减少。
“应付款明细”用于查询企业所有的应付款,对应到每一笔进货的明细。
“应付款汇总”用于查询企业所有的应付款,对应到每一个供货商。
“付款单”用于录入企业支付货款的凭证和应付款,内容包括编号、发票号、填票日期、进货单号、
货号、供货商号、数量、进货单价、金额、付款日期、详细说明、进货日期、状态、减预付等。
“已付款明细”用于查询企业历史的所有已经支付的款项。
“历史查询”用于查询付款单历史。
“应付款帐簿”用于查询应付款科目的明细分录,属于财务上的概念。每一笔进货或者付款发生时,
系统都会在帐簿中自动产生一笔记录,以借方、贷方、余额的形式存在,可以直接将查询的结果输出作为财务软件的凭证。
“应付款帐龄”用于分析应付款的帐龄,即在不同时间段内应付款分布的情况,作为付款依据。
-------------------------------------------------------------------------------------------

2.6 应收款管理

“应收款管理”功能模块用于管理企业的应收款业务,包含的功能模块如图2.7所示。
图2.7“应收款管理”功能模块

“预收款管理”用于管理企业的预收款信息,内容包括客户编号、预收款总额等。
填写收款单时可以选择收款的方式,如果是“减预收款”则“预收款”信息表中的“预收总额”自动减少。
“应收款明细”用于查询企业所有的应收款,对应到每一笔销售的明细。
“应收款汇总”用于查询企业所有的应收款,对应到每一个客户。
“收款单”用于录入企业收回货款的凭证和应收款,内容包括编号、发票号、填票日期、
销售单号、货号、客户编号、数量、销售价、金额、收款日期、详细说明、销售日期、状态、减预收等。
“已收款明细”用于查询企业历史的所有已收回的款项。
“历史查询”用于查询收款单历史。
“应收款帐簿”用于查询应收款科目的明细分录,每发生一笔销售或收款业务,系统都会
帐簿中自动产生一笔记录,以借方、贷方、余额的形式存在。可以直接将查询的结果输出作为财务软件的凭证。
“应收款帐龄”用于分析应收款的帐龄,即在不同时间段内应收款分布的情况,作为收款依据。
---------------------------------------------------------------------------------------------------------

2.7 帐务管理

“帐务管理”功能模块用于管理企业的结帐业务,所包含的功能模块如图2.8所示。
一般商业企业每个月都要进行一次结帐操作,确定该财务月份所有商品成本的进、销、结存情况,为财务管理提供数据。
图2.8“帐务管理”功能模块
“结帐日期设定”用于设置企业每月结帐的日期,内容包括月份、全称、结帐日期等。
一般商业企业每个月的结帐日期都是固定的,默认为25号。
“模拟结帐”用于进行模拟结帐操作。因为结帐操作不可逆,即正式结帐后商品进销存汇总的数据
就无法更改了,因此在正式结帐前往往要进行模拟结帐,以查看结帐数据是否正确。
“正式结帐”用于进行结帐操作,用于计算进销存汇总报表。
“进销存汇总”用于查询本次结帐的结果,内容包括结帐编号、年月、货号、上期结帐数量、
上期结帐金额、借方数量、借方金额、贷方数量、贷方金额、本期结存数量、本期结存金额、备注等。
“历史查询”用于查询历史结帐结果。


小知识:财务成本核算方法

财务上,为了统计企业的经营利润和报税,每个月都要对经营商品的成本进行核算,
核算方法一般分为加权平均法和先进先出法(或者后进先出法),下面来举例说明这两种方法的区别。
例如,110日进了100双鞋子,进价为每双50元;115日销售了其中的80双;
120日又进了100双,但进价变为每双40元了。采用加权平均法计算:
当月销售的成本为80×(0100×50100×40)/(0100100)80×453 600元;
当月期末余额为120×455 400元。其中0表示当月该品种的期初数量和期初金额(上月的期末数量、金额)0
例如下月计算时取值为5 400。由此可见,加权平均法计算公式为:
销售成本=销售数量×(上月期末金额+本月入库金额)/(上月期末数量+本月入库数量)
而用先进先出法计算,因为销售的80双属于第一次进货的,其真实的成本应该是80×504 000元。
由此可见两种不同的计算方法对企业当月的利润是不一样的,后一种增加了400元的成本,
利润就降低了400元。到这里,也许用户会问,这两种方法有什么区别?最终企业的利润总是一样的,
只不过是先算还是后算的问题。首先,先进先出法可以更加准确的反映出企业的实际经营状况;
其次在不同的动机下会产生不同的结果,例如一般商品的价格总是下降的趋势,
如果上市公司想增加本年度的利润,采用先进先出法就可以合法地提高公司的利润。需要注意的是,
先进先出法需要大量的运算工作,因此在手工操作模式下是不现实的,这也是加权平均法产生的根本原因。
---------------------------------------------------------------------------------------------------------

2.8 统计分析

“统计分析”功能模块用于统计和分析企业的经营数据,供企业决策者作为决策依据。常用的功能如图2.9所示。
图2.9“统计分析”功能模块
“统计分析”功能模块对企业的历史数据进行统计分析,并将这些数据的分析结果以直观的形式表现出来,
当然最理想的情况是以图表的形式表现出来,如图5.10和图5.11所示。以上列举的只是“统计分析”
功能模块的一小部分功能,其他还有商品时段销售对比、门店时段销售对比等功能。




图2.10同一商品不同时段销售对比

图2.11不同门店销售分析对比
小知识:二八(ABC)分析方法
意大利经济学家帕列托于19世纪发现:社会约80% 的财富集中在20% 的人手里,
而其余80% 的人只拥有20% 的社会财富。这种统计的不平衡性在社会经济及生活中无处不在,
这就是二八法则,即80% 的结果(如产出、酬劳、销售等),往往源于20% 的原因(如投入、努力、商品等)
对应到流通企业,就是20% 的商品(客户)大致带来80% 的销售额和毛利,
因此需要找出这些重点品种和重点客户,从而更好地发挥它们的优势。ABC分析与二八分析原理是一致的,
只不过ABC分析把结果分为3个等级,而二八分析只分为两个等级。
---------------------------------------------------------------------------------------------------------

2.9 零售管理

流通企业分为批发企业和零售企业,零售企业又分为单门店企业和连锁企业。
对于零售企业,其自身的特点必然导致进销存系统与批发企业的系统不一致。
最大的区别就是零售销售的界面,还有连锁门店的管理。“零售管理”功能模块包括的子功能模块如图2.12所示。
图2.12“零售管理”功能模块


“零售收款”用于门店的POS收款管理。正如前面所说的,零售企业不管把东西卖给了谁
也不会产生应收款。而由于顾客收款排队,需要保证最快的收款速度,
因此“零售收款”的功能要简单便捷,往往只输入商品的货号、数量和收款的总金额即可。
“班次结帐”用于零售企业的结帐管理。零售企业一般都是分班次销售的,
一天一个班次或两个班次,各班次的人员之间交班前需要将收款的金额点清,
并和计算机统计的金额一致后,选择“班次结帐”功能模块,确定并清除该班次的收款信息,
将其放入历史记录,从而实现顺利交班。
“销售日报统计”用于统计零售企业日销售的信息,内容包括日期、部门、组别、
收款机号、货号、班次、销售数量、应收金额、实收金额、库存单价等。
“连锁要货申请”用于管理连锁门店向配送中心请求配货,内容包括编号、部门、组别、
货号、数量、日期、申请人、申请说明、回复等。
“连锁来货入库”用于管理连锁门店在接收到配送中心的货物时进行入库确认。
“会员管理”用于管理企业的会员信息,可以增加新会员、维护现有会员信息、
查询会员消费明细、设置会员折扣等。
“数据传输”用于管理连锁门店、配送中心和企业总部之间的数据传输,传输的操作应该简单安全。
---------------------------------------------------------------------------------------------------------

2.10 系统管理

系统管理是每个系统都必须具备的功能,包括的子功能模块如图2.13所示。
由于这部分功能比较通用,故在后面的实例中将不再详细加以介绍。
图2.13“系统管理”功能模块
“参数设置”用于设置系统定义的一些基础参数或开关。
“权限设置”用于设置各操作员使用系统的权限,为了方便设置,一般的应用系统都是可以将操作人员分组的
将通用的权限赋予整个组,个别的权限单独赋予个人,这样可以大大减少权限管理的工作量。
“数据备份”用于备份系统数据库。
“数据恢复”用于恢复系统数据库。
“日志管理”用于维护系统的使用日志。一个好的应用系统会对任何操作员进行的所有操作进行日志记录,
“日志管理”可以查询、导出和删除历史的日志。
“更改密码”供用户更改自己的密码。
---------------------------------------------------------------------------------------------------------

3.1 进销存管理系统E-R图

根据以上需求分析,一个基本的进销存管理系统数据库中大致包括60多张表,分别存放相应子功能的数据信息,
其中商品清单、供货商清单和客户清单都是关键表格,用于存放基础的数据信息。其他涉及商品、供货商和
客户信息的表,都只记录这些元素的编号,根据作为外键的编号来对应。因此这三张表和其他表间的关系是1N的关系。
因为整个系统涉及的实体和属性较多,限于篇幅,这里不能也没有必要一一列举。
214为进销存管理系统关键实体的E-R(即实体—关系图)

图2.14进销存管理系统E-R图

其他实体与基本信息表间的对应关系都是类似的,同时配书光盘的“\Chap5\建库脚本\进销存管理.sql
文件提供了创建数据库所有表的脚本,被省略的实体对象和实体属性用户完全可以参考这些脚本,
也可以使用Microsoft Visio 2002自动生成全部实体和属性的 E-R
---------------------------------------------------------------------------------------------------------

3.2 进销存管理系统表清单

配书光盘中“\Chap1\建库脚本\进销存管理.sql”文件提供了创建数据库所有表的脚本,
下面我们仅列出一些重要表的名称及其用途供用户参考(如表5.1所示)。关于各表所包含的字段,
用户可以自己查看建库脚本和前面的需求分析。

表5.1进销存管理系统表清单

表 名 称
表 用 途
用户清单
保存系统使用者的信息
权限清单
保存系统使用者的权限信息,可以指定到菜单级权限
商品清单
保存企业经营商品的资料信息
供货商清单
保存企业供货商的资料信息
客户清单
保存企业客户的资料信息
业务员清单
保存企业业务员信息
仓库清单
保存企业仓库设置信息
采购合同
保存企业与供货商签订的采购合同
库存库
保存企业商品库存的数量、金额等信息
采购订单
采购订单主表,填写采购订单时使用
采购订单明细
采购订单从表
采购订单历史
保存采购订单历史,填写采购订单确认后单据导入历史
采购订单明细历史
保存采购订单明细历史
进货单
进货单主表
进货单明细
进货单从表
进货单历史
保存进货单历史
进货单明细历史
保存进货单明细历史
进价调整单
进价调整时保存进价调整的信息
销售订单
销售订单主表
销售订单明细
销售订单从表
销售订单历史
保存销售订单历史
销售订单明细历史
保存销售订单明细历史
销售单
销售单主表
销售单明细
销售单从表
销售单历史
保存销售单历史
销售单明细历史
保存销售单明细历史
销退货单
填写销售退货单时使用该表,确定后数据导入销退货单历史


续表

表 名 称
表 用 途
销退货单历史
保存销售退货单历史
调拨单
填写调拨单时使用该表,确定后数据导入调拨单历史
调拨单历史
保存调拨单历史
报损报溢
填写报损报溢单时使用该表,确定后数据导入报损报溢历史
报损报溢历史
保存报损报溢历史
上下限对照表
保存各仓库的库存上、下限数量
应付款
保存企业应付款明细数据
应收款
保存企业应收款明细数据
预收款
保存企业预收款数据
预付款
保存企业预付款数据
每月结帐日期表
保存每个月份的结帐日期
结帐历史
保存每月结帐的历史
进销存汇总表
保存每月结帐的结果
销售日报
保存零售的销售数据
调货申请
门店填写调货申请时使用该表
盘点单
填写商品盘点单时使用该表,确认后数据导入盘点单历史
盘点单历史
保存商品盘点单历史
---------------------------------------------------------------------------------------------------------

4.2 系统流程图

系统流程图如图5.20所示。

图5.20系统流程图

---------------------------------------------------------------------------------------------------------
根据5.4节的介绍,本实例系统共需要17张表,用途分别如表5.2所示。
表5.2实例系统表及其用途

表 名 称
表 用 途
用户清单
保存系统使用者的信息
权限清单
保存系统使用者的权限信息,可以指定到菜单级权限
商品清单
保存企业经营商品的资料信息
供货商清单
保存企业供货商的资料信息
客户清单
保存企业客户的资料信息
仓库清单
保存企业库房的分类信息,可以用于数据辞典
业务员清单
保存企业的业务员信息,可以用于数据辞典
进货单
进货单主表
进货单明细
进货单从表
进货单历史
保存进货单历史
进货单明细历史
保存进货单明细历史
销售单
销售单主表
销售单明细
销售单从表
销售单历史
保存销售单历史
销售单明细历史
保存销售单明细历史
库存单
保存企业商品库存的数量、金额等信息
应付款、应收款
保存企业应付款明细、应收款明细



各表之间的E-R图可以参考前面的图5.14
---------------------------------------------------------------------------------------------------------
创建“商品清单”表创建“商品清单”表的SQL脚本如下:


CREATE TABLE [dbo].[商品清单] (
[货号] [char] (14) NOT NULL Primary Key,
[条码] [char] (14) NULL ,
[拼音编码] [char] (40) NULL ,
[品名] [varchar] (80) NULL ,
[规格] [varchar] (40) NULL ,
[单位] [char] (6)NOT NULL ,
[产地] [varchar] (50) NULL ,
[类别] [char] (20) NULL ,
[进货价] [decimal] (28,6) NULL default(0),
[销售价1] [decimal] (28,6) NULL default(0),
[销售价2] [decimal] (28,6) NULL default(0),
[最低售价] [decimal] (28,6)NULL default(0)
)
GO
5.5.3创建“供货商清单”表创建“供货商清单”表的SQL脚本如下:


CREATE TABLE [dbo].[供货商清单] (
[供货商号] [char] (10) NOT NULL Primary Key,
[拼音编码] [char] (40) NOT NULL ,
[简称] [varchar] (80) NULL ,
[名称] [varchar] (80) NULL ,
[地址] [varchar] (80) NULL ,
[邮编] [char] (6)NULL ,
[区号] [char] (6)NULL ,
[地区] [varchar] (12) NULL ,
[类型] [char] (10) NULL ,
[电话] [varchar] (20) NULL ,
[传真] [varchar] (20) NULL ,
[电报] [varchar] (20) NULL ,
[开户行] [varchar] (40) NULL ,
[开户行邮编] [char] (6)NULL ,
[银行帐号] [varchar] (20) NULL ,
[税号] [varchar] (20) NULL ,
[库房地址] [varchar] (40) NULL ,
[库房电话] [varchar] (20) NULL ,
[业务员] [char] (10) NULL ,
[业务部门] [varchar] (20) NULL ,
)
GO
5.5.4创建“客户清单”表创建“客户清单”表的SQL脚本如下:


CREATE TABLE [dbo].[客户清单] (
[客户编号] [char] (10) NOT NULL Primary Key,
[拼音编码] [char] (20) NOT NULL ,
[简称] [varchar] (80) NULL ,
[名称] [varchar] (80) NULL ,
[联系人] [varchar] (30) NULL ,
[地址] [varchar] (80) NULL ,
[邮编] [char] (6)NULL ,
[区号] [char] (6)NULL ,
[地区] [varchar] (12) NULL ,
[电话] [varchar] (20) NULL ,
[传真] [varchar] (20) NULL ,
[电报] [varchar] (20) NULL ,
[开户行] [varchar] (40) NULL ,
[开户行邮编] [char] (6)NULL ,
[银行帐号] [varchar] (20) NULL ,
[税号] [varchar] (20) NULL ,
[性质] [varchar] (10) NULL ,
[业务员] [char] (10) NULL ,
[业务部门] [varchar] (20) NULL ,
[授信额度] [decimal] (28,6)NULL,
)
GO
---------------------------------------------------------------------------------------------------------
5.5.5创建“进货单”和“进货单明细”表创建“进货单”表的SQL脚本如下:


CREATE TABLE [dbo].[进货单] (
[编号] [char] (14) Not NULL Primary key,
[供货商号] [char] (10) NOT NULL ,
[进货日期] [datetime] NULL,
[业务员] [char] (10) NULL ,
[制单人] [char] (10) NULL ,
[验收员] [char] (10) NULL ,
[保管员] [char] (10) NULL ,
[税价合计] [decimal] (28,6)NULL ,
[不含税价] [decimal] (28,6)NULL ,
[税额] [decimal] (28,6) NULL,
[订单号] [char] (14) NULL
)
GO


创建“进货单明细”表的SQL脚本如下:


CREATE TABLE [dbo].[进货单明细] (
[编号] [char] (14) Not NULL Primary key,
[进货单号] [char] (14) Not NULL ,
[货号] [char] (14) NOT NULL ,
[进货数量] [decimal] (28,6)NOT NULL ,
[进价] [decimal] (28,6) NULL ,
[税价合计] [decimal] (28,6)NULL ,
[扣率] [decimal] (28,6) NULL ,
[税率] [decimal] (28,6) NULL ,
[不含税价] [decimal] (28,6)NULL ,
[税额] [decimal] (28,6) NULL ,
[仓库] [char] (20) NULL ,
[货物质量] [varchar] (50) NULL
)
GO
5.5.6创建“销售单”和“销售单明细”表创建“销售单”表的SQL脚本如下:


CREATE TABLE [dbo].[销售单] (
[编号] [char] (14) Not NULL Primary key,
[客户编号] [char] (10) NOT NULL ,
[销售日期] [datetime] NULL,
[业务员] [char] (10) NULL ,
[制单人] [char] (10) NULL ,
[保管员] [char] (10) NULL ,
[税价合计] [decimal] (28,6)NULL ,
[不含税价] [decimal] (28,6)NULL ,
[税额] [decimal] (28,6) NULL,
[订单号] [char] (14) Not NULL
)
GO


创建“销售单明细”表的SQL脚本如下:


CREATE TABLE [dbo].[销售单明细] (
[编号] [char] (14) Not NULL Primary key,
[销售单号] [char] (14) Not NULL ,
[货号] [char] (14) NOT NULL ,
[销售数量] [decimal] (28,6)NOT NULL ,
[销售价] [decimal] (28,6) NULL ,
[税价合计] [decimal] (28,6)NULL ,
[扣率] [decimal] (28,6) NULL ,
[税率] [decimal] (28,6) NULL ,
[不含税价] [decimal] (28,6)NULL ,
[税额] [decimal] (28,6) NULL ,
[仓库] [char] (20) NULL
)
GO
5.5.7创建其他重要表创建“库存库”表的SQL脚本如下:


CREATE TABLE [dbo].[库存库] (
[货号] [char] (14) NOT NULL ,
[仓库] [varchar] (20) NOT NULL ,
[库存数量] [decimal] (28,6)NOT NULL ,
[库存金额] [decimal] (28,6)NOT NULL ,
[库存单价] [decimal] (28,6)NOT NULL ,
[最新进价] [decimal] (28,6)NULL
)
GO
---------------------------------------------------------------------------------------------------------
创建“权限清单”表的SQL脚本如下:


CREATE TABLE [dbo].[权限清单] (
[权限序号] [int] IDENTITY (1, 1)NOT NULL ,
[用户编号] [char] (6) NULL ,
[部门] [char] (20) NULL ,
[权限名称] [char] (6) NOT NULL
)
GO
5.5.8创建外部关键字以下为脚本代码为需要特别注意的外部关键字,其他外部关键字参考脚本文件。


-- 外键关联字段
ALTER TABLE [dbo].[进货单] ADD
CONSTRAINT [进货单_供货商_fk] FOREIGN KEY
(
[供货商号]
) REFERENCES [dbo].[供货商清单] (
[供货商号]
)
GO
ALTER TABLE [dbo].[进货单明细] ADD
CONSTRAINT [FK_进货单明细_进货单] FOREIGN KEY
(
[进货单号]
) REFERENCES [dbo].[进货单] (
[编号]
),
CONSTRAINT [进货单明细_货号_fk] FOREIGN KEY
(
[货号]
) REFERENCES [dbo].[商品清单] (
[货号]
)
GO
ALTER TABLE [dbo].[销售单] ADD
CONSTRAINT [销售单_客户编号_fk] FOREIGN KEY
(
[客户编号]
) REFERENCES [dbo].[客户清单] (
[客户编号]
)
GO
ALTER TABLE [dbo].[销售单明细] ADD
CONSTRAINT [FK_销售单明细_销售单] FOREIGN KEY
(
[销售单号]
) REFERENCES [dbo].[销售单] (
[编号]
),
CONSTRAINT [销售单明细_货号_fk] FOREIGN KEY
(
[货号]
) REFERENCES [dbo].[商品清单] (
[货号]
)
GO
5.5.9创建存储过程系统使用了两个存储过程,分别实现进货时加大库存、产生应付款和销售时减少库存、产生应收款的功能。


-- 存储过程
CREATE PROCEDURE sf_进货单 @记帐人 char(10) = NULL
AS
begin transaction
-- 库存库中没有,增加记录
INSERT INTO 库存库(货号,仓库,库存数量,库存金额,库存单价)
SELECT DISTINCT j.货号, j.仓库, 0,0,0
FROM 进货单明细 AS J left join 库存库 as k on ( j.仓库=k.仓库 and j.货号=k.货号 )
where k.货号 is null
-- 修改库存信息
UPDATE 库存库 SET 库存单价=case when 库存数量<=0 or (库存数量+数量ALL)<=0 then 进价
else (库存金额+税价合计ALL)/(库存数量+数量ALL) end ,

库存数量=库存数量+数量ALL,

库存金额=case when 库存数量<=0 or (库存数量+数量ALL)<=0
then 进价*(库存数量+数量ALL) else (库存金额+税价合计ALL) end ,

最新进价=进价
FROM
(SELECT 仓库,货号,'数量ALL'=sum(进货数量), '进价' = sum(税价合计)/sum(进货数量),
'税价合计ALL'=sum(税价合计) FROM 进货单明细 GROUP BY 仓库,货号) AS LSJ
WHERE库存库.仓库=LSj.仓库 AND 库存库.货号=LSj.货号
-- 加入应付款
INSERT INTO 应付款(编号, 进货单号, 货号, 供货商号, 数量, 进货单价, 金额, 进货日期, 状态)
SELECT ''+a.编号,b.编号,a.货号,b.供货商号,进货数量,进价,a.税价合计,进货日期,'应付'
FROM 进货单明细 as a, 进货单 as b
where a.进货单号=b.编号

-- 加入历史
insert into 进货单历史 select * from 进货单
insert into 进货单明细历史 select * from 进货单明细
-- 清除进货单
delete from 进货单明细
delete from 进货单
commit
go


CREATE PROCEDURE sf_销售单 @记帐人 char(10) = NULL
AS
begin transaction
-- 修改库存信息
UPDATE 库存库 SET 库存数量=库存数量-数量ALL, 库存金额=库存单价*(库存数量-数量ALL)
FROM (SELECT 仓库,货号,'数量ALL'=sum(销售数量) FROM 销售单明细

GROUP BY 仓库,货号) AS LSJ
WHERE库存库.仓库=LSj.仓库 AND 库存库.货号=LSj.货号
-- 加入应收款
INSERT INTO 应收款(编号, 销售单号, 货号, 客户编号, 数量, 销售价, 金额, 销售日期, 状态)
SELECT ''+a.编号,b.编号,a.货号,b.客户编号,销售数量,销售价,a.税价合计,销售日期,'应收'
FROM 销售单明细 as a, 销售单 as b
where a.销售单号=b.编号

-- 加入历史
insert into 销售单历史 select * from 销售单
insert into 销售单明细历史 select * from 销售单明细
-- 清除销售单
delete from 销售单明细
delete from 销售单
commit
---------------------------------------------------------------------------------------------------------
    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn