求助:看看我的进销存系统的数据库设计及出库处理

21KM 2005-07-09 10:15:59
第一次做进销存系统,没什么经验,请高手指点一二!
主要有以下几个表:
进货表(库存表):
进货单号、
品名、
商品类别
供货商代码
进货件数量、进货零头数(如:5瓶)、
赠送数量(也分件和零头)、
进货价格
进货实际件价(为了以后计算利润)
进货实际单价(为了以后计算利润)
库存件数
库存零头数
库存金额

出库表(主表):
出库单号
客户姓名
业务员姓名
司机
出库日期
金额
毛利润

出库表(从表):
出库单号
品名
商品类别
供货商代码
出库件数
出库零头数
出库件价
出库单价
进货实际件价
进货实际单价
进货单号(为退货而设计)
出库方式(销售或赠送,如果为赠送,则出库价格都为零)

客户端是用VB写的,关键在出库的处理上,近期用户反映有些商品的库存量比实际的库存量多出近百件
比如某次销售,用户选择了10个商品销售,2个商品赠送,我是这样处理出库的:
开始事务
1 首先产生出库单(在出库主表里插入一条记录)
2 插入第一个商品的出库明细
更新第一个商品的库存信息(库存件数、库存零数、库存金额)

……

插入第十个商品的出库明细
更新第十个商品的库存信息(库存件数、库存零数、库存金额)

插入第一个赠送商品的出库明细
更新第一个赠送商品的库存信息(库存件数、库存零数、库存金额)
插入第二个赠送商品的出库明细
更新第二个赠送商品的库存信息(库存件数、库存零数、库存金额)
提交事务
这样我一共做了13此的insert,和12此的update操作,是不是频繁的I/O操作影响了数据库的性能
导致库存量的错误。大家有什么好的优化方法,请高手指点!在此谢过!
...全文
165 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
soapyboy 2005-07-10
如果按瓶为单位,用户只需在出库数里输入15
--===
这种方法比较好,交给软件自己判断,如果数量%换算率,那么可以将数量拆分为整件和散数。这样好看一点。(双单位问题或者多单位问题,我觉得那个精诚软件处理的不错)
回复
21KM 2005-07-09
感谢两位的关注!
还有就是出库单位的问题,一般是不是只用商品的最小单位,如:瓶!
比如出库一件枝江大曲酒(规格为:10*1)+5瓶,按我的方法用户要在件数里输1,零头里输5
如果按瓶为单位,用户只需在出库数里输入15就OK

我的办法是不是搞复杂了阿!
回复
cxmcxm 2005-07-09
最好有单独的库存表.
回复
zlp321002 2005-07-09
--给你看个例子,邹建的。
/*--示例

--出处:邹建

在代码中,首先定义了一个最简单的出入库数据记录明细表(tb),用来记录每笔出入库的交易情况。
明细帐查询要求得到每种Item每天的期初数量、当天进货数、进货退回数、出货数、出货退回数及当天结余数。
--*/

--明细帐数据
CREATE TABLE tb(
ID int IDENTITY PRIMARY KEY,
Item varchar(10), --产品编号
Quantity int, --交易数量
Flag bit, --交易标志,1代表入库,0代表出库,这样可以有效区分退货(负数)
Date datetime) --交易日期
INSERT tb SELECT 'aa',100,1,'2005-1-1'
UNION ALL SELECT 'aa',90 ,1,'2005-2-1'
UNION ALL SELECT 'aa',55 ,0,'2005-2-1'
UNION ALL SELECT 'aa',-10,1,'2005-2-2'
UNION ALL SELECT 'aa',-5 ,0,'2005-2-3'
UNION ALL SELECT 'aa',200,1,'2005-2-2'
UNION ALL SELECT 'aa',90 ,1,'2005-2-1'
UNION ALL SELECT 'bb',95 ,1,'2005-2-2'
UNION ALL SELECT 'bb',65 ,0,'2005-2-3'
UNION ALL SELECT 'bb',-15,1,'2005-2-5'
UNION ALL SELECT 'bb',-20,0,'2005-2-5'
UNION ALL SELECT 'bb',100,1,'2005-2-7'
UNION ALL SELECT 'cc',100,1,'2005-1-7'
GO


--select * from TB

--结果

ID Item Quantity Flag Date
----------- ---------- ----------- ---- ------------------------------------------------------
1 aa 100 1 2005-01-01 00:00:00.000
2 aa 90 1 2005-02-01 00:00:00.000
3 aa 55 0 2005-02-01 00:00:00.000
4 aa -10 1 2005-02-02 00:00:00.000
5 aa -5 0 2005-02-03 00:00:00.000
6 aa 200 1 2005-02-02 00:00:00.000
7 aa 90 1 2005-02-01 00:00:00.000
8 bb 95 1 2005-02-02 00:00:00.000
9 bb 65 0 2005-02-03 00:00:00.000
10 bb -15 1 2005-02-05 00:00:00.000
11 bb -20 0 2005-02-05 00:00:00.000
12 bb 100 1 2005-02-07 00:00:00.000
13 cc 100 1 2005-01-07 00:00:00.000

--查询时间段定义
DECLARE @dt1 datetime,@dt2 datetime
SELECT @dt1='2005-2-1',@dt2='2005-2-10'

--查询
--统计时间段内无发生额的数据(如果这个不是查询需要的,去掉这段查询)
SELECT Item,
Date=CONVERT(char(10),@dt1,120),
Opening=SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END),
[IN]=0,
[IN_Retrun]=0,
[OUT]=0,
[OUT_Return]=0,
Balance=SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
FROM tb a
WHERE Date<@dt1 AND NOT EXISTS(
SELECT * FROM tb WHERE Item=a.Item AND Date>@dt1 AND Date<DATEADD(Day,1,@dt2))
GROUP BY Item
UNION ALL
--指定时间段内有交易发生的数据
SELECT Item,
Date=CONVERT(char(10),Date,120),
Opening=ISNULL((SELECT SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
FROM tb WHERE Item=a.Item AND Date<MIN(a.Date)),0),
[IN]=ISNULL(SUM(CASE WHEN Flag=1 AND Quantity>0 THEN Quantity END),0),
[IN_Retrun]=ISNULL(SUM(CASE WHEN Flag=1 AND Quantity<0 THEN -Quantity END),0),
[OUT]=ISNULL(SUM(CASE WHEN Flag=0 AND Quantity>0 THEN Quantity END),0),
[OUT_Return]=ISNULL(SUM(CASE WHEN Flag=0 AND Quantity<0 THEN -Quantity END),0),
Balance=ISNULL((SELECT SUM(CASE WHEN Flag=1 THEN Quantity ELSE -Quantity END)
FROM tb WHERE Item=a.Item AND Date<=MAX(a.Date)),0)
FROM tb a
WHERE Date>=@dt1 AND Date<DATEADD(Day,1,@dt2)
GROUP BY CONVERT(char(10),Date,120),Item
ORDER BY Item,Date

--结果

Item Date Opening IN IN_Retrun OUT OUT_Return Balance
---------- ---------- ----------- ----------- ----------- ----------- ----------- -----------
aa 2005-02-01 100 180 0 55 0 225
aa 2005-02-02 225 200 10 0 0 415
aa 2005-02-03 415 0 0 0 5 420
bb 2005-02-02 0 95 0 0 0 95
bb 2005-02-03 95 0 0 65 0 30
bb 2005-02-05 30 0 15 0 20 35
bb 2005-02-07 35 100 0 0 0 135
cc 2005-02-01 100 0 0 0 0 100

(所影响的行数为 8 行)

回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-07-09 10:15
社区公告
暂无公告