Office中国论坛/Access中国论坛

标题: 主子窗体修改数据后提示问题? [打印本页]

作者: 小何    时间: 2008-2-18 14:14
标题: 主子窗体修改数据后提示问题?
如何做到修改内容后,点击退出时提示“什么项目由YY内容修改成XX内容,是否保存”
例子如下,不知道有谁知道,能否帮我修改一下?

现在主窗体已实现,就是如果有子窗体时,在修改子窗体后,与主窗体一起提示?(不要理数据库结构和表的关系,主要是实现功能)

[ 本帖最后由 小何 于 2008-2-20 16:20 编辑 ]
作者: 小何    时间: 2008-2-18 15:52
怎么没人帮我啊?我都快急死了,请管理员帮我看看
作者: andymark    时间: 2008-2-18 16:08
定义一个窗体全局变量,在窗体的加载事件中赋值为FALSE, 当窗体控件修改或变更时同时更改变量为TRUE, 当退出没有保存时,检杳变量是否为TRUE, 并做出相应的提示和保存动作
作者: haemon    时间: 2008-2-18 16:13
如果一个窗体有好几个地方修改过了, 要一个一个提示过来的话, 可能要疯掉的
作者: 小何    时间: 2008-2-18 16:14
能否帮我修改一下,我还是有点糊涂啊
作者: t小宝    时间: 2008-2-18 18:03
帮你在 产品名称 字段写了代码给你参照一下
作者: 小何    时间: 2008-2-19 08:10
如果按你这个的话,我一次性全部项目都修改后就会一个一个的提示,变的很麻烦.最好修改多个项目后一次性提示.
作者: fswxs    时间: 2008-2-19 08:32
仅提供思路:
1、用临时表保存调出要修改的数据,修改后与临时表数据做对比,有不同的用消息框反映,可以用“&”串起来;
2、用窗体反映,凡是更改的数据如果与之前不同,数据的颜色或背景色不同,最后再判断是这些颜色的有哪些,并按上面的办法表示出来。
作者: 小何    时间: 2008-2-19 11:10
这种思路我也想过,可是实现起来有点困难,你可否做例子啊
作者: fswxs    时间: 2008-2-19 12:31
根据t小宝和andymark的意见,如果字段不多就这样吧
作者: 小何    时间: 2008-2-19 13:09
fswxs  你好!
你做的我试了一下,发现两问题:
1、没有修改数据时,也会提示是否保存?
2、我修改数据后,在提示是否保存时,我点击否也会保存?
这两个问题如何处理呢?
作者: fswxs    时间: 2008-2-19 13:19
那是因为我删除了你的变量,你用回你以前的代码就是了
作者: kafeichaofan    时间: 2008-2-19 13:36
没看清楚,说的仔细点
作者: 小何    时间: 2008-2-19 14:31
主窗体解决了

[ 本帖最后由 小何 于 2008-2-19 15:21 编辑 ]
作者: 小何    时间: 2008-2-19 15:21
现在新问题:
当主窗体内有子窗体时,修改了子窗体内容,如何得到同样的提示?(或主窗体和子窗体一起修改了数据又怎么提示呢?)

[ 本帖最后由 小何 于 2008-2-19 15:27 编辑 ]
作者: t小宝    时间: 2008-2-19 15:32
原帖由 小何 于 2008-2-19 08:10 发表
如果按你这个的话,我一次性全部项目都修改后就会一个一个的提示,变的很麻烦.最好修改多个项目后一次性提示.

我在6楼的例子只是告诉你使用OldValue属性,如果你要一次性提示,就把代码放在窗体的更新前事件中,也不要放在保存按钮的单击事件,因为是绑定窗体,只要移动记录就保存数据了。
完整代码是这样的(无需公共变量):
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim st1 As String
st1 = "产品名称由 " & Me.产品名称.OldValue & " 修改成 " & Me.产品名称 & Chr(13)
st1 = st1 & "单位数量由 " & Me.单位数量.OldValue & " 修改成 " & Me.单位数量 & Chr(13)
st1 = st1 & "单价由 " & Me.单价.OldValue & " 修改成 " & Me.单价 & Chr(13)
st1 = st1 & "库存量由 " & Me.库存量.OldValue & " 修改成 " & Me.库存量 & Chr(13)
st1 = st1 & "订购量由 " & Me.订购量.OldValue & " 修改成 " & Me.订购量 & Chr(13)
st1 = st1 & "再订购量由 " & Me.再订购量.OldValue & " 修改成 " & Me.再订购量 & Chr(13)
st1 = st1 & "中止由 " & IIf(Me.中止.OldValue, "是", "否") & " 修改成 " & IIf(Me.中止, "是","否") & Chr(13)
If MsgBox("数据已经修改" & Chr(13) & Chr(13) & st1 & Chr(13) & Chr(13) & "是否保存?" & _
    Chr(13) & "单击是保存,单击否取消修改。", vbInformation + vbYesNo, "修改提示") = vbNo Then
    Cancel = True
    Me.Undo
End If
End Sub
作者: t小宝    时间: 2008-2-19 15:34
原帖由 小何 于 2008-2-19 15:21 发表
现在新问题:
当主窗体内有子窗体时,修改了子窗体内容,如何得到同样的提示?(或主窗体和子窗体一起修改了数据又怎么提示呢?)

子窗体按上面的如法炮制
作者: fswxs    时间: 2008-2-19 15:43
不用公共变量不行,他要求是没修改的不提示
对于子窗体也一样啊,最多弄个全局变量
作者: t小宝    时间: 2008-2-19 15:46
不须要公共变量呀!再完善一下代码。

  1. Private Sub Form_BeforeUpdate(Cancel As Integer)
  2. Dim st1 As String
  3. If Me.产品名称.OldValue <> Me.产品名称 Then st1 = "产品名称由 " & Me.产品名称.OldValue & " 修改成 " & Me.产品名称 & Chr(13)
  4. If Me.单位数量.OldValue <> Me.单位数量 Then st1 = st1 & "单位数量由 " & Me.单位数量.OldValue & " 修改成 " & Me.单位数量 & Chr(13)
  5. If Me.单价.OldValue <> Me.单价 Then st1 = st1 & "单价由 " & Me.单价.OldValue & " 修改成 " & Me.单价 & Chr(13)
  6. If Me.库存量.OldValue <> Me.库存量 Then st1 = st1 & "库存量由 " & Me.库存量.OldValue & " 修改成 " & Me.库存量 & Chr(13)
  7. If Me.订购量.OldValue <> Me.订购量 Then st1 = st1 & "订购量由 " & Me.订购量.OldValue & " 修改成 " & Me.订购量 & Chr(13)
  8. If Me.再订购量.OldValue <> Me.再订购量 Then st1 = st1 & "再订购量由 " & Me.再订购量.OldValue & " 修改成 " & Me.再订购量 & Chr(13)
  9. If Me.中止.OldValue <> Me.中止 Then st1 = st1 & "中止由 " & IIf(Me.中止.OldValue, "是", "否") & " 修改成 " & IIf(Me.中止, "否", "是") & Chr(13)
  10. If Len(Trim(st1)) = 0 Then
  11.     Me.Undo
  12.     Exit Sub
  13. End If
  14. If MsgBox("数据已经修改" & Chr(13) & Chr(13) & st1 & Chr(13) & Chr(13) & "是否保存?" & _
  15.     Chr(13) & "单击是保存,单击否取消修改。", vbInformation + vbYesNo, "修改提示") = vbNo Then
  16.     Cancel = True
  17.     Me.Undo
  18. End If
  19. End Sub
复制代码

作者: fswxs    时间: 2008-2-19 15:50
楼上正解 学习啊
作者: 小何    时间: 2008-2-19 16:13
T小宝,你这个我试了一下,如果我只修改里面一项内容时,提示会将所有显示出来(不管有没有修改都会在提示框内显示)。
还有子窗体我怎么搞,也不定哦
作者: t小宝    时间: 2008-2-19 16:15
19楼已经有完善的代码了
作者: 小何    时间: 2008-2-19 16:26
搞定了,谢谢你,T小宝
作者: 小何    时间: 2008-2-19 16:39
子窗体里搞不定,如果在子窗体更新前也加入同样的代码时,如果在主窗体和子窗体都修改过,会造成两次提示。另一个如果在主窗体修改后再点击子窗体里就会提示。(子窗体里是乱做的,由于是不想重新建表)
作者: 小何    时间: 2008-2-19 20:42
大家帮帮我忙啊!!!!!!!!!!!!!!!
作者: t小宝    时间: 2008-2-19 22:43
你的库需要子窗体吗?如果需要,先把需要的表、窗体做出来,乱做一个。。。看不懂呀
你的例子里,主窗体和子窗体的数据源,控件,都是一样的
作者: 小何    时间: 2008-2-20 08:13
已做好新的例子,请帮忙修改(不要看数据库的结构和表的关系。主要目的是想实现功能为主)

[ 本帖最后由 小何 于 2008-2-20 09:10 编辑 ]
作者: 小何    时间: 2008-2-20 09:28
各位好心人帮帮我忙吧
作者: 小何    时间: 2008-2-20 10:45
帮自已顶一下,希望有人帮帮我
作者: 小何    时间: 2008-2-20 16:19
求求大家了,请帮帮我,好吗?
作者: t小宝    时间: 2008-2-20 17:12
在主窗体改数据后,进入子窗体,肯定会引发主窗体的更新事件,所以就有提示了
在子窗体改数据后,退出子窗体,又会引发子窗体的更新事件,所以就又有提示了
没办法的,ACCESS中绑定窗体就是这样。如果你只想有一次提示,就用非绑定窗体、临时表,要花费数倍的功夫,很多的代码。。。
作者: fangkinght    时间: 2008-2-20 19:40
:lol :lol
作者: 小何    时间: 2008-2-24 20:04
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim st1 As String
If Me.产品名称.OldValue <> Me.产品名称 Then st1 = "产品名称由 " & Me.产品名称.OldValue & " 修改成 " & Me.产品名称 & Chr(13)
If Me.单位数量.OldValue <> Me.单位数量 Then st1 = st1 & "单位数量由 " & Me.单位数量.OldValue & " 修改成 " & Me.单位数量 & Chr(13)
If Me.单价.OldValue <> Me.单价 Then st1 = st1 & "单价由 " & Me.单价.OldValue & " 修改成 " & Me.单价 & Chr(13)
If Me.库存量.OldValue <> Me.库存量 Then st1 = st1 & "库存量由 " & Me.库存量.OldValue & " 修改成 " & Me.库存量 & Chr(13)
If Me.订购量.OldValue <> Me.订购量 Then st1 = st1 & "订购量由 " & Me.订购量.OldValue & " 修改成 " & Me.订购量 & Chr(13)
If Me.再订购量.OldValue <> Me.再订购量 Then st1 = st1 & "再订购量由 " & Me.再订购量.OldValue & " 修改成 " & Me.再订购量 & Chr(13)
If Me.中止.OldValue <> Me.中止 Then st1 = st1 & "中止由 " & IIf(Me.中止.OldValue, "是", "否") & " 修改成 " & IIf(Me.中止, "否", "是") & Chr(13)
If Len(Trim(st1)) = 0 Then
    Me.Undo
    Exit Sub
End If
If MsgBox("数据已经修改" & Chr(13) & Chr(13) & st1 & Chr(13) & Chr(13) & "是否保存?" & _
    Chr(13) & "单击是保存,单击否取消修改。", vbInformation + vbYesNo, "修改提示") = vbNo Then
    Cancel = True
    Me.Undo
End If
End Sub

=========================================================================
就是如果当该项目没有数据时,输入新数据就不会提示(如当产品名称里有数据时修改后会提示,但是当没有数据里,在输入数据时就不会提示.)
这是为什么啊?
作者: t小宝    时间: 2008-2-24 20:40
当该项目没有数据时,就出现了空值,空值无法和字符串比较,用Nz把文本型字段和数字型字段的空值转换为空字符串即可,注意是否型字段不需要转换:

  1. Private Sub Form_BeforeUpdate(Cancel As Integer)
  2. Dim st1 As String
  3. If Nz(Me.产品名称.OldValue) <> Nz(Me.产品名称) Then st1 = "产品名称由 " & Me.产品名称.OldValue & " 修改成 " & Me.产品名称 & Chr(13)
  4. If Nz(Me.单位数量.OldValue) <> Nz(Me.单位数量) Then st1 = st1 & "单位数量由 " & Me.单位数量.OldValue & " 修改成 " & Me.单位数量 & Chr(13)
  5. If Nz(Me.单价.OldValue) <> Nz(Me.单价) Then st1 = st1 & "单价由 " & Me.单价.OldValue & " 修改成 " & Me.单价 & Chr(13)
  6. If Nz(Me.库存量.OldValue) <> Nz(Me.库存量) Then st1 = st1 & "库存量由 " & Me.库存量.OldValue & " 修改成 " & Me.库存量 & Chr(13)
  7. If Nz(Me.订购量.OldValue) <> Nz(Me.订购量) Then st1 = st1 & "订购量由 " & Me.订购量.OldValue & " 修改成 " & Me.订购量 & Chr(13)
  8. If Nz(Me.再订购量.OldValue) <> Nz(Me.再订购量) Then st1 = st1 & "再订购量由 " & Me.再订购量.OldValue & " 修改成 " & Me.再订购量 & Chr(13)
  9. If Me.中止.OldValue <> Me.中止 Then st1 = st1 & "中止由 " & IIf(Me.中止.OldValue, "是", "否") & " 修改成 " & IIf(Me.中止, "是", "否") & Chr(13)
  10. If Len(Trim(st1)) = 0 Then
  11.     Me.Undo
  12.     Exit Sub
  13. End If
  14. If MsgBox("数据已经修改" & Chr(13) & Chr(13) & st1 & Chr(13) & Chr(13) & "是否保存?" & _
  15.     Chr(13) & "单击是保存,单击否取消修改。", vbInformation + vbYesNo, "修改提示") = vbNo Then
  16.     Cancel = True
  17.     Me.Undo
  18. End If
  19. End Sub
复制代码

作者: 小何    时间: 2008-2-24 20:47
谢谢你,T小宝
作者: zczc123    时间: 2008-6-24 12:55
这个问题我也想解决,前来学习罗
作者: qdoffcie    时间: 2008-7-4 13:54
下载学习
作者: 7777777    时间: 2008-12-31 14:44
DDDDDDDDDDDDDDDDD
作者: 05632016    时间: 2009-1-20 19:20
值得学习下~~




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