SIEBEL代码分析
eScript代碼
- 代碼就是上圖的業務腳本和瀏覽器腳本。
顯示
部分代碼講解
function WebApplet_PreInvokeMethod (MethodName) {//判斷點擊事件傳進來的參數名稱,符合則進入if( MethodName == "CheckOrder" ){//新建一個對象,并且給它設置參數,key——value oIn輸入var oIn=TheApplication().NewPropertySet();oIn.SetProperty("Applet Mode","3");//彈出的AppletoIn.SetProperty("Applet Name","FT Approval Popup Applet - Order");//oOut輸出,新建一個對象var oOut=TheApplication().NewPropertySet();//下面是調用BS的SLM Save List Service的LoadPopupApplet方法var oBS=TheApplication().GetService("SLM Save List Service");oBS.InvokeMethod("LoadPopupApplet",oIn,oOut);//oOut = oBS.InvokeMethod("LoadPopupApplet",oIn);//結束方法,下面的方法都終止掉return (CancelOperation);}//繼續進行下一個方法return (ContinueOperation); } //TheApplication().RaiseErrorText("Hello World"); == alert("Hello World");//通過值列表獲取計劃訂單的顯示值var URGENT_ORDER = TheApplication().InvokeMethod("LookupValue","HAND_ORD_TYPE", "Urgent Order");//獲取當前這個Applet對應的BC對象實例var bcOrder = this.BusComp();//設置Order Type的值bcOrder.SetFieldValue("Order Type", URGENT_ORDER);//釋放bc變量bcOrder = null; function Service_PreInvokeMethod (MethodName, Inputs, Outputs) {//為了保證代碼的健壯性,function開始前應使用try{}catch(e){}finally{}來捕獲并處理異常。try{//每個客戶化BS開頭定義事務,以確保數據的完整性//定義事務控制var psTranIn = TheApplication().NewPropertySet();var psTranOut = TheApplication().NewPropertySet();var bsTran = TheApplication().GetService("EAI Transaction Service");//開始事務bsTran.InvokeMethod("BeginTransaction", psTranIn, psTranOut);if (MethodName == "SubmitOrder"){SubmitOrder(Inputs, Outputs);}//如果邏輯正確結束,提交事務//正常結束,提交事務psTranIn.SetProperty("Abort", "false");bsTran.InvokeMethod("EndTransaction", psTranIn, psTranOut);}catch(e){//如果捕獲到異常,回滾事務//捕獲異常,回滾事務psTranIn.SetProperty("Abort", "true");bsTran.InvokeMethod("EndTransaction", psTranIn, psTranOut);TheApplication().RaiseErrorText(e.message);}finally{//程序結束時,必須釋放所有新創建的對象型變量//釋放對象psTranIn = null;psTranOut = null;bsTran = null;}//所有客戶化的BS都要返回CancelOperatonreturn (CancelOperation); } //Function: SubmitOrder//提交訂單的邏輯//輸入參數:OrderId,需要提交的訂單的Idfunction SubmitOrder(Inputs, Outputs){try{//獲取訂單BO,BCvar boOrder = TheApplication().GetBusObject("HAND Order");var bcOrder = boOrder.GetBusComp("HAND Order");var bcItem = boOrder.GetBusComp("HAND Order Item");//獲取參數//GetProperty()是Property的一個最重要的方法之一,它的作用是獲取Property Set里的某個鍵的值。我們這里是獲取輸入參數OrderId的值。var orderId = Inputs.GetProperty("OrderId");//根據輸入參數OrderId查詢出需要提交的訂單with (bcOrder){//從下面一句開始到ExecuteQuery,是最常用的腳本BC查詢操作步驟//激活字段,查詢前要激活所有你需要獲取或者設置值的字段ActivateField("Order Status");//設置安全性,結合安全性的知識理解。代碼中新開的BC實例一般用AllView安全性,確保能查到數據。但是界面上的實例不可更改安全性SetViewMode(AllView);//清空查詢條件ClearToQuery();//設置查詢條件,這里有兩種設置查詢條件的方法,SetSearchSpec和SetSearchExpr,我們建議使用SetSearchExpr,具體原因后續再分析//SetSearchSpec("Id", orderId);SetSearchExpr("[Id] = '" + orderId + "'");//執行查詢ExecuteQuery(ForwardOnly);//查詢完成后,通過FirstRecord定位到查詢結果的第一條記錄,如果查詢不到任何記錄,則FirstRecord方法會返回falseif (!FirstRecord())throw "找不到訂單Id " + orderId + " !";}//查詢訂單下的訂單行with (bcItem){ActivateField("Item Status");//這里可以不需要對訂單行設置頭Id的查詢條件,因為在獲取BC時,訂單行被BO里的Link限制為訂單頭的子,該條件會自動附加ClearToQuery();ExecuteQuery(ForwardOnly);var bLineFound = FirstRecord();//驗證如果不存在至少一條訂單行,報錯if (!bLineFound)throw "請先錄入訂單行再提交!";//以下是最典型的通過while循環查詢出的記錄做操作的例子//循環所有訂單行,更新訂單行狀態為待發運var TO_BE_SHIPPED = TheApplication().InvokeMethod("LookupValue","HAND_ORD_ITEM_STATUS", "To Be Shipped");while (bLineFound){//SetFieldVaue是設置BC Field的值的方法SetFieldValue("Item Status", TO_BE_SHIPPED);//WriteRecord是保存記錄的方法WriteRecord();//NextRecord是把記錄定位到查詢結果的下一條記錄,如果已經是最后一條(即不存在下一條),返回false,跳出while循環bLineFound = NextRecord();}}//更新為訂單行后,更新訂單頭狀態with (bcOrder){var PENDING = TheApplication().InvokeMethod("LookupValue", "HAND_ORD_STATUS", "Pending");SetFieldValue("Order Status", PENDING);WriteRecord();}}catch(e){//捕獲異常,報錯throw e;}finally{//釋放對象變量bcItem = null;bcOrder = null;boOrder = null;}}人機交互(按鈕調用代碼)
function WebApplet_PreInvokeMethod (MethodName) {//提交訂單if (MethodName == "SubmitOrder"){try{//獲取Applet對應的BC實例var bcOrder = this.BusComp();//調用前先做一次界面的保存bcOrder.WriteRecord();//創建BS的輸入參數和輸出參數的Property Setvar psIn = TheApplication().NewPropertySet();var psOut = TheApplication().NewPropertySet();//設置輸入參數OrderId的值為當前光標選中的訂單頭IdpsIn.SetProperty("OrderId", bcOrder.GetFieldValue("Id"));//獲取BSvar bsOrdSvc = TheApplication().GetService("HAND Order Service");//調用BS的方法SubmitOrderbsOrdSvc.InvokeMethod("SubmitOrder", psIn, psOut);//注意,SNTO Order BC的Class必須是CSSBCBase或者其子類,否則不支持RefreshRecord方法//此處為什么要對記錄做刷新呢?因為BS里更新數據時基于一個全新的實例去更新的,//并不影響當前界面的實例。為了使當前界面的實例能反饋給用戶處理結果(訂單狀態字段改為“已提交”)//因此需要刷新當前界面的實例bcOrder.InvokeMethod("RefreshRecord");//客戶化方法,返回CancelOperationreturn (CancelOperation);}catch(e){TheApplication().RaiseErrorText(e.message);}finally{//釋放對象psIn = null;psOut = null;bsOrdSvc = null;bcOrder = null;}}//Hello World方法else if (MethodName == "HelloWorld"){TheApplication().RaiseErrorText("Hello World");return (CancelOperation);}return (ContinueOperation); }配置調用代碼
Applet和BC上都有一個User Property叫Named Method。通過這個User Property,我們可以輕松地通過配置實現BS的調用。
例1
//Applet進入的方法 function WebApplet_PreInvokeMethod (MethodName) {//點擊確定,判斷傳參方法名是不是確定按鈕if( MethodName == "RandomAssign" ){//獲取BO(業務對象)下名稱為FT Lead的BC(業務組件)var oBC = TheApplication().ActiveBusObject().GetBusComp("FT Lead");//獲取名稱和Idvar agent = this.BusComp().GetFieldValue("Name");var agentId = this.BusComp().GetFieldValue("Id");//獲取值列表上的值(值列表類型為FT_LEAD_STATUS,獨立語言代碼是Assignment)var sState = TheApplication().InvokeMethod("LookupValue","FT_LEAD_STATUS","Assignment");var sNew = TheApplication().InvokeMethod("LookupValue","FT_LEAD_STATUS","New");with (oBC){//獲取第一條記錄var iRecord = FirstSelected();while (iRecord){SetFieldValue("FT Resp Agent Id",agentId);SetFieldValue("FT Resp Agent Name",agent);//這時候判斷這個記錄是不是新建的,是新建的就改成已分派Assignmentif(GetFieldValue("Status")==sNew ){SetFieldValue("Status",sState);}//寫入WriteRecord();//下一條記錄iRecord = NextSelected();}}//關閉當前頁面(關閉彈出來的小窗口)this.InvokeMethod("CloseApplet",TheApplication().NewPropertySet(),TheApplication().NewPropertySet());return (CancelOperation);}return (ContinueOperation); } //獲取時間,年月日 function getDate() {var tmStrFmt = "",tm = Clib.localtime(Clib.time());Clib.strftime(tmStrFmt, "%Y%m%d",tm);return tmStrFmt; } //獲取當前的時間,轉換格式 var nowDate=new Date(); var nowDateStr=Clib.rsprintf("%04d-%02d-%02d %02d:%02d:%02d",nowDate.getFullYear(),nowDate.getMonth()+1,nowDate.getDate(),nowDate.getHours(),nowDate.getMinutes(),nowDate.getSeconds());常用方法
Application對象
- 常用的方法有:例如:TheApplication.RaiseErrorText(“Hello World”); 消息彈出框
- GetBusObject: 獲取BO
- GetService:獲取BS
- GotoView:View跳轉
- InvokeMethod:最常用于獲取值列表”LookupValue”
- LoginId:獲取當前登錄用戶的Id
- LoginName:獲取當前登錄用戶的用戶名
- NewPropertySet:新建PropertySet
- PositionId:獲取當前登錄用戶的職位Id
- RaiseError:報錯(使用Message報錯)
- RaiseErrorText:報錯(使用文本報錯)
Business Object對象
BO對象對應于配置中的BO,最常用的只有一個方法:GetBusComp,通過該方法獲取BO里的BC。
Business Component對象
常用的方法包括:
- ActivateField:激活字段,在查詢前,必須激活你需要獲取或者設置的Field。
- ClearToQuery:查詢前清除查詢條件的方法
- DeleteRecord:刪除記錄
- ExecuteQuery:執行查詢,參數包括ForwardOnly和ForwardBackward。
- FirstRecord:把光標定位到當前實例的第一條記錄,如果不存在,返回false,否則返回true
- FirstSelected:把光標定位到當前選中的第一條記錄,如果不存在,返回false,否則返回true
- GetFieldValue:獲取Field的值
- NewRecord:新建記錄
- NextRecord:把光標定位到下一條記錄,如果不存在,返回false,否則返回true
- NextSelected:把光標定位到當前選中的下一條記錄,如果不存在,返回false,否則返回true
- ParentBusComp:獲取父BC
- SetFieldValue:設置Field的值
- SetSearchExpr\SetSearchSpec:兩者都是設置查詢條件,但是使用方法和效果都有區別。這里主要強調效果的差別。首先SetSearchSpec默認使用模糊查詢,如SetSearchSpec(“Name”, “ABC”),則執行的查詢實際是[Name] like ABC*。第二,SetSearchSpec對空查詢無效。例如SetSearchSpec(“Name”, “”),則會把所有記錄都查出來,而不是[Name]為空的記錄。最后,SetSearchSpec對關鍵字敏感,如SetSearchSpec(“Name”,“(ABC)”),則會報錯。以上的所有問題都可以通過SetSearchExpr來規避,因此我們強烈建議(也要求)大家在設置查詢條件時,使用SetSearchExpr方法。
- SetSortSpec:設置排序條件
- SetViewMode:設置查詢安全性
- WriteRecord:保存記錄
Applet對象
最常用的方法是:
- BusComp:取得當前Applet所對應的BC實例。
- BusObject:取得當前Applet所在View的BO實例。
Property Set對象
最重要的兩個方法是SetProperty和GetProperty。
其余對象
除了以上的對象外,eScript還包含了javascript本身自帶的所有對象和API,如Date, Math, Array, String等等。
代碼Debug
首先,通過View –> Debug Window -> Watch來打開Debug的監控窗。其次,我們在代碼里設置斷點(在需要設置斷點的代碼行右鍵,Toggle Breakpoint)
然后開發Debug,點擊提交按鈕,我們可以看到代碼執行到斷點時停下來了,我們可以通過F8進行單步調試,當前執行到的代碼行用藍底色顯示。
同時,代碼中的變量的當前值,可以通過watch窗口查看
代碼方法
//激活字段 ActivateField("Value"); //設置之前先清除搜索條件 ClearToQuery(); SetViewMode(AllView); //設置搜索條件 SetSearchExpr("[Type]= '"+sLovType+"' AND [Language]= '"+sLanguage+"' AND [Active]= '"+sActive+"'"); //執行 ExecuteQuery(ForwardOnly); //CountRecords() 獲取執行的記錄總數 sCount = CountRecords(); //獲取第一條記錄 var sHasRecord = FirstRecord(); //下一條記錄 sHasRecord = NextRecord(); //刷新BC this.BusComp().InvokeMethod("RefreshBusComp");//打開一個新的窗口 var oIn=TheApplication().NewPropertySet(); var oIn.SetProperty("Applet Mode","3"); oIn.SetProperty("Applet Name","FT Import Popup Applet"); oOut=TheApplication().NewPropertySet(); var oBS=TheApplication().GetService("SLM Save List Service"); oBS.InvokeMethod("LoadPopupApplet",oIn,oOut); //新建記錄 NewRecord(NewAfter); sType = GetFieldValue("Order Type");// 獲得Order Type訴求類型的值 sTypeCode = GetFieldValue("Order Type.TransCode");// 轉換成Code值 var loginId = TheApplication().LoginId(); //當前登錄人Id var positionId= TheApplication().PositionId(); //當前登錄人職位 var positionName= TheApplication().PositionName(); //當前登錄人職位名稱 var orgId= TheApplication().GetProfileAttr("Org.Id"); // 獲取當前登錄人的主要組織Idvar sPropert = TheApplication().NewPropertySet(); // 判斷sPropert是否有這個Key:Value sPropert.PropertyExists(sCategoryCode); //得到 Excel 中的數據 var ExcelApp = new ActiveXObject("Excel.Application"); var ExcelBook = ExcelApp.Workbooks.Open(sFileName); var ExcelSheet = ExcelBook.WorkSheets("Sheet1"); var sTemp = ExcelSheet.Cells(1,1).Value; //------------------------------------------------------------------------------------------------------------- // 在腳本中對具有 PickList 的 Field 賦值時,不要直接使用 SetFieldValue 對 field 直接賦值,需要使用 Pick 方法 // 錯誤的賦值方式:BC.SetFieldValue("fieldname", "value"), // 正確的賦值方式: with(oBcCA){var oBCPick = GetPicklistBusComp("State");with (oBCPick){ClearToQuery();SetSearchSpec("Value", "CA");ExecuteQuery(ForwardOnly);if(FirstRecord())Pick();}//end with(oBCPick)oBCPick = null; }//end with(oBcCA) //------------------------------------------------------------------------------------------------------------- var boActive = TheApplication().ActiveBusObject().Name(); // TheApplication().SetProfileAttr("FT_SAMPLE_DOC_ID",sDocId); // var sSRN=TheApplication().GetSRN(); // 通過值列表的值獲取獨立語言代碼(也就是通過漢字獲取英文名稱) function F_LookupName(sType, sValue) {try{var sReturn = "";var oBO = TheApplication().GetBusObject("List Of Values");var oBC = oBO.GetBusComp("List Of Values");if(sValue != "" && sValue != null){with(oBC){ActivateField("Name");ActivateField("Type");ActivateField("Value");SetViewMode(AllView);ClearToQuery();SetSearchSpec("Type", sType);SetSearchSpec("Value", sValue);ExecuteQuery(ForwardOnly);if(FirstRecord()){sReturn = GetFieldValue("Name");}}}return sReturn;}catch(e){return "";}finally{oBC = null;oBO = null;} } //------------------------------------------------ //執行新建/更新 (太牛了,應該是系統自帶的方法,更新全部的數據,不一樣的就覆蓋) var bsQuery = TheApplication().GetService("EAI Siebel Adapter"); var psInput = TheApplication().NewPropertySet(); var psOutput = TheApplication().NewPropertySet(); bsQuery.InvokeMethod("Upsert" , Inputs , psOutput);//獲取結果,寫入出參 var psData = psOutput.GetChild(0).Copy(); psData.SetType("Data"); Outputs.AddChild(psData); //獲取新建記錄的row_id ContactId = psOutput.GetProperty("PrimaryRowId"); Outputs.SetProperty("ContactId" , ContactId);// 獲取IO傳進來的第一個BC var psSR = Inputs.GetChild(0).GetChild(0).GetChild(0); //獲取IO下面還有多少個關聯的BC數量 for(i = 0 ; i < psSR.GetChildCount() ; i ++){//獲得下一個BCpsOrders = psSR.GetChild(i);// 判斷是不是這個BCif(psOrders.GetType() == "ListOfFT CSM Service Order"){ var cId = psCallBacks.GetChild(0).GetProperty("Contact Id"); //獲得IO上這個BC的字段屬性(傳進來的)psCallBacks.GetChild(0).SetProperty("Contact Id" , sContactId); // 給這個BC賦值,最后一并寫入。(和這個BS聯合太牛了【EAI Siebel Adapter】)bHasOrder = true;break;} } //------------------------------------------------- //通過這個BS獲取唯一ID var bsOrderNumber = TheApplication().GetService("FT Generate Sequence BS"); // 傳入一個BC的名稱,查找下一個ID的唯一值是什么 psOrderIn.SetProperty("name", "FT Service Request Asset"); bsOrderNumber.InvokeMethod("getSequenceDailyReset" , psOrderIn , psOrderOut);//文本轉換成數字 var iCountLimit = "1000"; iCountLimit = ToNumber(iCountLimit);//批量選擇字段(BC的Field層次) var psShipName = TheApplication().NewPropertySet(); var psShipValue = TheApplication().NewPropertySet(); psShipName.SetProperty("Appoint Date","");//Plan Ship Date psShipName.SetProperty("Associate Allocate Num",""); psShipName.SetProperty("Associate Back Num",""); with{//使這些字段處于活動狀態ActivateMultipleFields(psShipName);ClearToQuery();SetSearchExpr("[Deal Flag] = 'N'");ExecuteQuery(ForwardOnly);//setMultipleFieldValues(psShipName); //相當于一個一個的setFieldValues();//獲得這些查找的字段信息GetMultipleFieldValues(psShipName,psShipValue); }//增加日志 var bsLogger = TheApplication().GetService("FT Logger V2 Service");//初始化接口日志 var psLogInput = TheApplication().NewPropertySet(); psLogInput.SetProperty("Name" , "回訪提交接口");//寫入開始日志 psLogInput.SetProperty("Status" , "處理中"); psLogInput.AddChild(Inputs.Copy()); bsLogger.Log(psLogInput);//寫入完成日志 psLogInput.SetProperty("Status" , sLogStatus);//sLogStatus = 成功 psLogInput.SetProperty("ObjectId" , sId); psLogInput.SetProperty("SMType" , "out"); psLogInput.SetProperty("ErrorMsg" , sReson);psLogInput.AddChild(Outputs.Copy()); bsLogger.Log(psLogInput); //調用其他BS的方法 var sInactiveTime = TheApplication().GetService("FT MicorCallBack V2 Service").FormateDate(dInactiveTime,"ST",0,"");日期比較用getDateTime(),獲得時間戳比較更方便,1970/01/01 00:00:00到指定時間的毫秒數
調用WF方法
var bsWorkflow = TheApplication().GetService("Workflow Process Manager"); var psInputs = TheApplication().NewPropertySet(); var psOutputs = TheApplication().NewPropertySet();psInputs.SetProperty("ProcessName","FT SR Update Process");//設置要調用的工作流名字 psInputs.SetProperty("SRId", sSrId);//設置工作流中 Object Id 這個屬性的值 bsWorkflow.InvokeMethod("RunProcess",psInputs,psOutputs);//把流程跑起來設置定時任務:
在“站點地圖”搜索“管理—— 服務器管理(S)”——“工作”,里面有工作流。
模擬器
在“站點地圖”搜索“模擬器”。
接口設置
在‘管理 - Web 服務"——“入站 Web 服務”,設置接口。
數據映射對象
“站點地圖”——“管理-應用程序(A)”——“數據映射管理”
服務器配置
配置外部jar包
Siebel平臺支持Http請求,不支持Https請求,所以對于Https的請求需要插件轉換發送(FT CallHttps Service)
總結
以上是生活随笔為你收集整理的SIEBEL代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【织梦插件】xenu软件-网站url和死
- 下一篇: php-ftm,关于KEA128中FTM