Office中国论坛/Access中国论坛

标题: 在窗体中每增加新的记录,在子窗体中如何实现记录序号从1开始自动编号 [打印本页]

作者: ACCESSWANGCHENG    时间: 2005-6-28 19:24
标题: 在窗体中每增加新的记录,在子窗体中如何实现记录序号从1开始自动编号
在窗体中每增加新的记录,在子窗体中如何实现记录序号从1开始自动编号
作者: lc8231    时间: 2005-10-31 07:01
先建一个模块  ContinuedIDOption Compare Database

Option ExplicitPrivate WithEvents DataForm As Form

Private strIDField As String

Private lngIDBegin As Long

Private lngIDStep As LongPublic Sub Init(srcForm As Form, srcField As String, Optional IDBegin As Long = 1, Optional IDStep As Long = 1)

    Set DataForm = srcForm

    DataForm.AfterInsert = "[Event Procedure]"

   

    strIDField = srcField

    lngIDBegin = IDBegin

    lngIDStep = IDStep

End SubPrivate Sub DataForm_AfterInsert()

    Dim daoRs As DAO.Recordset

    Dim daoField As DAO.Field

   

    Dim daoFieldName As Variant

    Dim daoFieldNames As New Collection

    Dim daoFieldValues As New Collection

   

    Dim NewID As Long

    Dim tmpID As Long

   

    DataForm.Recordset.MoveLast

    For Each daoField In DataForm.Recordset.Fields

        daoFieldNames.Add daoField.Name

        daoFieldValues.Add daoField.Value, daoField.Name

    Next daoField

   

    tmpID = lngIDBegin - lngIDStep

   

    Set daoRs = CurrentDb.OpenRecordset("SELECT " & strIDField & " FROM " & DataForm.Recordset(strIDField).SourceTable, dbOpenDynaset, dbReadOnly)

   

    Do Until daoRs.EOF

        If daoRs(strIDField) > tmpID + lngIDStep Then Exit Do

        tmpID = tmpID + lngIDStep

        daoRs.MoveNext

    Loop

   

    daoRs.Close

    Set daoRs = Nothing

   

    NewID = tmpID + lngIDStep

   

    If NewID >= DataForm.Recordset(strIDField) Then

        NewID = DataForm.Recordset(strIDField)

        GoTo Check_Next

    End If

   

    DataForm.Recordset.Delete

   

    DataForm.Recordset.AddNew

    For Each daoFieldName In daoFieldNames

        DataForm.Recordset(daoFieldName) = daoFieldValues(daoFieldName)

    Next daoFieldName

   

    DataForm.Recordset(strIDField) = NewID

    DataForm.Recordset.Update

   

    '设定下个默认值

Check_Next:

    tmpID = lngIDBegin - lngIDStep

   

    Set daoRs = CurrentDb.OpenRecordset("SELECT " & strIDField & " FROM " & DataForm.Recordset(strIDField).SourceTable, dbOpenDynaset, dbReadOnly)

   

    Do Until daoRs.EOF

        If daoRs(strIDField) > tmpID + lngIDStep Then Exit Do

        tmpID = tmpID + lngIDStep

        daoRs.MoveNext

    Loop

   

    daoRs.Close

    Set daoRs = Nothing

   

    If tmpID = NewID Then Exit Sub

   

    DataForm.Recordset.FindFirst strIDField & "=" & tmpID

    For Each daoField In DataForm.Recordset.Fields

        daoFieldValues.Remove daoField.Name

        daoFieldValues.Add daoField.Value, daoField.Name

    Next daoField

    DataForm.Recordset.Delete

   

    DataForm.Recordset.AddNew

    For Each daoFieldName In daoFieldNames

        DataForm.Recordset(daoFieldName) = daoFieldValues(daoFieldName)

    Next daoFieldName

   

    DataForm.Recordset.Update

End Sub窗体代码Option Compare Database

Option ExplicitPublic CID As New ContinuedIDPrivate Sub Form_Load()

    CID.Init Me, "id"

End Sub

试一试,应该没有问题.


作者: ACCESSWANGCHENG    时间: 2005-10-31 18:39
嘿你好!

   谢谢你给我的代码,不过不是很明白,能否做个有子母窗体的例子让我看看.

谢了

wangcheng 2005-12-15


作者: 老中医    时间: 2005-11-23 07:16
我也想知道。
作者: george    时间: 2006-4-12 06:29
以下是引用ACCESSWANGCHENG在2005-10-31 10:39:00的发言:


嘿你好!

   谢谢你给我的代码,不过不是很明白,能否做个有子母窗体的例子让我看看.

谢了

wangcheng 2005-12-15


作者: xlonger    时间: 2006-4-20 00:33
最好能作个ACCESS例子,我试了后,也不行,好像所有的记录编号都是一样的。




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