平台在同一窗体中实现新增、编辑功能的原理分析
时 间:2013-11-27 19:42:38
作 者:jia ID:8795 城市:深圳
摘 要:平台在同一窗体中实现新增、编辑功能的原理分析
正 文:
平台在生成窗体时,将编辑和新增窗体合二为一。
以下是我对该部分代码的理解,请指正。
在单击“新增”和“编辑”按钮时,虽然都会打开编辑窗体,但是打开的方式不一样。使用了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交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)