以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  如何实现撤消已保存、多行修改的记录  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=185862)

--  作者:lin98
--  发布时间:2023/3/21 20:25:00
--  如何实现撤消已保存、多行修改的记录
Tables("入库主表").Current.DataRow.Load(False)
Tables("入库明细").Current.DataRow.Load(False)

上面代码,只对当前选中修改,未保存的记录进行撤消修改

如何实现对多行修改已保存的记录进行撤消修改?

--  作者:有点蓝
--  发布时间:2023/3/21 20:32:00
--  
如果不是整表撤销,只能是遍历逐行处理
--  作者:lin98
--  发布时间:2023/3/21 20:49:00
--  
不是整表撤销,1楼的代码只对未保存的记录,对已保存的数据是无效,如何实现对已保存也有效,同时更新到外部数据源,确保一致?
--  作者:有点蓝
--  发布时间:2023/3/21 21:12:00
--  
已保存的数据是没有办法撤销的
--  作者:lin98
--  发布时间:2023/3/22 9:33:00
--  
撤销修改

方法一:Tables("入库主表").Current.DataRow.Load(False)

方法二:
With Tables("员工")
    If .Current IsNot Nothing Then
        .Current.Reject()
    End If
End With

这二种方法,都是必须光标在修改行,撤销修改才有效,对多行记录,光标不在修改行是撤销修改无效。

问题一:如何实现多行记录,光标不在修改行撤销修改有效?
问题二:二种方法,哪种对外部数据源同步更好?试一下,好象差不多,这二种写法的区别是什么?

--  作者:有点蓝
--  发布时间:2023/3/22 9:43:00
--  
1、遍历:http://www.foxtable.com/webhelp/topics/1438.htm
2、方法1可以重新加载数据,方法2只是撤销修改,不会重新加载

--  作者:lin98
--  发布时间:2023/3/22 12:24:00
--  
With Tables("员工")
    If .Current IsNot Nothing Then
        .Current.Reject()
    End If
End With

这个之前测试一下是可以撤销修改,现在再测试变成删除记录,这个什么情况

--  作者:cd_tdh
--  发布时间:2023/3/22 13:31:00
--  
你这个代码就是当前行啊
要不用系统的撤销命令哟Syscmd.Edit.Undo()
[此贴子已经被作者于2023/3/22 13:33:17编辑过]

--  作者:有点蓝
--  发布时间:2023/3/22 13:35:00
--  
以下是引用lin98在2023/3/22 12:24:00的发言:
With Tables("员工")
    If .Current IsNot Nothing Then
        .Current.Reject()
    End If
End With

这个之前测试一下是可以撤销修改,现在再测试变成删除记录,这个什么情况

如果是新增行还没有保存过,撤销当然是连新增这个动作也撤销了
--  作者:lin98
--  发布时间:2023/3/22 14:47:00
--  
模拟关联-入库主表和明细--执行-增、删除都正常
问题一:主表录入后,明细表没录入,修改主表,执行下面,无报错,无反应,有时,只有录入明细才有反应,再保存,保存事件失效,按保存无反应
Tables("入库主表").Current.DataRow.Load(False)

问题2:修改明细,执行下面,无报错,无反应,有时,删除记录
For Each r As Row In Tables("入库明细").Rows
    r.DataRow.Load(False)
Next

下面保存
Dim dr As DataRow = Tables("入库主表").current.DataRow
Dim pf As String
If dr.RowState <> DataRowState.Added Then
    Return
ElseIf dr.IsNull("制单日期") Then
    e.Cancel = True
    MessageBox.Show("必须输入日期!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Return
Else
    pf = "RK" & "" & Format(dr("制单日期"),"yyyyMM")
End If
Dim cmd1 As New SQCommand
Dim cmd2 As New SQCommand
Dim Key As Integer
cmd1.C \'设置数据源名称
cmd2.C
cmd1.commandText = "Se Count(*) From [编号] Where [前缀] = \'" & pf & "\'"
If cmd1.ExecuteScalar = 0 Then
    cmd1.commandtext = "Insert Into 编号 (前缀, 顺序号) Values(\'" & pf & "\',1)"
    cmd1.ExecuteNonQuery
End If
cmd1.commandText = "Sel [顺序号] From [编号] Where [前缀] = \'" & pf & "\'"
Do
    Key = cmd1.ExecuteScalar()
    cmd2.commandText = "Update [编号] Se [顺序号] = " & (Key + 1) & " Where [顺序号] = " & Key & " And [前缀] = \'" & pf & "\'"
    If cmd2.ExecuteNonQuery() > 0 Then
        Exit Do
    End If
Loop
dr("入库单号") = pf & "-" & Format(Key,"0000")   \'流水号的设计)



Dim r As Row = Tables("入库主表").current

r("保存状态") = True
DataTables("入库主表").Save()
DataTables("入库明细").Save()
MessageBox.Show("保存成功!")

如果是新增行还没有保存过,撤销当然是连新增这个动作也撤销了,
已保存的数据是没有办法撤销的
把我整不会

需求,("保存状态") = True,可以实现未保存的主表或明细的修改的撤销,这个怎么实现?