Office中国论坛/Access中国论坛

标题: 调用自定义函数的查询和其窗体 [打印本页]

作者: koutx    时间: 2012-5-20 20:37
标题: 调用自定义函数的查询和其窗体
本帖最后由 koutx 于 2012-5-20 20:38 编辑

调用自定义函数的查询和其窗体体时出现诸多问题,请坛友们帮忙出出主意。问题在样库窗体上有说明
[attach]49235[/attach]


作者: zzf9008    时间: 2012-5-20 20:58
看看,谢谢!先下了

作者: Henry D. Sy    时间: 2012-5-21 09:37
描述不清,先说说目的!
作者: koutx    时间: 2012-5-21 10:16
本帖最后由 koutx 于 2012-5-21 10:21 编辑
Henry D. Sy 发表于 2012-5-21 09:37
描述不清,先说说目的!


[attach]49236[/attach]
补充说明见图示,请版主帮忙看一下。
实在想不到更好的查询方法,只好用了在查询中调用自定义函数,以避免在查询中有几次应交,就重复出现几次相同的实交款。
但却造成在窗体的右键筛选和取消筛选时,绑定查询中的实交数不能稳定显示,并且在打印预览时实交数消失的现象。
作者: koutx    时间: 2012-5-21 11:54
在线等
作者: Henry D. Sy    时间: 2012-5-21 15:21
还是不明白,你的最终意图
如果,表5中同一个id有多次交款怎么办?
作者: koutx    时间: 2012-5-21 16:18
Henry D. Sy 发表于 2012-5-21 15:21
还是不明白,你的最终意图
如果,表5中同一个id有多次交款怎么办?

不会出现多次交款,每续交一次,只是将表5中的实交更新,而不是新记入一笔。
作者: Henry D. Sy    时间: 2012-5-21 16:57
  1. Public kz As Integer

  2. Function etu(ByVal idh As Integer) As Currency
  3.     If idh = kz Then Exit Function
  4.     Dim strSj As String
  5.     Dim rsSj As New ADODB.Recordset
  6.     strSj = "SELECT 实交 FROM 表5 WHERE id = " & idh
  7.     rsSj.Open strSj, CurrentProject.Connection, adOpenStatic, adLockReadOnly
  8.     If rsSj.RecordCount <= 0 Then
  9.         etu = 0
  10.     Else
  11.         etu = rsSj.Fields(0)
  12.         kz = idh
  13.     End If
  14.     rsSj.Close
  15.     Set rsSj = Nothing
  16. End Function
复制代码

作者: roych    时间: 2012-5-21 17:37
本帖最后由 roych 于 2012-5-21 21:37 编辑

太复杂了。其实表字段建立好的话,不必写那么复杂的代码的。详见附件的“查询结果”。增加一个自动编号字段,然后利用最小值(Min)即可处理。——此外,也可以用DMin来完成。
[attach]49238[/attach]
作者: koutx    时间: 2012-5-21 17:43
还是不行啊,版主将下句
03.Function etu(ByVal idh As Integer) As Currency
中的Variant类型改为货币型后,也不能解决我在样库窗体中注明的问题:
1、窗体右键筛选及取消筛选时,实交数字混乱
2,偶尔筛选后即便实交数字不混乱,可一打印预览实交数就没有了。
麻烦版主下载我在一楼的样库试一下,真不知内中的机理到底是什么?
作者: koutx    时间: 2012-5-21 19:57
roych 发表于 2012-5-21 17:37
太复杂了。其实表字段建立好的话,不必写那么复杂的代码的。详见附件的“查询结果”。增加一个自动编号字段 ...

Roych版主能否再深入一些讲,另外,我怎么找不到您说的“查询结果”呢
作者: roych    时间: 2012-5-21 21:08
本帖最后由 roych 于 2012-5-21 21:38 编辑
koutx 发表于 2012-5-21 19:57
Roych版主能否再深入一些讲,另外,我怎么找不到您说的“查询结果”呢


里面不是有个查询的名称叫“查询结果”吗?{:soso_e127:} 奇怪,之前的附件貌似没更新~~现在楼主可以去下载看看了。
作者: koutx    时间: 2012-5-22 09:35
本帖最后由 koutx 于 2012-5-22 09:36 编辑

谢谢两位版主的帮忙,Roych版主给出了一个很好的方法,只是我实际的应用中不象上传样库这么简单,作为表4的对象是一个经过几层查询而得出的查询,中间字段还进行了分组或总计,即便再通过原表改造增加自动编号字段,最终的查询中也不可能再带有自动编号了。而试用在查询时自动生成编号(当然也是通过自定义函数),也行不通。因此万不情愿还是采用生成临时表的方法了。再次感谢。
作者: koutx    时间: 2012-5-22 09:55
但是第一个问题还是弄不清是啥原因,如何解决,还请二版主帮忙诊断一下。
在try查询中调用模块1中的自定义函数etu(),为什么打开try查询时要多一轮循环(将模块中的Msgbox idh取消注释即可发现)?

附上已修改好使用生成表查询的样库,供参考,窗体筛选、取消筛选、及打印预览时的问题都已解决了。
[attach]49242[/attach]
作者: huangbl1984    时间: 2012-5-22 21:26
关注ing
作者: roych    时间: 2012-5-22 22:09
koutx 发表于 2012-5-22 09:55
但是第一个问题还是弄不清是啥原因,如何解决,还请二版主帮忙诊断一下。
在try查询中调用模块1中的自定义 ...

循环并没有增加到。
1、第一个Msgbox属于初始值, idh自然对应每一个ID,分别返回1,1,2,2,3。
2、第二个Msgbox属于执行语句后的值,返回的是1,2。
3、如果这两行代码都运行的话,那么返回值当然是交叉出现的了。于是便有:
1,1(第一个Msgbox),1(第二个Msgbox)
2,2(第二个SQL语句对应的第一个Msgbox),2(第二个SQL语句对应的第二个Msgbox)
3(第二个SQL语句对应的第一个Msgbox),空值(不符合条件,执行Else部分)。
我向来是个啰嗦分子,不知道这次讲清楚了没有。
作者: koutx    时间: 2012-5-23 17:44
只要第一个Msgbox,我运行查询却返回:1,1,2,2,3,1,1,2,2,3
不知为什么?




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3