平台在同一窗体中实现新增、编辑功能的原理分析-jia
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-模块/函数/VBA


平台在同一窗体中实现新增、编辑功能的原理分析

发表时间:2013/11/27 19:42:38 评论(6) 浏览(15690)  评论 | 加入收藏 | 复制
   
摘 要:平台在同一窗体中实现新增、编辑功能的原理分析
正 文:

平台在生成窗体时,将编辑和新增窗体合二为一。

以下是我对该部分代码的理解,请指正。 

在单击“新增”和“编辑”按钮时,虽然都会打开编辑窗体,但是打开的方式不一样。使用了openform的OpenArgs参数。

弹出编辑窗体时,根据OpenArgs参数判断是新增还是编辑,如果是编辑,则加载需要编辑的记录,如果是新增,则不加载数据。

单击编辑窗体的保存按钮时,也判断是新增还是编辑。如果是新增,则进入addnew模式,如果是编辑,则直接编辑。

这里换了一种判断方法,通过记录集EOF真假来判断是新增还是修改,效果一样。

如果使用OpenArgs参数进行判断,会怎样呢?

if没有OpenArgs参数 then

进入新增模式,加载rst记录集,输入数据,保存

else

进入编辑模式,加载rst记录集,修改数据,保存

那么可以改进成如下模式:

if没有OpenArgs参数 then

进入新增模式

else

进入编辑模式

endif

加载rst记录集,修改数据,保存

尽量缩短if……endif之间的语句长度,增加易读性。

id字段为自动编号,在rst.update时会自动生成一个序号,而不是在rst.add时生成。

Private Sub btnAdd_Click()
    DoCmd.OpenForm Me.Name & "_Edit", DataMode:=acFormAdd
    ' 打开编辑窗体,并进入add模式。
End Sub
----------------------------------------------------------------------
Public Sub btnEdit_Click()
    If Me.sfrList.Form.CurrentRecord < 1 Then
        Exit Sub
    End If
‘如果没有选中记录,则退出,不弹出编辑窗体。
    Me.sfrList.SetFocus
    RunCommand acCmdSelectRecord
    DoCmd.OpenForm FormName:=Me.Name & "_Edit", _
          DataMode:=IIf(Me.btnEdit.Enabled, acFormEdit, acFormReadOnly), _
          OpenArgs:=Me.sfrList![ID]
‘如果“编辑”按钮可用,则代表有权限编辑。
'打开编辑窗体,并进入edit模式。如果权限不允许编辑,则以只读模式打开。
'打开窗体时,将列表子窗体中当前选中数据的id传递给OpenArgs参数。
'参数acFormEdit代表me.allowedits属性为True。
'acFormReadOnly代表me.allowedits属性为False。
End Sub
------------------------------------------------------------------------
Private Sub Form_Load()
    Dim strSQL        As String
    Dim cnn           As Object 'ADODB.Connection
    Dim rst           As Object 'ADODB.Recordset

    ApplyTheme Me
    If IsNull(Me.OpenArgs) Then
        Me.DataEntry = True
    End If
'判断打开窗体时是否发送了OpenArgs参数过来。
‘由Add按钮打开本窗体时,OpenArgs参数为空。
‘由edit按钮打开本窗体时,OpenArgs参数记录了要编辑记录的id。
    If Me.DataEntry Then
        Exit Sub
    End If
    '如果DataEntry属性为真——OpenArgs参数为空——新增模式,则退出程序,不加载数据。
    Me.btnSave.Enabled = Me.AllowEdits
    Set cnn = CurrentProject.Connection
    strSQL = "Select * FROM [部门信息表] Where [ID]=" & Nz(Me.OpenArgs, 0)
Set rst = OpenADORecordset(strSQL, , cnn)
'OpenADORecordset为自定义函数,简化了adodb的代码。
'中间省略了LockType参数,默认使用 adLockReadOnly,即返回一个只读记录集。
    Me![ID] = rst![ID]
    Me![部门] = rst![部门]
    Me![拼音码] = rst![拼音码]
‘将rst中的记录写入窗体中等待被修改。
rst.Close
    Set rst = Nothing
    Set cnn = Nothing
End Sub
------------------------------------------------------------------------
Private Sub btnSave_Click()
    Dim strWhere      As String
    Dim strSQL        As String
    Dim cnn           As Object 'ADODB.Connection
    Dim rst           As Object 'ADODB.Recordset

    If Not CheckRequired(Me) Then Exit Sub
    If Not CheckTextLength(Me) Then Exit Sub
‘检查窗体中所有控件是否该填的都填写了,长度是否符合要求。
‘如果没有,则退出,不进行下面的保存操作。
    Set cnn = CurrentProject.Connection
‘    : ConnectionString : "Provider=Microsoft.ACE.OLEDB.12.0;
User ID=Admin;Data Source=E:\TK\Main.mdb;Mode=Share Deny None;
Extended Properties="";Jet OLEDB:System database=C:\Users\jia\AppData\Roamin"
strSQL = "Select * FROM [部门信息表] Where [ID]=" & Nz(Me![ID], 0)
‘id是自动编号,不允许手动修改。查找id=me.id的记录。
‘如果是修改,则能查询到一条记录。
‘如果是新增,id为空,查询结果为空。
Set rst = OpenADORecordset(strSQL, adLockOptimistic, cnn)
‘将查询结果存入rst记录集。
‘adLockOptimistic参数,指示逐记录的开放式锁定。提供程序使用开放式锁定
‘即仅在您调用 Update 方法时锁定记录。
If rst.EOF Then
‘eof返回一个值,指示当前记录位置是否位于 Recordset 对象的最后一条记录之后。
‘如果是修改数据,则rst中有一条记录,EOF返回false,则不执行rst.addnew
‘如果是新增数据,则rst中没有记录,EOF返回true,执行rst.addnew,新增一条记录。
        rst.AddNew
    End If
    rst![部门] = Me![部门]
    rst![拼音码] = Me![拼音码]
    rst.Update
'update之后,自动编号的id字段才会生成一个序号。
    Me![ID] = rst![ID]
‘把记录集中的id传递给控件。这句代码意义何在?
    rst.Close

    Form_frm部门信息.RefreshDataList
‘RefreshDataList是平台自定义的函数,刷新窗体数据。
    MsgBoxEx "保存成功!", vbInformation
‘MsgBoxEx是平台自定义的msgbox增强版函数。
    If Me.DataEntry Then
‘DataEntry属性为真,表示新增。
        ClearControlValues Me
‘如果是新增记录,保存完之后清空窗体控件,不退出窗体,等待新增下一条记录。
‘下一次新增记录,又要从头开始执行代码,重新判定。
    Else
        DoCmd.Close acForm, Me.Name, acSaveNo
‘如果是编辑记录,保存完之后退出窗体。
    End If
    Set rst = Nothing
    Set cnn = Nothing
End Sub

Access软件网交流QQ群(群号:198465573)
 
 相关文章
Access非记录集方式新增数据到子窗体\Access主窗体添加数...  【金宇  2012/2/6】
【Access源码示例】Access调用同一个非绑定数据源窗体实现...  【金宇  2013/1/7】
Access2003数据库快速开发教程(一)  【竹笛  2013/10/30】
Access2007数据库快速开发教程(一)  【竹笛  2013/10/30】
Access2010数据库快速开发教程(一)  【竹笛  2013/10/30】
常见问答
技术分类
相关资源
文章搜索
关于作者

jia

文章分类

文章存档

友情链接