教學指導 5:使用 JavaScript 來撰寫事件處理常式
本教學指導提供撰寫一組事件處理常式的指示。教學指導會假定您已經有基於 Classic Models, Inc. 範例資料庫的基本報告設計。在開始報告設計時,唯一的需求就是它包含一份客戶表格,其中有一欄是客戶名稱。在這個教學指導中,您會根據內含字串 "Mini" 的名稱來計算客戶,並且將結果顯示在蹦現視窗中。
在這個教學指導中,您將執行下列作業:
作業 1:開啟報告設計
開啟一個報告設計,該報告設計使用 Classic Car 範例資料庫並顯示一份客戶名稱表格。
- 必要時,請選擇「視窗」->「顯示視圖」->「導覽器」,來開啟「導覽器」。
- 按兩下適當的報告設計。這時會在版面編輯器中開啟檔案(請參閱圖 22-4)。
作業 2:在 Table.onCreate( ) 方法中建立和起始設定計數器
為了計算客戶名稱中包含字串 Mini 的客戶數,您必須先宣告一個廣域計數器,並且將其值設為零。Table.onCreate( ) 方法是最適合執行這個作業的地方,因為 Table.onCreate( ) 是在擷取任何列之前執行。您可以有條件地在 Row.onCreate( ) 方法中增加這個計數器的數量。
- 在「版面」中,將游標置於靠近表格左下角的地方,來選取表格。這時會出現表格圖示(請參閱圖 22-5)。
- 選擇 Script 標籤。這時會出現 Script 標籤(請參閱圖 22-6)。
- 在 onCreate( ) 方法的 Script 視窗中,輸入下列程式碼行:
- 如果要執行報告並驗證程式碼沒有產生任何錯誤,請選擇「預覽」。
- 捲動至報告底端,這是出現 JavaScript 錯誤訊息的地方。如果沒有任何錯誤,就會出現報告(請參閱圖 22-7)。
如果看見錯誤訊息,可能是您輸入了錯誤的陳述式。如果有錯誤,請回到 Script 視窗,選取剛才修改的方法,更正錯誤,然後重新選擇「預覽」。
作業 3:有條件地增加 Row.onCreate( ) 方法中的計數器數量
如果要計算名稱裡有字串 Mini 的客戶數目,就必須檢查每一個客戶的名稱,並且在每次出現時,在計數器中增加一個個數。邏輯上適合執行這個作業的地方是 Row.onCreate( ) 方法,每次從資料來源擷取一列資料時,就會執行它。
- 在「版面」中,選取「列」,然後選擇「Script」。
- 將 Script 視窗頂端的方法清單往下拉,然後選取 onCreate(請參閱圖 22-8)。
- 在 Script 視窗中,輸入下列 JavaScript 程式碼行:
請注意,當您在程式碼後面輸入句點時,會出現一個蹦現視窗,其中包含所有可用的方法和內容,包括 getRowData。這個程式碼行會取得 IRowData 的實例,其中包含一個 getExpressionValue( ) 方法,用以取得列的直欄內容。
- 請在您剛才輸入的程式行下面輸入下面這一行 JavaScript:
這個程式碼行會傳回從資料集中的 CUSTOMERNAME 直欄取得的表格直欄內容。
您可以使用 JavaScript 選用區,在先前的程式行中插入下列每一個元素:
- indexOf( )
Select Native ( JavaScript ) Objects->String Functions->indexOf( )
- !=
Select Operators->Comparison->!=
- +=
Select Operators->Assignment->+=
- 選擇「預覽」來重新執行報告,以驗證所輸入的程式碼沒有產生任何錯誤。
作業 4:利用
ReportDesign.afterFactory( ) 方法來顯示結果
如果要顯示名稱裡有字串 Mini 的客戶計數,可以在處理表格中的所有列之後執行的方法中,插入程式碼。就邏輯而言,適合插入這個程式碼的地方是 ReportDesign.afterFactory( ) 方法。
- 從 Script 視窗的下拉清單中,選取 afterFactory( ) 方法。
- 在 afterFactory( ) 方法中輸入下列程式碼:
- 選取「預覽」來察看結果。如果程式碼中沒有錯誤,就會看見與圖 22-10 中類似的報告。
如果沒有看見「Mini 的計數」視窗,請在「Eclipse」視窗後面尋找它。如果「Mini 的計數」視窗沒有出現,最可能的原因是其中一個程式碼項目的錯誤導致 Scripting 錯誤。
如果您懷疑已發生 Scripting 錯誤,請捲動至報告底端,這是出現所有 Scripting 錯誤訊息的地方。在大部分的情況下,加號 ( + ) 旁邊會有簡要的錯誤訊息。加號表示有更詳細的錯誤訊息,只有在展開簡要錯誤訊息後,才可以看到它。若要展開簡要錯誤訊息,請選擇加號。請向下捲動,來察看更詳細的錯誤訊息。
