设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4797|回复: 14
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-27 00:26:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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、点击“取消”同点击“否”一样。
求各位大侠帮助!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-8-27 10:51:37 | 只看该作者
一起学习,等老师指导
3#
发表于 2011-8-27 14:03:28 | 只看该作者
放到unload事件中,点击取消的执行代码应使用
cancel=true
4#
 楼主| 发表于 2011-8-27 14:26:21 | 只看该作者
cjnt007 发表于 2011-8-27 14:03
放到unload事件中,点击取消的执行代码应使用
cancel=true

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

好思路,我也是这么在想,就是不知道怎么做,有没有实例,上传一下,好好学习!
10#
发表于 2011-8-27 17:35:44 | 只看该作者
本帖最后由 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步中可以根据此标识只更新修改过的记录。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-21 17:56 , Processed in 0.181823 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表