假如有两个仓库,仓库1、仓库2;
想将仓库1的物料调拨到仓为2,
那么基础的思想是这样的,仓库1的物料减少,仓库2的物料增加。
那么有可能存在一种情况,当仓库1的物料减少成功时,仓库2的物料增加却因为网络或是其它的问题而导致无法增加相应的量,那么这样后台的数据库就会变得不准确。
如果是直接用SQL语句来管理,我们可以引入SQL事务的想法,当仓库1减少成功而仓库2增不成功时就可以进行事务回滚操作。保证数据库的准确性。
但是想用这样的语句来实现,不是单单靠一两条就行的,可能需要写好多行同时提交过去SQL服务器。
如下面的语句:
use 信息管理系统 --使用数据库名
GO
begin transaction --开始事务
insert into 调拨明细表(单号,仓库名,物料名,数量,进入库情况) values('201207050002','仓库1','物资A',100,'出库') --调出
insert into 调拨明细表(单号,仓库名,物料名,数量,进入库情况) values('201207050002','仓库2','物资A',100,'入库') --调入
DECLARE @x int --定义变量
DECLARE @y int --定义变量
DECLARE @z int --定义变量
--以下为变量运算
set @x = (select COUNT(*) from 调拨明细表 where 单号 = '201207050002' and 仓库名 = '仓库1' and 物料名 ='物资A' and 数量 = 100 and 进入库情况 = '出库')
set @y = (select COUNT(*) from 调拨明细表 where 单号 = '201207050002' and 仓库名 = '仓库2' and 物料名 ='物资A' and 数量 = 100 and 进入库情况 = '入库')
set @z = @x + @y --如果成功,@z变量的值应该为2
--print @x
--print @y
--print @z
if @z <> 2 --如果值不为2时执行回滚操作
begin rollback transaction
print '调拨失败,数据操作不一致!'
end
else --值为2时执行正式操作,结束事务
begin commit transaction
print '调拨成功!'
end
go
上面的语句操作后验证了调拨的结果,如果只写入一行值,则执行事务回滚操作。
我想问的是,FOXTABLE有没有办法在一个语句设置字段里写入多条语句提交,而不是一条一条提交到SQL。我还没有试过能不能分开提交以上语句。
当然,您也可能会说:那您不如执行后再查询一下,如果发现数据不一致就删除多余的数据行,当然这也可以,但这样似乎没有办法发挥SQL数据库的强大功能。
其实,目前我也不清楚事务管理只能在SQL查询管理器中执行才有效还是可以用类似FOXTABLE这样的第三方工具提交也有效。
望孤爸给予解答一下,谢谢。