设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1832|回复: 7
打印 上一主题 下一主题

[模块/函数] 怎样列出与某个分类相关的字符

[复制链接]
跳转到指定楼层
1#
发表于 2009-7-26 09:48:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 benhh 于 2009-7-27 06:44 编辑

希望我的题目不是太雷人了
我有一个表,大致如下

项目       资金        金额

项目A     资金1     10000
项目A     资金2     20000
项目A     资金3     30000
项目B     资金1     20000
项目B     资金2     30000

对项目进行统计查询之后,得出以下结果
项目A                 60000
项目B                 50000

当然资金是不能在这个查询内出现的,否则跟原来的表没有区别
我想做出这个结果

项目A    60000   资金1/资金2/资金3
项目B    50000   资金1/资金2

不知道能不能用自定义函数做到,我也可以用交叉查询实现,不过要分几步,有些麻烦,有没有高手懂?或者有没有朋友看过类似的自定义函数,请告诉我,谢谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2009-7-26 12:30:42 | 只看该作者
可以
不过您要传例子
3#
 楼主| 发表于 2009-7-27 06:48:26 | 只看该作者
多谢版主,例子已经上传,内有一个表和两个查询,请帮忙实现这种效果:

项目A    60000   资金1/资金2/资金3
项目B    50000   资金1/资金2

如果是您的自定义函数,请在注释里说明,谢谢!
4#
发表于 2009-7-27 11:30:11 | 只看该作者
自定义函数

Public Function gStr(strGrp As String) As String
    Dim strTemp As String           '?????????
    Dim rs As New ADODB.Recordset   '??ado???
    Dim strSQL As String            '????????????sql??
    strSQL = "select ?? from ?1 where ??='" & strGrp & "'"      '?strSQL????
    With rs
        .Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockReadOnly     '?????
        Do While Not .EOF                   '??
            strTemp = strTemp & .Fields(0) & "/"   '??
            .MoveNext
        Loop
        .Close         '?????
    End With
    If Len(strTemp) <> 0 Then           '???????
        strTemp = Left(strTemp, Len(strTemp) - 1)
    End If
    gStr = strTemp       '????????????
    Set rs = Nothing     '????
End Function


查询A
SELECT 表1.项目, gStr([项目]) AS 新资金
FROM 表1;


查询B
SELECT 项目, Sum(金额) AS 总计
FROM 表1
GROUP BY 项目;

结果
SELECT DISTINCT A.项目, A.新资金, B.总计
FROM A INNER JOIN B ON A.项目 = B.项目;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
5#
发表于 2009-7-27 11:30:46 | 只看该作者
  1. Public Function gStr(strGrp As String) As String
  2.     Dim strTemp As String           '定义一个临时字符串
  3.     Dim rs As New ADODB.Recordset   '定义ado记录集
  4.     Dim strSQL As String            '定义一个字符串变量来保存sql语句
  5.     strSQL = "select 资金 from 表1 where 项目='" & strGrp & "'"      '给strSQL变量赋值
  6.     With rs
  7.         .Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockReadOnly     '打开记录集
  8.         Do While Not .EOF                   '循环
  9.             strTemp = strTemp & .Fields(0) & "/"   '叠加
  10.             .MoveNext
  11.         Loop
  12.         .Close         '关闭记录集
  13.     End With
  14.     If Len(strTemp) <> 0 Then           '去掉最后的“/”
  15.         strTemp = Left(strTemp, Len(strTemp) - 1)
  16.     End If
  17.     gStr = strTemp       '最后将临时变量还回给函数
  18.     Set rs = Nothing     '释放内存
  19. End Function
复制代码
6#
发表于 2009-7-27 12:10:40 | 只看该作者
模块:
Function hBTXT(TX As String, TB As String, FD As String, TJFD As String)
  Dim conn As ADODB.Connection
  Set conn = CurrentProject.Connection
  Dim RecA As ADODB.Recordset
  Set RecA = New ADODB.Recordset
  
  Dim Str
  Str = "select DISTINCT " & FD & " from " & TB & " where " & TJFD & "='" & TX & "'"
  RecA.Open Str, conn, adOpenStatic, adLockReadOnly
  Select Case RecA.RecordCount
  Case 0
    hBTXT = ""
  Case 1
    hBTXT = RecA.Fields(0)
  Case Is > 1
    hBTXT = RecA.Fields(0)
    For i = 2 To RecA.RecordCount
      RecA.MoveNext
      hBTXT = hBTXT & "\" & RecA.Fields(0)
    Next i
  End Select
End Function
查询:
SELECT 表1.项目, Sum(表1.金额) AS 金额之总计, hBTXT([项目],"表1","资金","项目") AS 表达式1
FROM 表1
GROUP BY 表1.项目;
7#
发表于 2009-7-27 13:21:19 | 只看该作者
学习了。
8#
 楼主| 发表于 2009-8-2 06:46:30 | 只看该作者
多谢版主,多谢aslxt同学,我回单位以后也弄出一个函数,不过时间太忙,直到周末才有时间上网和大家分享。

我的函数如下
Public Function CatList(ByVal qryname, refname, catname, productName As String) As String
On Error GoTo err_catlist
Dim temp2 As String
Dim dbs As Database
Dim rs As Recordset
Dim strSql As String

Set dbs = CurrentDb()

strSql = "SELECT [" & qryname & "]." & refname & ", [" & qryname & "]." & catname & " From [" & qryname & "] WHERE [" & qryname & "]." & refname & "= " & Chr(34) & productName & Chr(34) & ";"

Set rs = dbs.OpenRecordset(strSql, dbOpenSnapshot)

rs.MoveFirst
temp2 = rs.Fields(1)
Do While Not rs.EOF
  If InStr(temp2, rs.Fields(1)) = 0 Then
     temp2 = temp2 & " " & rs.Fields(1)
  End If
  rs.MoveNext
Loop
rs.Close
dbs.Close
CatList = temp2

err_catlist:
   Set rs = Nothing
   
End Function

我声明,没有偷看两位同学的作业:)

我上网查看了很多论坛资料和看了一本叫Access案例的书才做出的,没有版主和aslxt同学做的那么快,并且我对recordset 认识不多,不晓得它也可以用在查询中。
几点意见:版主的做法是教科书式的,Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockReadOnly 的用法很经典,不过我发现类似Set rs = dbs.OpenRecordset(strSql, dbOpenSnapshot) 也行得通。Dim conn As ADODB.Connection
  Set conn = CurrentProject.Connection 的声明也很常见,不过似乎Access2003中可以不用。我自己对函数的测试结果,用在基于表的查询中很快,运行两千个记录大概用两秒,然而对基于查询的查询就显示出自定义函数的不足,占用内存极多,如果用慢一点的CPU只能逐行显示。再次多谢两位,我目前刚进入代码阶段,这些对我帮助很大,我会用两位的函数再进行比较,有时间再和大家分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-15 16:05 , Processed in 0.102493 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表