Office中国论坛/Access中国论坛

标题: 求助:如何关闭窗体时可以有保存、不保存和取消三个选项 [打印本页]

作者: xiayumei    时间: 2011-8-27 00:26
标题: 求助:如何关闭窗体时可以有保存、不保存和取消三个选项
本帖最后由 xiayumei 于 2011-8-27 08:19 编辑

有一窗体为数据表格式窗体,在里面编辑了多项记录,在关闭窗体时能否弹出对话框,提示保存、不保存和取消选项,点击保存则对所有编辑的数据保存,点击不保存则不保存并关闭该窗体,点击取消则回到窗体编辑状态下,现在编写了的代码如下:
Private Sub Form_Close()
Dim strMsg As String
   Dim iResponse As Integer
   strMsg = "数据已更改,需要保存吗?" & Chr(10)
   strMsg = strMsg & "按 yes 则保存,按no则不保存,按Cancel则取消"
   iResponse = MsgBox(strMsg, vbQuestion + vbYesNoCancel, "Save Record?")
   
  If iResponse = vbNo Then
        DoCmd.RunCommand acCmdUndo
   ElseIf iResponse = vbYes Then
      DoCmd.RunCommand acCmdSaveRecord
      Else
      End If
   End sub
运行后是以下情况:
1、点击“是”保存后退出窗体。
2、点击“否”取消最后编辑的一条记录后退出窗体。
3、点击“取消”同点击“否”一样。
求各位大侠帮助!
作者: jinzhanxi    时间: 2011-8-27 10:51
一起学习,等老师指导
作者: cjnt007    时间: 2011-8-27 14:03
放到unload事件中,点击取消的执行代码应使用
cancel=true
作者: xiayumei    时间: 2011-8-27 14:26
cjnt007 发表于 2011-8-27 14:03
放到unload事件中,点击取消的执行代码应使用
cancel=true

谢谢指点,但是不行,代码改过后,点击取消就退出且保存修改的内容,如果未修改点击否,提示“当前undo命令不可用”
作者: cjnt007    时间: 2011-8-27 14:39
你修改了一项记录后,如果再跳转到另一项记录进行修改,刚才修改过的记录就自动保存了,所以就不存在你在退出窗体时统一保存所有修改过的记录机会。
作者: cjnt007    时间: 2011-8-27 14:40
其实可以在窗体的更新前事件中作相应处理
作者: xiayumei    时间: 2011-8-27 15:02
就是啊!主要是想批量保存,我自己建立一个档案资料管理系统,档案的主要项为主表,档案目录为子表,平时主要是修改子表(档案目录),想将子表(档案目录)改完了再去保存,如果加入窗体更新事件中会出现改一项或增加一项提示你是否保存,对于主表到是无所谓,对于子表就太麻烦了!
请大家帮帮忙!
作者: cjnt007    时间: 2011-8-27 16:01
提供下思路:可在每次打开修改子表的窗体前,用代码给子表建立一个副本,修改工作在这个副本上进行,完成后退出窗体时如果要保存就将副本内容更新到子表里。子表副本里应该保存有原表的ID号,这样更新操作就方便多了。
作者: xiayumei    时间: 2011-8-27 16:46
cjnt007 发表于 2011-8-27 16:01
提供下思路:可在每次打开修改子表的窗体前,用代码给子表建立一个副本,修改工作在这个副本上进行,完成后 ...

好思路,我也是这么在想,就是不知道怎么做,有没有实例,上传一下,好好学习!
作者: cjnt007    时间: 2011-8-27 17:35
本帖最后由 cjnt007 于 2011-8-27 17:38 编辑

1、手工复制一个子表副本,进入表设计模式修改此副本的原ID为普通数值长整型(我猜测你原表使用自动编号字段,如不是这样可不用这修改),可再增加个字段作为主键。
2、将修改子表的窗体数据源重新设定为子表副本。
3、在窗体的打开事件中加入代码
currentdb.execute "delete from 子表副本"  '清空副本中的所有记录
currentdb.execute "insert into 子表副本 (字段列表) select (字段列表) from 子表"  '将子表中的所有记录复制到副本中。
4、在窗体退出时执行代码,将副本中的记录更新到子表中
currentdb.execute "UPDATE 子表 INNER JOIN 子表副本 ON 子表.ID = 子表副本.ID SET 子表.字段1 = 子表副本.字段1, 子表.字段2 = 子表副本.字段2, 子表.字段3 = 子表副本.字段3;"

以上SQL语句需要根据你自己的情况进行修改,主要代码就是这些。
另外,如果在子表副本中添加一个逻辑型字段,用来作为副本记录更改标识,这样的第4步中可以根据此标识只更新修改过的记录。

作者: xiayumei    时间: 2011-8-27 19:06
谢谢!学习学习!拜谢!
作者: xiayumei    时间: 2011-8-27 20:15
cjnt007 发表于 2011-8-27 17:35
1、手工复制一个子表副本,进入表设计模式修改此副本的原ID为普通数值长整型(我猜测你原表使用自动编号字段 ...

[attach]46531[/attach]哎!水平太低,搞不定啊,在第3项就出错,清空副本不能清空啊!上传示例帮忙处理一下吧!拜谢拜谢!
作者: cjnt007    时间: 2011-8-27 21:38
尝试根据你的需求进行了修改,你看下
作者: changweiren    时间: 2012-1-18 22:50
学习学习
作者: JosephTan    时间: 2012-1-20 16:16
真蠢.人家自動保存記錄是這個數據庫的優點.摒棄了優點,還要用很艱難的辦法去實現.沒見過這麼蠢的.挖鼻屎肉吃.




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3