Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 5018|回復(fù): 13
打印 上一主題 下一主題

[ADO/DAO] 主子窗體批量保存,發(fā)現(xiàn)的問題,(原來是2010的問題,換為07就好了,謝謝T小寶版主提醒

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2012-4-16 01:50:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 dlack 于 2012-4-21 23:58 編輯

t小寶 版主發(fā)布的[ADO/DAO] 主子窗體批量保存(http://ctxi.cn/thread-72836-1-1.html),非常有用,在使用過程中發(fā)現(xiàn)如下問題:,使用ADO方式的時(shí)候,在子表中的統(tǒng)計(jì)以及好多其他的表功能都沒法使用(在DAO模式下Me.frmsub.Form.rsChildClone可以使用,ADO時(shí)候也沒法使用),使用DAO的時(shí)候一切功能正常,但是如果數(shù)據(jù)多于50行或者項(xiàng)次多于15列左右,在第二次打開的時(shí)候就會(huì)出現(xiàn)假死狀態(tài),F(xiàn)在正在使用這個(gè)做一個(gè)數(shù)據(jù)庫(kù),感覺T小寶版主做的這個(gè)是最適合的,請(qǐng)了解的朋友幫忙改一下,謝謝了。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊(cè)

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
 樓主| 發(fā)表于 2012-4-16 09:37:00 | 只看該作者
誰(shuí)能幫忙看一下,謝謝了!
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

4#
 樓主| 發(fā)表于 2012-4-16 10:04:43 | 只看該作者
采用DAO時(shí),數(shù)據(jù)多一點(diǎn),下面的語(yǔ)句就會(huì)出問題!
Set mDAOTransForm = New DAOTransForm
    mDAOTransForm.InitForm Me, "Select * From 訂單 Where 訂單ID='" & stID & "'", _
        Me.訂單明細(xì)_子窗體, "Select * From 訂單明細(xì) Where 訂單ID='" & stID & "'"
5#
 樓主| 發(fā)表于 2012-4-16 10:54:42 | 只看該作者
實(shí)例改為低版本的了,煩請(qǐng)了解的朋友幫忙看一下,謝謝了

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊(cè)

x
6#
發(fā)表于 2012-4-16 16:56:24 | 只看該作者
看著挺復(fù)雜的,你用些簡(jiǎn)單的不行嗎?
7#
 樓主| 發(fā)表于 2012-4-16 19:06:33 | 只看該作者
風(fēng)中漫步 發(fā)表于 2012-4-16 16:56
看著挺復(fù)雜的,你用些簡(jiǎn)單的不行嗎?

主要是這個(gè)功能挺好的,不用建臨時(shí)表就可以實(shí)現(xiàn)批量保存。能幫忙看看嗎?

點(diǎn)擊這里給我發(fā)消息

8#
發(fā)表于 2012-4-21 13:57:37 | 只看該作者
本帖最后由 t小寶 于 2012-4-21 13:58 編輯
dlack 發(fā)表于 2012-4-16 10:54
實(shí)例改為低版本的了,煩請(qǐng)了解的朋友幫忙看一下,謝謝了


5樓的例子沒發(fā)現(xiàn)問題呀,你把有問題的傳上來
9#
 樓主| 發(fā)表于 2012-4-21 16:31:48 | 只看該作者
本帖最后由 dlack 于 2012-4-21 19:05 編輯
t小寶 發(fā)表于 2012-4-21 13:57
5樓的例子沒發(fā)現(xiàn)問題呀,你把有問題的傳上來



T小寶版主,我嘗試過了很多次,當(dāng)表 請(qǐng)購(gòu)單ID 設(shè)置為主鍵的時(shí)候,數(shù)據(jù)一多,多點(diǎn)幾次修改請(qǐng)購(gòu)單,程序馬上崩潰
。如果請(qǐng)購(gòu)單ID不設(shè)置為主鍵,那么請(qǐng)購(gòu)單ID  s0000中如果有數(shù)據(jù),S0000多點(diǎn)幾次修改,程序會(huì)直接退出。修改s0001,不會(huì)出現(xiàn)這個(gè)問題。如果刪除請(qǐng)購(gòu)單ID S0000,那么S0001在多次點(diǎn)擊修改后也會(huì)直接退出。
   一直不知道是啥原因,請(qǐng)版主幫忙修改一下,謝謝了。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊(cè)

x

點(diǎn)擊這里給我發(fā)消息

10#
發(fā)表于 2012-4-21 16:49:11 | 只看該作者
dlack 發(fā)表于 2012-4-21 16:31
T小寶版主,我嘗試過了很多次,當(dāng)表 請(qǐng)購(gòu)單ID 設(shè)置為主鍵的時(shí)候,數(shù)據(jù)一多,多點(diǎn)幾次修改請(qǐng)購(gòu)單,程序 ...

你把引起出錯(cuò)的操作過程講清楚,讓我按照你說的步驟操作就會(huì)出現(xiàn)你所說的錯(cuò)誤!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 10:28 , Processed in 0.103385 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表