Public Event BeforeUnload(ByVal Dirty As Boolean, Cancel As VbMsgBoxResult) ' 窗体卸载前
Public Event BeforeSaveAll(Cancel As Boolean, Response As Integer) ' 保存前
Public Event AfterSaveAll(ByVal DataMode As Boolean) ' 保存后
Dim WithEvents frmMain As Form ' 主窗体
Dim WithEvents frmChild As Form ' 子窗体
Dim mblDataMode As Boolean ' 数据模式,添加:true 修改:false
Dim mblBeginTrans As Boolean ' 是否已开启事务
Dim mblDataChange As Boolean ' 数据是否已更改
Dim mblChildDel As Boolean ' 用于判断子窗体取消删除
'===========================================================
' 加载窗体和数据
'===========================================================
Public Sub InitForm(Main As Form, MainRcSource As String, Child As SubForm, ChildRcSource As String)
Set frmMain = Main
Set frmChild = Child.Form
With frmMain
.AllowDeletions = False ' 强制主窗体不能删除记录
.AfterInsert = "[Event Procedure]"
.AfterUpdate = "[Event Procedure]"
.OnUnload = "[Event Procedure]"
End With
With frmChild
.AfterUpdate = "[Event Procedure]"
.AfterDelConfirm = "[Event Procedure]"
.OnDelete = "[Event Procedure]"
End With
'===========================================================
' 主窗体 事件
'===========================================================
Private Sub frmMain_AfterInsert()
frmMain.AllowAdditions = False ' 一次只能添加一条记录
End Sub
Private Sub frmMain_AfterUpdate()
If mblDataChange = False Then mblDataChange = True
End Sub
Private Sub frmMain_Unload(Cancel As Integer)
' 卸载前提示
Dim msg As VbMsgBoxResult
msg = vbNo ' 默认不保存
RaiseEvent BeforeUnload(mblDataChange, msg)
Cancel = (msg = vbCancel)
If mblDataChange Then
If msg = vbNo Then
UndoAll
ElseIf msg <> vbCancel Then
SaveAll
End If
ElseIf mblBeginTrans Then
If msg <> vbCancel Then DBEngine.Rollback
End If
End Sub
'===========================================================
' 子窗体 事件
'===========================================================
Private Sub frmChild_AfterDelConfirm(Status As Integer)
If Status = acDeleteOK Then
If mblDataChange = False Then mblDataChange = True
Else
If mblChildDel Then
' 如删除不成功且是第一次更改窗体数据
mblDataChange = False
mblChildDel = False
End If
End If
End Sub
Private Sub frmChild_AfterUpdate()
If mblDataChange = False Then mblDataChange = True
End Sub
Private Sub frmChild_Delete(Cancel As Integer)
If mblDataChange = False Then
' 第一次更改窗体数据
mblDataChange = True
mblChildDel = True
End If
End Sub
'===========================================================
' 取消所有数据更改
'===========================================================
Public Sub UndoAll()
If mblDataMode Then frmMain.AllowAdditions = True
If frmMain.Dirty Or frmChild.Dirty Then DoCmd.RunCommand acCmdUndo
DBEngine.Rollback
mblBeginTrans = False
mblDataChange = False
End Sub
'===========================================================
' 保存所有数据更改
'===========================================================
Public Function SaveAll() As Boolean
Dim b As Boolean, i As Integer
If frmMain.Dirty Or frmChild.Dirty Then DoCmd.RunCommand acCmdSaveRecord
If mblDataChange Then
RaiseEvent BeforeSaveAll(b, i)
If b Then
If i = 0 Then MsgBox "无法保存数据!", vbExclamation, "系统提示"
Exit Function
End If
DBEngine.CommitTrans
RaiseEvent AfterSaveAll(mblDataMode)
mblDataMode = False
mblDataChange = False
Else
DBEngine.Rollback
End If
mblBeginTrans = False
SaveAll = True
End Function
'===========================================================
' 主窗体数据模式 添加或修改
'===========================================================
Public Property Get FormDataMode() As Boolean
FormDataMode = mblDataMode
End Property
'===========================================================
' 子函数 设置窗体记录集
'===========================================================
Private Function CreateFormRst(frm As Form, RecSource As String) As Integer
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(RecSource, dbOpenDynaset)
Set frm.Recordset = rs
CreateFormRst = rs.RecordCount
Set rs = Nothing
End Function
作者: dlack 时间: 2012-4-16 10:04
采用DAO时,数据多一点,下面的语句就会出问题!
Set mDAOTransForm = New DAOTransForm
mDAOTransForm.InitForm Me, "Select * From 订单 Where 订单ID='" & stID & "'", _
Me.订单明细_子窗体, "Select * From 订单明细 Where 订单ID='" & stID & "'"作者: dlack 时间: 2012-4-16 10:54
实例改为低版本的了,烦请了解的朋友帮忙看一下,谢谢了作者: 风中漫步 时间: 2012-4-16 16:56
看着挺复杂的,你用些简单的不行吗?作者: dlack 时间: 2012-4-16 19:06