注冊 登錄
Office中國論壇/Access中國論壇 返回首頁

roych的個人空間 http://m.mzhfr.cn/?179386 [收藏] [復制] [分享] [RSS]

日志

“排排坐,吃果果”——淺談自定義函數(shù)的編寫

熱度 3已有 3411 次閱讀2011-10-29 06:24 |個人分類:隨便說說

       “排排坐,吃果果,你一個來我一個,大家快樂笑呵呵……”拿一段很悅耳的廣東童謠來說事,多少有些煮鶴焚琴的意味。然而,這短短的一段兒歌,正說明了一個道理,無以規(guī)矩不成方圓。只有“排排坐”了,才能“吃果果”。
       對于Access自定義函數(shù)的編寫,也是這個道理。只是一開始時,你可能不清楚,總以為這是多么高深的事情!鴮嶋H上是把問題復雜化,或者說是“長代碼的志氣,滅編程的威風”了。
       在寫自定義函數(shù)之前,必須要弄清楚的問題至少有2個:
       1、算法。即該通過怎樣的過程,才能返回我所想要的結果。
       2、參數(shù)。確定是否需要參數(shù),需要幾個參數(shù),參數(shù)該怎么排列。排列好之后,順序就不能亂了。
       這一點,簡單點說,就是“排排坐,吃果果”,首先看看有幾個小朋友,多少個水果,該怎么分才算合理。最后就是讓小朋友坐下來,依次把水果分好。
       以之前在EH里回答的一個問題為例吧。樓主的問題很簡單,就是想通過公式對不同的形狀進行面積計算。于是,他就把所有參數(shù)都作為字段列出,然后希望能夠把公式整合起來。大致內容如下:
************************************************
        類型       長(或上底)       寬(或下底)     高        半徑
        圓形         0                         0                       0           4
       長方形      4                         3                       0           0
       正方形      7                         0                       0           0
       梯形         3                          5                      4           0 
************************************************
       大家知道,這幾個形狀的算法是不一樣的。因此,組合在一起,可以用IIf語句(或者Choose語句)來處理。當然,這里將自定義函數(shù)嘛,就用自定義函數(shù)的做法來完成了。
        1、定義算法。算法自然就是每個圖形的面積計算公式了。那么先返回哪個,再返回哪個,這個就看個人喜好了。我這里的算法順序是:圓形→梯形→長方形→正方形。這個從廣義上來說,是流程。從狹義上講,實際也是算法。
        2、確定參數(shù) 。參數(shù)有幾個?可能有人會認為是4個(3個的有木有?),也就是長、寬、高和半徑?蓜e忘了,得先判斷形狀。因此,這里給出的全是參數(shù)。
       這兩步完成后,接下來就是寫代碼了。對于剛開始學習代碼的朋友,建議先寫段偽代碼再轉換,會更方便些。代碼的書寫,各有各的習慣,我這里就用Select語句了(你也可以用If)。
       為了方便提問者做選擇查詢,這里就用了Function函數(shù),如果是操作查詢(例如更新查詢),改成Sub過程就可以了。需要注意的是,在Function函數(shù)中,有可選參數(shù)和必選參數(shù)兩種,是否必選需要根據(jù)實際而定。像本例就不能有可選參數(shù),否則計算就會出錯。
       此外,這里用了邏輯值表達式來處理其他參數(shù)。例如梯形中的“(半徑=0)”,該表達式返回值為真(TRUE),真值在VB里是相當于1,由此可以把面積公式寫成統(tǒng)一參數(shù)的不同公式了。
        以下是參考代碼(看起來像偽代碼,實際上可以在區(qū)域語言為中文的系統(tǒng)上運行)。
       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
       這樣一來,思路就很清晰了。這里流程不長,因此可以一步到位地把全部代碼寫完。對于流程較長的,如果條件允許的話,最好畫出流程圖,然后再逐步完善。必要時,把每個流程做成一個獨立的函數(shù),最后再進行調用。

發(fā)表評論 評論 (7 個評論)

回復 ycxchen 2011-11-1 09:34
ROYCH的空間很多知識學習,太好了,感謝版主分享!
回復 ycxchen 2011-11-1 09:45
對于像我這樣非計算機專業(yè)畢業(yè)的人所說,自定義函數(shù)編寫有一定的難度,版主能否再寫兩、三個例子供我等學習?
回復 roych 2011-11-1 23:51
這幾天有些小忙……有時間會寫些貼上來滴。順便說一句,我也不是科班出身滴,^O^
回復 ycxchen 2011-11-6 15:25
版主不是科班出身的?不相信,你很專業(yè)呀。
回復 冰火火冰 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, 2025-7-13 08:38 , Processed in 0.076922 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部