当调拨,销售,购进发生时,库存表的数量要同时改变.当购进的编码,库存表中没有时,则插入编码,库存表中有时,则更新数量.在存储过(50分)

  • 主题发起人 主题发起人 dqj
  • 开始时间 开始时间
D

dqj

Unregistered / Unconfirmed
GUEST, unregistred user!
库存表:编码 门市 数量
购进表:日期 门市 编码 数量 单价
销售表:日期 门市 编码 数量 单价
调拨表:日期 调入门市 调出门市 编码 数量
当调拨,销售,购进发生时,库存表的数量要同
时改变.当购进的编码,库存表中没有时,则插
入编码,库存表中有时,则更新数量.在存储过
程中怎样判断?sql语句怎么写?在进销存中还
有其他的方法和思路?mssql7.0
 
我做的话,会在 before post 前做
 
使用触发器,创建SQL语句如下(购进时,同时增加库存)

CREATE TRIGGER GJB_TRGGER_ADD
ON 购进表
FOR INSERT
AS
UPDATE 库存表
SET 数量 = h.数量 + itbl.数量
FROM 库存表 h, inserted itbl
WHERE h.编码=itbl.编码
 
oopsware:
谢谢老兄.在上面的触发器中,如果在录入购进表时
库存表中有相同编码正常,如是新进品种,库存表中没
有相同编码时,会有问题.这时应在库存表中插入新编
码,该如何做呢?无相同编码,插入,有相同编码,则更新.
还有就是在录入购进表保存后,有可能因录入错误,
要修改或删除,同时也要更新库存表,才能保证库存表
的正确.
调拨表,销售表的变动都会影响库存表数量,是不是
在这几个表中都要触发器.
 
CREATE TRIGGER GJB_TRGGER_ADD
ON 购进表
FOR INSERT,DELETE,UPDATE
AS
INSERT INTO 库存表(编码,门市,数量)
SELECT ISNULL(MAX(编码),0)+1, 默认门市, 0
FROM 库存表
WHERE 编码 NOT IN
(SELECT 编码 FROM inserted)
GO
UPDATE 库存表
SET 数量 = h.数量 + itbl.数量
FROM 库存表 h, inserted itbl
WHERE h.编码=itbl.编码
GO
UPDATE 库存表
SET 数量 = h.数量 - dtbl.数量
FROM 库存表 h, deleted dtbl
WHERE h.编码=itbl.编码

 
不能保存上面的触 发器
 
是问我吗?

没时间试,随手写的,可能...

建议你先把表名、字段名换为英文

在SQL Explorer中运行时
将"GO"换成 "--"
 
to:opsware改为英文,太麻烦了吧,我学这个这么费力,一个
最大原因是不懂英文,只会拿着词霸连蒙带猜.
在这个例子中我想用存储过程动态取得库存.
select 编码, 门市,sum(数量) "数量"
from (select 编码, 门市,数量
from b购进
union all
select 编码, 调入方,数量
from b调拨
union all
select 编码, 调出方,-数量
from b调拨
union all
select 编码, 门市,-数量
from b销售) #temp
group by 编码, 门市
这样写对不对?
还有朋友说这样联合三个表,在记录很多时,调用过程又主要
是通过ras,可能对速度,性能有较大影响,所以才考虑用库存
表,及时更新.但使用触发器,前端用access出现添加记录时
会出现写入冲突,提示复制到剪帖板,我只有关闭窗体,再打
开,才能下一条记录输入.这样肯定无法使用.
各位给评估一下,是用存储过程动态求库存好,还是单独建库存
表用触发器?
 
select C1 AS 编码, C2 AS 门市, SUM(C3) 总数量
from (select 编码 AS C1, 门市 AS C2, 数量 AS C3 from b购进
union all
select 编码 AS C1, 调入方 AS C2,数量 AS C3 from b调拨
union all
select 编码 AS C1, 调出方 AS C2,0-数量 AS C3 from b调拨
union all
select 编码 AS C1, 门市 AS C2, 0-数量 AS C3 from b销售) MyTemp
group by C1, C2

触发器如写好速度快且不用人干预,建议使用。
你所诉的错误有可能是被触发器修改的表,正由你以锁的形式打开。
 
触发器修改的表,就是库存表嘛,正由你以锁的形式打开?能解释一下吗?最好用access2000试
 
无此环境!

我用MSSQLServer7.0

ACCESS的数据库速度太慢!对其不感兴趣!
 
我写错了.后台是sql7.0,前端用的access.
 
有兴趣听一听
 
既然触发器有这么好,还是用触发器吧,但但使用触发器,前端
用access出现添加记录时会出现写入冲突,提示复制到剪帖板,
我只有关闭窗体,再打开,才能下一条记录输入.这样肯定无法
使用.
这几天买了一些access和sql7.0的书,饱看了一遍,无奈水平
太菜,不得要领.唯一的结论是上述的写入冲突与前端access无
关,锁由sql7.0控制的,问题应在sql7.0中,该怎么样改变锁呢?
insert into b库存(编码, 门市, 数量)
select distinct 编码 ,门市,0
from inserted
where not exists(
select *
from b库存
where b库存.编码 =inserted.编码 and
b库存.门市 =inserted.门市)


update 库存表 set 数量=数量+updt.数量
from 库存表 ,(
select 编码, 门市,sum(数量) as "数量"
from (select 编码, 门市,数量
from inserted
union all
select 编码, 门市,-数量
from deleted ) as #temp
group by 编码, 门市
)as updt
where 库存表.编码 =updt.编码 and
库存表.门市 =updt.门市


 
近期结束
 
使用触发器,创建SQL语句如下(这里只是示例在购进时,同时增加库存的情况)
总的思路是这样:
在购进表中插入记录(insert)时,使用触发器在库存表中同时更新记录,若更新语句(update)所影响的行数
(@@rowcount)为0,则说明这是一个新的品种,然后用insert语句在库存表中加入记录即可!

以下是伪代码,具体实现你自己来!

CREATE TRIGGER GJB_TRGGER_ADD
ON 购进表
FOR INSERT
AS
DECLARE @count int /*定义变量*/
UPDATE 库存表
SET 数量 = h.数量 + itbl.数量
FROM 库存表 h, inserted itbl
WHERE h.编码=itbl.编码
SELECT @count= @@rowcount /*@count的值为前面UPDATE语句所影响的记录数*/

if @count = 0 //表明UPDATE语句未影响任何记录,说明这是一个新的品种
/* 插入新记录 */
begin
SQL的insert语句
end
 
还要考虑删除情况。

以购进表的删除作例,以下是代码增加购进表的1个触发器

CREATE TRIGGER 购进表_DTrig ON 购进表 FOR DELETE AS
SET NOCOUNT ON
/* 动态库存处理----进仓部分 */
update 库存表 /*现在的库存减去原来进仓部分(退仓)*/
set 库存表.数量=k.数量-d.数量 From 库存表 k, deleted d
Where k.编码=d.编码 AND K.门市=D.门市



 
用存储过程:
Create Procedure Update库存表
@编码 char(10)='',
@门市 char(10)='',
@数量 Int=0
As
if Exists(Select * from 库存表 where 编码=@编码)
Update 库存表 Set 门市=@门市,数量=@数量
Where 编码=@编码
Else
Insert 库存表 Values(@编码,@门市,@数量)
使用是SQL:Exec Update库存表 编码,门市,数量

如果你的修改更复杂,可作相应修改.

 
最后一个总结,各位认为上述朋友的方法,
按我的实际情况该用哪一个的.我将在近
期结速.
 
后退
顶部