SIEBEL代码分析

eScript代码

  • 代码就是上图的业务脚本和浏览器脚本。
    代码简介
    方法位置

显示

样例图片

部分代码讲解

function WebApplet_PreInvokeMethod (MethodName)
{
		//判断点击事件传进来的参数名称,符合则进入
		if( MethodName == "CheckOrder" ){
			//新建一个对象,并且给它设置参数,key——value    oIn输入
			var oIn=TheApplication().NewPropertySet();
			oIn.SetProperty("Applet Mode","3");
			//弹出的Applet
			oIn.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都要返回CancelOperaton
	return (CancelOperation);
}
	//Function: SubmitOrder
	//提交订单的逻辑
	//输入参数:OrderId,需要提交的订单的Id
	function SubmitOrder(Inputs, Outputs)
	{
		try
		{
			//获取订单BO,BC
			var 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方法会返回false
				if (!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 Set
			var psIn = TheApplication().NewPropertySet();
			var psOut = TheApplication().NewPropertySet();
			//设置输入参数OrderId的值为当前光标选中的订单头Id
			psIn.SetProperty("OrderId", bcOrder.GetFieldValue("Id"));
			//获取BS
			var bsOrdSvc = TheApplication().GetService("HAND Order Service");
			//调用BS的方法SubmitOrder
			bsOrdSvc.InvokeMethod("SubmitOrder", psIn, psOut);
			//注意,SNTO Order BC的Class必须是CSSBCBase或者其子类,否则不支持RefreshRecord方法
			//此处为什么要对记录做刷新呢?因为BS里更新数据时基于一个全新的实例去更新的,
			//并不影响当前界面的实例。为了使当前界面的实例能反馈给用户处理结果(订单状态字段改为“已提交”)
			//因此需要刷新当前界面的实例
			bcOrder.InvokeMethod("RefreshRecord");
			//客户化方法,返回CancelOperation
			return (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的调用。
BC下的配置
Applet下的配置

例1

在这里插入图片描述

//Applet进入的方法
function WebApplet_PreInvokeMethod (MethodName)
{
	//点击确定,判断传参方法名是不是确定按钮
	if( MethodName == "RandomAssign" )
	{
		//获取BO(业务对象)下名称为FT Lead的BC(业务组件)
		var oBC = TheApplication().ActiveBusObject().GetBusComp("FT Lead");
		//获取名称和Id
		var 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);
				//这时候判断这个记录是不是新建的,是新建的就改成已分派Assignment
				if(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+"'");
//对BC层查询出来的数据进行排序,
SetSortSpec("FT Sequnece(ASCENDING), Parm Type(ASCENDING)");
//执行
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"); // 获取当前登录人的主要组织Id

var 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 ++){
	//获得下一个BC
	psOrders = psSR.GetChild(i);
	// 判断是不是这个BC
	if(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,"");

//获取IO的查询条件:
function BusComp_PreQuery ()
{
	var sOriSearch = this.GetSearchSpec("FT Mobile Cal");

	var sSearch = "" ;
	if(sOriSearch)
	{
		sOriSearch = sOriSearch.replace("=", "") ;
		if(isNaN(sOriSearch)){
			TheApplication().RaiseErrorText("请输入正确的号码进行查询!");
		}else{
			sSearch = "([FT Mobile New] = '" + ToNumber(sOriSearch) + "' OR [FT Mobile Old] = '" + ToNumber(sOriSearch) + "')" ;
		}
	}

	if(sSearch)
	{
		this.ActivateField("FT Mobile New") ;
		this.ActivateField("FT Mobile Old") ;
		this.ClearToQuery();
		this.SetSearchExpr(sSearch) ;
	}
	else
	{
		TheApplication().RaiseErrorText("请输入正确的号码进行查询!") ;
	}
	
	return (ContinueOperation);
}

SIEBEL代码分析_第1张图片

日期比较用getDateTime(),获得时间戳比较更方便,1970/01/01 00:00:00到指定时间的毫秒数

SIEBEL代码分析_第2张图片
SIEBEL代码分析_第3张图片
SIEBEL代码分析_第4张图片
SIEBEL代码分析_第5张图片
SIEBEL代码分析_第6张图片

调用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);//把流程跑起来

SIEBEL代码分析_第7张图片

设置定时任务:

在“站点地图”搜索“管理—— 服务器管理(S)”——“工作”,里面有工作流。

模拟器

在“站点地图”搜索“模拟器”。

接口设置

在‘管理 - Web 服务"——“入站 Web 服务”,设置接口。

数据映射对象

“站点地图”——“管理-应用程序(A)”——“数据映射管理”
“管理-集成(I)”——“数据映射编辑器”

服务器配置

配置外部jar包
SIEBEL代码分析_第8张图片
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");

异步请求日志记录

需要找到工作流的名称。比如:FT Create In SR WF

select * from siebel.s_srm_request
where desc_text like('%FT Create In SR WF%')
--order by  created  desc
and created > to_date('2023/2/1 14:00:00','yyyy-mm-dd hh24:mi:ss') 
--and created < to_date('2023/1/11 15:00:00','yyyy-mm-dd hh24:mi:ss') 

SIEBEL代码分析_第9张图片
导入里面,获取模板,得到DocName的名字,在:系统管理-模板 搜索名称,上传excel模板即可
SIEBEL代码分析_第10张图片
BC层写入值列表的Field值

var vue = "中文";
with(targetBc)//对应的BC
{
	var bcPicklist = GetPicklistBusComp("Parm Type");//Field的Name
	with(bcPicklist)
	{
		SetViewMode( AllView );//设置数据可视性为AllView
		ClearToQuery();
		SetSearchExpr("[Value]='"+ vue + "'");
		ExecuteQuery( ForwardOnly );
		if(FirstRecord())
		{
			Pick();
		}
	}
	bcPicklist = null;
}

事务控制

function ImportReassignment(Inputs , Outputs)
{
	try
	{

		var boReassignment = TheApplication().GetBusObject("FT Owner Reassignment BO");
		var bcReassignment = boReassignment.GetBusComp("FT Owner Reassignment");
		
		//事务控制
		var bsTra:Service = TheApplication().GetService("EAI Transaction Service");
		var psTraIn = TheApplication().NewPropertySet();
		var psTraOut = TheApplication().NewPropertySet();

		var lov_Reassignment = TheApplication().InvokeMethod("LookupValue" , "FT_RE_ASSI_OWNER_TYPE" , "Reassignment");//改派
		var oPickListBC = "",sEventId = "";
		
		//开启事务
		bsTra.InvokeMethod("BeginTransaction",psTraIn,psTraOut);
		//写入参数
		for(var i = 0 ; i < Inputs.GetChildCount() ; i ++)
		{
			var psRecord = Inputs.GetChild(i);
			var c1 = psRecord.GetProperty("C1");//业务类型
			var c2 = psRecord.GetProperty("C2");//问卷任务类型
			var c3 = psRecord.GetProperty("C3");//事件名称
			var c4 = psRecord.GetProperty("C4");//事件名称模糊匹配
			var c5 = psRecord.GetProperty("C5");//事件创建开始时间
			var c6 = psRecord.GetProperty("C6");//事件创建结束时间
			var c7 = psRecord.GetProperty("C7");//通讯结果
			var c8 = psRecord.GetProperty("C8");//用户年限
			var c9 = psRecord.GetProperty("C9");//办事处
			var c10 = psRecord.GetProperty("C10");//服务中心
			var c11 = psRecord.GetProperty("C11");//大区
			var c12 = psRecord.GetProperty("C12");//产品组
			var c13 = psRecord.GetProperty("C13");//产品系列
			var c14 = psRecord.GetProperty("C14");//原有客服
			var c15 = psRecord.GetProperty("C15");//改派客服
			var c16 = psRecord.GetProperty("C16");//回收/改派数量
			var c17 = psRecord.GetProperty("C17");//比例
			var c18 = psRecord.GetProperty("C18");//要求完整量
			var c19 = psRecord.GetProperty("C19");//顾客分类 hxd ad by 20230513

			//新建人工改派任务
			with(bcReassignment)
			{
				InvokeMethod("SetAdminMode","TRUE");
				NewRecord(NewAfter);

				SetFieldValue("FT Type" , c1);
				SetFieldValue("FT Task Type" , c2);				

				if(!c3)
				{//事件模糊名称
					SetFieldValue("FT Event Fuzzy Name" , c4);
					SetFieldValue("FT Task Start Dt" , FormatDate(c5));
					SetFieldValue("FT Task End Dt" , FormatDate(c6));
				}
				else
				{//指定事件名称
					oPickListBC = GetPicklistBusComp("FT Event Name");
					with(oPickListBC)
					{
						ClearToQuery();
						SetViewMode(AllView);
						SetSearchExpr("[Event Name] = '"+c3+"'");
						ExecuteQuery();
	
						if(FirstRecord())
						{
							Pick();
						}
						else
						{
							throw "系统内不存在指定事件【"+c3+"】";
						}
					}
				}

				SetFieldValue("FT Communication Result" , c7);
				SetFieldValue("FT User Years" , c8);
				SetFieldValue("FT Sub Comp Name" , c9);

				if(c10)
				{//服务中心
					oPickListBC = GetPicklistBusComp("FT Service Center");
					with(oPickListBC)
					{
						ClearToQuery();
						SetViewMode(AllView);
						SetSearchExpr("[Name] = '"+c10+"'");
						ExecuteQuery();
	
						if(FirstRecord())
						{
							Pick();
						}
						else
						{
							throw "系统内不存在指定服务中心【"+c10+"】";
						}
					}
				}

				SetFieldValue("FT Area Name" , c11);
				SetFieldValue("FT Prod Line" , c12);
				SetFieldValue("FT Prod Series" , c13);
				SetFieldValue("FT Old Owner Str" , c14);
				SetFieldValue("FT Task Num" , c16);
				
				if(c1 == lov_Reassignment || c1 == "" || c1 == null)
				{//改派
					SetFieldValue("FT New Owner Str" , c15);
					SetFieldValue("FT Proportion" , c17);
					SetFieldValue("FT Task Need Num" , c18);
				}
				SetFieldValue("FT Customer Classification" , c19);
				WriteRecord();
				InvokeMethod("SetAdminMode","FALSE");
			}//end with
		}//end for
		
		//提交事务
		psTraIn.SetProperty("Is Abort","False");
		bsTra.InvokeMethod("EndTransaction",psTraIn,psTraOut);
	}
	catch(e)
	{
		//回退
		psTraIn.SetProperty("Is Abort","True");
		bsTra.InvokeMethod("EndTransaction",psTraIn,psTraOut);
		throw e.message;
	}
	finally
	{
		psTraOut = null;
		psTraIn = null;
		bsTra = null;
		bcReassignment = null;
		boReassignment = null;
	}
}

热部署

遇到的问题:在IO增加了新的出参字段,编译发版后新字段还是没有

打开打包机服务器的Siebel Tools,找到IO地方右键,关闭热部署后在出站Web和入站Web清一下缓存即可。

SIEBEL代码分析_第11张图片
上传附件到FTP,

//FT Upload File Service
if(MethodName == "NewFileAttachment")
	{
		//上传附件后将附件传到ftp服务器
		this.BusComp().WriteRecord();
		var sId = this.BusComp().GetFieldValue("Id");
		TheApplication().GetService("FT Upload File Service").UploadFile(
			this.BusObject().Name() , this.BusComp().Name() , sId , "OrderFileName" , "OrderFileSrcPath" , "Order Id" , "OrderFileAutoUpdFlg");
		this.BusComp().InvokeMethod("RefreshBusComp");
	}

SIEBEL使用浏览器打开

如果需要调用BS,必须在Application里面激活
比如:Siebel Universal Agent 的 Application User Prop 里面的 ClientBusinessService12 (Value就是BS)

你可能感兴趣的:(SIEBEL,开发语言)