我的变速箱作业三完成后的总结笔记
时 间:2012-08-05 00:44:12
作 者:七夜 ID:16896 城市:厦门
摘 要:我的变速箱作业三完成后的总结笔记
正 文:
今天学习到了作业三,为了加深对带有子窗体的窗体的制作的了解,同时对所学知识点做一个回顾,写了一个今后开发类似功能模块的笔记。供自己开发类似模块使用。
与报销教程相比,含有子窗体的窗体,在建设过程中多了以下功能 ,
1、使用到了复选框的更新后事件功能,以达到确定某些权限的目的,和在行记录中的执行某个二选一的操作。
2、在修改功能中加入了对操作员的判定,以达到维护数据安全的目的,即谁录入谁修改,他人无权修改自己的相关录入的记录。
3、子窗体中的数据,在新增是用的是临时表,在修改是用的是表本身。
4、使用了带有日期的序号自增函数。并了解到了其原理。
新增加的功能并不多,但整个程序的前后协调性何紧密性比之前的报销教程以及变速箱作业一、二的内容都要严谨得多,代码看似复杂,其实就多了以上的这部分功能。
以下是笔记的内容,大家见笑了。
首先是建立表:tblCgdd ;表tblcgmx;表tblcgmx_temp;建立查询qryCgdd;建基础窗体:frmCgdd_child,基础窗体的制作是基于查询qrycgdd来的。看似跟查询对应的新增或修改,其实操作的都不是查询,而是跟查询差不多的有对应字段的表,这里就是tblcgdd;
一、子窗体建立的时候要做的工作有:
通过窗体制作向导以查询为依据做的窗体,控件的名称一定要改为和标tblcgdd相同的字段名。
基础窗体的相关属性要设置好,默认视图是 数据表; 记录集类型是快照。
建立计时器事件,目的是有修改操作的时候,好返回到修改前的那行记录
Private Sub Form_Timer()
Acchelp_FindstrRecord (g_CurrentSelectStrID)
'计时器执行一次后不再执行
Me.TimerInterval = 0
End Sub
建立以主键为“采购订单号“的获得焦点事件
‘目的:给全局变量selectstr赋值,好让程序明白你选择的是哪条记录,后面多个功能模块需要用到这个
Private Sub 采购订单号_GotFocus()
On Error GoTo Err_采购订单号_GotFocus:
selectstr = Me.采购订单号
Forms!usysfrmMain!labFind.Tag = 1
Forms!usysfrmMain!btnEdit.Tag = 999
Exit_采购订单号_GotFocus:
Exit Sub
Err_采购订单号_GotFocus:
Resume Exit_采购订单号_GotFocus
End Sub
窗体成为当前 事件的属性中输入=selectrecord() ,目的是貌似是为了读取整个记录集
添加删除功能代码: 删除选中的那条记录,并且删除相应的子窗体中的记录,确定记录就是通过变量selectstr 来传递的。这里就体现了之前采购订单号的 成为当前事件的预定义的必要性了。
Public Sub btnDel()
If MsgBox("您确认要删除吗?", vbYesNo + vbInformation, Forms!usysfrmLogin.Caption) = vbYes Then
'防止屏幕闪动
DoCmd.Echo False
'AccHelp_DeleteFldStrRow函数的详细说明请看平台帮助第十二章
Call acchelp_deletefldstrrow("tblcgdd", "xsddID", selectstr)
Call acchelp_deletefldstrrow("tblcgmx", "xsddid", selectstr)
'重新加载子窗体,以刷新数据
Forms!usysfrmMain!frmChild.SourceObject = "frmcgdd_child"
DoCmd.Echo True
End If
End Sub
后面如果需要使用到查询功能,代码也是在这个基础窗体中添加
Public Sub btnFind()
DoCmd.OpenForm "usysfrmFind"
'文本型对应 3 ,日期型对应 1 ,数值型对于 2
Forms!usysfrmFind!cobfldName.RowSource = "供应商名称;3;采购订单日期;1;最早交货日期;1;最迟交货日期;1;联系人1;3;"
'指定查询数据来源
Forms!usysfrmFind!labDataSource.Caption = "qryCgdd"
End Sub
平台按钮“查找“的功能实现代码
‘如果有报表需要输出,这里也一并将报表所需的全局变量strRptReSource赋值
Public Sub FindEnd()
Forms!usysfrmMain!frmChild.Form.RecordSource = Acchelp_ChildFormRecordSource("qryCgdd", "采购订单号", True)
'记录下来报表的数据来源
strRptReSource = Forms!usysfrmMain!frmChild.Form.RecordSource
End Sub
二、新增窗体的制作:
新增窗体不需要记录源,如果想节省开发新增窗体的事件的时候可以以查询qryCgdd为依据来建立窗体,调整好窗体的布局,但要记得删除掉记录源信息,并将各个控件调整其名称属性,以查询为基础建立的窗体默认控件的名称都是查询中的字段名称,这里要记得修改。控件来源要删除,使得其状态是未绑定;需要将文本框更改为列表框的,在这里就进行更改和对其相应的属性进行初始定义,文本框修改为列表框,其值的来源肯定是某个表,而不是某个查询,在这里。增加需要使用到但初始建立又没有的控件,例如复选框控件。添加采购明细的子窗体。在添加子窗体之前呢,先建立采购明细的子窗体,该子窗体是基于tblcgmx_temp表来建立的,记录集为动态级;确定链接子字段和链接主字段为同一个可唯一确定订单记录的cgddid;
通过 复选框 fxcgmx 的更新后事件,来确定子窗体是否可接受新增数据。
Private Sub fxcgmx_AfterUpdate()
'如果有零件明细,则子窗体可新增数据,否则不可新增数据
If Me.fxcgmx = -1 Then
Me.frmChild.Form.AllowAdditions = True
Else
Me.frmChild.Form.AllowAdditions = False
End If
End Sub
新增窗体中直接对应的是一个tblcgmx_temp,所以其中有可能有值钱遗留的未清空的数据,所以我们在新增窗体加载的时候做一个临时表类数据清空操作:
新增窗体加载事件
Private Sub Form_Load()
'主窗体加载事件
'清空零件明细临时表 tblCgmx_temp
DoCmd.SetWarnings False
DoCmd.RunSQL "Delete tblCgmx_temp.* FROM tblCgmx_temp;"
'生成新的编号
AutoMxID
'让子窗体不能新增数据
Me.frmChild.Form.AllowAdditions = False
End Sub
这里有一个比较拗口的语句,因为选中一个供应商后,该供应商默认有两个联系人,而我们的订单表里只接受一个联系人,在这种二选一的界面操作中,
我们可以用,gysid文本框的更新后事件来确定,联系人文本框将获得什么样的默认值,
代码如下:
Private Sub gysid_AfterUpdate()
Me.Lxr1 = Me.gysid.Column(2) '第三列值赋值给lxr1
Me.Lxr1.SetFocus
'展开组合框
End Sub
而再通过设置lxr2复选框,来确定是否需要改变lxr1里的值。
Private Sub fxlxr2_AfterUpdate()
If Me.fxlxr2 = -1 Then '被选中
Me.Lxr1 = Me.gysid.Column(3) '赋值第四列
Me.Lxr1.SetFocus
Else
Me.Lxr1 = Me.gysid.Column(2) '赋值第三列
End If
End Sub
定义一个含有日期的编号新增函数 AutoMxID
Private Sub AutoMxID()
'功能:生成采购明细编号
Dim YM As String
Dim YMold As String
'使mxID文本框有效,写入数据
Me.cgddid.Enabled = True
Me.cgddid.SetFocus
'生成编号前缀,格式为CG200701,即年四位,月两位
YM = "CG" & Year(Date) & Format(Month(Date), "00")
If CheckRecords("tblCgdd") = True Then 'checkRecords函数说明见平台帮助第十二章
'如果表中存在记录,则去取得表最后一条记录的年月
YMold = Left(DLast("[cgddid]", "tblcgdd"), 8) '取tblcgdd表中最后一条记录的cgddid字段的值的前8位
If YM = YMold Then '如果系统月份与最后一条记录月份相同,则增加1
Me.cgddid = acchelp_autoid(YM, 4, "tblcgdd", "cgddid") 'acchelp_autoid函数说明见平台帮助第十二章
Else '如果不相同,则按新月份从1开始编号
Me.cgddid = YM & "0001"
End If
Else
'如果表中不存在记录,则生成第一条编号
Me.cgddid = acchelp_autoid(YM, 4, "tblcgdd", "cgddid")
End If
'让gysid文本框获得焦点
Me.gysid.SetFocus
'使用cgddid文本框无效,以防止操作员误修改数据
Me.cgddid.Enabled = False
End Sub
设置保存按钮和关闭按钮的相关事件代码
‘这里要注意的是,看你使用的是自己定义的按钮还是系统给 的按钮,代码的名称会不一样,功能完全一样。
Private Sub cmdOK_click() '保存按钮事件
cmd_save
End Sub
Private Sub cmdCancel_Click() '关闭按钮事件
Me.Undo
DoCmd.Close acForm, Me.Name
End Sub
定义保存数据函数Save的代码
Private Sub cmd_save()
Dim rst As DAO.Recordset
'如果保存时,别的操作员新增了此编号,则生成新的编号
If Acchelp_StrDataIsExist("tblCgdd", "cgddid", Me.cgddid) = True Then
'生成新的编号
AutoMxID
End If
If IsNull(Me.gysid) Then
MsgBox "请输入供应商名称", vbCritical, "提示"
Me.gysid.SetFocus
Exit Sub
End If
If IsNull(Me.Lxr1) Then
MsgBox "请输入联系人1", vbCritical, "提示"
Me.Lxr1.SetFocus
Exit Sub
End If
If IsNull(Me.cgddrq) Then
MsgBox "请输入采购订单日期", vbCritical, "提示"
Me.cgddrq.SetFocus
Exit Sub
End If
If IsNull(Me.zzrq) Then
MsgBox "请输入最早交货日期", vbCritical, "提示"
Me.zzrq.SetFocus
Exit Sub
End If
If IsNull(Me.zcrq) Then
MsgBox "请输入最晚交货日期", vbCritical, "提示"
Me.zcrq.SetFocus
Exit Sub
End If
If MsgBox("您确认要保存吗?", vbOKCancel + vbInformation, "提示") = vbOK Then
Me.Refresh
Set rst = CurrentDb.OpenRecordset("tblCgdd", dbOpenDynaset)
rst.AddNew
rst("cgddid") = Me.cgddid
rst("gysid") = Me.gysid
rst("Lxr1") = Me.Lxr1
rst("cgddrq") = Me.cgddrq
rst("zzrq") = Me.zzrq
rst("zcrq") = Me.zcrq
'操作员,czyid的字段大小务必为6,请检查
rst("czyid") = Forms!usysfrmLogin!txtUserName
rst.Update
rst.Close
Set rst = Nothing
'如果有零件明细
If Me.fxcgmx = -1 Then
'将tblCgmx_temp表中的数据追加到tblCgmx表中
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert INTO tblCgmx Select tblCgmx_temp.* FROM tblCgmx_temp;"
End If
'刷新数据,通过重新加载子窗体实现
If IsLoaded("usysfrmMain") Then
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmCgdd_child"
DoCmd.Echo True
End If
MsgBox "保存成功!", vbInformation, "提示"
Me.gysid = Null
Me.Lxr1 = Null
Me.zzrq = Null
Me.zcrq = Null
'让gysid获得焦点,不然如果焦点停留在frmChild上,会出错
Me.gysid.SetFocus
'生成新的编号
AutoMxID
If Me.fxcgmx = -1 Then
'清空零件明细临时表 tblCgmx_temp
DoCmd.SetWarnings False
DoCmd.RunSQL "Delete tblCgmx_temp.* FROM tblCgmx_temp;"
End If
Me.fxcgmx = 0
'子窗体不可新增数据
Me.frmChild.Form.AllowAdditions = False
Me.gysid.SetFocus
End If
End Sub
三、修改窗体的制作:
以表tblcgdd为数据来源,建立一个新的窗体,也可以在原来的新增窗体直接复制过来,以减少控件的制作,但无论是以复制还是以向导来建立的窗体,各个控件的命名均以和表的字段名相同的名称命名;且控件来源,也同样和表的字段名一一对应;
需要将文本框改为列表框的控件,在这里就可以先修改并定义属性了;
有需要用到复选框来控制值的内容的这一步也可以进行类似新增窗体的操作了,是通过gysid控件的更新后事件,来确定lxr1的值,同时通过复选框lxr2的更新后事件来确定lxr1的值,
该步的子窗体直接对应的是tblcgmx表操作,不在是对应临时表操作了,这里 要注意;
设置窗体的加载事件:
通过之前的基础窗体采购订单号获得焦点事件的变量,selectstr确定选中的记录,给各个控件初始化,即提取对应的值;
Private Sub Form_Load()
Me.RecordSource = "Select * FROM tblcgdd Where tblcgdd.cgddid='" & selectstr & "'"
Me.frmChild.Form.AllowAdditions = False
g_CurrentSelectStrID = selectstr
End Sub
通过窗体的成为当前事件来对比操作员是否和建立的人是同一人,达到控制是否赋予其修改权限的目的。
Private Sub Form_Current()
'判断修改的用户和建立数据的用户是否是同一个人,为否的话则无法对该窗体进行修改。
If Me.czyid = Forms!usysfrmLogin!txtUserName Then
Me.AllowEdits = True
Else
Me.AllowEdits = False
End If
End Sub
通过复选框fxcgmx的更新后事件
来实现是否打开子窗体,让用户获得修改子窗体数据权限的目的。
Private Sub fxcgmx_AfterUpdate()
'如果有三包零件,则子窗体可新增数据,否则不可新增数据
If Me.fxcgmx = -1 Then
Me.frmChild.Form.AllowAdditions = True
Else
Me.frmChild.Form.AllowAdditions = False
End If
End Sub
确定保存按钮cmd_ok的单击事件,达到保存修改后的数据的目的
Private Sub cmdOK_click() '单击确定按钮事件
'刷新当前窗体内容 任何在窗体中的操作实际上已经直接在表里操作了,刷新是为了使得整个界面看到的是实时的内容而已
Me.Refresh
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmcgdd_child"
DoCmd.Echo True
Forms!usysfrmMain!frmChild.Form.TimerInterval = 300
DoCmd.Close acForm, Me.Name
End Sub
设置取消或者是关闭按钮,达到退出修改窗体的目的
Private Sub cmdCancel_Click() '关闭按钮事件
Me.Undo
DoCmd.Close acForm, Me.Name
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)