注册 登录
Office中国论坛/Access中国论坛 返回首页

roych的个人空间 http://www.office-cn.net/?179386 [收藏] [复制] [分享] [RSS]

日志

“排排坐,吃果果”——浅谈自定义函数的编写

热度 3已有 2888 次阅读2011-10-29 06:24 |个人分类:随便说说

       “排排坐,吃果果,你一个来我一个,大家快乐笑呵呵……”拿一段很悦耳的广东童谣来说事,多少有些煮鹤焚琴的意味。然而,这短短的一段儿歌,正说明了一个道理,无以规矩不成方圆。只有“排排坐”了,才能“吃果果”。
       对于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
       这样一来,思路就很清晰了。这里流程不长,因此可以一步到位地把全部代码写完。对于流程较长的,如果条件允许的话,最好画出流程图,然后再逐步完善。必要时,把每个流程做成一个独立的函数,最后再进行调用。

发表评论 评论 (7 个评论)

回复 ycxchen 2011-11-1 09:34
ROYCH的空间很多知识学习,太好了,感谢版主分享!
回复 ycxchen 2011-11-1 09:45
对于像我这样非计算机专业毕业的人所说,自定义函数编写有一定的难度,版主能否再写两、三个例子供我等学习?
回复 roych 2011-11-1 23:51
这几天有些小忙……有时间会写些贴上来滴。顺便说一句,我也不是科班出身滴,^O^
回复 ycxchen 2011-11-6 15:25
版主不是科班出身的?不相信,你很专业呀。
回复 冰火火冰 2011-12-16 13:22
   来看看
回复 WFH6898 2015-11-29 09:33
ycxchen: ROYCH的空间很多知识学习,太好了,感谢版主分享!
感谢分享
回复 WFH6898 2015-11-29 09:34
roych: 这几天有些小忙……有时间会写些贴上来滴。顺便说一句,我也不是科班出身滴,^O^
能到这个水平,非常高级了,佩服得很

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

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

GMT+8, 2024-3-29 07:45 , Processed in 0.076289 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部