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

我的变速箱作业三完成后的总结笔记

时 间: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源码网店

常见问答:

技术分类:

相关资源:

专栏作家

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