技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 257
|
3#
樓主 |
發(fā)表于 2012-4-16 09:59:40
|
只看該作者
是不是函數(shù)在載入關(guān)閉后沒有卸載掉,所以多開幾次就會(huì)導(dǎo)致崩潰。請(qǐng)高手幫忙看看,謝謝!
'--------------------------------------------------------------------------------------------------
'類 名: ADOTransForm
'功 能: 應(yīng)用于主子窗體(子可以是數(shù)據(jù)表或連續(xù)窗體),實(shí)現(xiàn)主子窗體所有數(shù)據(jù)修改的同步批量保存或取消,
' 可用于 ACCESS 2000 以上版本.
'
'方 法: InitForm 加載窗體和數(shù)據(jù)
' UndoAll 取消所有數(shù)據(jù)更改
' SaveAll 保存所有數(shù)據(jù)更改,成功返回真
'
'屬 性: FormDataMode 返回窗體的允許添加屬性, 添加:true 修改:false
'
'事 件: BeforeUnload 主窗體卸載前發(fā)生,可確定是否保存記錄和關(guān)閉窗體
' BeforeSaveAll 保存所有數(shù)據(jù)之前發(fā)生,可確定是否允許保存記錄
' AfterSaveAll 保存所有數(shù)據(jù)之后發(fā)生
'
'使用注意: 指定給主窗體的記錄不要超過1條.
' 將窗體的模式屬性設(shè)為是,因?yàn)閱?dòng)事務(wù)之后會(huì)影響其它打開的記錄集.
'
'相關(guān)說明: 這個(gè)類使用了DAO事務(wù).
'
'作 者: t小雨 (tcl013@126.com)
'創(chuàng)建日期: 2009-7-22
'--------------------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
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 ' 數(shù)據(jù)模式,添加:true 修改:false
Dim mblBeginTrans As Boolean ' 是否已開啟事務(wù)
Dim mblDataChange As Boolean ' 數(shù)據(jù)是否已更改
Dim mblChildDel As Boolean ' 用于判斷子窗體取消刪除
'===========================================================
' 加載窗體和數(shù)據(jù)
'===========================================================
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 ' 強(qiáng)制主窗體不能刪除記錄
.AfterInsert = "[Event Procedure]"
.AfterUpdate = "[Event Procedure]"
.OnUnload = "[Event Procedure]"
End With
With frmChild
.AfterUpdate = "[Event Procedure]"
.AfterDelConfirm = "[Event Procedure]"
.OnDelete = "[Event Procedure]"
End With
mblDataMode = (CreateFormRst(frmMain, MainRcSource) = 0)
frmMain.AllowAdditions = mblDataMode
CreateFormRst frmChild, ChildRcSource
DBEngine.BeginTrans ' 開啟事務(wù)
mblBeginTrans = True
End Sub
'===========================================================
' 主窗體 事件
'===========================================================
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 ' 默認(rèn)不保存
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
' 如刪除不成功且是第一次更改窗體數(shù)據(jù)
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
' 第一次更改窗體數(shù)據(jù)
mblDataChange = True
mblChildDel = True
End If
End Sub
'===========================================================
' 取消所有數(shù)據(jù)更改
'===========================================================
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
'===========================================================
' 保存所有數(shù)據(jù)更改
'===========================================================
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 "無法保存數(shù)據(jù)!", vbExclamation, "系統(tǒng)提示"
Exit Function
End If
DBEngine.CommitTrans
RaiseEvent AfterSaveAll(mblDataMode)
mblDataMode = False
mblDataChange = False
Else
DBEngine.Rollback
End If
mblBeginTrans = False
SaveAll = True
End Function
'===========================================================
' 主窗體數(shù)據(jù)模式 添加或修改
'===========================================================
Public Property Get FormDataMode() As Boolean
FormDataMode = mblDataMode
End Property
'===========================================================
' 子函數(shù) 設(shè)置窗體記錄集
'===========================================================
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
|
|