Foxtable(狐表)用户栏目专家坐堂 → [求助]存储过程


  共有4494人关注过本帖树形打印复制链接

主题:[求助]存储过程

帅哥哟,离线,有人找我吗?
huhu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
[求助]存储过程  发帖心情 Post By:2016/3/2 15:18:00 [显示全部帖子]

If e.DataCol.name = "SN" Then
    If e.DataRow("体态") = "通用态" Then
        Dim dr1 As DataRow = DataTables("库存通用态表").Find("物料编码 = '" & e.DataRow("物料编码") & "'")
        If dr1 IsNot Nothing Then
            dr1("库存数量") = dr1("库存数量") + 1
            dr1("可用数量") = dr1("可用数量") + 1
        Else
            Dim dr2 As DataRow = DataTables("库存通用态表").AddNew
            dr2("物料编码") = e.DataRow("物料编码")
            dr2("物料名称") = e.DataRow("物料名称")
            dr2("库位类别") = e.DataRow("库位类别")
            dr2("体态") = e.DataRow("体态")
            dr2("库存数量") = 1
            dr2("可用数量") = 1
        End If
这段代码我同事说有潜在的风险。(如果多任务并发进行)
比如这句dr1("可用数量") = dr1("可用数量") + 1
当设备SN进来,第一次读可用数量,读出来是100,这时还没进行加1和赋值的动作。恰巧另外一个客户端把可用数量给改为了80.这时我去加1,然后赋值。是在读出来100的基础上加1然后赋值的,最后可用数量变为了101了。而非81了。
如何避免这种情况。
是用存储过来来实现吗?怎么弄?

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 16:31:00 [显示全部帖子]

应该不是这样。
你说的如果是单线程那应该没问题。如果是多线程,并发操作呢。
就是我说的意思。第一个client在5秒时读到的可用数量是100,这时第二个client把后台的可用数量改为了80.
可是第一个人并不知道有人改了可用数量,仍然按照读到的100执行这条语句dr1("可用数量") = dr1("可用数量") + 1,那么可用数量变为了101了。实际上正确结果应该为81(80+1)。
dr1("可用数量") = dr1("可用数量") + 1
是否可用做到第一个client只有把这条语句执行完dr1("可用数量") = dr1("可用数量") + 1,其他client才能开始读写这个可用数量,其它时间都阻塞操作。
听说用存储过程可用实现,不知怎弄。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:02:00 [显示全部帖子]

另外一个人不是通过FT来改数据的,是通过webservice来来改的。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:24:00 [显示全部帖子]

库存是不能直接修改,而是添加记录,然后统计入库、出库,相减得出的。
他们改的是可用数量,不是在库数量。
一开始在库数量和可用数量都是100.但是销售下单了,需要发货20,那么就会冻结着20台设备给这个订单,但此时并未发货,所有在库数量仍然是100,可用数量就是80了。另外一个销售要下单了,他一查,发现可用数量是80,要发货60,能满足要求,就冻结60台设备,这是可用数量就是20了。
是这回事。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:38:00 [显示全部帖子]

独占式编辑也解决不了吗?
他们说的存储过程也没办法?

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:39:00 [显示全部帖子]

客户端解决不了。那么是否可以在sql server 数据库上能怎么能搞一下。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 17:49:00 [显示全部帖子]

能不能把方法二给我弄一下。需要怎么做。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 18:43:00 [显示全部帖子]

数据库sql语句

 

ALTER DATABASE 数据库名 SET READ_COMMITTED_SNAPSHOT ON
go

create proc 我的存储过程(
    @id varchar
)
As
    
begin tran  
    up date 库存通用态表 set 可用数量 = 可用数量 + 1 from 库存通用态表 where 物料编码= @id
commit tran

go


这个语句不应该写到ft吧,应该写哪里呢?另外where 后面是条件。那么@id这个指的是什么?


 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 20:35:00 [显示全部帖子]

消息 5069,级别 16,状态 1,第 12 行
ALTER DATABASE 语句失败。

 回到顶部
帅哥哟,离线,有人找我吗?
huhu
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1182 积分:8225 威望:0 精华:0 注册:2015/3/30 10:44:00
  发帖心情 Post By:2016/3/2 20:37:00 [显示全部帖子]

ALTER DATABASE FoxDate SET READ_COMMITTED_SNAPSHOT ON

 回到顶部
总数 20 1 2 下一页