日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SIEBEL代码分析

發布時間:2023/12/16 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

EAI HTTP Transport 用于http請求, FT CallHttps Service 外部插件方法,轉換https或者http的請求(eclipse程序) FT DCS EAI Common Service (CallHttp) 調用沒有token的HTTPS FT Cloud EAI Common Service (PostJson) 調用有token的HTTPS FT DCS Service 1.(GetSRComm) 2.(Send2DCS) 調用沒有token的HTTPS psInput = TheApplication().NewPropertySet(); psOutput = TheApplication().NewPropertySet(); bsHttpReq = TheApplication().GetService("FT CallHttps Service"); psInput.SetProperty("sbody", json);//報文體 psInput.SetProperty("url", sUrl);//地址 bsHttpReq.InvokeMethod("HSendReceive", psInput, psOutput); //發送信息 sValue = psOutput.GetProperty("result");

總結

以上是生活随笔為你收集整理的SIEBEL代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。