Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

请问:怎样写代码才能在公用函数中默认为当前窗体名及其子窗体名

放弃  发表于:2010-06-30 12:44:49  
复制

原来是这样的:

 

Public Function 刷新(ByVal strFormName As Form,ByVal strSubFormName As SubForm) 

           strFormName.Requery
           strSubFormName.Requery

End Function

 

Call 刷新(Forms!某一主窗体名,某一子窗体名)'能否实现不用参数而默认指当前窗体名称?

请教!

 

Top
王樵民 发表于:2010-06-30 14:21:53

使用如下方法解决你的问题

Public Function 刷新()
  DoCmd.ShowAllRecords
End Function

ShowAllRecords 操作

使用 ShowAllRecords 操作可删除活动、查询结果集窗体中所有已应用过的筛选,并且显示表或结果集中的所有记录,或者窗体基本表或查询中的所有记录。

设置

ShowAllRecords 操作没有任何参数。

说明

用该操作可以确保表、查询结果集或窗体的所有记录(包括被修改的或新的记录)都显示出来。该操作还导致对窗体或子窗体记录的重新查询

另外,对于所有通过 ApplyFilter 操作、“记录”菜单上的“应用筛选/排序”命令或者 OpenForm 操作的“筛选名称”或“Where 条件”参数来应用的筛选,用该操作都可删除它们。

该操作的效果和单击“记录”菜单上的“取消筛选/排序”或单击“窗体”视图“数据表”视图工具栏上的“取消筛选” 是一样的。

若要在 Visual Basic 中运行 ShowAllRecords 操作,可使用 DoCmd 对象的 ShowAllRecords 方法。



煮江品茶 发表于:2010-06-30 16:10:29

这个函数没什么意义。

因为从函数的本意来看是希望通用的刷新窗体及其子窗体,但其带入的只有两个参数,于是乎就不可能刷新多个子窗体以及多级子窗体。这样一来其通用的性质就变了。

由此来看,不如直接在相关子程序中使用Requery进行刷新为妙。



放弃 发表于:2010-06-30 19:20:28

谢谢二位老师给予的关心和帮助。

 

本人认为一般的数据处理窗体都是由主窗体(主表)和一个子窗体(明细表)组成的。

我的最终目的是,想在不同的窗体中对于相同的按钮,比如“保存”按钮,想通过一句“CALL 保存()”就解决了。

 

现在可以通过

        CALL 保存(主表名称 As String, 子表名称 As String, ByVal 当前窗体中的主窗体名称 As Form, ByVal 当前窗体中的子窗体名称 As SubForm)

           进行处理,而且也避免了在公用子函数中不可直接地使用“ME”的问题。

但是总感到以上四个“参数”的值应该会有个办法能自动得到处理,而不应每次调用都要人工写上以上四个具体参数值,因为指的是“当前窗体”嘛。

 

请老师再帮我想想办法,就考虑每个窗体都是一主一子的情况吧。再次感谢二位老师。

 



放弃 发表于:2010-06-30 20:37:12
CALL 保存(“主表名称”, “子表名称”, FORMS!当前窗体中的主窗体名称,当前窗体中的子窗体名称)'上面复制错了。

煮江品茶 发表于:2010-07-01 17:09:46

太倔了,呵呵。

这样吧,给你写一个主子两级多个子窗体的刷新函数。

 

Public Function frmrq(frm As Form)
'功能:主子两级窗体刷新
'示例:call frmrq(me.form)
Dim ctls As Controls
Dim ctl As Control
frm.Requery
Set ctls = frm.Controls
For Each ctl In ctls
    If ctl.ControlType = acSubform Then
        ctl.Form.Requery
    End If
Next ctl
End Function



煮江品茶 发表于:2010-07-01 17:23:59

有时候不太希望刷新主窗体,因为刷新主窗体的话,主窗体记录会跳回到首记录,那么这个函数可以改造为:

 

Function frmrq(frm As Form, B As Boolean)

'功能:刷新主子窗体

'示例:同时刷新主子窗体:call frmrq(me.form,true)

'      只刷新子窗体:call frmrq(me.form,fasle)
Dim ctls As Controls
Dim ctl As ctl
If B = True Then
    frm.Requery
End If
Set ctls = frm.Controls
For Each ctl In ctls
    If ctl.ControlType = acSubform Then
        clt.Form.Requery
    End If
Next ctl
End Function



煮江品茶 发表于:2010-07-01 17:28:00

多数情况下虽不想刷新主窗体,但希望刷新主窗体中的列表框和组合框控件,则该函数可以进一步改写为:

Function frmrq(frm As Form, B As Boolean)

Dim ctls As Controls
Dim ctl As ctl
If B = True Then
    frm.Requery
End If
Set ctls = frm.Controls
For Each ctl In ctls
    If ctl.ControlType = acSubform Then
        clt.Form.Requery
    End If
    If ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
        clt.Requery
    End If
Next ctl
End Function



煮江品茶 发表于:2010-07-01 17:32:00

当然还可以进一步加入孙窗体的刷新功能,在此不再赘述。

简言之,函数也好,子程序也罢,总是需要根据需要来编写的,随心所欲好了。

呵呵



放弃 发表于:2010-07-01 23:10:16

唉,真不好意思,我还是搞不清楚啊。

比如每个数据录入窗体一般都有“保存”、“取消”、“删除”、“修改”、“退出”按钮,甚至还有“撤销”功能。

我想高手们一定是用调用公用过程函数的方法,来避免必须对每个窗体中的相同命令按钮都要写上相同的很多句代码。

并且一定要用到四个参数:前台临时主表名称,后台历史主表名称,窗体名称(主窗体),子窗体名称。如调用保存:

CALL 保存(“主表名称(即主窗体记录源)”, “子表名称(子窗体记录源)”, FORMS!当前窗体中的主窗体名称,当前窗体中的子窗体名称)

我的问题是:该四个参数值均指的是当前窗体而言,ACCESS完全可能自动默认并处理其窗体中的有关信息,所以想省略不写参数,而是简单的:CALL 保存(),省略写参数。万分感谢老师们的耐心教导。



放弃 发表于:2010-07-01 23:13:44
更正:并且一定要用到四个参数:前台临时主表名称,前台临时明细表名称,窗体名称(主窗体),子窗体名称。

煮江品茶 发表于:2010-07-02 07:34:07

不必一定调用所谓的四个参数吧?比如退出者,仅用docmd.close即可;删除、修改、保存者如做自定义函数需表名、条件为足矣;取消者如自定函数或窗体名或控件名即可。姹紫嫣红各不相同,似不可一言以蔽之。

 

 



王樵民 发表于:2010-07-02 09:51:09

可用如下代码获得主子窗体的名称及数据源

Dim i As Integer
MsgBox ("当前主窗体名称:" & Screen.ActiveForm.Name)
MsgBox ("当前主窗体数据源:" & Me.RecordSource)
For i = 0 To Screen.ActiveForm.Controls.Count - 1
 If Screen.ActiveForm.Controls(i).ControlType = acSubform Then
  MsgBox ("当前子窗体名称:" & Screen.ActiveForm.Controls(i).Name)
  MsgBox ("当前子窗体数据源:" & Screen.ActiveForm.Controls(i).Form.RecordSource)
 End If
Next i



王樵民 发表于:2010-07-02 09:56:58

利用上述四个值就可以设计你的函数了

1、Screen.ActiveForm.Name '当前主窗体名称

2、Me.RecordSource '当前主窗体数据源

3、Screen.ActiveForm.Controls(i).Name '当前子窗体名称

4、Screen.ActiveForm.Controls(i).Form.RecordSource '当前子窗体数据源

以上四项是自动获得的。



王樵民 发表于:2010-07-02 16:32:29

Dim i As Integer
MsgBox ("当前主窗体名称:" & Screen.ActiveForm.Name)
MsgBox ("当前主窗体数据源:" & Screen.ActiveForm.RecordSource)
For i = 0 To Screen.ActiveForm.Controls.Count - 1
 If Screen.ActiveForm.Controls(i).ControlType = acSubform Then
  MsgBox ("当前子窗体名称:" & Screen.ActiveForm.Controls(i).Name)
  MsgBox ("当前子窗体数据源:" & Screen.ActiveForm.Controls(i).Form.RecordSource)
 End If
Next i

利用上述四个值就可以设计你的函数了

1、Screen.ActiveForm.Name '当前主窗体名称

2、Screen.ActiveForm.RecordSource '当前主窗体数据源

3、Screen.ActiveForm.Controls(i).Name '当前子窗体名称

4、Screen.ActiveForm.Controls(i).Form.RecordSource '当前子窗体数据源

以上四项是自动获得的。



放弃 发表于:2010-07-02 19:45:46

谢谢王老师和煮江品茶版主:

下面是我在老师的指导下更改后的一个“不保存”函数过程,没有用参数,确实行得通呀。

Public Function 不保存()  ’对编辑的记录不保存

Dim i As Integer
For i = 0 To Screen.ActiveForm.Controls.Count - 1
 If Screen.ActiveForm.Controls(i).ControlType = acSubform Then
   Exit For
 End If
Next i

     ’删除前台库临时记录,并使窗体处于添加记录状态
         Call 删除临时子表(Screen.ActiveForm.Controls(i).Form.RecordSource)
         Call 删除临时主表(Screen.ActiveForm.RecordSource)      
         Call 添加新记录(Screen.ActiveForm.RecordSource)

 

    ’添加状态紧跟刷新功能。   
           Screen.ActiveForm.Requery
           Screen.ActiveForm.Controls(i).Requery
           Screen.ActiveForm.保存.Enabled = False         
End Function

我的问题应该得到圆满解决了。等待老师批阅确认。谢谢。



煮江品茶 发表于:2010-07-03 15:59:18

祝贺!

能解决问题就算成功,呵呵。



放弃 发表于:2010-07-06 12:19:48

万分感谢!



总记录:17篇  页次:1/1 9 1 :