|
本帖最后由 todaynew 于 2011-5-31 13:49 编辑
域函数很有用处,可以对记录做纵向的分类统计。不过域函数还是不能全部的应付各类纵向的分类处理,比如分类联接字符型数据,再比如分类连乘等等。这种情况下我们可以采用ADO记录集来处理此类问题,而且这种类型的函数你只要会编写一个,就能举一反三的解决若干个同类问题。
前不久,煮茶论道同志问了一个关于分类联接字符串的问题,问题如下:
------------------------------
表中有记录如下:
姓名 科目
张三 语文
张三 数学
“张三”有两条记录,我想转换成 张三 语文 数学 成为一条记录
-------------------------------
对于这个问题,可以写一个自定义函数如下:
Function DDSUM(tbname as string,fldname as string,fldIDname as string,StrID As String) as string
'示例:select 姓名 & " " & DDSUM("课程表","学科","姓名",[姓名]) from 课程表 group by 姓名
Dim rs As New ADODB.Recordset
Dim ssql As String
Dim i As Long
Dim s as string
ssql = "select " & fldname & " from " & tbname & " where Cstr(" & fldIDname & ")='" & strID & "'"
rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
for i=1 to rs.recordcount
DDSUM=DDSUM & rs.Fields(fldname).value & " "
rs.movenext
next
DDSUM=left(DDSUM,len(DDSUM)-1)
rs.close
set rs=nothing
end function
-------------------------------
其后,版友liqianwu同志又问了一个从工序合格率,计算产品合格率的问题,也就是分类连乘的问题。对于这个问题,可以将上面的函数稍作修改,写成如下:
Function Multiply(tbname As String, fldname As String, fldIDname As String, StrID As String) As String
'示例:select 产品,Multiply("生产表","合格率","产品",[产品]) as 产品合格率 from 生产表 group by 产品
Dim rs As New ADODB.Recordset
Dim ssql As String
Dim i As Long
Dim s As String
ssql = "select " & fldname & " from " & tbname & " where Cstr(" & fldIDname & ")='" & StrID & "'"
rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Multiply = 1
For i = 1 To rs.RecordCount
Multiply = Multiply * rs.Fields(fldname).Value
rs.MoveNext
Next
rs.Close
Set rs = Nothing
End Function
-------------------------------
可以看出,两个函数的结构基本一致,只是在循环体中的语句稍做了修改,我们可以把这样一类的函数叫做姊妹函数。在编程过程中,我们经常的会遇到很多类似和相近的问题,解决这些问题的时候,我们不能采取狗熊掰苞米,掰一个丢一个。要善于从以往的经验中获取经验,举一反三得解决问题。只有这样开发的效率才能提高,也才能在不断的积累中,提高自己的能力。
|
|