“排排坐,吃果果,你一个来我一个,大家快乐笑呵呵……”拿一段很悦耳的广东童谣来说事,多少有些煮鹤焚琴的意味。然而,这短短的一段儿歌,正说明了一个道理,无以规矩不成方圆。只有“排排坐”了,才能“吃果果”。
对于Access自定义函数的编写,也是这个道理。只是一开始时,你可能不清楚,总以为这是多么高深的事情。——而实际上是把问题复杂化,或者说是“长代码的志气,灭编程的威风”了。
在写自定义函数之前,必须要弄清楚的问题至少有2个:
1、算法。即该通过怎样的过程,才能返回我所想要的结果。
2、参数。确定是否需要参数,需要几个参数,参数该怎么排列。排列好之后,顺序就不能乱了。
这一点,简单点说,就是“排排坐,吃果果”,首先看看有几个小朋友,多少个水果,该怎么分才算合理。最后就是让小朋友坐下来,依次把水果分好。
以之前在EH里回答的一个问题为例吧。楼主的问题很简单,就是想通过公式对不同的形状进行面积计算。于是,他就把所有参数都作为字段列出,然后希望能够把公式整合起来。大致内容如下:
************************************************
类型 长(或上底) 宽(或下底) 高 半径
圆形 0 0 0 4
长方形 4 3 0 0
正方形 7 0 0 0
梯形 3 5 4 0
************************************************
大家知道,这几个形状的算法是不一样的。因此,组合在一起,可以用IIf语句(或者Choose语句)来处理。当然,这里将自定义函数嘛,就用自定义函数的做法来完成了。
1、定义算法。算法自然就是每个图形的面积计算公式了。那么先返回哪个,再返回哪个,这个就看个人喜好了。我这里的算法顺序是:圆形→梯形→长方形→正方形。这个从广义上来说,是流程。从狭义上讲,实际也是算法。
2、确定参数 。参数有几个?可能有人会认为是4个(3个的有木有?),也就是长、宽、高和半径。可别忘了,得先判断形状。因此,这里给出的全是参数。
这两步完成后,接下来就是写代码了。对于刚开始学习代码的朋友,建议先写段伪代码再转换,会更方便些。代码的书写,各有各的习惯,我这里就用Select语句了(你也可以用If)。
为了方便提问者做选择查询,这里就用了Function函数,如果是操作查询(例如更新查询),改成Sub过程就可以了。需要注意的是,在Function函数中,有可选参数和必选参数两种,是否必选需要根据实际而定。像本例就不能有可选参数,否则计算就会出错。
此外,这里用了逻辑值表达式来处理其他参数。例如梯形中的“(半径=0)”,该表达式返回值为真(TRUE),真值在VB里是相当于1,由此可以把面积公式写成统一参数的不同公式了。
以下是参考代码(看起来像伪代码,实际上可以在区域语言为中文的系统上运行)。
Function Area(形状 As String, 长 As Double, 宽 As Double, 高 As Double, 半径 As Double) As Double
Select Case 形状
Case "圆形"
Area = 3.14 * 半径 ^ 2 * (长 = 0) * (宽 = 0) * (高 = 0)
Case "梯形"
Area = (长 + 宽) * 高 / 2 * (半径 = 0)
Case "长方形"
Area = 长 * 宽 * (高 = 0) * (半径 = 0)
Case "正方形"
Area = 长 ^ 2 * (宽 = 0) * (高 = 0) * (半径 = 0)
Case Else
Area = 0
End Select
End Function
这样一来,思路就很清晰了。这里流程不长,因此可以一步到位地把全部代码写完。对于流程较长的,如果条件允许的话,最好画出流程图,然后再逐步完善。必要时,把每个流程做成一个独立的函数,最后再进行调用。