siebel编程
siebel編程
1.從哪里開始?
流程:
要求:在最需要的地方寫最少的代碼,且只寫一次
(1)能配置的不要通過代碼來開發;
(2)決定代碼放在哪個對象上:
共用代碼寫在BS/應用程序級,建議使用BS,因為BS可以被工作流進程調用,但工作流進程不能調用自定義的應用程序級別的方法。
如果某個方法處理的是特定BC上的數據,那么寫在這個BC上,這樣可以避免在使用該BC的Applet上多次復制類似代碼。
applet Server script的使用:查詢、插入、更新和刪除操作;訪問本條記錄之外其他記錄的數據。
applet browser script的使用:與用戶交互;與桌面應用程序交互;對當前記錄的驗證與處理。
(3)定代碼放在哪個事件上:
對BS而言有兩大類事件,分別是Pre-event類事件和reactive類事件。
Pre-event的使用:只是想執行某些驗證,不會更改除了當前記錄以外的任何記錄的值,如PreQuery, PreSetFieldValue, PreWriteRecord等;
reactive的使用:記錄更改后還想做進一步操作,如writeRecord;
對于applet而言,大部分applet瀏覽器端代碼一般寫在Applet_PreInvokeMethod事件中,在這個事件中開發人員可以捕獲applet觸發的方法,如用于和用戶的桌面、用戶、applet外觀交互的代碼。但不建議將所有方法的代碼都寫在Applet_PreInvokeMethod事件中,而是用來創建自定義方法,并調用這些自定義方法。
(4)添加錯誤處理模版。在撰寫任何代碼前先在合適的地方添加錯誤/異常處理策略,主要是添加錯誤處理模版應用于事件中。
(5)添加方法主體。將方法主體代碼添加在錯誤處理框架中,這樣你就能捕獲任何運行時錯誤。
(6)測試。
2.編碼命名規范:
(2)不同作用域范圍變量的修飾符
作用域 修飾符 全局作用域(僅適用于Siebel VB) G_ 模塊/實例范圍 M_ 或者 i_ 函數或者局部作用域 不需要修飾符或者l_3.一定要為代碼添加必要的注釋
4.將代碼放在合適的事件中:
5.在頻繁觸發的事件處理器中使用快速代碼
6.使用運行時BS還是編譯后的BS
(1)運行時BS:不會編譯到.srf文件中,代碼保存在數據庫中,可以隨時更改它,由于運行時都是使用最新的BS定義,適合于編寫邏輯經常變化的BS代碼或需要在不發布新.srf文件的情況下發布BS。缺陷是任何具有訪問商務服務管理員視圖的人都可以看見代碼,這可能會導致安全性問題。
(2)編譯后的BS:在Siebel Tools中定義的,適用于需要更高安全性和不怎么更改的功能。需要編譯,并且通過一個新的.srf來應用更改。優點是具有更高的安全性,且裝載的速度更快。
7.使用合適的調試技巧
(1)使用alert(不會停止代碼的執行)或RaiseErrorText(會停止代碼的執行)方法來彈出消息框;
(2)使用Trace或者自定義方法將信息寫入文件;
(3)使用Siebel的Debugger功能;
(4)使用對象管理器級別的日志功能(object manager level logging)。
8.從存儲庫中移除沒有用的代碼
(1)移除下面這些代碼:被注釋的代碼;設置為inactive (禁用)的代碼;從不調用的代碼。
(2)移除空方法
9.在所有的代碼中包括錯誤處理
? Try 塊:包括你要執行的邏輯;
? Catch塊:捕獲錯誤;
? Finally塊:執行任何清理工作,比如銷毀對象引用。
10.合適的使用RaiseError 和 RaiseErrorText
MsgBox只能用于Siebel 6.x或更早版本。
RaiseError 和 RaiseErrorText會產生一個服務器端代碼異常,使代碼的執行在此處終止。
所以,任何必須執行的代碼必須放到調用這些方法的前面。
11.使用異常信息:
(1)異常包括兩種信息:
? 錯誤描述。描述哪里錯了。
? 堆棧跟蹤信息。按照執行順序列出的直到產生異常地方的方法名稱。
(2)異常處理的目的:
捕獲異常;
? 使程序更加穩定;
? 記錄異常信息或者通知用戶發生了什么事;
? 可能,重新拋出異常;
? 可能,設置返回代碼。
(3)在eScript中,異常對象通過以下屬性(方法)存儲錯誤信息:
? errText屬性:exception.errText
當系統在運行時碰到一個錯誤,或者開發人員使用RaiseErrorText來引發一個異常時,該屬性就會包含錯誤信息。
? toString()方法:exception. toString()
從COM對象或者開發人員通過throw方法拋出的異常中異常信息。
12.將return語句放到合適的地方
finally塊中的return語句將會覆蓋掉產生的異常信息或者別人拋給它的異常信息,這些異常信息不會傳出方法外面。
當finally塊中的代碼產生異常信息時,這樣的異常信息會傳到方法外面,但是之前的異常信息卻丟掉了。
13.使用Top對象來集中瀏覽器端代碼
在客戶端代碼中,top是到頂層文檔的捷徑。使用top對象,開發人員可以撰寫一個瀏覽器端代碼函數一次,然后從其他的瀏覽器端對象中調用它。
14.在服務器端代碼中何時使用當前上下文,何時使用新的上下文?
當前上下文處理的對象是系統創建用來支持對用戶來說可用的數據;
15.為變量使用最小的作用域
創建實例級別的變量:
? 經常會違反封裝的原則;
?代碼的執行會有交叉;
? 沒有事件保證這些對象會被銷毀;
?理解這類變量的作用域或狀態比較困難,因為他們是在一個方法中初始化的,而在另外的方法也可以訪問。
更好的做法是:當需要的時候聲明和使用對象,然后將他們作為參數傳遞給其他方法。
16.只在需要時初始化對象,創建沒有使用的對象實例會影響系統性能
評估條件—–>創建對象—–>使用對象
17.當對象變量不再使用時要銷毀它
(1)對象引用包括:COM對象,屬性集 (Property Sets),BS,BC,BO,Applet
(2)應按照程序創建應用對象順序的逆序來釋放對象,先釋放子對象,再釋放父對象。
? Pick/Associate/MVG BC 在父BC之前釋放;
? BC在BO之前釋放;
? 屬性集和BS因為他們是相互獨立創建的,所以先釋放哪個都沒有關系。
(3)應該將對象銷毀語句放到錯誤處理語句中的finally塊中,這樣不管方法是執行成功還是執行失敗后退出,對象都會被銷毀的。
18.使用條件塊來運行代碼
function BusComp_PreSetFieldValue(FieldName, FieldValue) {switch(FieldName){case “Status”://do somethingbreak;…}… }19.檢查返回的對象是不是你想要的
(1)ActiveBusObject方法。該方法返回的是活動Applet對應的BC所對應的BO。
當BC是多個BO的子對象時,那一定要檢查返回的BO是不是你想要的。
ActiveBusObject只有在應用程序級代碼或者BS中調用才有意義,而在Applet或者BC中你應該使用:this.BusObject() 。
代碼示例:
(2)ActiveBusComp方法。該方法返回的是與活動Applet相關聯的BC。
如果是在BC之外調用該方法,應該檢查該方法返回的BC是不是你想要的。
(3)ParentBusComp方法。該方法是根據鏈接(link)中的子BC返回父BC。總是要檢查該方法返回的BC是有效的,且是你想要的。
下面兩種情況可能會導致沒有可用的引用:
? BC是父BC且它沒有父BC,比如在Account BO中的Account BC;
? 在BO中建立的父子關系的link已經被移除了或者更改了。
如果ParentBusComp方法沒有返回引用,也不會拋出異常。如果在一個為null的對象上調用方法或者引用屬性將會引發運行錯誤。
20.在使用字段之前檢查字段是活動的
在非活動字段上調用GetFieldValue 或者SetFieldValue方法會導致數據丟失或者邏輯混亂。
只能在ExecuteQuery執行成功后使用ActivateField方法。作為一個獨立語句,ActivateField不會暗中激活一個非活動字段。
ActivateField告訴系統在BC上下次執行的SQL語句時包括這個列。
(1)只要滿足下面條件之一,那么服務器端代碼字段就是活動的:
? 系統(保留)字段,如Id, Created, Created By, Updated, Updated By
? BC的LinkSpec屬性被設置為TRUE ;
? BC的Force Active屬性被設置為TRUE;
? 在活動視圖中包含了一個Applet定義;
? 在活動Applet中該字段被用于計算字段的計算公式中;
? 使用方法BusComp.ActivateField (strFldName) 顯式激活。
(2)滿足下面條件之一,那么瀏覽器端代碼字段就是活動的:
? Id 字段;
? 在用戶界面上該字段可見。
21.Siebel 7 新方法:ctivateMultipleFields, GetMultipleFieldValues 和 SetMultipleFieldValues。
22.為查詢使用合適的視圖模式
with (bcAcct) {SetViewMode(this.GetViewMode()); }23.只查詢索引列
24.使用ForwardOnly游標模式
25.在執行查詢后檢查是否有合法的記錄存在
26.使用Switch(eScript)或者Select Case語句(Siebel VB)
當需要將某個表達式的值和多個可能性進行比較的時候,最快和最具可讀性的方法就是使用switch。
? 因為表達式只被求值一次,然后和不同的值進行比較,所以效率更高;
? 比一大堆嵌套的if…else if 語句更具可讀性,使用switch或者select case語句往往能把多頁代碼壓縮成一頁。
27.在If/Else If語句中比較相同的條件
28.使用Associate方法創建中間表(intersection table)記錄
var lBC_mvg = this.GetMVGBusComp(“Sales Rep”); var lBC_associate = lBC_mvg.GetAssocBusComp(); with(lBC_associate) {ClearToQuery();SetSearchSpec(“Id”, SomeRowId);ExecuteQuery(ForwardOnly);if(FirstRecord()) Associate(NewAfter); }29.使用動態值
最好使用動態值代替將值硬編碼到代碼中。這對于那些經常更改的值來說特別重要,因為如果你硬編碼的話,編碼的任何變化都要重新編譯和發布。
代碼中經常要用到的值都可以通過TheApplication.GetProfileAttr() 函數來獲取。
此外,還可以將值存儲在List Of Values表或其他表中,在需要的時候查詢,用于在代碼中要查詢的只有一個動態值或較短的值列表時。
30.使用邏輯常量還是字面量
最好使用邏輯常量,它使代碼更加易讀且更加容易升級,使用字面量有可能給升級帶來問題。
31.避免使用Exit Function 和 Exit Sub
僅針對Siebel VB,應避免使用Exit Function 和 Exit Sub。
32.將GotoView放到代碼的結尾
GotoView語句不會立即退出代碼的執行并導航到指定的視圖,而是將該語句掛起來直到其他的代碼執行完畢,所以最好將該語句放到代碼的結尾處。
33.合適的使用DeleteRecord
DeleteRecord 會隱式的將記錄指針移到記錄集中的下一行。在DeleteRecord 后調用 NextRecord 將會使記錄指針移動兩次,
也就是說Siebel應用程序會跳過記錄集中的一條記錄,如果你在一個循環中這樣刪除記錄,Siebel應用程序將會隔行刪除記錄。
在循環中刪除記錄的方法(Siebel VB):
總結
- 上一篇: python中的encode_pytho
- 下一篇: Java LeetCode每日一题-从易