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

Access快速开发平台一日通案例《费用报销管理软件》学习心得

时 间:2018-10-24 08:37:36
作 者:周韶璋   ID:69789  城市:南宁
摘 要:Access快速开发平台一日通案例《费用报销管理软件》学习心得
正 文:

(1) 充分利用关系型数据库的特点:用ID的主键当另一个表的外键,然后通过查询调取另一个表的数据。展示数据多用查询,避免组合框显示,求统一和美观。
(2) 登录的全局变量,相当于ini文件,存放在一个表里:调取的几个常用函数有:
i) GetParameter(“current User UserName”) ,获得登录的用户名
ii) SetParameter
iii) DLookup(“[value]”,”SysLocalParameters”,“[ParameterName]=’startdate’”)
(3) 权限设置:在后台设置完成后,需要记得目录名和权限名,先用HasPermission(“目录名”,” 权限名”):
If HasPermission(“目录名”,” 权限名”) = true then
 (4)  对于限制权限的用户,如何控制数据输出,即自已录入的数据可以看到,但是看不到别人录入的数据:
在Form load事件中, GetParameter(“current User UserName”) ,获得登录的用户名,赋值给StrUser变量【我经常打错成GetParametor】
If HasPermisson(“报销明细”,“查看全部”) = true then 
  strSQL = “select * from qryExpense”
else
  strSQL = “select * from qryExpense where Operator=’ ”  & StrUser & “’”
EndIF
再用me.recordSource = strSQL
5 控件锁定和控制不可用略有不同:前者是locked=true, 后者是enable=false,并变灰。
(6)主窗体(me)中,子窗体(以sfrList例)内控件的取用格式:
me.sfrList.form.控件名
(7)一个页面打开后,通常tab=0的控制自动获得焦点,为消除这种情况,建一个文本框,设tab=0,并调到最小,放在一个小显眼的地方(细节是决定一个软件好坏的标准之一)
(8)在快速开发平台里,可以在启动后的界面窗体,即:SysFrmMain_HomePage 窗体上放置按钮图片,从而方便操作员通过按钮来打开对应的窗体。那么,在单击事件中可以采用如下代码: 
=DoMenuCmd("节点名称") 
‘把下面的函数复制到代码过程中任何一个地方
Function DoMenuCmd(MenuText As String)
    Dim MenuID As String
    RunMenuCommand Nz(DLookup("Command", "SysLocalNavigationMenus", "MenuText=" & SQLText(MenuText))), Nothing
    MenuID = Nz(DLookup("ID", "SysLocalNavigationMenus", "MenuText=" & SQLText(MenuText)))
    With Forms!SysFrmMain
        RunDefaultRDPNavMenu MenuID
        !lblNodePath.Caption = .mclsNavTree.GetNodeFullPath(MenuID, " > ")
        !lblNodePath.Visible = True
        If !sfrChild.Top <> !lblNodePath.Top + !lblNodePath.Height Then
            !sfrChild.Height = !sfrChild.Height - !lblNodePath.Height
            !sfrChild.Top = !lblNodePath.Top + !lblNodePath.Height
        End If
    End With
End Function

(9)提醒功能的制作
把下面的函数复制到代码过程中任何一个地方,注意修改label的名称,表的名称

Public Sub CalRemind()
    Dim x As Long '待审核
    Dim y As Long '待财务确认
    x = DCount("[ID]", "tblExpense", "[Examine]=0")
    y = DCount("[ID]", "tblExpense", "[Accounting]=0")
    If x + y = 0 Then
        Form_SysFrmMain_HomePage!lblRemind.Caption = "( 暂无提醒 )"
    Else
        
        If x > 0 And y = 0 Then
            Form_SysFrmMain_HomePage!lblRemind.Caption = vbNewLine + "待主管审核的明细 (" & x & ") 笔"
        End If
        If x > 0 And y > 0 Then
            Form_SysFrmMain_HomePage!lblRemind.Caption = vbNewLine + "1.待主管审核的明细 (" & x & ") 笔" + vbNewLine + "2.待财务确认的明细 (" & y & ") 笔"
        End If
        If x = 0 And y > 0 Then
            Form_SysFrmMain_HomePage!lblRemind.Caption = vbNewLine + "待财务确认的明细 (" & y & ") 笔"
        End If
        
    End If
End Sub

(10) 关于组合框显示的理解:

这个表之所以有员工编码的字段,是把另一个表的主键当成外键进行联系,如果显示员工姓名,就不合理。
这个员工编码的组合框中,它的数据源来自SELECT tblEmployee.EID, tblEmployee.EName, tblDepartment.DName FROM tblEmployee INNER JOIN tblDepartment ON tblEmployee.DID = tblDepartment.DID;
采用0; 2; 2的方式进行显示,即显示的姓名,部门,但是记录的EID,即绑定的值。

另外,我们还可以对这个值,进行进一步的指定:即采用DLookup()查一个值,然后让它显示
Me.EID = DLookup("[EID]", "tblEmployee", "[Username]='" & strUser & "'"),显示的值,必须是在0; 2; 2的方式进行显示出来的值中之一,否则不显示。

(11)知道了null和””的区别:
""    是已知的长度为0的字符串;
Null 是无效数据,不知道有没有数据。

(12)月平均、本月、年累计
本年第一天:DateSerial(Year(date( )),1,1)
上月末 :DateSerial(Year(Date()),month(date()),0)
本月第一天:DateSerial(Year(Date()),month(Date()),1)
本月末:DateSerial(Year(Date()),Month(Date())+1,0)

(13) SQL代码分行:
StrSQL=”aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbb”
可以分为:
StrSQL=”aaaaaaaaaaaaaaaaaaaaaaaaa “ _ 
& “bbbbbbbbbbbbbbb”
(14) 采用VBA代码执行追加查询,在执行前,要取消系统警告
Docmd.setwarning false
Docmd.runsql “delect * from tblXXX” //在追加之前先清空
Docmd.runsql strsql
(15)在tblcount费用统计表中,字段分别为Item, moneyAve, thismonth, monthyear, 没有设主键,也没有设一个自动递增的ID。
没有设主键,可能是这个是终末表,不需要在别的表中设其为外键。
没有设自动递增的ID,可能会要按其它字段进行排序时,这样的ID顺序也会乱,所以在窗体中,自已加入了不受按字段排序影响的序号。加入序号见下。
(16)加入序号的代码:
先插入一个Label,在数据的控件来源处写上 =GetLineNumber([Form]) //注:表名不用改
(17)关闭按钮的代码
RDPCloseForm me
(18)为什么在员工信息的窗体中,数据源不直接采用tblEmployee,而是采用qryEmployee,是不是考虑到“DID”部门字段中,如果用tblEmployee作数据源,那么显示的DID将是组合框,不美观,而且也容易被更改。
(19)

对于这样的表格,通过设立两个主键,再设一列为SN进行排序。

如果别的表想用这个表,那么两个主键都要查询。


(20)采用Group by进行分组时,要确保入选的字段都具有分组功能,为避免不必要的错误,通都是两列,一列是用来group by ,一列是求和,求差等具有计算功能的列。
(21) Month(Date()),得到的月份,可以直接用来计算,不用转为数字。
(22)查询中,可以对字段进行取值、计算、表达式等等,然后再汇总。
(23)有一个组合框,值为姓名,如果选择某个姓名,就显示某人的数据,如果不选择,就显示所有人的数据,这怎么做?
采用联合查询:如
Select ‘E00’as EID, ‘所有人’as 姓名,’(全公司)’as  部门 from tblExpenseCount
Union select EID,Ename,DName
From qryEmpID


(24)在折线曲和柱状图之前进行切换(需要事先引用控件,见下图)
Private sub frame3_AfterUpdate()
Select case Frame3 
Case 1
Me.graphmoth.object.charttype= x1LineMarkers
Case 2
Me.graphmonth.object.chartType=x1ColumnClustered
End select


用代码选择图表Chart样式见:
http://www.accessoft.com/article-show.asp?id=1082


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

常见问答:

技术分类:

相关资源:

专栏作家

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