Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 程序人生

我的报销管理学习总结笔记

时 间:2012-07-28 09:16:40
作 者:七夜   ID:16896  城市:厦门
摘 要:我的报销管理学习总结笔记
正 文:

制作流程:

1、  建立数据库资料存放数据库的数据表;

2、  连接后台数据库的相关表到前台客户端界面表中;

3、  设置相关的后台数据库链接路径;

4、  设置前台数据库的代码相关引用的顺序和完整性;

5、  设置导航按钮界面;

6、  创建frmyg_child窗体,用于显示员工信息的基础数据,首先要设置好此窗体的记录源:Select tblCodeyg.* FROM tblCodeyg;  修改该窗体的属性的记录集类型为快照,方便后面的权限操作;默认视图要修改为:数据表;相关字段列表直接拖到主窗体区域;

7、  考虑到此窗体内的数据需要设置修改功能,直接在员工序号的文本框的获得焦点事件中输入以下代码:

On Error GoTo Err_ygId_GotFocus:
selectstr = Me.
ygId
Forms!usysfrmMain!labFind.Tag = 1
Forms!usysfrmMain!btnEdit.Tag = 999
Exit_ygId_GotFocus:
Exit Sub
Err_ygId_GotFocus:
Resume Exit_ygId_GotFocus

并在模块中定义selectstr变量为文本型。

  '文本型变量
Public selectstr As String

frmyg_child属性的成为当前事件文本框中输入

=selectrecord()

 

同时因为本窗体后面需要添加修改子窗体,所以我们有必要将能在本窗体设计时候的所有后续功能直接一次性添加完成。下面再添加一个修改后返回修改纪录的原始定位功能代码,先在模块中定义一个文本型变量;

    '文本型变量
Public g_CurrentSelectStrID As String

实现上述功能需要在窗体计时器触发事件中输入如下代码:

Acchelp_FindstrRecord (g_CurrentSelectStrID)
    '
计时器执行一次后不再执行

Me.TimerInterval = 0

 

8、  建立frmyg_child的删除记录的功能,直接在窗体建立时候完成,在窗体代码模块中输入以下代码:

Public Sub btnDel()
If MsgBox("
您确认要删除吗
?", vbYesNo + vbInformation, Forms!usysfrmLogin.Caption) = vbYes Then
DoCmd.Echo False
Call AccHelp_DeleteFldstrRow ("tblCodeyg", "ygId", selectstr)
Forms!usysfrmMain!frmChild.SourceObject = "frmyg_child"
DoCmd.Echo True
End If
End Sub

 

9、  创建frmyg_child_add窗体,用于新增员工资料;创建一个文本框命名为ygxm,用于新增员工姓名的装载;调整页眉页脚,页眉区域从平台文件ActiveX一区里复制几个控件,调整整个窗体的各项属性。

10、          设置员工姓名新增窗体的代码

Private Sub ToolbarFrm_ButtonClick(ByVal Button As Object)

Select Case Button
Case "
保存
"
cmd_Save
Case "
关闭
"
DoCmd.Close
End Select
End Sub

Private Sub cmd_Save()
Dim rst As DAO.Recordset

If IsNull(Me.ygxm) Then
MsgBox "
请输入员工姓名!", vbCritical, "提示:
"
Me.ygxm.SetFocus
Exit Sub
End If

Me.Refresh
If Acchelp_StrDataIsExist("tblCodeyg", "ygxm", Me.ygxm) = True Then
MsgBox "
你输入的数据已经存在,请重新输入", vbCritical, "警告
"
Me.ygxm.SetFocus
Exit Sub
End If

If MsgBox("您确认要保存吗?", vbOKCancel + vbInformation, "提示") = vbOK Then
Set rst = CurrentDb.OpenRecordset("tblCodeyg", dbOpenDynaset)
rst.AddNew
rst("ygId") = acchelp_autoid("Y",2, "tblCodeyg", "ygId")
rst("ygxm") = Me.
ygxm
rst.Update
rst.Close
Set rst = Nothing
'
刷新数据
If IsLoaded("usysfrmMain") Then
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmyg_child"
DoCmd.Echo True
End If
MsgBox "
保存成功!", vbInformation, "提示"
Me.ygxm = Null

Me.ygxm.SetFocus    此是作者自行添加的语句,目的是为了保存后员工姓名文本框自动获得焦点,提高输入速度。
End If
End Sub

11、           制作员工姓名修改界面:

制作员工姓名文本框,修改其名称未ygxm,调整窗体页眉页脚,并吧ActiveX_02中的控件复制到页眉区域;调整整个窗体的属性,由于在建立frmyg_child窗体时候就对ygxm文本框的获得焦点事件的代码进行了书写以及frmyg_child窗体的成为当前属性中进行了设置,所以在该修改界面时候省略了以上步骤。直接设置frmyg_child_edit窗体加载事件:

 Me.RecordSource = "Select * FROM tblCodeyg Where ygId = '" & selectstr & "'"

以下语句是为了实现使光标回到修改前的记录功能所必须的一个赋值语句

g_CurrentSelectStrID = selectstr

 

同时,我们需要对员工姓名修改窗体的ygxm文本框的控件来源属性进行设置为:

Ygxm

现在对整个窗体的操作代码进行书写:

Private Sub ToolbarFrm_ButtonClick(ByVal Button As Object)
If IsNull(Me.ygxm) Then
MsgBox "
请输入员工姓名!", vbCritical, "提示:
"
Me.ygxm.SetFocus
Exit Sub
End If

Me.Refresh
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmyg_child"
DoCmd.Echo True
    '
触发子窗体计时器事件

Forms!usysfrmMain!frmChild.Form.TimerInterval = 300
DoCmd.Close acForm, "frmyg_child_Edit"
End Sub

 

12、              调整相关权限,便于在设计中实时检查设计程序是否符合我们的预期目标;包括新增、删除、修改等;

按同样的步骤,制作报销类别的相关基础窗体和新增修改窗体。(过程此处省略)

 

现在来设计报销明细窗体的相关基础窗体、新增、修改等窗体,以及相关功能:

1、  由于我们现在所需要建立的窗体是基于几个不同的表的数据,所以我们要先建立查询;

2、  建立查询:qryBxmx  获取各个相应字段,并为其添加中文名称,注意中文名称后方冒号要用英文格式。保存为qryBxmx

3、 建立报销明细的基础窗体:

4、  建立窗体的记录源Select qryBxmx.* FROM qryBxmx,将所有字段拖到窗体中;保存该窗体,名称为frmBxmx_child  ,将该窗体的默认视图改为记录表,记录集类型改为快照;  

5、  添加该窗体的对应打开按钮和管理员权限;

6、  为了方便在后面使用修改功能,需要在报销明细文本框属性的获得焦点事件中输入以下代码:

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

7、  在报销明细基础窗体的成为当前属性中输入以下内容=selectrecord()

8、  设置报销明细的基础窗体的计时器事件,方便修改后光标返回修改前的记录集;计时器的代码为:

Acchelp_FindstrRecord (g_CurrentSelectStrID)
'
计时器执行一次后不再执行

Me.TimerInterval = 0

9、  设置报销明细基础窗体的删除光标所在行的代码:

Public Sub btnDel()
If MsgBox("
您确认要删除吗
?", vbYesNo + vbInformation, Forms!usysfrmLogin.Caption) = vbYes Then
DoCmd.Echo False
Call AccHelp_DeleteFldstrRow("tblBxmx","mxId",selectstr)
Forms!usysfrmMain!frmChild.SourceObject = "frmBxmx_child"
DoCmd.Echo True
End If
End Sub

10、          建立以查询作为数据源的窗体的 目的就在于实现相关数据的查询,所以我们可以在建立报销明细基础窗体的就直接先把查询所需代码编辑进去。查询功能实现的相关代码如下:【以下代码有些生涩难懂】

Public Sub btnFind()
DoCmd.OpenForm "usysfrmFind"
    '
文本型对应 3 ,日期型对应 1 ,数值型对于
2
Forms!usysfrmFind!cobfldName.RowSource = "
报销日期;1;类别名称;3;员工姓名;3;报销金额;2;报销摘要;3;
"
    '
指定查询数据来源

Forms!usysfrmFind!labDataSource.Caption = "qryBxmx"
End Sub

Public Sub FindEnd()
Forms!usysfrmMain!frmChild.Form.RecordSource = Acchelp_ChildFormRecordSource("qryBxmx", "
报销编号", True)

    '记录下来报表的数据来源
strRptReSource = Forms!usysfrmMain!frmChild.Form.RecordSource

End Sub

由于我们以查询为目的建立起来的基础窗体,将有可能通过使用报表来将查询所获得的信息反映出来,所以这里可一步到位的将将来所需要用到的动态报表所需代码制作进去。如果有需要制作报表的话。在以上代码中以红色字体来体现建立动态报表的功能。  由于记录以查询后结果为数据源使用到了一个全局变量strRptReSource  所以要在模块代码中对此变量进行定义,定义语句如下

    '在模块中声明报表数据源的全局变量
Public strRptReSource As String

 

11、              建立报销明细的新增窗体:由于报销明细有六个字段,其中有五个字段是需要用户输入,一个字段是自动增加,所以添加5个文本框,并调整大小及布局;修改标签和名称;需要注意的是报销类别和员工姓名的命名为lbidygid,而不是bxlbygxm,因为该查询对应的记录是lbidygid而不是bxlbygxm;设置此弹出窗体的各项属性,美化窗体的各个控件。

12、              由于我们在新增报销明细时候可能会遇到需要给新的员工增加相关记录或者产生了一些新的费用类别,所以,在这里可直接制作【快捷添加】的功能模块。(此功能不是必须的,可选择制作也可以不制作)步骤如下:

13、              ActiveX二区的控件复制到报销类别和员工姓名文本框后面,用于实现该功能,    进入刚添加的报销类别后面的按钮的属性对话框,,将其名称命名为 cmdBX (属性-其他选项卡-名称),员工姓名后面的一个命名为 cmdYG 。之后进入该窗体的代码编辑界面,新起一行,输入这样的代码:

Private Sub cmdBX_ButtonClick(ByVal Button As Object)
DoCmd.OpenForm "frm_CodeBxlb_child_Add"
End Sub

Private Sub cmdYG_ButtonClick(ByVal Button As Object)
DoCmd.OpenForm "frmyg_child_Add"
End Sub

14、              然后是需要对原报销类别和员工姓名的基础窗体的新增窗体的代码进行适当的修改,在以下代码处进行修改:用色代码为实现本功能的新增代码:以实现CmdBX为例,CmdYG同理;

If IsLoaded("usysfrmMain") Then

 

If IsLoaded("frmBxmx_child_Add") = True Then
Forms!
frmBxmx_child_Add!lbId.Requery   
‘通过一个跳转语句,跳到后面直接执行弹出提示“保存成功”的窗体,从而跳过对报销类别新增窗体的加载,达到继续停留在原来的报销明细基础窗体的 目的;

GoTo
100
End If

DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frm_CodeBxlb_child"
DoCmd.Echo True
End If
MsgBox "
保存成功!", vbInformation, "提示"

100: MsgBox " 保存成功 !", vbInformation, " 提示 "  ‘通过100这个语句直接跳转出来
Me.lbmc = Null
End If
End Sub

 

 

 

15、            为了实现提高输入速度的目的,我们有必要对输入的各个控件设置一个自动跳转的功能,以及自动展开组合框列表的功能,组合框类表自动展开是通过对组合框的获得焦点事件设置Me.lbId.Dropdown 代码来实现;而自动跳转是通过对上一个空间的更新后事件设置 Me.ygId.SetFocus 来实现,即在更新后事件中直接设置某个控件获得焦点。而且这两个功能可以同时使用,以达到提升输入速度的目的;

16、              输入报销明细的新增代码

Private Sub ToolbarFrm_ButtonClick(ByVal Button As Object)

Select Case Button
Case "
保存
"
cmd_Save
Case "
关闭
"
DoCmd.Close
End Select
End Sub

Private Sub cmd_Save()
Dim rst As DAO.Recordset

If IsNull(Me.bxrq) Then
MsgBox "
请输入报销日期!", vbCritical, "提示:
"
Me.bxrq.SetFocus
Exit Sub
End If

If IsNull(Me.lbId) Then
MsgBox "
请输入报销类别!", vbCritical, "提示:
"
Me.lbId.SetFocus
Exit Sub
End If

If IsNull(Me.ygId) Then
MsgBox "
请输入员工姓名!", vbCritical, "提示:
"
Me.ygId.SetFocus
Exit Sub
End If

If IsNull(Me.bxje) Then
MsgBox "
请输入报销金额!", vbCritical, "提示:
"
Me.bxje.SetFocus
Exit Sub
End If

Me.Refresh
If MsgBox("
您确认要保存吗?", vbOKCancel + vbInformation, "提示
") = vbOK Then
Set rst = CurrentDb.OpenRecordset("tblBxmx", dbOpenDynaset)
rst.AddNew
rst("mxId") = acchelp_autoid("M",10, "tblBxmx", "mxId")
rst("bxrq") = Me.
bxrq
rst("lbId") = Me.
lbId
rst("ygId") = Me.
ygId
rst("bxje") = Me.
bxje
rst("bxzy") = Me.
bxzy
rst.Update
rst.Close
Set rst = Nothing
'
刷新数据
If IsLoaded("usysfrmMain") Then
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmBxmx_child"
DoCmd.Echo True
End If
MsgBox "
保存成功!", vbInformation, "提示"
Me.bxrq = Null
Me.lbId = Null
Me.ygId = Null
Me.bxje = Null
Me.bxzy = Null
End If

在保存之后将焦点定位到下一个新增记录的报销日期文本框控件上,提高输入效率

Me.bxrq.SetFocus
End Sub

设置报销类别和员工姓名的级联菜单,格式未组合框,报销类别文本框的行来源属性Select tblCodeBxlb.* FROM tblCodeBxlb; 依次修改文本框属性的以下属性:    

数据选项卡

绑定列: 1

    格式选项卡

列数: 2

列宽: 0cm ; 2cm

列表行数: 20

列表宽度: 2cm

另外,为了实现新增数据时候日期型数据避免减少输错的情况,可对日期型控件进行相关设置。设置要注意的要点是,日期型数据控件的初始值赋值一般可在新增窗体的加载事件中完成,添加如下代码:

Me.bxrq.Value = Date

而新增窗体的记录集承接来自日期控件的数据时候,赋值语句要做相应的更改,即由原来的rst("bxrq") = Me.bxrq   需要修改为:rst("bxrq") = Me.bxrq.value   ;并且由于每次新增窗体给记录集增加一条完整的新记录集后我们需要对日期型控件重新上当天的值,而不是将其清空,所以原来的清空代码Me.bxrq = Null需要修改为:  me.bxrq.value = Date ;

制作修改窗体,建立空白窗体,建立5个文本框,并分别给文本框输入标题以及给标签属性取名,bxrqlbidygidbxjebxzy;修改文本框的控件来源属性与其控件的属性名称是一样的;添加弹出窗口的菜单栏控件,设置相关控件的级联菜单。设置整个窗体的各项属性;设置加载窗体属性代码:

Me.RecordSource = "Select * FROM tblBxmx Where mxId = '" & selectstr & "'"

同时是的模块变量获得记录集的编号,方便计时器时间触发后返回操作前光标所在位置;

g_CurrentSelectStrID = selectstr

 

‘加载与selectstr相对应的当条记录及的所有字段,通过修改窗体上的已定义好对应名称的各个文本框控件显示出基础窗体光标所在行的相关字段信息。

17、    为修改窗体键入如下代码:

Private Sub ToolbarFrm_ButtonClick(ByVal Button As Object)

If IsNull(Me.bxrq) Then
MsgBox "
请输入报销日期!", vbCritical, "提示:
"
Me.bxrq.SetFocus
Exit Sub
End If

If IsNull(Me.lbId) Then
MsgBox "
请输入报销类别!", vbCritical, "提示:
"
Me.lbId.SetFocus
Exit Sub
End If

If IsNull(Me.ygId) Then
MsgBox "
请输入员工姓名!", vbCritical, "提示:
"
Me.ygId.SetFocus
Exit Sub
End If

If IsNull(Me.bxje) Then
MsgBox "
请输入报销金额!", vbCritical, "提示:
"
Me.bxje.SetFocus
Exit Sub
End If

Me.Refresh
DoCmd.Echo False
Forms!usysfrmMain!frmChild.SourceObject = "frmBxmx_child"
DoCmd.Echo True
'
触发子窗体计时器事件

Forms!usysfrmMain!frmChild.Form.TimerInterval = 300
DoCmd.Close acForm, "frmBxmx_child_Edit"
End Sub

18、    查询功能的设计与应用:由于我们在报销明细基础窗体的设计中就已经将相关代码编辑进去了,故这里无需进行相关的代码设计就可以实现查询功能了;

19、    创建报表

利用向导创建一个以查询qryBxmx为数据来源的静态报表,选定字段为报销类别和报销金额,分组选项选择报销类别,在设计视图中更改报表标签、调整格式,更改报表名称为rptBxmx这样就建立了一个以报销类别未分组依据的静态报表。更改报表属性的  工具栏属性为rptToolBar;打开frmbxlb_child窗体,在代码中增加以下打开本报表的代码:

Public Sub btnPreview()
DoCmd.OpenReport "rptBxmx", acViewPreview
End Sub

由于静态报表本身意义不大,这里我们把报表修改成为一个动态报表。【原理:通过一个全局变量来记录要打开那些数据源,再通过控制报表的打开事件,先判定原frmbxmx_child有无执行了一次查询,有执行按条件查询的话就将查询所获得查询后的数据源信息赋值给全局变量strRptReSource若没有进行按条件查询的话就直接将所有的数据源赋值给该全局变量,由于我们实现给报表定义数据源的代码已经在基础窗体制作时候完成了,所以现在就只需要对该报表的打开事件进行代码的添加】,该动态报表的打开事件代码如下:

‘先判断全局变量strRptReSource是否为空,

If strRptReSource = "" Then

‘为空的话表示基础窗体没有对数据源进行查询,也就是筛选数据源,所以现在如果要打开报表,所获得的数据源应该是整个基础窗体的数据源
Me.RecordSource = Forms!usysfrmMain!frmChild.Form.RecordSource
Else

‘不为空的话就直接将赛选过的数据源复制给该全局的值付给报表作为数据来源
Me.RecordSource = strRptReSource
End If

20、    制作一个以人员为分类依据的动态报表,命名为rptbxmx_yg;其打开事件代码同样要输入以下代码:

If strRptReSource = "" Then
Me.RecordSource = Forms!usysfrmMain!frmChild.Form.RecordSource
Else
Me.RecordSource =
strRptReSource
End If

21、    由于现在有基于两个不同种的分类的报表,所以我们要制作一个打开报表的中转切换面板,找到frmbxmx_child的代码窗口中的如下代码:

Public Sub btnPreview()

DoCmd.OpenReport "rptBxmx", acViewPreview

End Sub

将其修改为以下代码:

Public Sub btnPreview()

‘打开frmBxmx_child_rpt窗体
DoCmd.OpenForm "frmBxmx_child_rpt"
End Sub

在制作frmbxmx_child_rpt窗体的时候,其他选项卡的模式属性,将其从默认值否,这是与其他新增、修改等窗体不同的地方,如果模式选项属性选择是的时候,你会发现当你运行你的功能时候,弹出报表后,报表并没有获得焦点,而原来的主数据窗体却是你的焦点,不符合我们的使用习惯。

当然这个选择窗体我们完全可以不用像教程那样复杂的制作,只用做两个功能按钮就行了,单击按钮一弹出按报销类别汇总的报表,单击按钮二弹出按员工姓名汇总的报表。这属于非常基础的部分,在VBA基础知识里单击事件的讲座里就有了,这里不写了。

最后这一段其实体现的是一个道理,就是我们程序要实现一个功能不是只有一种方法,而是有很多种方法,有的方法简单,有的方法系统,有的方法可能是为以后其他的在做考虑,遇到跟教程有不同想法的地方,可先跟着教程联系,通过后,也可以尝试用自己的构思,看是否也能解决或者实现相应功能。达到举一反三的作用。

至此,报销管理教程学习完毕。期间虽有很多代码有些不是太明白,但能够看懂大概就行了,相信随着学习的深入,这些问题将不在是问题。



Access软件网官方交流QQ群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助