“排排坐,吃果果,你一個來我一個,大家快樂笑呵呵……”拿一段很悅耳的廣東童謠來說事,多少有些煮鶴焚琴的意味。然而,這短短的一段兒歌,正說明了一個道理,無以規(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ù),最后再進行調用。