siebel scholar

逻辑图梳理 解析: Application:在最上层,是一个Application。Application是Siebel的一个应用,是业务上某个大模块、或者某个行业的所有功能的集合。譬如服务模块(Field Service)是一个Application,譬如制药行业(

逻辑图梳理

在这里插入图片描述
解析:

  • Application:在最上层,是一个Application。Application是Siebel的一个应用,是业务上某个大模块、或者某个行业的所有功能的集合。譬如服务模块(Field Service)是一个Application,譬如制药行业(ePharma)也是一个Application。我们使用Siebel,一定是非常明确地先登录至某个Application,才能继续使用该Application下的所有功能。下图是SiebelService应用的登录页面。
  • Screen:Application下有哪些功能,取决于该Application下关联了哪些Screen。只有Application下引用了这些Screen,那么这些Screen下的页面和功能才能被使用。下图的“服务”,“活动”等Tab是服务应用下的Screen。
  • View:View就是Siebel上一个具体的页面,挂靠在某个Screen下。下图的整体是一个活动的View。
  • Applet:Applet是数据显示的载体,是组成View的基本元素。下图是一个“我的活动”的View,View上面关联一个List Applet和一个Form Applet。
  • List Column\Control:Applet上具体的某个字段或者控件,List Applet上的字段对应于List Column,Form Applet上的字段对应于Control。按钮等对象也属于Control。
  • Business Object:每一个View都是基于某一个特定的BO,View上能展现的数据是该BO上所包含的业务实体的数据,同时通过BO控制不同业务实体之间的关联关系。
  • Business Component & Field:每个Applet都关联一个BusinessComponent,作为其在业务层的数据源。Field则是该数据源的字段,对应于Applet上的List Column或者Control。
  • Table & Column:BC和Field是Siebel Server在业务层对数据的封装,而数据真正存储在数据库的Table和Column上,是所有数据的最终取数源。每个BC都会基于某个基表,大多数的Field的取值则来源于Table上的Column。
    自己总结理解
  • 一个Application是对应整个CEM系统,下面有很多Screen,Screen就比如菜单栏/导航栏。
  • Screen的Screen View重要类别:Aggregate Category是Screen下一组View的大集合,下面可包含Aggregate View,Detail Category,Detail View。可以这样理解:Aggregate Category是一个显示整体,Aggregate View是默认显示的页面。Detail View是Aggregate Category的子视图(相当于一个超链接点进去显示的页面)。
  • 如果Type是Aggregate Category,则这条记录的View没有值,值会在Aggregate View中显示出来,Aggregate View的Parent Category是Type为Aggregate Category的名字。
    Aggregate Category和Aggregate View
    Detail Category和Detail View
  • 把Screen关联的View打开,进入View界面。
  • View会关联一个BO(业务对象),BO就是BC的逻辑关系,里面就是多张表的关系连接(主外键),使用Link绑定关系。
  • 另外还会关联一个Applet,Applet包括List Applet、Form Applet等,这两个最常用。
  • View下View Web Tempaltes的View Web Template Items可能会关联多个Applet(List、Form)。Applet Mode取值只保留Edit(Form
    Applet)或者Edit List(List Applet)。
  • 而关于List、Form)Applet的List Column,每个字段属性都要在这里设置添加。然后找到这个Applet右键点击(Edit Web Layout)。然后拖动自己左侧的属性到相应位置即可。Applet布局
  • Applet下List Columns的Field就是关联的BC上的Name,BC——Fields的Column就是Table的Column。

补充优化

Table

  • Table中的column可设置多语言和大小写不敏感(运行右键最下方向导),table可以对某一个新增字段加索引,Table下的Index——Index Column。Table的User Name尽量和Field的Name一样。
  • 切记要写Comments注释Column索引
  • 当是下拉列表的时候,table下的column的Translate(打√)、Translation Table Name(固定值S_LST_OF_VAL)、LOV Bounded(打√)、Lov Type(和pickList的type value尽量一样,但是需要在下图配置Lov Type的名称【作用就是存数据库的时候中文翻译成英文】)。下图第二个地方有点问题,应该是Type和Column关联的Lov Type一样,Display Value是值列表,后面还有独立语言代码和父许可,几乎和浏览器页面上是一样的,如果已知存在的找不到就搜索Type(LOV_TYPE),在后面增加已知的LOV TYPE。
    在这里插入图片描述
    在这里插入图片描述

BC、Pick List、Field

  • 在BC中,如果有的字段需要显示下拉值列表,则在相应字段的Fields的Picklist关联上一个Pick List(和上面的Column关联的Lov Type配套使用),先在Pick List定义一行,Name就是关联的名称,如果是静态的Plck List的话,BC就默认(PickList Generic),勾选Static即可。反之是动态就需要选择相应的BC了。在Type Value命名,这个名称需要在浏览器中新建,名称一致。对于值是严格限定范围的值列表,必须勾上Bounded的Bounded是实现多语言的前提条件。Business Component:对于无父子结构的静态Pick List,选择PickList Generic;对于有父子结构的静态Pick List,选择PickList Hierarchical。
  • 静态的:关联好之后,要在Field相应的Pick Map新建记录,Field就是相应的Field,Picklist Field选择value,之后需要在浏览器上后台值列表添加相应的数据,然后新增下拉的值
  • 关联BC映射关系:在Pick List里面的BC就要关联上对应的BC,因为Field下面的Pick Map关联的字段需要用到。实际形成一种映射关系。在这里插入图片描述
  • 父子级动态:Pick List的BC选择PickList Hierarchical,但是看的例子里面Static也都打√了,只有需要关联BC映射关系的没有勾上
    在这里插入图片描述
    在这里插入图片描述
  • Pick Map UpdOnlyIfNull:Field下Pick Map的Pick Map UpdOnlyIfNull可以进行选中子级带出父级,就是在父级新建一条记录,Name就是父级的Name即可,注意:这些操作都是在子级里面操作的。
  • BC筛选条件。Search Specification:对BC数据的过滤条件,满足该条件的记录才算是BC的一条数据。Sort Specification:对BC数据的默认排序方式。注意,参与默认排序的首列必须是索引列。
    Pick List特面定义

Field、Join

  • 如果在BC中有的字段取值取不到,则需要通过关系来获取,这时就需要新建Join来解决。Field的Join类别需要关联Join(Alias)。
  • Field上的Calculated和Calculated Value是一对操作,是写表达式的。
  • IIf ([Order Status] = LookupValue(‘FS_ORDER_STATUS’,‘8’), ‘Y’,‘N’):意思是判断Field的Order Status和值列表的值比较,是的话返回Y,否则返回N。从这里可以看出这是个Bool类型的值。LookupValue是从值列表获取值。
  • 对于Field的Validation & Validation Message:Validation是字段值的验证,譬如 >0,表示填入该字段的值必须大于0;Validation Message是当Validation不通过时的报错消息。
  • Disable Sort:Disable Sort可禁用字段的排序,对某些Calculated Field和某些描述型的Field勾上Disable Sort可避免出现由于误操作导致的性能问题。
  • 新建一条Join行,Table选择需要找的属性所在的Table(如果不是直接关联的Table,也就是说外键没有关联到所需的那张表,就需要进行创建多个Join进行多次关联),Join的(Outer Join Flag)勾选上
  • Join下面的Join Specification是在相应的Join下创建的:
    Source Field: BC上用来连接的源Field(BC的字段)。Destination Column:连接Join的Table的Column,必须是主键或者唯一性索引
  • 多张表的关联就是先关联一个Table的Column,生成一个Field,再用这个Field关联另外一张表的Column即可(也就是Join下Source Field写的是BC自己Field的Name)。

BO、Link

Link基本是在BO里面用到的,BO是关联多张表的中间件。
Link关联BO
在这里插入图片描述

Applet

  • List Applet:以列表的形式展示数据。
    HTML Icon Map:可以把Field的值映射为一个Icon进行显示,常用与CheckBox型的字段设为CHECK,从而把Y值显示为√。
    Show In List:如果字段默认隐藏,但是用户可根据需要决定是否显示,则把Show In List的勾设为N。
  • Form Applet:以表单的形式展示数据。
  • Pick Applet:用于动态Pick List选择数据,由Pick Applet小按钮触发,以弹出框的列表形式展示数据。
    在这里插入图片描述
  • MVG Applet:用于展示和操作MVG数据,由MVG小按钮 触发,以弹出框列表形式展示数据。
  • Associate Applet:用于MVG的数据关联操作,通常伴随着MVGApplet出现,展现形式与MVG Applet一致。下图是一个MVG和Associate Applet的结合体,左边为Associate Applet,右边为MVGApplet。
    在这里插入图片描述
  • Applet下Controls如果有点击跳转的视图,可以在Controls的类别属性Pick Applet下关联跳转的Applet。在点击事件Controls的Method Invoked设置名称,点击就会传参(这个方法的名字)。
    业务脚本
  • 无论是Controls还是List Column,Caption(Display Name)是显示在页面上的值。
    Display Name - String Reference(Caption - String Reference)选择的值。
    Display Name - String Override(Caption - String Override)优先级更高,默认显示,不好维护。
    在这里插入图片描述
  • Display Name - String Reference(Caption - String Reference)选择值维护在下面。
    在这里插入图片描述

View、Screen

1. View

  • Item Identifier:必输字段,决定了View上Applet的显示顺序
  • Applet Mode:默认使用的Applet的Mode。一般情况下,我们客户化的Applet只保留Edit(Form Applet)或者Edit List(List Applet)。如果一个Applet配置了多种Mode,需要在此处选择一种正确的Mode。
  • Name & Applet:View上所挂的Applet之一,原则上要求Name和Applet属性保持一致。
    2. Screen
  • Default View:Screen的默认View,可理解为Screen的首页,用户通过点击Screen的Tab进入Screen时默认展现的View。
  • Display In Page:把该属性设为Y,避免View在Screen下被隐藏。
  • Display In Site Map:在Site Map上显示,对于Aggregate Category和Aggregate View,勾上该属性,使用户可以通过场地图链接进入View。对于Detail View或者Detail Category,应酌情而定,如果该Detail View上对应了多种安全性类型或者不同的Search条件,则把勾去掉,强制用户通过Aggregate View Drilldown的方式进入Detail View。基本都是勾上。
  • Screen Views的Type

  1. Aggregate Category:Aggregate Category是Screen下一组View的大集合,下面可包含Aggregate View,Detail Category和Detail View。“列表”链接对应的是一个Aggregate Category,它下面可以挂靠多个具有不同安全性的Aggregate View。
  2. Aggregate View:Aggregate View一般用以列表View,作为一组View的入口,如下图基于各种安全性的订单列表View,都是同一个Aggregate Category下的Aggregate View。
  3. Detail Category:Detail类型是相对Aggregate类型的另一种类型,这种类型的View一般只基于某一条主BC数据展开的信息,如基于某个订单头展开的订单行信息,一般通过Aggregate View上Drilldown过去。DetailCategory是对一组Detail View的分类,往上挂靠一个AggregateCategory,往下挂靠Detail View。如下图所示的“行项目”Tab,则是一个Detail Category的展示。
  4. Detail View:Detail View可以挂靠在Detail Category下,也可以直接挂靠在Aggregate Category下,作为一个Master-Detail型的数据展示的页面。

IO

  • IO的作用就是接口,输入输出。
  • IO就是关联一个BO,BO的名称在External Sequence中填写。里面的结构相当于是一个对象集合。返回出去的也是一个集合形式的。
    在这里插入图片描述
  • 下面是返回的字段要求。
    在这里插入图片描述
  • 用法:在BS里面的返回值output行设置。
  • 在BS Methods下面的Arguments设置,Name是返回的名字,调用IO的话就设置成Date。Data Type是Hierarchy,IO写调用的IO,Storage Type是Hierarchy。普通的就是Property即可。
  • 里面的代码如下:

function Query(Inputs , Outputs){
	var code = "S";//结果,S为成功,E为失败
	var msg = "";
	try{
		var sSRNumber = Inputs.GetProperty("SRNumber");//诉求编号
		var sSearchExpr = "";
		//判断必输
		if(sSRNumber == "" ){
			throw("sSRNumber不能为空");
		}
		//拼接诉求编号查询条件
		if(sSRNumber != ""){
			sSearchExpr = "[FT Research Task BC.FT Auxiliary9] = '" + sSRNumber + "'";
		}
		//执行查询
		var bsQuery = TheApplication().GetService("EAI Siebel Adapter");
		var psInput = TheApplication().NewPropertySet();
		var psOutput = TheApplication().NewPropertySet();
		psInput.SetProperty("OutputIntObjectName" , "FT Cloud Query Questionnaire Service IO");
		psInput.SetProperty("SearchSpec" , sSearchExpr);
		bsQuery.InvokeMethod("Query" , psInput , psOutput);
		//获取查询结果,写入出参
		var psData = psOutput.GetChild(0).Copy();
		psData.SetType("Data");
		Outputs.AddChild(psData);
	}catch(e){
		code = "E";
		msg = e.message;
	}finally{
		Outputs.SetProperty("code" , code);
		Outputs.SetProperty("msg" , msg);
	}
}
  • 添加IO字段需要注意XML sequence的序列号,往下继续,不能重复。
    在这里插入图片描述

Drilldown、Toggle

  • Drilldown也就是HTML里面的标签,起超链接的作用。
  • Drilldown分为静态Drilldown和动态Drilldown两种。静态Drilldown所跳转的View是固定;而动态Drilldown则可以根据Drilldown的不同字段的值决定跳转至哪个View。
  • Drilldown实现的是不同View之间的跳转,而Toggle实现的则是同一个View内,不同Applet之间的动态切换(就是类似于一个下拉框,根据选择的值不同,Applet显示的列表不同)。
  • Drilldown是在Applet里面创建的,Hyperlink Field:用于链接的Field(点击的超链接),该Field必须放到List Applet上,否则无效果。* Source Field: 用于跳转定位的源字段。Business Component: 目标View的目标BC。Destination Field:用于定位的目标字段。
  • 创建动态Drilldown需要在Applet创建多条记录,设置Sequence,在Sequence为1的地方下面创建多条Dynamic Drilldown Destination(和Drilldown条数一样)。
  • Toggle创建Applet Toggle(这个是在计划订单下创建的,Applet Toggles的Applet就是另外一个紧急订单的Applet,Auto Toggle Value是紧急订单,Auto Toggle Field是关键字[作为判断的值])
  • 注意,View Template Item里使用的是哪个Applet,就应该把Toggle属性建在哪个Applet下。
    在这里插入图片描述

Siebel的安全性类型

  • Person、Position、Organization三种安全性类型,那么我们分别需要有一个SVF来记录某个订单属于哪个Person、一个MVF来记录属于哪些Position、一个MVF来记录属于哪些Organization。
  • Person安全性:在BC中创建Buscomp View Mode,Name可以选择Personal(对应Owner Type是Person),Visibility Field是Person的权限筛选。在相应View的Applet Visibility Type设置之前的值(Personal、Organization)。
  • Position安全性:在BC中创建Buscomp View Mode,Owner Type可以选择Position。
  • Organization安全性:在BC中创建Buscomp View Mode,Name、Owner Type可以选择Organization。
    在这里插入图片描述
    在这里插入图片描述

User Property

BC User Property

BC Read Only Field
  • BC Read Only Field:是全部字段都只读,不可编辑。
  1. 创建Field。创建一个Field:命名为BC Read Only Flag,属性如下:
    Comments:订单状态为已关闭时,控制BC只读 Name:BC Read Only Flag
    Calculated: Y Calculated Value:IIf([Order Status]=LookupValue(“HAND_ORD_STATUS”,“Closed”),“Y”,“N”) Type:DTYPE_BOOL
    在这里插入图片描述
  2. 创建UP。在Business Component User Prop处创建一个UP,属性如下:
    Name: BC Read Only Field Value: BC Read Only Flag
    在这里插入图片描述
Field Read Only Field
  • Field Read Only Field:指定字段只读,不可编辑。
  1. 创建Field
    创建一个Field,设置属性如下:
    Comments:订单状态不为新建时,控制某几个字段只读
    Name:Status IsNot New
    Calculated: Y
    Calculated Value:IIf([Order Status]=LookupValue(“HAND_ORD_STATUS”,“New”),“N”,“Y”)
    Type:DTYPE_BOOL
  2. 创建UP
    在Business Component User Prop处创建三个UP,属性如下:
    Name: Field Read Only Field: Account Name
    Value: Status IsNot New
    Name: Field Read Only Field: Drop Shipment Flag
    Value: Status IsNot New
    Name: Field Read Only Field: Rebate
    Value: Status IsNot New
    在这里插入图片描述
On Field Update Set
  • On Field Update Set:当一个字段改变时,需要自动改变另一个字段的值时,我们可以On FieldUpdate Set这个UP。
    在Business Component User Prop处创建UP,属性如下:
    Name:On Field Update Set 1
    Value:“Order Type”, “Drop Shipment Flag”, “IIf([Order Type]=LookupValue(‘HAND_ORD_TYPE’,‘Urgent Order’),‘Y’,‘N’)”
    Comments:订单类型为"紧急订单"时,设直发标识为Y,否则设为N。
    在这里插入图片描述
    解析
  • Name:一个BC中可以定义多个On Field Update Set的UP,因此当一个BC上的该UP存在多个时,后面就需要跟一个n(1~99),按顺序递增。上面的例子是HAND Order BC的第一个On Field Update Set UP,因此我们在后面加数字1;后面的新的该UP则递增加数字2,3,4…。
    Value:On Field Update Set的Value有三个部分组成
    “Field Changed”, “Field To Set”, “Value”
    Field Changed:触发源,BC上的一个Field的名称。
    Field To Set:设置目标,BC上的一个Field的名称。
    Value:设置目标值,可以是一个表达式。

Field User Property

Required
  • Required:Field的必输可以通过勾选Required属性实现,但是某些情况下,必输是具有前提条件的,这个时候就需要用到Field的Required UP。
    Name: Required Value: IIf([Order Type]=LookupValue(“HAND_ORD_TYPE”,“Plan Order”),‘Y’,‘N’)
    在这里插入图片描述
  • 编译调试,对于订单类型为”计划订单”的订单,试着删除返利字段的值,保存,则报必输错误。当Order Type是Plan Order时返回Y。

Applet User Property

第一步-去除字段上的多语言转换。
第二步-在Field上配置Aspect。
在配置Applet上的Aspect前,需要先在Field上配置Aspect。找到HAND Order上Field “Order Type”,添加两个Aspect Default Value:Aspect Default Value: Urgent Aspect Default Value: Supplement 分别对应紧急订单和补充计划订单。
在这里插入图片描述
第三步-确认需要做Aspect的Applet的Class
List Applet的Class必须是CSSFrameListBase或者其子类型(不可以是默认是CSSFrameList)。
Form Applet的Class必须是CSSFrameBase或者其子类型(不可以是默认是CSSFrame)。
在这里插入图片描述
第四步-在Applet上添加Default Aspect
分别在List Applet和Form Applet上添加以下UP:Name: Default Aspect Value: Supplement

Application User Property

系统字段代码

  • LookupName:是把显示值转换为独立语言代码的函数。例:Calculated Value:LookupName(“HAND_ORD_TYPE”, [Order Type])

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);
}

常用方法

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窗口查看
在这里插入图片描述

创建表层视图

先把创建视图的sql语句保存起来(注意:要能导进Siebel Tools里面)

CREATE OR REPLACE VIEW V_CB_LABELED AS
SELECT ROW_ID FROM SIEBEL.CX_FT_CB_TA TA WHERE EXISTS(
       SELECT 1 FROM SIEBEL.CX_CB_LABEL_TMP TMP WHERE TMP.CB_ID=TA.ROW_ID
);

在数据库创建视图的时候需要在创建完成后执行下面赋权语句

grant select on V_CB_LABELED to sse_role;

然后打开Tools新建
在这里插入图片描述
下面的SVR是视图起的名字,完成后不可修改哦
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
映射视图字段需要手动更改,需要设置主键
在这里插入图片描述
在这里插入图片描述

知秋君
上一篇 2024-07-22 19:48
下一篇 2024-07-22 19:12

相关推荐