谢谢二位老师给予的关心和帮助。
本人认为一般的数据处理窗体都是由主窗体(主表)和一个子窗体(明细表)组成的。
我的最终目的是,想在不同的窗体中对于相同的按钮,比如“保存”按钮,想通过一句“CALL 保存()”就解决了。
现在可以通过
CALL 保存(主表名称 As String, 子表名称 As String, ByVal 当前窗体中的主窗体名称 As Form, ByVal 当前窗体中的子窗体名称 As SubForm)
进行处理,而且也避免了在公用子函数中不可直接地使用“ME”的问题。
但是总感到以上四个“参数”的值应该会有个办法能自动得到处理,而不应每次调用都要人工写上以上四个具体参数值,因为指的是“当前窗体”嘛。
请老师再帮我想想办法,就考虑每个窗体都是一主一子的情况吧。再次感谢二位老师。
CALL 保存(“主表名称”, “子表名称”, FORMS!当前窗体中的主窗体名称,当前窗体中的子窗体名称)'上面复制错了。
太倔了,呵呵。
这样吧,给你写一个主子两级多个子窗体的刷新函数。
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
有时候不太希望刷新主窗体,因为刷新主窗体的话,主窗体记录会跳回到首记录,那么这个函数可以改造为:
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
多数情况下虽不想刷新主窗体,但希望刷新主窗体中的列表框和组合框控件,则该函数可以进一步改写为:
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
当然还可以进一步加入孙窗体的刷新功能,在此不再赘述。
简言之,函数也好,子程序也罢,总是需要根据需要来编写的,随心所欲好了。
呵呵
唉,真不好意思,我还是搞不清楚啊。
比如每个数据录入窗体一般都有“保存”、“取消”、“删除”、“修改”、“退出”按钮,甚至还有“撤销”功能。
我想高手们一定是用调用公用过程函数的方法,来避免必须对每个窗体中的相同命令按钮都要写上相同的很多句代码。
并且一定要用到四个参数:前台临时主表名称,后台历史主表名称,窗体名称(主窗体),子窗体名称。如调用保存:
CALL 保存(“主表名称(即主窗体记录源)”, “子表名称(子窗体记录源)”, FORMS!当前窗体中的主窗体名称,当前窗体中的子窗体名称)
我的问题是:该四个参数值均指的是当前窗体而言,ACCESS完全可能自动默认并处理其窗体中的有关信息,所以想省略不写参数,而是简单的:CALL 保存(),省略写参数。万分感谢老师们的耐心教导。
更正:并且一定要用到四个参数:前台临时主表名称,前台临时明细表名称,窗体名称(主窗体),子窗体名称。
不必一定调用所谓的四个参数吧?比如退出者,仅用docmd.close即可;删除、修改、保存者如做自定义函数需表名、条件为足矣;取消者如自定函数或窗体名或控件名即可。姹紫嫣红各不相同,似不可一言以蔽之。
可用如下代码获得主子窗体的名称及数据源
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
利用上述四个值就可以设计你的函数了
1、Screen.ActiveForm.Name '当前主窗体名称
2、Me.RecordSource '当前主窗体数据源
3、Screen.ActiveForm.Controls(i).Name '当前子窗体名称
4、Screen.ActiveForm.Controls(i).Form.RecordSource '当前子窗体数据源
以上四项是自动获得的。
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 '当前子窗体数据源
以上四项是自动获得的。
谢谢王老师和煮江品茶版主:
下面是我在老师的指导下更改后的一个“不保存”函数过程,没有用参数,确实行得通呀。
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
我的问题应该得到圆满解决了。等待老师批阅确认。谢谢。