Foxtable(狐表)用户栏目专家坐堂 → 保存存时确保相关表单数据一致的办法?


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

主题:保存存时确保相关表单数据一致的办法?

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


加好友 发短信
等级:八尾狐 帖子:1916 积分:17110 威望:0 精华:0 注册:2014/7/29 19:09:00
保存存时确保相关表单数据一致的办法?  发帖心情 Post By:2016/3/16 12:56:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:事务.txt

更新数据的方式如上面附件里面所述

我的问题是:如果在保存前所有的相关事务代码都成功执行,即更新了其他表单中相关的数据,但在保存时突然断电等异常情况导致了本表没有保存成功
那前面的所有相关更新都不正确了,有没有办法把保存这个动作也加入事务,ft有没有办法实现这种功能,

还是只有在SQL表中用触发器才能完成这种功能?用触发器的效率会比我上面说的方式高还是低?

谢谢!

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/16 15:29:00 [只看该作者]

单独做一个按钮保存,所有的保存转换成sql语句在一个事务里面执行。

 

不能用beforesavedatarow事件,这个是每保存一行都会触发一次的。


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


加好友 发短信
等级:八尾狐 帖子:1916 积分:17110 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/3/16 18:14:00 [只看该作者]

所有的保存转换为SQL语句在一个事务里面,这个不知道怎么写, 
比如datatables("表A").save 这句的功能要转换成sql语句保存要怎么写啊?,update是针对具体的列的,难道要update所有列?谢谢!



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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/16 18:25:00 [只看该作者]

对比一下每一列的OriginalValue,不就知道有没有必要更新这一列了?

 

然后一行合成一条up date语句执行。

 

下面是分别获取各种的行(当然,你循环每一行,判断RowState也可以)

 

 

'根据DataTable获取一个System.Data.DataTable类型变量
Dim t As System.Data.DataTable = CurrentTable.DataTable.BaseTable
'获取新增行数
Dim t1 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Added )   '新增行
If t1 IsNot Nothing Then Output.Show("新增" & t1.Rows.Count)
'获取修改行数
Dim t2 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Modified )   '修改行
If t2 IsNot Nothing Then Output.Show("修改" & t2.Rows.Count)
'获取已删除行数
Dim t3 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Deleted )   '已删除行
If t3 IsNot Nothing Then Output.Show("删除" & t3.Rows.Count)


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


加好友 发短信
等级:八尾狐 帖子:1916 积分:17110 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/3/16 19:44:00 [只看该作者]

Dim t2 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Modified )   '修改行
If t2 IsNot Nothing Then Output.Show("修改" & t2.Rows.Count)
for each dr as datarow in t2.datarows
  if dr.OriginalValue("列名") <> dr("列名") then
    ......
  end if
next

上面得到的t2表集合要怎么遍历啊,红色部份写出来都是错?


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/16 20:53:00 [只看该作者]

For Each dr As DataRow In DataTables("表A").Select("")
    If dr.RowState = DataRowState.Modified Then
        Dim str As String = ""
        For Each dc As DataCol In DataTables("表A").DataCols
            If dr.OriginalValue(dc.name) <> dr(dc.name) Then
                str &= dc.name & "='" & dr(dc.name) & "',"
            End If
        Next
        msgbox(str.trim(","))
    End If
Next


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


加好友 发短信
等级:八尾狐 帖子:1916 积分:17110 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/3/16 22:35:00 [只看该作者]

谢谢,我是想问5楼那样
Dim t2 As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Modified )   '修改行
得到的表集合要怎么遍历,ft中的知道,


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/16 22:59:00 [只看该作者]

Dim t As System.Data.DataTable = Tables("表A").DataTable.BaseTable
Dim tm As System.Data.DataTable = t.GetChanges(System.Data.DataRowState.Modified )   '新增行
For Each dr As object In tm.Rows
    Dim str As String = ""
    For Each dc As object In tm.Columns
        Dim obj1 = dr(dc, System.Data.DataRowVersion.Original)
        Dim obj2 = dr(dc)
        If obj1.Tostring <> obj2.Tostring Then
            str &= dc.ColumnName & "='" & dr(dc.ColumnName) & "',"
        End If
    Next
    msgbox(str.trim(","))
Next

 

https://msdn.microsoft.com/zh-cn/library/system.data.datatable_members%28v=vs.80%29.aspx

 


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


加好友 发短信
等级:八尾狐 帖子:1916 积分:17110 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/3/16 23:05:00 [只看该作者]

谢谢老师,还有最后一个这方面的问题

比如采购入库单中有多行数据变动了,要根据产品编码及入库数量 更新库存表中的库存数量
是否要用类似下面结构的sql语句来一次批量更新?
update 库存表 s et 库存数量 = 库存数量+入库数量 from 采购入库单 inner join 库存表 on 库存表.产品编码 = 库存表.产品编码 
where 产品编码 in (s elect 产品编码 from t2) 
 
上面where条件的目的是从表中查询到所有变动行的关联列即产品编码,跨表更新时只更新库存表中对应的产品编码的数据行

上面的方式是否正确,还是有其他方式?


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/3/16 23:46:00 [只看该作者]

没必有实时更新,而且你更新的sql语句也不对,库存数量是入库的汇总减去出库的汇总,你这样更新很可能造成数量不正确。


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