逻辑图梳理


解析:

  • 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的名字。

  • 把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下List Columns的Field就是关联的BC上的Name,BC——Fields的Column就是Table的Column。

补充优化

Table

  • Table中的column可设置多语言和大小写不敏感(运行右键最下方向导),table可以对某一个新增字段加索引,Table下的Index——Index Column。Table的User Name尽量和Field的Name一样。
  • 切记要写Comments注释
  • 当是下拉列表的时候,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数据的默认排序方式。注意,参与默认排序的首列必须是索引列。

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是关联多张表的中间件。

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");//弹出的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);
}

常用方法

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窗口查看

SIEBEL基础学习相关推荐

  1. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  2. python创建对象的格式为_Python入门基础学习(面向对象)

    python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  3. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  4. 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals

    如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...

  5. Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender

    Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...

  6. ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course

    ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...

  7. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

    原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...

  8. 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...

    2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...

  9. Java零基础学习难吗

    java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...

  10. 零基础学习java,这些书一定要看!

    学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出来给大家作为 ...

最新文章

  1. 每日一皮:我以为的工作量 VS 实际上的工作量
  2. Mysql的timestamp与datetime
  3. 关于hibernate中提示can not create table ******
  4. c++11 继承构造
  5. phpcms上传php,phpcms如何上传视频
  6. Android安全问题 抢先开机启动
  7. 面向对象——意图与逻辑(四)
  8. 嵌入式C的高级用法必须了解
  9. 服务器虚拟网卡驱动卸载,Win10安装和卸载万能网卡版驱动的方法
  10. VS.Net 2005 下载地址
  11. CSS强制图像调整大小并保持纵横比
  12. python基础之输入输出语法
  13. python3 + opencv +pyzbar实时检测二维码 / 定位二维码,并绘制出二维码的框和提取二维码内容
  14. N-Tiers开发方式(如何使用VB.NET撰写COM+组件)
  15. mysql表前缀_关于数据库表前缀的认识
  16. Windows 搭建 Nexus3 私服
  17. [web效果实现-3] 拼音排序通讯录实现
  18. Reids面试题集合 数据结构+穿透雪崩+持久化+内存淘汰策略+数据库双写+哨兵
  19. 应用程序无法正常启动(0xc000007b) 问题解决
  20. c++编写函数实现字符串中指定字符位置插入字符串

热门文章

  1. 深度学习中的有监督学习和无监督学习
  2. Win32的setlocale详解
  3. word文档中向下的箭头是什么,怎么去掉
  4. 游戏网络架构逆向分析--1
  5. 第一篇博客:A+B Problem
  6. 删除mac开机启动项
  7. js传递参数时类型错误
  8. 新能源汽车电池健康状态及能耗分析
  9. 串口线接法是什么 详细步骤介绍
  10. 基于Auto.js的萌猫跳辅助